"""Routes C2 — Calendrier district 87-16.""" from fastapi import APIRouter, Depends from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.core.database import get_db from app.core.security import get_current_membre from app.models.groupe import Groupe from app.models.affectation import Affectation from app.models.poste import Poste from app.models.membre import Membre from app.schemas.phase2 import CalendrierEntry router = APIRouter(prefix="/calendrier", tags=["C2 — Calendrier district"]) @router.get("/", response_model=list[CalendrierEntry]) async def calendrier_district( membre=Depends(get_current_membre), db: AsyncSession = Depends(get_db), ): """C2 — Calendrier des serviteurs de tous les groupes du district 87-16.""" # Récupérer le district du membre groupe = await db.get(Groupe, membre.groupe_id) district = groupe.district if groupe else "87-16" # Tous les groupes du même district result = await db.execute( select(Groupe).where(Groupe.district == district).order_by(Groupe.nom) ) groupes = {g.id: g for g in result.scalars().all()} # Toutes les affectations actives de ces groupes result = await db.execute( select(Affectation).where( Affectation.groupe_id.in_(groupes.keys()), Affectation.statut == "actif", ) ) affectations = result.scalars().all() entries = [] for a in affectations: poste = await db.get(Poste, a.poste_id) mbr = await db.get(Membre, a.membre_id) grp = groupes.get(a.groupe_id) if poste and mbr and grp: entries.append(CalendrierEntry( groupe_nom=grp.nom, groupe_id=grp.id, jour_reunion=grp.jour_reunion, poste_nom=poste.nom, membre_prenom=mbr.prenom, date_debut=a.date_debut, )) # Trier par groupe puis par ordre de poste entries.sort(key=lambda e: (e.groupe_nom, e.poste_nom)) return entries @router.get("/groupe/{groupe_id}") async def calendrier_groupe( groupe_id: str, membre=Depends(get_current_membre), db: AsyncSession = Depends(get_db), ): """Détail des serviteurs d'un groupe spécifique.""" groupe = await db.get(Groupe, groupe_id) if not groupe: return {"groupe": None, "serviteurs": []} result = await db.execute( select(Affectation).where( Affectation.groupe_id == groupe_id, Affectation.statut == "actif", ) ) affectations = result.scalars().all() serviteurs = [] for a in affectations: poste = await db.get(Poste, a.poste_id) mbr = await db.get(Membre, a.membre_id) if poste and mbr: serviteurs.append({ "poste": poste.nom, "categorie": poste.categorie, "prenom": mbr.prenom, "depuis": str(a.date_debut), }) serviteurs.sort(key=lambda s: s.get("poste", "")) return { "groupe": { "id": str(groupe.id), "nom": groupe.nom, "jour_reunion": groupe.jour_reunion, "adresse": groupe.adresse_local, }, "serviteurs": serviteurs, }