# 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
<!-- ✅ Jauge réactivée -->
<ui:param name="progressValue" value="#{dashboardMembreBean.tauxCotisationsPerso}" />
```
**Métrique** : Taux de paiement annuel (0-100%)

#### KPI 2 : Mon Épargne
```xml
<!-- ✅ Jauge réactivée -->
<ui:param name="progressValue" value="#{dashboardMembreBean.objectifEpargne}" />
```
**Métrique** : Progression vers objectif d'épargne (0-100%)

#### KPI 3 : Mes Événements
```xml
<!-- ✅ Jauge réactivée -->
<ui:param name="progressValue" value="#{dashboardMembreBean.tauxParticipationPerso}" />
```
**Métrique** : Taux de participation aux événements (0-100%)

#### KPI 4 : Mes Aides
```xml
<!-- ✅ Jauge réactivée -->
<ui:param name="progressValue" value="#{dashboardMembreBean.tauxAidesApprouvees}" />
```
**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
<!-- Valeur simple, pas de condition "Chargement..." -->
<ui:param name="value" value="#{dashboardMembreBean.statutCotisations}" />

<!-- Date d'inscription avec gestion du null -->
<h:outputText value="#{dashboardMembreBean.dateInscription}"
              rendered="#{dashboardMembreBean.dateInscription != null}">
    <f:convertDateTime pattern="dd MMMM yyyy" type="localDate" locale="fr"/>
</h:outputText>
<span class="text-500" rendered="#{dashboardMembreBean.dateInscription == null}">-</span>
```

**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<CotisationResponse>
// }
// 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`
