102 lines
3.2 KiB
Python
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,
|
|
}
|