- 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
12 KiB
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 ❌
<h5 class="mb-3">Historique des Cotisations</h5>
Problème : Redondant avec le menu "Historique"
Après ✅
<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
- Paiement en Ligne : Choix méthode + numéro téléphone → Redirection gateway
- 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 :
<!-- 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 :
<!-- 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 :
<!-- 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) Auto-détection membre connecté Actions : Voir reçu |
| paiement-mes-cotisations.xhtml | MEMBRE_ACTIF | /pages/secure/membre/paiement-mes-cotisations.xhtml |
NOUVEAU KPI personnels Payer MES cotisations en ligne Déclarer paiement manuel |
| paiement.xhtml | TRESORIER/ADMIN | /pages/secure/cotisation/paiement.xhtml |
Conditionné KPI globaux (si admin) Liste TOUTES les cotisations Colonne "Membre" (si admin) Enregistrer paiements |
Menu Recommandé
Menu MEMBRE_ACTIF
<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
<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é
@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 :
- ✅ Création page dédiée
paiement-mes-cotisations.xhtmlpour MEMBRE_ACTIF - ✅ Conditionnement
paiement.xhtmlpour masquer KPI globaux et colonne "Membre" si pas admin
Composants Réutilisables Utilisés
✅ Conformité DRY/WOU
Pages utilisant les composants réutilisables :
-
cotisations.xhtml :
- ✅
kpi-card.xhtml(4 KPI) - ✅
button-secondary.xhtml(Bouton Retour, Actualiser)
- ✅
-
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)
- ✅
-
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 :
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→ ListGET /api/cotisations/mes-cotisations/synthese→ Synthèse KPIGET /api/paiements/mes-paiements/historique?limit=5→ ListPOST /api/paiements/initier-paiement-en-ligne→ PaymentGatewayResponse (redirect URL)POST /api/paiements/declarer-paiement-manuel→ 201 CreatedGET /api/paiements/telecharger-recu/{id}→ PDF file
Checklist Validation UX
- Problème 1 : "Aucun membre sélectionné" → ⏳ À résoudre côté Bean
- Problème 2 : "Historique des Cotisations" → ✅ Résolu (renommé "Mes Cotisations")
- Problème 3 : Page ADMIN pour MEMBRE_ACTIF → ✅ Résolu (page dédiée + conditionnement)
- KPI composants réutilisables : ✅ Utilisés partout (kpi-card, stat-card)
- 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)
-
Créer
MesCotisationsPaiementBean.java:- Auto-détection membre connecté
- Méthodes charger cotisations/paiements
- Méthodes initier paiement en ligne / déclarer manuel
-
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
-
Corriger
MembreCotisationBean.java:- Auto-détection membre si pas d'ID fourni
Frontend (Complémentaire)
-
Mettre à jour le menu :
- Modifier "Mes Finances" pour pointer vers nouvelle page
- Retirer "Historique" redondant
- Ajouter "Payer en Ligne"
-
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)