groupe-meditation/backend/app/routers/calendrier.py
2026-03-04 14:01:00 -05:00

102 lines
3.2 KiB
Python

"""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,
}