2026-03-04 14:01:00 -05:00
|
|
|
"""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%"),
|
|
|
|
|
)
|
|
|
|
|
)
|
2026-03-13 09:53:55 -04:00
|
|
|
if not result.scalars().first():
|
2026-03-04 14:01:00 -05:00
|
|
|
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
|