# Révision UX - Menu et Pages par Rôle > **Date**: 2026-03-02 > **Système**: UnionFlow - Navigation et Accès par Rôle > **Principe**: **Chaque membre ne voit que ce qui est pertinent pour SON rôle** --- ## Problème Identifié ### État Actuel ❌ **Ligne 48-52 de menu.xhtml** : "Annuaire des Membres" est visible pour **TOUS** incluant **MEMBRE_ACTIF** ```xml ``` **Problèmes UX** : 1. ❌ Un membre simple d'une mutuelle n'a **pas besoin** de voir la liste de tous les membres 2. ❌ Exposition de données personnelles (RGPD) sans raison métier 3. ❌ La page `/pages/secure/membre/liste.xhtml` affiche des **KPI administratifs** : - Total Membres - Membres Actifs/Inactifs - Nouveaux Membres (30j) 4. ❌ Actions administratives non pertinentes : - Nouveau Membre - Import/Export - Suspendre/Réactiver - Rappel Cotisations Groupé --- ## Question Métier Fondamentale **Pour un MEMBRE_ACTIF d'une mutuelle, quels sont ses besoins réels ?** ✅ **Besoins légitimes** : - SON dashboard personnel - SES cotisations - SON compte épargne - SES inscriptions aux événements - SES demandes d'aide sociale - Consulter les événements publics (pour s'inscrire) - Voir ses notifications personnelles - Accéder à SON profil ❌ **Besoins NON légitimes** (rôles admin) : - Voir la liste complète des membres - Rechercher d'autres membres - Voir les statistiques globales de l'organisation - Créer/Modifier/Suspendre des membres - Importer/Exporter des membres - Envoyer des rappels de cotisations - Voir la trésorerie globale --- ## Solution Recommandée ### 1. Révision du Menu par Rôle #### A. Menu pour **MEMBRE_ACTIF** (Minimal) ```xml ``` **Total items** : ~10 items pertinents (vs ~50+ actuellement) #### B. Menu pour **SECRETAIRE** (Gestion Administrative) ```xml ``` #### C. Menu pour **TRESORIER** (Gestion Financière) ```xml ``` #### D. Menu pour **ADMIN_ORGANISATION** (Tout) ```xml ``` --- ### 2. Révision des Pages par Rôle #### A. `/pages/secure/membre/liste.xhtml` **État actuel** : Une seule page pour tous (admin + membres) **Solution** : Conditionner l'affichage selon le rôle ```xml
``` **Alternative** : Créer 2 pages séparées - `/pages/secure/membre/liste.xhtml` → Admin seulement (avec KPI et actions) - `/pages/secure/membre/annuaire.xhtml` → Tous (lecture seule, pas de KPI) #### B. `/pages/secure/dashboard.xhtml` vs `/pages/secure/dashboard-membre.xhtml` **Actuellement** : Bien séparés ✅ - `dashboard.xhtml` → ADMIN, RESPONSABLES (KPI globaux) - `dashboard-membre.xhtml` → MEMBRE_ACTIF (données personnelles) **À conserver** tel quel. --- ### 3. Modification de MenuBean.java #### Réviser `isAnnuaireMembresVisible()` **Avant** (ligne 135-139) : ```java public boolean isAnnuaireMembresVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "TRESORIER", "RESPONSABLE_SOCIAL", "RESPONSABLE_EVENEMENTS", "RESPONSABLE_CREDIT", "MEMBRE_BUREAU", "MEMBRE_ACTIF"); // ← PROBLÈME } ``` **Après** (Option 1 - Restrictif) : ```java /** * Annuaire des Membres - Consultation limitée * Visible pour les responsables et bureau SEULEMENT (pas MEMBRE_ACTIF) * * Raison métier: Un membre simple n'a pas besoin de voir la liste complète * des autres membres (RGPD, pertinence métier limitée) */ public boolean isAnnuaireMembresVisible() { return hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "TRESORIER", "RESPONSABLE_SOCIAL", "RESPONSABLE_EVENEMENTS", "RESPONSABLE_CREDIT", "MEMBRE_BUREAU"); // MEMBRE_ACTIF retiré intentionnellement } ``` **Après** (Option 2 - Configurable par Organisation) : ```java @Inject ConfigurationService configService; // Service qui lit config de l'organisation /** * Annuaire des Membres - Consultation limitée * Visible selon configuration de l'organisation */ public boolean isAnnuaireMembresVisible() { // Toujours visible pour les admins if (hasAnyRole("SUPER_ADMIN", "ADMIN_ORGANISATION", "SECRETAIRE", "TRESORIER", "RESPONSABLE_SOCIAL", "RESPONSABLE_EVENEMENTS", "RESPONSABLE_CREDIT", "MEMBRE_BUREAU")) { return true; } // Pour MEMBRE_ACTIF: vérifier si l'organisation autorise l'annuaire if (hasAnyRole("MEMBRE_ACTIF")) { return configService.isAnnuaireMembresActive(); // false par défaut } return false; } ``` --- ## Cas d'Usage Métier - Annuaire pour MEMBRE_ACTIF ? ### ✅ Arguments POUR (lien social) 1. **Faciliter la communication** entre membres 2. **Créer du lien social** dans la mutuelle 3. **Trouver des contacts** pour covoiturage aux événements 4. **Identifier des compétences** (ex: trouver un plombier membre) ### ❌ Arguments CONTRE (protection données) 1. **RGPD** : Exposition non justifiée de données personnelles 2. **Sécurité** : Risque de phishing/spam entre membres 3. **Pertinence limitée** : Un membre n'a généralement pas besoin de la liste complète 4. **Surcharge cognitive** : Menu trop chargé pour un usage quotidien limité ### 💡 Recommandation **Option privilégiée** : **Désactiver par défaut**, rendre **configurable par organisation** ```java // Configuration dans table `configuration_organisation` { "annuaire_membres_actif": false, // Par défaut : désactivé "annuaire_membres_champs_visibles": ["nom", "prenom", "telephone"], // Pas email "annuaire_membres_recherche_avancee": false // Recherche simple seulement } ``` Si l'organisation **active** l'annuaire pour MEMBRE_ACTIF : - ✅ Afficher une **version limitée** (pas de KPI, pas d'actions admin) - ✅ Masquer certains champs sensibles (email optionnel, pas d'adresse) - ✅ Limiter la recherche (nom/prénom seulement, pas de filtres avancés) --- ## Plan d'Action ### Phase 1 : Menu ✅ (Immédiat) - [ ] Modifier `MenuBean.isAnnuaireMembresVisible()` pour exclure `MEMBRE_ACTIF` - [ ] Tester que le menu "Annuaire des Membres" n'apparaît plus pour MEMBRE_ACTIF - [ ] Vérifier que les autres menus sont bien visibles selon les rôles ### Phase 2 : Pages Conditionnelles 🔧 (Court terme) - [ ] Ajouter `rendered="#{menuBean.gestionMembresMenuVisible}"` sur les KPI de `liste.xhtml` - [ ] Ajouter `rendered="#{menuBean.gestionMembresMenuVisible}"` sur les actions admin - [ ] Conditionner les actions du DataTable (Éditer, Suspendre) selon le rôle - [ ] Tester avec un utilisateur MEMBRE_ACTIF : pas de KPI, pas d'actions admin ### Phase 3 : Configuration Optionnelle 🚀 (Moyen terme) - [ ] Créer table `configuration_organisation` avec champ `annuaire_membres_actif` - [ ] Créer `ConfigurationService.isAnnuaireMembresActive()` - [ ] Modifier `MenuBean.isAnnuaireMembresVisible()` pour utiliser la config - [ ] Créer page admin `/pages/admin/configuration/annuaire.xhtml` pour activer/désactiver - [ ] Si activé : créer page `/pages/secure/membre/annuaire.xhtml` (version simplifiée) ### Phase 4 : Révision Complète Menu 📋 (Long terme) - [ ] Créer des fichiers menu séparés par rôle : - `menu-membre-actif.xhtml` (10 items) - `menu-secretaire.xhtml` (20 items) - `menu-tresorier.xhtml` (15 items) - `menu-admin.xhtml` (50+ items) - [ ] Charger le bon menu selon le rôle dans `main-template.xhtml` - [ ] Simplifier `MenuBean` en supprimant les méthodes deprecated --- ## Checklist de Validation UX Avant de déployer un menu ou une page, vérifier : - [ ] **Pertinence métier** : L'utilisateur a-t-il besoin de cette fonction pour SON rôle ? - [ ] **Moindre privilège** : La fonction n'expose-t-elle que les données nécessaires ? - [ ] **Clarté** : L'intitulé du menu est-il explicite ? ("Mes Cotisations" vs "Cotisations") - [ ] **Cohérence** : Les fonctions "MES" vs "GESTION" sont-elles bien séparées ? - [ ] **Simplicité** : Le menu n'est-il pas surchargé ? (max 10-15 items pour MEMBRE_ACTIF) --- ## Contact **Documentation** : - `docs/UX_MENU_PAR_ROLE.md` (ce fichier) - `docs/KPI_DASHBOARD_PAR_ROLE.md` (matrice KPI) - `docs/PERMISSIONS_MATRIX.md` (permissions pages) **Code** : - `MenuBean.java` - Logique de visibilité - `menu.xhtml` - Structure du menu - `liste.xhtml` - Page à conditionner