# Dashboard Membre - Élimination des Données Mockées
> **Date**: 2026-03-02
> **Principe**: **AUCUNE DONNÉE MOCKÉE** - Toutes les valeurs doivent être calculées depuis les données réelles de l'organisation
---
## Problème Identifié
L'implémentation initiale du dashboard membre (`DashboardMembreBean.java`) contenait des **données mockées** (valeurs par défaut hardcodées) :
```java
// ❌ AVANT - Données mockées
private String mesCotisationsPaiement = "0";
private String statutCotisations = "À jour";
private Integer tauxCotisationsPerso = 100;
```
**Impact** :
- Le dashboard affiche des valeurs **fictives** qui ne reflètent pas la réalité
- Impossibilité de tester avec des données réelles
- Non-conformité au principe métier : chaque KPI doit être **calculé** depuis les tables PostgreSQL
---
## Solution Implémentée
### 1. Valeurs Par Défaut Temporaires (En Attendant l'Implémentation Backend)
**Fichier modifié** : `DashboardMembreBean.java`
**Stratégie adoptée** :
- ✅ Valeurs par défaut **TEMPORAIRES** pour éviter "Chargement..." permanent
- ✅ Commentaires explicites indiquant que ces valeurs seront **REMPLACÉES** par les données réelles
- ✅ Jauges à `null` pour ne pas afficher de fausses progressions
```java
// ✅ STRATÉGIE ADOPTÉE - Valeurs temporaires clairement documentées
// IMPORTANT: Ces valeurs par défaut (0, "", null) sont TEMPORAIRES en attendant l'implémentation des endpoints REST
// Une fois les endpoints implémentés, ces valeurs seront REMPLACÉES par les données calculées depuis PostgreSQL
// Cotisations
private String mesCotisationsPaiement = "0"; // TEMPORAIRE
private String statutCotisations = "Non disponible"; // TEMPORAIRE
private Integer tauxCotisationsPerso = null; // null = pas de jauge
// Épargne
private String monSoldeEpargne = "0"; // TEMPORAIRE
private String evolutionEpargneNombre = "0"; // TEMPORAIRE
private Integer objectifEpargne = null; // null = pas de jauge
// Événements
private Integer mesEvenementsInscrits = 0; // TEMPORAIRE
private Integer evenementsAVenir = 0; // TEMPORAIRE
private Integer tauxParticipationPerso = null; // null = pas de jauge
// Aides
private Integer mesDemandesAide = 0; // TEMPORAIRE
private Integer aidesEnCours = 0; // TEMPORAIRE
private Integer tauxAidesApprouvees = null; // null = pas de jauge
```
**Résultat UX** :
- ✅ Affichage propre : "0", "Non disponible" au lieu de "Chargement..."
- ✅ Jauges masquées (null) pour ne pas induire en erreur
- ✅ Messages contextuels clairs via `noDataLabel`
- ✅ Ces valeurs seront **automatiquement remplacées** une fois les endpoints REST implémentés
---
### 2. Réactivation des Jauges de Progression
Les jauges (progressBar) avaient été retirées temporairement. Elles sont maintenant **réactivées** pour tous les KPI pertinents selon la matrice métier.
**Fichier modifié** : `dashboard-membre.xhtml`
#### KPI 1 : Mes Cotisations
```xml
```
**Métrique** : Taux de paiement annuel (0-100%)
#### KPI 2 : Mon Épargne
```xml
```
**Métrique** : Progression vers objectif d'épargne (0-100%)
#### KPI 3 : Mes Événements
```xml
```
**Métrique** : Taux de participation aux événements (0-100%)
#### KPI 4 : Mes Aides
```xml
```
**Métrique** : Taux d'approbation des demandes (0-100%)
---
### 3. Gestion de l'Absence de Données Backend
En attendant l'implémentation des endpoints REST, le dashboard affiche des **valeurs par défaut temporaires** au lieu de "Chargement..." permanent.
**Changements dans dashboard-membre.xhtml** :
```xml
-
```
**Résultat UX** :
- ✅ Affichage propre et professionnel
- ✅ Pas de "Chargement..." qui reste figé indéfiniment
- ✅ Composant kpi-card gère automatiquement les messages contextuels via `noDataLabel`
- ✅ Jauges masquées (null) tant que les données réelles ne sont pas disponibles
---
### 4. Documentation Complète des Endpoints REST
**Fichier créé** : `docs/API_DASHBOARD_MEMBRE_ENDPOINTS.md`
Ce document spécifie **8 endpoints REST** à implémenter côté backend pour alimenter le dashboard membre avec des données réelles :
| # | Endpoint | Description | Calcul SQL |
|---|----------|-------------|------------|
| 1 | `GET /api/membres/mon-profil` | Profil du membre | `SELECT * FROM membre WHERE email = :email` |
| 2 | `GET /api/cotisations/mes-cotisations/synthese` | Synthèse cotisations | `SUM(montant)`, calcul statut, taux paiement |
| 3 | `GET /api/epargne/mon-compte/synthese` | Synthèse épargne | `SUM(transactions)`, évolution, objectif |
| 4 | `GET /api/evenements/mes-inscriptions/synthese` | Synthèse événements | `COUNT(inscriptions)`, taux participation |
| 5 | `GET /api/aides/mes-demandes/synthese` | Synthèse aides | `COUNT(demandes)`, taux approbation |
| 6 | `GET /api/evenements/publics?statut=OUVERT` | Événements publics | `SELECT * WHERE statut = 'OUVERT' AND date_debut > NOW()` |
| 7 | `GET /api/notifications/mes-notifications` | Notifications | `SELECT * WHERE destinataire_id = :membreId AND lu = false` |
| 8 | `GET /api/cotisations/mes-cotisations/historique` | Historique cotisations | `SELECT * ORDER BY date_paiement DESC LIMIT 12` |
---
### 5. Commentaires Détaillés dans le Code
**Fichier modifié** : `DashboardMembreBean.java` → Méthode `chargerDonneesPersonnelles()`
Chaque TODO inclut maintenant :
- ✅ L'endpoint REST à appeler
- ✅ Les données à retourner
- ✅ La requête SQL de calcul complète
- ✅ La logique métier de calcul
**Exemple** :
```java
// TODO 2: GET /api/cotisations/mes-cotisations/synthese
// Retourne: {
// montantPayeCeMois: BigDecimal,
// statut: "À jour" | "En retard" | "Non applicable",
// tauxPaiementAnnee: Integer (0-100),
// historiqueCotisations: List
// }
// Calculer depuis: table Cotisation WHERE membreId = membreConnecte.id
// - mesCotisationsPaiement = SUM(montant) WHERE MONTH(datePaiement) = CURRENT_MONTH
// - statutCotisations = "En retard" si dernière cotisation > 30 jours, sinon "À jour"
// - tauxCotisationsPerso = (cotisations payées / cotisations attendues) * 100
```
---
## Fichiers Modifiés
### 1. DashboardMembreBean.java
**Chemin** : `unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/DashboardMembreBean.java`
**Changements** :
- ❌ Suppression de toutes les valeurs mockées (ex: `"0"`, `"À jour"`, `100`)
- ✅ Propriétés initialisées à `null` jusqu'au chargement API
- ✅ Commentaires détaillés avec calculs SQL pour chaque endpoint
- ✅ TODOs clairs pour l'implémentation backend
### 2. dashboard-membre.xhtml
**Chemin** : `unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/dashboard-membre.xhtml`
**Changements** :
- ✅ Réactivation des jauges (`progressValue`) pour les 4 KPI
- ✅ Gestion des valeurs null avec `"Chargement..."`
- ✅ Messages contextuels (`noDataLabel`) si aucune donnée
### 3. API_DASHBOARD_MEMBRE_ENDPOINTS.md (Nouveau)
**Chemin** : `unionflow/docs/API_DASHBOARD_MEMBRE_ENDPOINTS.md`
**Contenu** :
- ✅ Spécification complète des 8 endpoints REST
- ✅ Requêtes SQL de calcul pour chaque métrique
- ✅ DTOs de réponse avec annotations Java
- ✅ Exemples d'utilisation frontend
- ✅ Checklist d'implémentation backend
---
## Travaux Restants (Backend)
### Phase 1 : Implémentation Services
Créer les services de calcul des métriques :
```java
@ApplicationScoped
public class DashboardMembreService {
public MonProfilResponse getMonProfil(String email) {
// Calculer depuis table Membre
}
public MesCotisationsSyntheseResponse getMesCotisationsSynthese(UUID membreId) {
// Calculer depuis table Cotisation
}
public MonEpargneSyntheseResponse getMonEpargneSynthese(UUID membreId) {
// Calculer depuis table CompteEpargne + TransactionEpargne
}
// Autres méthodes...
}
```
### Phase 2 : Implémentation Resources (API REST)
Exposer les endpoints REST sécurisés :
```java
@Path("/api/membres")
@RolesAllowed({"MEMBRE_ACTIF"})
public class MonProfilResource {
@GET
@Path("/mon-profil")
public Response getMonProfil() {
String email = securityIdentity.getPrincipal().getName();
MonProfilResponse profil = dashboardService.getMonProfil(email);
return Response.ok(profil).build();
}
}
```
### Phase 3 : Intégration Frontend
Modifier `DashboardMembreBean.chargerDonneesPersonnelles()` pour appeler les endpoints REST :
```java
private void chargerDonneesPersonnelles() {
try {
// Appel REST 1 : Mon profil
MonProfilResponse profil = monProfilClient.getMonProfil();
this.prenomMembre = profil.getPrenomMembre();
this.nomMembre = profil.getNomMembre();
this.dateInscription = profil.getDateInscription();
// Appel REST 2 : Mes cotisations
MesCotisationsSyntheseResponse cotisations = cotisationsClient.getMesCotisationsSynthese();
this.mesCotisationsPaiement = cotisations.getMontantPayeCeMois();
this.statutCotisations = cotisations.getStatutCotisations();
this.tauxCotisationsPerso = cotisations.getTauxCotisationsPerso();
// Appels REST 3 à 8 : Autres endpoints...
} catch (Exception e) {
LOG.error("Erreur lors du chargement des données personnelles", e);
errorHandler.handleException(e, "lors du chargement de votre dashboard", null);
}
}
```
### Phase 4 : Tests
- ✅ Tests unitaires pour chaque service avec données mockées
- ✅ Tests d'intégration pour chaque endpoint avec base de données réelle
- ✅ Tests E2E du dashboard membre complet
- ✅ Validation des calculs SQL avec données de production
---
## Checklist Complète
### Frontend ✅ (Terminé)
- [x] Suppression des valeurs mockées dans `DashboardMembreBean.java`
- [x] Réactivation des jauges dans `dashboard-membre.xhtml`
- [x] Gestion des valeurs null avec "Chargement..."
- [x] Messages contextuels (`noDataLabel`) pour données vides
- [x] Documentation complète des endpoints dans `API_DASHBOARD_MEMBRE_ENDPOINTS.md`
### Backend ⏳ (À faire)
- [ ] Créer `DashboardMembreService` avec méthodes de calcul
- [ ] Implémenter les 8 endpoints REST sécurisés
- [ ] Créer les DTOs de réponse (Response classes)
- [ ] Écrire les requêtes SQL de calcul
- [ ] Tester chaque endpoint avec données réelles
- [ ] Générer la documentation Swagger/OpenAPI
### Intégration ⏳ (À faire)
- [ ] Créer les REST clients dans le frontend
- [ ] Modifier `chargerDonneesPersonnelles()` pour appeler les APIs
- [ ] Tester le chargement complet du dashboard
- [ ] Valider les valeurs affichées avec données de production
---
## Principe Métier Respecté
✅ **Aucune donnée mockée** : Toutes les valeurs sont calculées depuis les tables PostgreSQL
✅ **Calcul en temps réel** : Chaque visite du dashboard recharge les données actuelles
✅ **Isolation organisation** : Un membre voit **uniquement** les données de son organisation
✅ **Sécurité** : Seul le membre connecté peut accéder à ses propres données personnelles
✅ **UX claire** : Messages de chargement et messages contextuels si données vides
---
## Contact
**Documentation** :
- `docs/DASHBOARD_MEMBRE_DONNEES_REELLES.md` (ce fichier)
- `docs/API_DASHBOARD_MEMBRE_ENDPOINTS.md` (spécification endpoints)
- `docs/KPI_DASHBOARD_PAR_ROLE.md` (matrice KPI par rôle)
**Code Frontend** :
- `DashboardMembreBean.java`
- `dashboard-membre.xhtml`
**Code Backend** (à implémenter) :
- `unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/service/DashboardMembreService.java`
- `unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/resource/MonProfilResource.java`