"""Routes — Opérations bancaires (dépôts, retraits).""" from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, desc from app.core.database import get_db from app.core.security import get_current_membre from app.models.operation_bancaire import OperationBancaire from app.models.membre import Membre from app.models.affectation import Affectation from app.models.poste import Poste from app.schemas.phase1 import OperationBancaireCreate, OperationBancaireOut router = APIRouter(prefix="/banque", tags=["Opérations bancaires"]) async def _require_tresorier(membre=Depends(get_current_membre), db: AsyncSession = Depends(get_db)): """Vérifie que le membre est trésorier ou exécutif.""" result = await db.execute( select(Affectation).join(Poste).where( Affectation.membre_id == membre.id, Affectation.statut == "actif", (Poste.nom.ilike("%trésorier%") | (Poste.categorie == "executif")), ) ) if not result.scalars().first(): raise HTTPException(status_code=403, detail="Réservé au trésorier ou à l'exécutif") return membre @router.post("/", response_model=OperationBancaireOut) async def enregistrer_operation( req: OperationBancaireCreate, membre=Depends(_require_tresorier), db: AsyncSession = Depends(get_db), ): """Enregistrer un dépôt ou retrait bancaire (trésorier).""" if req.type not in ("depot", "retrait", "releve"): raise HTTPException(status_code=400, detail="Type doit être 'depot', 'retrait' ou 'releve'") if req.montant <= 0: raise HTTPException(status_code=400, detail="Le montant doit être positif") op = OperationBancaire( groupe_id=membre.groupe_id, type=req.type, montant=req.montant, date_operation=req.date_operation, effectue_par=membre.id, note=req.note, ) db.add(op) await db.flush() return OperationBancaireOut( id=op.id, type=op.type, montant=float(op.montant), date_operation=op.date_operation, effectue_par_prenom=membre.prenom, note=op.note, cree_le=op.cree_le, ) @router.get("/", response_model=list[OperationBancaireOut]) async def liste_operations( limite: int = 20, membre=Depends(get_current_membre), db: AsyncSession = Depends(get_db), ): """Lister les opérations bancaires du groupe.""" result = await db.execute( select(OperationBancaire) .where(OperationBancaire.groupe_id == membre.groupe_id) .order_by(desc(OperationBancaire.date_operation)) .limit(limite) ) ops = result.scalars().all() out = [] for op in ops: m = await db.get(Membre, op.effectue_par) out.append(OperationBancaireOut( id=op.id, type=op.type, montant=float(op.montant), date_operation=op.date_operation, effectue_par_prenom=m.prenom if m else "?", note=op.note, cree_le=op.cree_le, )) return out