82 lines
2.6 KiB
Python
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")
|
|
|