feat: WebSocket temps réel + Finance Workflow + corrections

- Task #6: WebSocket /ws/dashboard + Kafka events (5 topics)
  * Backend: KafkaEventProducer, KafkaEventConsumer
  * Mobile: WebSocketService (reconnection, heartbeat, typed events)
  * DashboardBloc: Auto-refresh depuis WebSocket events

- Finance Workflow: approbations + budgets (backend + mobile)
  * Backend: entities, services, resources, migrations Flyway V6
  * Mobile: features finance_workflow complète avec BLoC

- Corrections DI: interfaces IRepository partout
  * IProfileRepository, IOrganizationRepository, IMembreRepository
  * GetIt configuré avec @injectable

- Spec-Kit: constitution + templates mis à jour
  * .specify/memory/constitution.md enrichie
  * Templates agent, plan, spec, tasks, checklist

- Nettoyage: fichiers temporaires supprimés

Signed-off-by: lions dev Team
This commit is contained in:
dahoud
2026-03-15 02:12:17 +00:00
parent bbc409de9d
commit e8ad874015
635 changed files with 58160 additions and 20674 deletions

View File

@@ -0,0 +1,364 @@
# Changements Pages Cotisations - Appliqués
> **Date**: 2026-03-02
> **Système**: UnionFlow - Pages Cotisations
> **Statut**: ✅ **APPLIQUÉ**
---
## Changements Appliqués
### ✅ 1. `/pages/secure/membre/cotisations.xhtml` - Correction Titre
**Fichier** : `cotisations.xhtml` (ligne 89)
#### Avant ❌
```xml
<h5 class="mb-3">Historique des Cotisations</h5>
```
**Problème** : Redondant avec le menu "Historique"
#### Après ✅
```xml
<h5 class="mb-3">Mes Cotisations</h5>
```
**Résultat** : Titre clair et non redondant
---
### ✅ 2. `/pages/secure/membre/paiement-mes-cotisations.xhtml` - CRÉÉE
**Fichier** : NOUVEAU fichier créé pour MEMBRE_ACTIF
#### Contenu de la Page
**KPI Personnels** (Utilise `kpi-card.xhtml` - DRY/WOU ✅)
- Cotisations à Payer
- Montant Dû
- Prochaine Échéance
- Total Payé en {année}
**Tableau "Mes Cotisations en Attente"**
-**PAS de colonne "Membre"** (redondant pour un membre)
- Colonnes : Référence, Type, Période, Montant Dû, Échéance, Actions
- Actions :
- **"Payer en ligne"** → Dialog paiement Wave/Orange/Free Money/Carte
- **"Autre"** → Dialog déclaration paiement manuel (validation trésorier requise)
**Tableau "Mes Derniers Paiements"**
- Historique des 5 derniers paiements
- Action : Télécharger reçu PDF
**Dialogs**
1. **Paiement en Ligne** : Choix méthode + numéro téléphone → Redirection gateway
2. **Paiement Manuel** : Déclaration paiement effectué autrement (espèces, virement, chèque)
#### Caractéristiques UX
**Données personnelles** uniquement (pas de stats globales)
**Interface simplifiée** pour un membre
**Actions pertinentes** : Payer mes cotisations, pas gérer celles des autres
**Composants réutilisables** : kpi-card, form-field-*, buttons
---
### ✅ 3. `/pages/secure/cotisation/paiement.xhtml` - Conditionnement ADMIN
**Fichier** : `paiement.xhtml` (modifications lignes 36, 67, 140)
#### A. KPI Globaux - TRESORIER/ADMIN SEULEMENT
**Ligne 36** :
```xml
<!-- Statistiques de paiement - TRESORIER/ADMIN SEULEMENT -->
<div class="grid" rendered="#{menuBean.gestionFinancesMenuVisible}">
<ui:include src="/templates/components/cards/stat-card.xhtml">
<ui:param name="value" value="#{cotisationsBean.statistiques.totalCollecteFormatte}" />
<ui:param name="label" value="Total Collecté" />
...
</ui:include>
</div>
```
**KPI conditionnés** :
- Total Collecté
- Moyenne Mensuelle
- Objectif Annuel
- Taux de Recouvrement
---
#### B. Répartition Méthodes - TRESORIER/ADMIN SEULEMENT
**Ligne 67** :
```xml
<!-- Répartition par méthode de paiement - TRESORIER/ADMIN SEULEMENT -->
<div class="card" rendered="#{menuBean.gestionFinancesMenuVisible}">
<h5>Répartition par Méthode de Paiement</h5>
...
</div>
```
---
#### C. Colonne "Membre" - TRESORIER/ADMIN SEULEMENT
**Ligne 140** :
```xml
<!-- Colonne Membre - TRESORIER/ADMIN SEULEMENT -->
<p:column headerText="Membre" sortBy="#{cotisation.nomMembre}"
rendered="#{menuBean.gestionFinancesMenuVisible}">
<div>
<div class="font-medium">#{cotisation.nomMembre}</div>
<div class="text-600 text-sm">#{cotisation.numeroMembre}</div>
</div>
</p:column>
```
**Résultat** : Si un MEMBRE_ACTIF accède à cette page (URL directe), il ne verra PAS les données admin
---
## Architecture Finale
### Pages Cotisations par Rôle
| Page | Rôle | URL | Contenu |
|------|------|-----|---------|
| **cotisations.xhtml** | MEMBRE_ACTIF | `/pages/secure/membre/cotisations.xhtml` | Liste MES cotisations (payées, en attente)<br>Auto-détection membre connecté<br>Actions : Voir reçu |
| **paiement-mes-cotisations.xhtml** | MEMBRE_ACTIF | `/pages/secure/membre/paiement-mes-cotisations.xhtml` | **NOUVEAU**<br>KPI personnels<br>Payer MES cotisations en ligne<br>Déclarer paiement manuel |
| **paiement.xhtml** | TRESORIER/ADMIN | `/pages/secure/cotisation/paiement.xhtml` | **Conditionné**<br>KPI globaux (si admin)<br>Liste TOUTES les cotisations<br>Colonne "Membre" (si admin)<br>Enregistrer paiements |
---
## Menu Recommandé
### Menu MEMBRE_ACTIF
```xml
<p:submenu label="Mes Finances" icon="pi pi-wallet"
rendered="#{menuBean.mesFinancesMenuVisible}">
<p:menuitem value="Mes Cotisations"
icon="pi pi-list"
outcome="/pages/secure/membre/cotisations" />
<p:menuitem value="Payer en Ligne"
icon="pi pi-credit-card"
outcome="/pages/secure/membre/paiement-mes-cotisations" />
<p:menuitem value="Mon Épargne"
icon="pi pi-money-bill"
outcome="/pages/secure/epargne/mon-compte" />
<p:menuitem value="Mes Prêts"
icon="pi pi-briefcase"
outcome="/pages/secure/credit/mes-prets"
rendered="#{config.moduleCredit}" />
</p:submenu>
```
---
### Menu TRESORIER/ADMIN
```xml
<p:submenu label="Gestion Financière" icon="pi pi-dollar"
rendered="#{menuBean.gestionFinancesMenuVisible}">
<p:menuitem value="Enregistrer Paiements"
icon="pi pi-wallet"
outcome="/pages/secure/cotisation/paiement" />
<p:menuitem value="Trésorerie"
icon="pi pi-chart-line"
outcome="/pages/secure/finance/tresorerie" />
<p:menuitem value="Relances Cotisations"
icon="pi pi-bell"
outcome="/pages/secure/cotisation/relances" />
<p:menuitem value="Rapports Financiers"
icon="pi pi-chart-bar"
outcome="/pages/secure/finance/rapports" />
</p:submenu>
```
---
## Problèmes Résolus
### ❌ Problème 1 : "Aucun membre sélectionné" (Double affichage)
**Statut** : ⏳ **À résoudre côté Bean**
**Solution** : Modifier `MembreCotisationBean.java` pour auto-détecter le membre connecté
```java
@PostConstruct
public void init() {
if (membreId == null || membreId.isEmpty()) {
// Auto-détection du membre connecté
String email = securityIdentity.getPrincipal().getName();
Membre membreConnecte = membreRepository.findByEmail(email);
if (membreConnecte != null) {
this.membreId = membreConnecte.getId().toString();
this.numeroMembre = membreConnecte.getNumeroMembre();
chargerCotisations();
} else {
// Afficher message d'erreur
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"Erreur",
"Impossible de charger vos cotisations. Veuillez contacter l'administrateur."
));
}
} else {
// ID fourni en paramètre (consultation admin d'un membre spécifique)
chargerCotisations();
}
}
```
---
### ✅ Problème 2 : "Historique des Cotisations" (Redondant)
**Statut** : ✅ **RÉSOLU**
**Solution** : Titre changé de "Historique des Cotisations" → "Mes Cotisations"
---
### ✅ Problème 3 : Page ADMIN affichée pour MEMBRE_ACTIF
**Statut** : ✅ **RÉSOLU**
**Solutions appliquées** :
1. ✅ Création page dédiée `paiement-mes-cotisations.xhtml` pour MEMBRE_ACTIF
2. ✅ Conditionnement `paiement.xhtml` pour masquer KPI globaux et colonne "Membre" si pas admin
---
## Composants Réutilisables Utilisés
### ✅ Conformité DRY/WOU
**Pages utilisant les composants réutilisables** :
1. **cotisations.xhtml** :
-`kpi-card.xhtml` (4 KPI)
-`button-secondary.xhtml` (Bouton Retour, Actualiser)
2. **paiement-mes-cotisations.xhtml** :
-`kpi-card.xhtml` (4 KPI personnels)
-`page-header.xhtml` (En-tête)
-`form-field-select.xhtml` (Méthode paiement)
-`form-field-text.xhtml` (Numéro téléphone, Référence)
-`form-field-textarea.xhtml` (Commentaire)
-`button-*.xhtml` (Tous les boutons)
3. **paiement.xhtml** :
-`stat-card.xhtml` (4 KPI globaux)
-`page-header.xhtml` (En-tête)
-`button-icon.xhtml` (Bouton Actualiser)
-`form-field-*.xhtml` (Formulaires dialogs)
-`button-*.xhtml` (Tous les boutons)
**Résultat** : ✅ Toutes les pages utilisent bien les composants réutilisables !
---
## Bean Backend à Créer
### MesCotisationsPaiementBean.java
**Localisation** : `unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/MesCotisationsPaiementBean.java`
**Responsabilités** :
- Auto-détecter le membre connecté via `SecurityIdentity`
- Charger uniquement SES cotisations en attente
- Calculer les KPI personnels (cotisations à payer, montant dû, prochaine échéance, total payé)
- Charger l'historique de SES paiements
- Initier paiement en ligne (redirection vers gateway Wave/Orange/Free/Carte)
- Déclarer paiement manuel (statut EN_ATTENTE_VALIDATION)
- Télécharger reçus PDF
**Propriétés** :
```java
private Integer cotisationsEnAttente;
private String montantDu; // Formaté avec FCFA
private String prochaineEcheance; // Formaté dd/MM/yyyy
private String totalPaye; // Formaté avec FCFA
private Integer anneeEnCours; // 2024, 2025, etc.
private List<CotisationResponse> mesCotisationsEnAttente;
private List<PaiementResponse> derniersPaiements;
private String methodePaiementChoisie;
private String numeroTelephone;
private String methodePaiementManuel;
private String referencePaiementManuel;
private String commentairePaiement;
private boolean paiementManuelActive; // Config organisation
```
**Endpoints REST à implémenter** :
- `GET /api/cotisations/mes-cotisations/en-attente` → List<CotisationResponse>
- `GET /api/cotisations/mes-cotisations/synthese` → Synthèse KPI
- `GET /api/paiements/mes-paiements/historique?limit=5` → List<PaiementResponse>
- `POST /api/paiements/initier-paiement-en-ligne` → PaymentGatewayResponse (redirect URL)
- `POST /api/paiements/declarer-paiement-manuel` → 201 Created
- `GET /api/paiements/telecharger-recu/{id}` → PDF file
---
## Checklist Validation UX
- [x] **Problème 1** : "Aucun membre sélectionné" → ⏳ À résoudre côté Bean
- [x] **Problème 2** : "Historique des Cotisations" → ✅ Résolu (renommé "Mes Cotisations")
- [x] **Problème 3** : Page ADMIN pour MEMBRE_ACTIF → ✅ Résolu (page dédiée + conditionnement)
- [x] **KPI composants réutilisables** : ✅ Utilisés partout (kpi-card, stat-card)
- [x] **Séparation MEMBRE vs ADMIN** : ✅ Pages distinctes + conditionnement
- [ ] **Bean backend MesCotisationsPaiementBean** : ⏳ À créer
- [ ] **Endpoints REST** : ⏳ À implémenter
- [ ] **Mise à jour menu** : ⏳ À faire
- [ ] **Tests utilisateur** : ⏳ À faire
---
## Prochaines Étapes
### Backend (Prioritaire)
1. **Créer `MesCotisationsPaiementBean.java`** :
- Auto-détection membre connecté
- Méthodes charger cotisations/paiements
- Méthodes initier paiement en ligne / déclarer manuel
2. **Implémenter endpoints REST** :
- Cotisations en attente membre
- Synthèse KPI personnels
- Historique paiements
- Gateway paiement en ligne (Wave/Orange/Free/Carte)
- Déclaration paiement manuel
3. **Corriger `MembreCotisationBean.java`** :
- Auto-détection membre si pas d'ID fourni
### Frontend (Complémentaire)
4. **Mettre à jour le menu** :
- Modifier "Mes Finances" pour pointer vers nouvelle page
- Retirer "Historique" redondant
- Ajouter "Payer en Ligne"
5. **Tests utilisateur** :
- MEMBRE_ACTIF : Accès uniquement pages personnelles
- TRESORIER : Accès pages admin conditionnées
---
## Contact
**Documentation** :
- `docs/CHANGEMENTS_PAGES_COTISATIONS_APPLIQUES.md` (ce fichier)
- `docs/ANALYSE_PAGES_COTISATIONS_UX.md` (analyse détaillée)
- `docs/UX_MENU_PAR_ROLE.md` (recommandations menu)
**Code modifié** :
- `cotisations.xhtml` (ligne 89)
- `paiement.xhtml` (lignes 36, 67, 140)
- `paiement-mes-cotisations.xhtml` (NOUVEAU - 400+ lignes)