package dev.lions.unionflow.client.bean; import dev.lions.unionflow.client.view.UserSession; import jakarta.enterprise.context.SessionScoped; import jakarta.inject.Named; import io.quarkus.security.identity.SecurityIdentity; import jakarta.inject.Inject; import java.io.Serializable; import java.util.Set; /** * Bean de gestion de la visibilité des menus en fonction des rôles utilisateur. * *

Fournit des méthodes utilitaires pour déterminer quels menus afficher * selon le rôle de l'utilisateur connecté et le type de son organisation. * *

Utilise {@link SecurityIdentity} pour l'authentification OIDC en mode web-app, * en cohérence avec {@link dev.lions.unionflow.client.view.LoginBean}. * * @author UnionFlow Team * @version 1.1 * @since 2026-03-01 */ @Named @SessionScoped public class MenuBean implements Serializable { private static final long serialVersionUID = 1L; @Inject SecurityIdentity securityIdentity; @Inject UserSession userSession; /** * Vérifie si l'utilisateur a au moins un des rôles spécifiés. * * @param roles Les rôles à vérifier * @return true si l'utilisateur possède au moins un des rôles, false sinon */ private boolean hasAnyRole(String... roles) { if (securityIdentity == null || securityIdentity.isAnonymous()) { return false; } Set userRoles = securityIdentity.getRoles(); if (userRoles == null || userRoles.isEmpty()) { return false; } for (String role : roles) { if (userRoles.contains(role)) { return true; } } return false; } // ======================================================================== // MENUS PRINCIPAUX - Visibilité par rôle // ======================================================================== /** * Super Administration - Visible uniquement pour SUPER_ADMIN */ public boolean isSuperAdminMenuVisible() { return hasAnyRole("SUPER_ADMIN"); } /** * Administration - Visible pour admins et secrétaires */ public boolean isAdministrationMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU"); } // ======================================================================== // NOUVEAUX MENUS PERSONNELS - Visible pour TOUS les membres // ======================================================================== /** * Mes Finances - Menu personnel pour consulter/gérer ses propres finances * Visible pour TOUS les membres (épargne, cotisations, prêts) */ public boolean isMesFinancesMenuVisible() { return !securityIdentity.isAnonymous(); } /** * Événements - Calendrier et inscriptions aux événements * Visible pour TOUS les membres */ public boolean isMesEvenementsMenuVisible() { return !securityIdentity.isAnonymous(); } /** * Mes Demandes d'Aide Sociale - Menu personnel pour les demandes d'aide * Visible pour TOUS les membres */ public boolean isMesAidesSocialesMenuVisible() { return !securityIdentity.isAnonymous(); } /** * Mes Formations - Catalogue et inscriptions aux formations * Visible pour TOUS les membres */ public boolean isMesFormationsMenuVisible() { return !securityIdentity.isAnonymous(); } /** * Mes Communications - Messages et notifications personnelles * Visible pour TOUS les membres */ public boolean isMesCommunicationsMenuVisible() { return !securityIdentity.isAnonymous(); } // ======================================================================== // MENUS DE GESTION - Visible pour les responsables uniquement // ======================================================================== /** * Gestion des Membres - Administration des membres * Visible pour SECRETAIRE et ADMIN uniquement */ public boolean isGestionMembresMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE"); } /** * Annuaire des Membres - Consultation de la liste (pas de modification) * Visible pour les responsables et bureau SEULEMENT (PAS pour MEMBRE_ACTIF) * * Raison métier: Un membre simple n'a généralement pas besoin de voir la liste complète * des autres membres. Cela peut poser des problèmes de: * - RGPD: Exposition non justifiée de données personnelles * - Sécurité: Risque de spam/phishing entre membres * - UX: Surcharge du menu pour un usage limité * * Si l'organisation souhaite activer l'annuaire pour MEMBRE_ACTIF, cela doit être * fait via configuration explicite (future Phase 3). */ public boolean isAnnuaireMembresVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "TRESORIER", "RESPONSABLE_SOCIAL", "RESPONSABLE_EVENEMENTS", "RESPONSABLE_CREDIT", "MEMBRE_BUREAU"); // MEMBRE_ACTIF retiré intentionnellement pour raisons UX et RGPD } /** * Gestion Financière - Administration finances (trésorerie, budgets, comptabilité) * Visible pour TRESORIER et ADMIN uniquement */ public boolean isGestionFinancesMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER"); } /** * Gestion Événements - Création et organisation des événements * Visible pour RESPONSABLE_EVENEMENTS, SECRETAIRE et ADMIN */ public boolean isGestionEvenementsMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "RESPONSABLE_EVENEMENTS"); } /** * Gestion Aide Sociale - Traitement des demandes d'aide * Visible pour RESPONSABLE_SOCIAL et ADMIN */ public boolean isGestionAidesSocialesMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_SOCIAL"); } /** * Organisations - Visible pour admins et super-admins */ public boolean isOrganisationsMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION"); } /** * Adhésions - Visible pour admins, secrétaires, bureau */ public boolean isAdhesionsMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU"); } /** * Communication - Visible pour admins, secrétaires, bureau */ public boolean isCommunicationMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "RESPONSABLE_EVENEMENTS", "MEMBRE_BUREAU"); } /** * Documents - Visible pour tous sauf membres simples */ public boolean isDocumentsMenuVisible() { return !hasAnyRole("MEMBRE_SIMPLE"); } /** * Formation - Visible pour tous les membres actifs et plus */ public boolean isFormationMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU", "MEMBRE_ACTIF"); } /** * Rapports et Analyses - Visible pour admins, trésoriers, secrétaires, bureau */ public boolean isRapportsMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "SECRETAIRE", "MEMBRE_BUREAU"); } /** * Outils et Utilitaires - Visible pour admins et secrétaires */ public boolean isOutilsMenuVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "MEMBRE_BUREAU"); } /** * Mon Espace Personnel - Visible pour tous les utilisateurs connectés */ public boolean isPersonnelMenuVisible() { return true; // Tous les utilisateurs connectés } /** * Aide et Support - Visible pour tous */ public boolean isAideMenuVisible() { return true; // Tous les utilisateurs } // ======================================================================== // ITEMS DE MENUS PERSONNELS - Actions membre // ======================================================================== /** * Consulter mon épargne - Visible pour TOUS */ public boolean isMonEpargneVisible() { return !securityIdentity.isAnonymous(); } /** * Payer mes cotisations - Visible pour TOUS */ public boolean isPaiementCotisationVisible() { return !securityIdentity.isAnonymous(); } /** * Demander un prêt/crédit - Visible pour TOUS */ public boolean isDemandePretVisible() { return !securityIdentity.isAnonymous(); } /** * Mes prêts en cours - Visible pour TOUS */ public boolean isMesPretsVisible() { return !securityIdentity.isAnonymous(); } /** * Demander une aide sociale - Visible pour TOUS */ public boolean isDemandeAideSocialeVisible() { return !securityIdentity.isAnonymous(); } /** * Mes demandes d'aide en cours - Visible pour TOUS */ public boolean isMesDemandesAideVisible() { return !securityIdentity.isAnonymous(); } /** * M'inscrire à un événement - Visible pour TOUS */ public boolean isInscriptionEvenementVisible() { return !securityIdentity.isAnonymous(); } /** * Mes inscriptions aux événements - Visible pour TOUS */ public boolean isMesInscriptionsEvenementsVisible() { return !securityIdentity.isAnonymous(); } /** * M'inscrire à une formation - Visible pour TOUS */ public boolean isInscriptionFormationVisible() { return !securityIdentity.isAnonymous(); } /** * Mes formations - Visible pour TOUS */ public boolean isMesFormationsVisible() { return !securityIdentity.isAnonymous(); } /** * Mes messages personnels - Visible pour TOUS */ public boolean isMesMessagesVisible() { return !securityIdentity.isAnonymous(); } /** * Annonces officielles (lecture seule) - Visible pour TOUS */ public boolean isAnnoncesLectureVisible() { return !securityIdentity.isAnonymous(); } // ======================================================================== // ITEMS DE MENUS SPÉCIFIQUES - Administration // ======================================================================== /** * Items Keycloak User Manager - Visible uniquement pour SUPER_ADMIN */ public boolean isKeycloakUserManagerVisible() { return hasAnyRole("SUPER_ADMIN"); } /** * Gestion des cotisations (admin) - Visible pour admins et trésoriers */ public boolean isCotisationsAdminVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER"); } /** * Comptabilité - Visible pour admins et trésoriers */ public boolean isComptabiliteVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER"); } /** * Trésorerie - Visible pour admins et trésoriers */ public boolean isTresorerieVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER"); } /** * Épargne/Crédit (spécifique mutuelles) - Visible pour trésoriers et responsables crédit */ public boolean isEpargneCreditVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "RESPONSABLE_CREDIT"); } /** * Inscription de membres - Visible pour admins et secrétaires */ public boolean isInscriptionMembreVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE"); } /** * Import/Export de membres - Visible pour admins et secrétaires */ public boolean isImportExportMembreVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE"); } /** * Validation des adhésions - Visible pour admins et secrétaires */ public boolean isValidationAdhesionVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE"); } /** * Traitement des demandes d'aide - Visible pour admins et responsables sociaux */ public boolean isTraitementAideVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_SOCIAL"); } /** * Évaluation sociale - Visible pour responsables sociaux */ public boolean isEvaluationSocialeVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_SOCIAL"); } /** * Création d'événements - Visible pour admins et responsables événements */ public boolean isCreationEvenementVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_EVENEMENTS", "SECRETAIRE"); } /** * Logistique événements - Visible pour responsables événements */ public boolean isLogistiqueEvenementVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "RESPONSABLE_EVENEMENTS"); } /** * Envoi SMS/Email - Visible pour admins et secrétaires */ public boolean isCommunicationMasseVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE"); } /** * Sauvegardes et maintenance - Visible uniquement pour SUPER_ADMIN */ public boolean isMaintenanceVisible() { return hasAnyRole("SUPER_ADMIN"); } /** * Rapports financiers - Visible pour admins et trésoriers */ public boolean isRapportFinancierVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER"); } /** * Exports personnalisés - Visible pour admins, trésoriers, secrétaires */ public boolean isExportsPersonnalisesVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "SECRETAIRE"); } // ======================================================================== // HELPERS // ======================================================================== /** * Vérifie si l'utilisateur est un super-admin */ public boolean isSuperAdmin() { return hasAnyRole("SUPER_ADMIN"); } /** * Vérifie si l'utilisateur est un admin d'organisation */ public boolean isAdminOrganisation() { return hasAnyRole("ADMIN_ORGANISATION"); } /** * Vérifie si l'utilisateur est un trésorier */ public boolean isTresorier() { return hasAnyRole("TRESORIER"); } /** * Vérifie si l'utilisateur est un secrétaire */ public boolean isSecretaire() { return hasAnyRole("SECRETAIRE"); } /** * Vérifie si l'utilisateur est un responsable social */ public boolean isResponsableSocial() { return hasAnyRole("RESPONSABLE_SOCIAL"); } /** * Vérifie si l'utilisateur est un responsable événements */ public boolean isResponsableEvenements() { return hasAnyRole("RESPONSABLE_EVENEMENTS"); } /** * Vérifie si l'utilisateur est un responsable crédit */ public boolean isResponsableCredit() { return hasAnyRole("RESPONSABLE_CREDIT"); } /** * Vérifie si l'utilisateur est membre du bureau */ public boolean isMembreBureau() { return hasAnyRole("MEMBRE_BUREAU"); } /** * Vérifie si l'utilisateur est membre actif */ public boolean isMembreActif() { return hasAnyRole("MEMBRE_ACTIF"); } /** * Vérifie si l'utilisateur est membre simple */ public boolean isMembreSimple() { return hasAnyRole("MEMBRE_SIMPLE"); } // ======================================================================== // MENUS PAR MODULE (conditionnels selon le type d'organisation active) // Chaque méthode combine : rôle requis + module actif dans l'org active. // Un SUPERADMIN voit tout sans restriction de module. // ======================================================================== /** * Vérifie si un module est actif pour l'organisation courante. * Les SUPER_ADMIN voient tous les modules. */ private boolean hasModule(String module) { if (hasAnyRole("SUPER_ADMIN")) return true; if (userSession == null) return false; return userSession.hasModuleActif(module); } /** Menu Tontine — visible si module TONTINE actif + rôle adéquat. */ public boolean isTontineMenuVisible() { return hasModule("TONTINE") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "TONTINE_RESP", "TONTINE_MANAGER", "TONTINE_COLLECTOR"); } /** Menu Tontine (membres) — consultation de ses propres tontines. */ public boolean isTontineMemberVisible() { return hasModule("TONTINE") && !securityIdentity.isAnonymous(); } /** Menu Épargne — visible si module EPARGNE actif. */ public boolean isEpargneMenuVisible() { return hasModule("EPARGNE") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "MUTUELLE_RESP", "EPARGNE_MANAGER"); } /** Menu Épargne (membres). */ public boolean isEpargneMemberVisible() { return hasModule("EPARGNE") && !securityIdentity.isAnonymous(); } /** Menu Crédit — visible si module CREDIT actif. */ public boolean isCreditMenuVisible() { return hasModule("CREDIT") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "TRESORIER", "MUTUELLE_RESP", "CREDIT_ANALYSTE", "RESPONSABLE_CREDIT"); } /** Menu Crédit (membres). */ public boolean isCreditMemberVisible() { return hasModule("CREDIT") && !securityIdentity.isAnonymous(); } /** Menu Agriculture / Campagnes — visible si module AGRICULTURE actif. */ public boolean isAgricoleMenuVisible() { return hasModule("AGRICULTURE") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "COOP_RESP"); } /** Menu Agriculture (membres). */ public boolean isAgricoleMemberVisible() { return hasModule("AGRICULTURE") && !securityIdentity.isAnonymous(); } /** Menu Collecte de fonds — visible si module COLLECTE_FONDS actif. */ public boolean isCollecteFondsMenuVisible() { return hasModule("COLLECTE_FONDS") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "COLLECTE_RESP"); } /** Menu Projets ONG — visible si module PROJETS_ONG actif. */ public boolean isProjetOngMenuVisible() { return hasModule("PROJETS_ONG") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "ONG_RESP", "PROJET_MANAGER"); } /** Menu Culte / Dons religieux — visible si module CULTE_DONS actif. */ public boolean isCulteMenuVisible() { return hasModule("CULTE_DONS") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "CULTE_RESP", "PASTEUR", "DIACRE"); } /** Menu Vote — visible si module VOTES actif. */ public boolean isVoteMenuVisible() { return hasModule("VOTES") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "VOTE_RESP", "SCRUTATEUR"); } /** Menu Registre / Agrément — visible si module REGISTRE_AGREMENT actif. */ public boolean isRegistreAgrementMenuVisible() { return hasModule("REGISTRE_AGREMENT") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "REGISTRE_RESP"); } /** Menu Gouvernance / Organigramme — visible si module GOUVERNANCE actif. */ public boolean isGouvernanceMenuVisible() { return hasModule("GOUVERNANCE") && hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION"); } // ======================================================================== // Pages conformité (Sprint 8 — backend P1-NEW-7 / P2-NEW-3 / P1-NEW-15) // ======================================================================== /** * Tableau de bord conformité — Compliance Officer / Contrôleur Interne / direction. * @since 2026-04-25 */ public boolean isConformiteDashboardVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "PRESIDENT", "TRESORIER", "COMPLIANCE_OFFICER", "CONTROLEUR_INTERNE"); } /** * Rapports trimestriels Contrôleur Interne — restreint contrôleur + président + admin. * @since 2026-04-25 */ public boolean isRapportsTrimestrielsVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "PRESIDENT", "CONTROLEUR_INTERNE"); } /** * PI-SPI Readiness — admin technique uniquement. * @since 2026-04-25 */ public boolean isPispiReadinessVisible() { return hasAnyRole("SUPER_ADMIN", "COMPLIANCE_OFFICER"); } /** * Bénéficiaires Effectifs (UBO) — Instr. BCEAO 003-03-2025. * @since 2026-04-25 (Sprint 11) */ public boolean isBeneficiairesEffectifsVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "COMPLIANCE_OFFICER", "CONTROLEUR_INTERNE"); } /** * Audit Trail viewer — compliance / contrôle interne. * @since 2026-04-25 (Sprint 11) */ public boolean isAuditTrailViewerVisible() { return hasAnyRole("SUPER_ADMIN", "COMPLIANCE_OFFICER", "CONTROLEUR_INTERNE"); } /** * Délégations de rôles — admin org / président. * @since 2026-04-25 (Sprint 11) */ public boolean isRoleDelegationsVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "PRESIDENT"); } /** * Retourne true si l'organisation active dispose d'au moins un module métier spécifique * (au-delà des modules communs toujours disponibles). * Utilisé pour afficher/masquer la section "Modules métier" dans la navigation. */ public boolean hasAnyBusinessModule() { if (hasAnyRole("SUPER_ADMIN")) return true; return isTontineMenuVisible() || isCreditMenuVisible() || isEpargneMenuVisible() || isAgricoleMenuVisible() || isCollecteFondsMenuVisible() || isProjetOngMenuVisible() || isCulteMenuVisible() || isVoteMenuVisible() || isRegistreAgrementMenuVisible() || isGouvernanceMenuVisible(); } }