"""Route accueil — écran dynamique par rôle.""" 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.affectation import Affectation from app.models.poste import Poste from app.schemas.schemas import AccueilResponse, ModuleTuile, MembrePublic router = APIRouter(prefix="/accueil", tags=["Accueil"]) # ── Définition des modules ── MODULES_CONSULTATION = [ ModuleTuile(code="C1", nom="Rapports PDF", description="Finances, PV, rapport RSG", icone="📄", couleur="blue"), ModuleTuile(code="C2", nom="Calendrier district", description="Serviteurs de tous les groupes", icone="📅", couleur="green"), ModuleTuile(code="C3", nom="Anniversaires", description="Sobriété du district 87-16", icone="🎂", couleur="yellow"), ModuleTuile(code="C4", nom="Littérature", description="Inventaire et prix", icone="📚", couleur="purple"), ModuleTuile(code="C5", nom="Décisions en cours", description="Suivi réunion d'affaires", icone="📌", couleur="red"), ModuleTuile(code="C6", nom="Votes ouverts", description="Conscience de groupe", icone="🗳️", couleur="indigo"), ModuleTuile(code="C7", nom="Mon profil", description="Modifier, PIN, notifications", icone="👤", couleur="gray"), ] # Modules de saisie par poste MODULES_SAISIE = { "Trésorier(ière)": [ ModuleTuile(code="S1", nom="Collecte 7e", description="Saisir le panier", icone="💰", couleur="green"), ModuleTuile(code="S5", nom="Dépense", description="Enregistrer une dépense", icone="💸", couleur="red"), ModuleTuile(code="M4", nom="Envoi contributions", description="District, région, BSG", icone="📮", couleur="blue"), ], "Secrétaire": [ ModuleTuile(code="M1", nom="Rédiger PV", description="Procès-verbal", icone="📝", couleur="blue"), ModuleTuile(code="M2", nom="Présences", description="Réunion d'affaires", icone="✅", couleur="green"), ], "RSG": [ ModuleTuile(code="M3", nom="Rapport RSG", description="Compte-rendu district", icone="📋", couleur="blue"), ], "RSG Substitut(e)": [ ModuleTuile(code="M3", nom="Rapport RSG", description="Compte-rendu district", icone="📋", couleur="blue"), ], "Animateur(trice)": [ ModuleTuile(code="S4", nom="Rapport réunion", description="Thème et annonces", icone="🎤", couleur="purple"), ], "Responsable littérature": [ ModuleTuile(code="S3", nom="Vente littérature", description="Enregistrer une vente", icone="📖", couleur="purple"), ModuleTuile(code="M5", nom="Ajuster inventaire", description="Mettre à jour le stock", icone="📦", couleur="orange"), ], "Responsable jetons": [ ModuleTuile(code="S2", nom="Remise jeton", description="Enregistrer un jeton", icone="🏅", couleur="yellow"), ModuleTuile(code="M6", nom="Commander jetons", description="Commander à l'Intergroupe", icone="📦", couleur="orange"), ], } MODULES_GESTION = [ ModuleTuile(code="G1", nom="Inviter un membre", description="Code d'invitation 48h", icone="➕", couleur="green"), ModuleTuile(code="G2", nom="Gérer les membres", description="Fiche complète, désactiver", icone="👥", couleur="blue"), ModuleTuile(code="G3", nom="Affecter les postes", description="Assigner un serviteur", icone="🎯", couleur="purple"), ModuleTuile(code="G4", nom="Terminer un mandat", description="Transition manuelle", icone="🔄", couleur="orange"), ModuleTuile(code="G5", nom="Planifier rotations", description="Calendrier serviteurs", icone="📅", couleur="green"), ModuleTuile(code="G6", nom="Lancer un sondage", description="Conscience de groupe", icone="📊", couleur="indigo"), ModuleTuile(code="G7", nom="Jumeler parrain", description="Parrain / filleul", icone="🤝", couleur="yellow"), ModuleTuile(code="G8", nom="Config. répartition", description="% contributions", icone="⚙️", couleur="gray"), ModuleTuile(code="G9", nom="Paramètres groupe", description="Nom, horaire, adresse", icone="🔧", couleur="gray"), ] @router.get("/", response_model=AccueilResponse) async def accueil( membre=Depends(get_current_membre), db: AsyncSession = Depends(get_db), ): """Écran d'accueil dynamique — retourne les modules selon les postes du membre.""" # Récupérer les affectations actives result = await db.execute( select(Affectation).join(Poste).where( Affectation.membre_id == membre.id, Affectation.statut == "actif", ) ) affectations = result.scalars().all() postes_noms = [] postes_categories = [] for a in affectations: poste = await db.get(Poste, a.poste_id) if poste: postes_noms.append(poste.nom) postes_categories.append(poste.categorie) # Modules de consultation : toujours visibles modules_consultation = MODULES_CONSULTATION # Modules de saisie : union des modules de tous les postes modules_saisie = [] codes_vus = set() for nom_poste in postes_noms: for m in MODULES_SAISIE.get(nom_poste, []): if m.code not in codes_vus: modules_saisie.append(m) codes_vus.add(m.code) # Modules de gestion : seulement si exécutif modules_gestion = MODULES_GESTION if "executif" in postes_categories else [] return AccueilResponse( membre=MembrePublic.model_validate(membre), postes=postes_noms, modules_consultation=modules_consultation, modules_saisie=modules_saisie, modules_gestion=modules_gestion, )