# 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