112 lines
5.6 KiB
Python
112 lines
5.6 KiB
Python
"""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,
|
||
)
|