# 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`