Adds user equity eligibility management
Implements functionality to manage user equity eligibility, allowing admins to grant and revoke access. Adds database migration, models, CRUD operations, and API endpoints for managing user equity status. This feature enables finer-grained control over who can convert expenses to equity contributions. Validates a user's eligibility before allowing them to submit expenses as equity.
This commit is contained in:
parent
3248d3dad6
commit
7f9cecefa1
4 changed files with 249 additions and 4 deletions
86
views_api.py
86
views_api.py
|
|
@ -287,10 +287,30 @@ async def api_create_expense_entry(
|
|||
|
||||
# Get or create user-specific account
|
||||
if data.is_equity:
|
||||
# Equity contribution
|
||||
user_account = await get_or_create_user_account(
|
||||
wallet.wallet.user, AccountType.EQUITY, "Member Equity"
|
||||
)
|
||||
# Validate equity eligibility
|
||||
from .crud import get_user_equity_status
|
||||
|
||||
equity_status = await get_user_equity_status(wallet.wallet.user)
|
||||
|
||||
if not equity_status or not equity_status.is_equity_eligible:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.FORBIDDEN,
|
||||
detail="User is not eligible to contribute expenses to equity. Please submit for cash reimbursement.",
|
||||
)
|
||||
|
||||
if not equity_status.equity_account_name:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
|
||||
detail="User equity account not configured. Contact administrator.",
|
||||
)
|
||||
|
||||
# Equity contribution - use user's specific equity account
|
||||
user_account = await get_account_by_name(equity_status.equity_account_name)
|
||||
if not user_account:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
|
||||
detail=f"Equity account '{equity_status.equity_account_name}' not found. Contact administrator.",
|
||||
)
|
||||
else:
|
||||
# Liability (castle owes user)
|
||||
user_account = await get_or_create_user_account(
|
||||
|
|
@ -1820,3 +1840,61 @@ async def api_run_daily_reconciliation(
|
|||
status_code=HTTPStatus.INTERNAL_SERVER_ERROR,
|
||||
detail=f"Error running daily reconciliation: {str(e)}",
|
||||
)
|
||||
|
||||
|
||||
# ===== USER EQUITY ELIGIBILITY ENDPOINTS =====
|
||||
|
||||
|
||||
@castle_api_router.get("/api/v1/user/info")
|
||||
async def api_get_user_info(
|
||||
wallet: WalletTypeInfo = Depends(require_invoice_key),
|
||||
) -> UserInfo:
|
||||
"""Get current user's information including equity eligibility"""
|
||||
from .crud import get_user_equity_status
|
||||
from .models import UserInfo
|
||||
|
||||
equity_status = await get_user_equity_status(wallet.wallet.user)
|
||||
|
||||
return UserInfo(
|
||||
user_id=wallet.wallet.user,
|
||||
is_equity_eligible=equity_status.is_equity_eligible if equity_status else False,
|
||||
equity_account_name=equity_status.equity_account_name if equity_status else None,
|
||||
)
|
||||
|
||||
|
||||
@castle_api_router.post("/api/v1/admin/equity-eligibility", status_code=HTTPStatus.CREATED)
|
||||
async def api_grant_equity_eligibility(
|
||||
data: CreateUserEquityStatus,
|
||||
wallet: WalletTypeInfo = Depends(require_admin_key),
|
||||
) -> UserEquityStatus:
|
||||
"""Grant equity contribution eligibility to a user (admin only)"""
|
||||
from .crud import create_or_update_user_equity_status
|
||||
|
||||
return await create_or_update_user_equity_status(data, wallet.wallet.user)
|
||||
|
||||
|
||||
@castle_api_router.delete("/api/v1/admin/equity-eligibility/{user_id}")
|
||||
async def api_revoke_equity_eligibility(
|
||||
user_id: str,
|
||||
wallet: WalletTypeInfo = Depends(require_admin_key),
|
||||
) -> UserEquityStatus:
|
||||
"""Revoke equity contribution eligibility from a user (admin only)"""
|
||||
from .crud import revoke_user_equity_eligibility
|
||||
|
||||
result = await revoke_user_equity_eligibility(user_id)
|
||||
if not result:
|
||||
raise HTTPException(
|
||||
status_code=HTTPStatus.NOT_FOUND,
|
||||
detail=f"User {user_id} not found in equity status records",
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
@castle_api_router.get("/api/v1/admin/equity-eligibility")
|
||||
async def api_list_equity_eligible_users(
|
||||
wallet: WalletTypeInfo = Depends(require_admin_key),
|
||||
) -> list[UserEquityStatus]:
|
||||
"""List all equity-eligible users (admin only)"""
|
||||
from .crud import get_all_equity_eligible_users
|
||||
|
||||
return await get_all_equity_eligible_users()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue