"""Routes S1 — Collecte 7e Tradition.""" 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.collecte import Collecte from app.models.membre import Membre from app.models.affectation import Affectation from app.models.poste import Poste from app.schemas.phase1 import CollecteCreate, CollecteOut router = APIRouter(prefix="/collectes", tags=["S1 — Collecte 7e Tradition"]) async def require_tresorier(membre=Depends(get_current_membre), db: AsyncSession = Depends(get_db)): """Vérifie que le membre est trésorier.""" result = await db.execute( select(Affectation).join(Poste).where( Affectation.membre_id == membre.id, Affectation.statut == "actif", Poste.nom.ilike("%trésorier%"), ) ) if not result.scalars().first(): raise HTTPException(status_code=403, detail="Réservé au trésorier") return membre @router.post("/", response_model=CollecteOut) async def saisir_collecte( req: CollecteCreate, membre=Depends(require_tresorier), db: AsyncSession = Depends(get_db), ): """S1 — Saisir le montant collecté au panier.""" collecte = Collecte( groupe_id=membre.groupe_id, date_collecte=req.date_collecte, montant=req.montant, reunion_id=req.reunion_id, saisi_par=membre.id, ) db.add(collecte) await db.flush() return CollecteOut( id=collecte.id, date_collecte=collecte.date_collecte, montant=float(collecte.montant), saisi_par_prenom=membre.prenom, cree_le=collecte.cree_le, ) @router.get("/", response_model=list[CollecteOut]) async def liste_collectes( limite: int = 20, membre=Depends(get_current_membre), db: AsyncSession = Depends(get_db), ): """Lister les collectes récentes du groupe.""" result = await db.execute( select(Collecte) .where(Collecte.groupe_id == membre.groupe_id) .order_by(desc(Collecte.date_collecte)) .limit(limite) ) collectes = result.scalars().all() out = [] for c in collectes: saisi = await db.get(Membre, c.saisi_par) if c.saisi_par else None out.append(CollecteOut( id=c.id, date_collecte=c.date_collecte, montant=float(c.montant), saisi_par_prenom=saisi.prenom if saisi else None, cree_le=c.cree_le, )) return out