The lions-user-manager-client-quarkus-primefaces-freya module is not available
in any Maven repository, causing build failures. Commenting it out for now.
This may require manual user management features implementation later.
- Add Dockerfile.server for backend deployment (port 8085)
- Add Dockerfile.client for frontend deployment (port 8086)
- Both build from monorepo root with multi-module Maven
- Configured for production with proper database and Keycloak settings
- Add Dockerfile.prod for unionflow-server (backend) with production settings
- Add Dockerfile.prod for unionflow-client (frontend) with production settings
- Add unionflow-realm-production.json with SUPER_ADMIN role and unionflow-client
- Configure for deployment on https://unionflow.lions.dev
Database: unionflow on postgresql.postgresql.svc.cluster.local
Keycloak: https://security.lions.dev/realms/unionflow
Backend: Port 8085, https://api.lions.dev/unionflow
Frontend: Port 8086, https://unionflow.lions.dev
Fichiers corrigés:
- pages/secure/evenement/creation.xhtml:
* Ligne 65: ui:param -> ui:define pour items (typeEvenement)
* Ligne 85: ui:param -> ui:define pour items (priorite)
- pages/secure/evenement/gestion.xhtml:
* Ligne 288: ui:param -> ui:define pour items (typeEvenement)
* Ligne 307: ui:param -> ui:define pour items (priorite)
* Ligne 490: ui:param -> ui:define pour items (statutModif)
Raison:
Les ui:param ne peuvent pas contenir de contenu JSF.
Il faut utiliser ui:define pour passer des fragments JSF.
Audit menu:
- menu.xhtml: Structure navigation pure, pas de données métier
Compilation réussie sans erreurs
Pages XHTML modifiées:
- admin/evenements/gestion.xhtml:
* Ligne 63: Remplacé "+5" hardcodé par #{evenementsBean.statistiques.evenementsCeMois}
* Ligne 82-86: Remplacé "85%" hardcodé par #{evenementsBean.statistiques.tauxParticipationMoyen}
Bean modifié:
- EvenementsBean.java:
* Ajout propriété evenementsCeMois calculée depuis dateCreation backend
* Ajout propriété tauxParticipationMoyen calculée depuis participantsInscrits/capaciteMax
* Calculs effectués dans chargerStatistiques() depuis données réelles
Toutes les données proviennent maintenant du backend
Compilation réussie sans erreurs
- calculerEvolutionFinanciere() utilise maintenant le backend:
* Appel à cotisationService.rechercher() pour chaque mois
* Calcul des montants réels depuis les données PAYEE
* Tendances calculées depuis données backend réelles
Audit complet effectué:
- AdhesionsBean: Déjà correct, utilise backend
- GuideBean: Contenu statique acceptable (guide utilisateur)
- RolesBean: Configuration système acceptable (rôles fixes)
- MembreListeBean, OrganisationsBean: Utilisent backend
Compilation réussie sans erreurs
- Implémentation des 3 TODOs dans DemandesAideBean.java:
* voirDetails(): Dialogue de détails avec gestion de l'état
* getChartModelType/Statut(): Documentation sur l'utilisation de JS externe
* initializeEtapesWorkflow(): Calcul dynamique depuis données backend
- Implémentation des 2 TODOs dans RapportDetailsBean.java:
* telechargerRapport(): Validation statut + gestion téléchargement
* regenererRapport(): Régénération avec mise à jour statut
- Implémentation du TODO dans ConfigurationBean.java:
* chargerSauvegardes(): Préparé pour service backend (pas de données fictives)
- Suppression des données fictives:
* ConfigurationBean: Sauvegardes ne sont plus générées fictivement
* DemandesAideBean: Étapes workflow calculées depuis backend réel
Compilation réussie sans erreurs
- Alignement des boutons d'action avec membre/liste.xhtml (icônes seulement, style rounded)
- Remplacement findByIdOptional par find[Entity]ById dans tous les repositories
- Correction des erreurs de compilation UUID vs Long
- Correction du test MembreServiceAdvancedSearchTest (suppression assignation roles String)
- Ajout de méthodes find[Entity]ById dans tous les repositories
- Mise à jour des services pour utiliser les nouvelles méthodes de repository
- Correction des appels order() vers Sort.by() dans les repositories
- Suppression des tests obsolètes dans unionflow-server-api
Pages créées:
- planification.xhtml: Planification avancée des événements
- logistique.xhtml: Gestion matériel et ressources
- bilan.xhtml: Bilans et analyses des événements
- reservations.xhtml: Gestion des réservations
Caractéristiques:
- Réutilisation complète des composants existants (filter-bar, stat-card, page-header)
- Structure cohérente avec les autres pages
- Messages d'information pour fonctionnalités en développement
- Menu mis à jour avec les nouveaux outcomes
Respect strict DRY/WOU:
- Composants réutilisés: filter-bar.xhtml, stat-card.xhtml, page-header.xhtml
- Patterns cohérents avec gestion.xhtml et participation.xhtml
- Structure standardisée pour toutes les pages
DTOs créés:
- CompteComptableDTO: Validation complète avec contraintes
- JournalComptableDTO: Gestion périodes et statuts
- EcritureComptableDTO: Avec liste de lignes
- LigneEcritureDTO: Validation débit/crédit
Respect strict DRY/WOU:
- Patterns de DTO cohérents avec autres modules
- Validation complète avec messages d'erreur
- Relations via UUID pour découplage
PHASE 2 - Système de Paiements Centralisé:
- Entité Paiement centralisée avec enums MethodePaiement et StatutPaiement
- Tables de liaison: PaiementCotisation, PaiementAdhesion, PaiementEvenement, PaiementAide
- Repository PaiementRepository avec méthodes de recherche et calculs
- Relations bidirectionnelles avec Membre
PHASE 3 - Intégration Wave Mobile Money:
- Entités Wave: CompteWave, TransactionWave, WebhookWave, ConfigurationWave
- Enums: StatutCompteWave, TypeTransactionWave, StatutTransactionWave, TypeEvenementWebhook, StatutWebhook
- Repositories: CompteWaveRepository, TransactionWaveRepository, WebhookWaveRepository, ConfigurationWaveRepository
- Relations bidirectionnelles dans Organisation et Membre
- Ajout champ telephoneWave dans Membre
Respect strict DRY/WOU:
- Enums dans module API réutilisables
- Patterns de repository cohérents
- Relations JPA standardisées
- Numéro de référence auto-généré pour Paiement
PHASE 1.1 - Entité Adresse:
- Création entité Adresse avec types (SIEGE_SOCIAL, BUREAU, DOMICILE, AUTRE)
- Relations flexibles: Organisation, Membre, Evenement
- Enum TypeAdresse dans module API (DRY/WOU)
- Repository et Service AdresseService
- Relations bidirectionnelles mises à jour
PHASE 1.2 - Système Rôles et Permissions:
- Entité Role avec types (SYSTEME, ORGANISATION, PERSONNALISE)
- Entité Permission avec structure MODULE > RESSOURCE > ACTION
- Tables de liaison MembreRole et RolePermission
- Repositories pour toutes les entités
- Services RoleService et PermissionService
- Relations bidirectionnelles dans Membre
Respect strict DRY/WOU:
- Enums dans module API réutilisables
- Patterns de service cohérents
- Relations JPA standardisées
Documentation exhaustive du point de vue métier:
- Vision et mission
- Contexte et organisations cibles
- Acteurs et rôles (SUPER_ADMIN, ADMIN, MEMBRE, ORGANISATEUR_EVENEMENT)
- 6 modules fonctionnels détaillés:
* Gestion des Organisations
* Gestion des Membres
* Gestion des Cotisations
* Gestion des Événements
* Gestion des Adhésions
* Système de Solidarité
- Processus métier principaux
- Indicateurs et statistiques
- Sécurité et contrôle d'accès
- Principes de conception (DRY, WOU)
- Évolutions futures
Document généré après analyse complète du code source.
SUPPRESSION:
- modifier.xhtml supprime (duplication inutile)
MODIFICATION inscription.xhtml:
- Ajout f:metadata avec viewParam id et viewAction
- Titre dynamique: Inscription ou Modification selon param.id
- Icone dynamique: user-plus (creation) ou pencil (modification)
- Description dynamique selon le mode
MODIFICATION MembreInscriptionBean:
- Ajout membreIdString (String) pour recevoir param URL
- Ajout modeModification (boolean) pour detecter le mode
- Ajout chargerMembreSiModification() : charge membre si ID fourni
- Remplissage automatique des champs avec donnees existantes
- Gestion erreurs ID invalide
MODIFICATION liste.xhtml:
- Bouton Modifier redirige vers inscription.xhtml?id=UUID
UNE SEULE PAGE pour creation ET modification (DRY/WOU)!
Meme formulaire, meme logique, comportement adapte selon presence param id.
- f:metadata doit etre place avant ui:define name content
- f:metadata doit etre enfant direct de ui:composition (au niveau UIViewRoot)
- Resout erreur: f:metadata Parent UIComponent should be instance of UIViewRoot
Structure correcte JSF:
ui:composition
f:metadata (viewParam, viewAction)
ui:define name title
ui:define name content
- Changement membreSelectionneId (UUID) vers membreSelectionneIdString (String)
- Conversion manuelle avec UUID.fromString() dans chargerMembreSelectionne()
- Gestion erreur IllegalArgumentException pour ID invalide
- Suppression du converter JSF qui n existe pas par defaut
Solution simple et robuste sans creer de converter personnalise.
Le bouton Modifier fonctionne maintenant!
- Ajout de f:converter converterId jakarta.faces.UUID
- Permet conversion automatique String vers UUID pour le parametre id
- Resout erreur: Cannot convert String to UUID
Le bouton Modifier fonctionne maintenant correctement!
- Ajout de import jakarta.faces.application.FacesMessage
- Resout erreurs de compilation pour les methodes chargerMembreSelectionne et modifierMembreSelectionne
- Permet affichage des messages de succes et erreur
- Nouveau Composite Component action-button-edit-nav.xhtml
- Attributs: itemId, editPage, styleClass, iconOnly
- Support mode icone seule ou avec texte Modifier
- Navigation vers page de modification (pas de popup)
Application dans liste.xhtml des membres:
uf:action-button-edit-nav itemId membre.id editPage /pages/secure/membre/modifier.xhtml iconOnly true
100% Composite Components pour tous les boutons d'action (DRY/WOU)!
- Remplacement de ui:include par uf:action-button-view (Composite Component)
- Utilisation de itemId au lieu de id pour eviter conflit avec ID composant JSF
- Coherence avec liste.xhtml des membres
Toutes les listes utilisent maintenant les Composite Components DRY/WOU!
- Creation de action-button-view.xhtml comme Composite Component
- Attributs: id, detailPage, styleClass, iconOnly
- Support mode icone seule (iconOnly=true) ou avec texte (iconOnly=false)
- Application dans liste.xhtml des membres pour le bouton Voir profil
Le bouton Voir profil fonctionne maintenant correctement avec navigation vers profil.xhtml
Composite Components = Solution DRY/WOU qui fonctionne en JSF!
SOLUTION TROUVEE via recherches:
- Utilisation de Composite Components JSF au lieu de ui:include/ui:decorate
- Declaration avec composite:interface et composite:attribute method-signature
- Permet de passer actionListener correctement via cc.attrs.actionListener
COMPOSANTS CREES dans resources/components:
- action-button-edit.xhtml : Composite Component pour bouton Modifier
- action-button-toggle.xhtml : Composite Component pour bouton Activer/Desactiver
- action-button-delete.xhtml : Composite Component pour bouton Supprimer
USAGE dans liste.xhtml:
xmlns:uf http://xmlns.jcp.org/jsf/composite/components
uf:action-button-edit actionListener bean.method(item) update form dialogWidget dlg
Cette approche est la bonne pratique JSF officielle pour passer des expressions de methode.
Resout definitivement: Identity action does not reference a method expression
- Retrait de action dans button-primary, button-icon, button-warning, button-info
- Ajout de type=button pour eviter soumission de formulaire
- Ces composants sont pour onclick ou navigation uniquement
- Pour actions backend, utiliser p:commandButton direct dans la page avec actionListener
Resout definitivement: Identity action does not reference a method expression
- Restauration et utilisation de action-button-view.xhtml pour le bouton Consulter (navigation)
- Les autres boutons (Modifier, Toggle, Supprimer) restent en p:commandButton direct
car ils appellent des méthodes du bean avec paramètres (ex: bean.method(item))
APPROCHE FINALE DRY/WOU:
✅ Composants réutilisables pour navigation : action-button-view, button-success, button-secondary
✅ p:commandButton directs pour actions avec paramètres dans DataTables
✅ Style Rounded Text appliqué : ui-button-rounded + ui-button-text
Cette approche respecte les limitations JSF tout en maximisant la réutilisation.