hesabixArc/hesabixAPI/adapters/api/v1/admin/wallet_admin.py
2025-11-09 05:16:37 +00:00

82 lines
2.6 KiB
Python

from __future__ import annotations
from typing import Dict, Any, List
from fastapi import APIRouter, Depends, Request, Body, Path, Query
from sqlalchemy.orm import Session
from adapters.db.session import get_db
from app.core.auth_dependency import get_current_user, AuthContext
from app.core.responses import success_response, ApiError
from adapters.db.models.wallet import WalletAccount
from app.services.wallet_service import refund_transaction, settle_payout
router = APIRouter(prefix="/admin/wallets", tags=["admin-wallet"])
@router.get(
"",
summary="فهرست کیف‌پول کسب‌وکارها",
)
def list_wallets_admin(
request: Request,
limit: int = Query(50, ge=1, le=200),
skip: int = Query(0, ge=0),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> dict:
if not ctx.has_any_permission("system_settings", "superadmin"):
raise ApiError("FORBIDDEN", "Missing permission: system_settings", http_status=403)
q = db.query(WalletAccount).order_by(WalletAccount.id.desc())
items = q.offset(skip).limit(limit).all()
data = [
{
"id": it.id,
"business_id": it.business_id,
"available_balance": float(it.available_balance or 0),
"pending_balance": float(it.pending_balance or 0),
"status": it.status,
}
for it in items
]
return success_response(data, request)
@router.post(
"/{business_id}/refunds",
summary="ایجاد استرداد (مدیریتی)",
)
def create_refund_admin(
request: Request,
business_id: int,
payload: Dict[str, Any] = Body(...),
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> dict:
if not ctx.has_any_permission("system_settings", "superadmin"):
raise ApiError("FORBIDDEN", "Missing permission: system_settings", http_status=403)
tx_id = int(payload.get("transaction_id") or 0)
amount = payload.get("amount")
reason = payload.get("reason")
from decimal import Decimal
data = refund_transaction(db, tx_id, amount=Decimal(str(amount)) if amount is not None else None, reason=reason)
return success_response(data, request, message="REFUND_CREATED")
@router.put(
"/payouts/{payout_id}/settle",
summary="تسویه درخواست Payout (مدیریتی)",
)
def settle_payout_admin(
request: Request,
payout_id: int,
db: Session = Depends(get_db),
ctx: AuthContext = Depends(get_current_user),
) -> dict:
if not ctx.has_any_permission("system_settings", "superadmin"):
raise ApiError("FORBIDDEN", "Missing permission: system_settings", http_status=403)
data = settle_payout(db, payout_id, ctx.get_user_id())
return success_response(data, request, message="PAYOUT_SETTLED")