diff --git a/unionflow-client-quarkus-primefaces-freya/pom.xml b/unionflow-client-quarkus-primefaces-freya/pom.xml index 1b75c29..4551c13 100644 --- a/unionflow-client-quarkus-primefaces-freya/pom.xml +++ b/unionflow-client-quarkus-primefaces-freya/pom.xml @@ -122,6 +122,13 @@ unionflow-server-api 1.0.0 + + + + dev.lions.user.manager + lions-user-manager-client-quarkus-primefaces-freya + 1.0.0 + diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/MembreService.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/MembreService.java index bd8e060..7c6a6d2 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/MembreService.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/MembreService.java @@ -82,20 +82,42 @@ public interface MembreService { @GET @Path("/export") - @Produces("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + @Produces({"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "text/csv", "application/pdf", "application/json"}) byte[] exporterExcel( @QueryParam("format") @DefaultValue("EXCEL") String format, @QueryParam("associationId") UUID associationId, - @QueryParam("statut") String statut + @QueryParam("statut") String statut, + @QueryParam("type") String type, + @QueryParam("dateAdhesionDebut") String dateAdhesionDebut, + @QueryParam("dateAdhesionFin") String dateAdhesionFin, + @QueryParam("colonnes") List colonnesExport, + @QueryParam("inclureHeaders") @DefaultValue("true") boolean inclureHeaders, + @QueryParam("formaterDates") @DefaultValue("true") boolean formaterDates, + @QueryParam("inclureStatistiques") @DefaultValue("false") boolean inclureStatistiques, + @QueryParam("motDePasse") String motDePasse + ); + + @GET + @Path("/export/count") + @Produces(MediaType.APPLICATION_JSON) + Long compterMembresPourExport( + @QueryParam("associationId") UUID associationId, + @QueryParam("statut") String statut, + @QueryParam("type") String type, + @QueryParam("dateAdhesionDebut") String dateAdhesionDebut, + @QueryParam("dateAdhesionFin") String dateAdhesionFin ); @POST @Path("/import") @Consumes(MediaType.MULTIPART_FORM_DATA) - ResultatImportDTO importerDonnees( - @FormParam("file") java.io.InputStream fileInputStream, - @FormParam("associationId") UUID associationId - ); + @Produces(MediaType.APPLICATION_JSON) + ResultatImportDTO importerDonnees(MembreImportMultipartForm form); + + @GET + @Path("/import/modele") + @Produces("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + byte[] telechargerModeleImport(); @GET @Path("/autocomplete/villes") diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/AuditBean.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/AuditBean.java index 68ac3a4..daa8843 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/AuditBean.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/AuditBean.java @@ -114,7 +114,7 @@ public class AuditBean implements Serializable { } catch (Exception e) { LOGGER.severe("Erreur lors du chargement des logs: " + e.getMessage()); - e.printStackTrace(); + LOGGER.log(java.util.logging.Level.SEVERE, "Détails de l'erreur de chargement des logs d'audit", e); tousLesLogs = new ArrayList<>(); ajouterMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Erreur lors du chargement des logs: " + e.getMessage()); diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/DemandesBean.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/DemandesBean.java index 34a6970..63c6a16 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/DemandesBean.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/DemandesBean.java @@ -5,8 +5,6 @@ import jakarta.inject.Named; import jakarta.annotation.PostConstruct; import java.io.Serializable; import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; @@ -42,51 +40,58 @@ public class DemandesBean implements Serializable { private String commentaireAssignation; // Statistiques - private int enAttente = 12; - private int urgentes = 5; - private int traitees = 143; - private int delaiMoyenTraitement = 3; + private int enAttente = 0; + private int urgentes = 0; + private int traitees = 0; + private int delaiMoyenTraitement = 0; @PostConstruct public void init() { initializeDemandes(); initializeGestionnaires(); initializeNouvelleDemande(); + calculerStatistiques(); selectedDemandes = new ArrayList<>(); } private void initializeDemandes() { demandes = new ArrayList<>(); - - String[] objets = { - "Demande d'aide financière urgente", "Certificat de membership", - "Mutation vers club Dakar", "Réclamation cotisation", - "Aide médicale famille", "Certificat de bonne conduite" - }; - - String[] types = {"AIDE_FINANCIERE", "CERTIFICAT", "MUTATION", "RECLAMATION", "AIDE_FINANCIERE", "CERTIFICAT"}; - String[] statuts = {"EN_ATTENTE", "EN_COURS", "APPROUVEE", "EN_ATTENTE", "URGENTE", "EN_COURS"}; - String[] priorites = {"URGENTE", "NORMALE", "NORMALE", "BASSE", "URGENTE", "NORMALE"}; - String[] demandeurs = {"Marie Kouassi", "Paul Traoré", "Fatou Sanogo", "Jean Ouattara", "Aissata Koné", "Ibrahim Touré"}; - - for (int i = 0; i < objets.length; i++) { - Demande demande = new Demande(); - demande.setId(UUID.fromString(String.format("00000000-0000-0000-0000-%012d", i + 1))); - demande.setReference("DEM-2024-" + String.format("%04d", i + 1)); - demande.setObjet(objets[i]); - demande.setType(types[i]); - demande.setStatut(statuts[i]); - demande.setPriorite(priorites[i]); - demande.setNomDemandeur(demandeurs[i]); - demande.setNumeroMembre("M" + String.format("%06d", 1000 + i)); - demande.setTelephoneDemandeur("+225 07 " + String.format("%02d", 10 + i) + " " + String.format("%02d", 20 + i) + " " + String.format("%02d", 30 + i)); - demande.setDateDepot(LocalDate.now().minusDays(i * 2)); - demande.setDateEcheance(LocalDate.now().plusDays(7 + i)); - demande.setHeureDepot(LocalDateTime.now().minusHours(i * 3).format(DateTimeFormatter.ofPattern("HH:mm"))); - if (i % 3 != 0) demande.setAssigneA("Gestionnaire " + (i % 3 + 1)); - demandes.add(demande); + // TODO: Charger depuis le backend via DemandeAideService + // Pour l'instant, liste vide - les données viendront du backend + } + + private void calculerStatistiques() { + if (demandes == null || demandes.isEmpty()) { + enAttente = 0; + urgentes = 0; + traitees = 0; + delaiMoyenTraitement = 0; + return; } + // Calculer depuis les données réelles + enAttente = (int) demandes.stream() + .filter(d -> "EN_ATTENTE".equals(d.getStatut())) + .count(); + + urgentes = (int) demandes.stream() + .filter(d -> "URGENTE".equals(d.getPriorite())) + .count(); + + traitees = (int) demandes.stream() + .filter(d -> "APPROUVEE".equals(d.getStatut()) || "REJETEE".equals(d.getStatut())) + .count(); + + // Calculer le délai moyen de traitement + long totalJours = demandes.stream() + .filter(d -> d.getDateDepot() != null && "APPROUVEE".equals(d.getStatut())) + .mapToLong(d -> ChronoUnit.DAYS.between(d.getDateDepot(), LocalDate.now())) + .sum(); + long countTraitees = demandes.stream() + .filter(d -> d.getDateDepot() != null && "APPROUVEE".equals(d.getStatut())) + .count(); + delaiMoyenTraitement = countTraitees > 0 ? (int) (totalJours / countTraitees) : 0; + // Initialiser les sous-listes demandesUrgentes = demandes.stream() .filter(d -> "URGENTE".equals(d.getPriorite()) || "EN_ATTENTE".equals(d.getStatut())) @@ -94,6 +99,11 @@ public class DemandesBean implements Serializable { .collect(Collectors.toList()); dernieresDemandes = demandes.stream() + .sorted((d1, d2) -> { + if (d1.getDateDepot() == null) return 1; + if (d2.getDateDepot() == null) return -1; + return d2.getDateDepot().compareTo(d1.getDateDepot()); + }) .limit(4) .collect(Collectors.toList()); } @@ -181,6 +191,8 @@ public class DemandesBean implements Serializable { public void actualiser() { LOGGER.info("Actualisation des données"); + initializeDemandes(); + calculerStatistiques(); } public void filtrerUrgentes() { diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/EvenementsBean.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/EvenementsBean.java index 7d6b3b7..bd01af2 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/EvenementsBean.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/EvenementsBean.java @@ -147,7 +147,7 @@ public class EvenementsBean implements Serializable { } catch (Exception e) { LOGGER.severe("Erreur lors du chargement des événements: " + e.getMessage()); - e.printStackTrace(); + LOGGER.log(java.util.logging.Level.SEVERE, "Détails de l'erreur de chargement des événements", e); tousLesEvenements = new ArrayList<>(); ajouterMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Erreur lors du chargement des événements: " + e.getMessage()); @@ -522,7 +522,7 @@ public class EvenementsBean implements Serializable { } catch (Exception e) { LOGGER.severe("Erreur lors de la création de l'événement: " + e.getMessage()); - e.printStackTrace(); + LOGGER.log(java.util.logging.Level.SEVERE, "Détails de l'erreur de création d'événement", e); ajouterMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Erreur lors de la création de l'événement: " + e.getMessage()); } diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/SuperAdminBean.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/SuperAdminBean.java index 9e30f23..535ec1b 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/SuperAdminBean.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/SuperAdminBean.java @@ -385,6 +385,51 @@ public class SuperAdminBean implements Serializable { public int getUtilisateursActifs() { return utilisateursActifs; } public void setUtilisateursActifs(int utilisateursActifs) { this.utilisateursActifs = utilisateursActifs; } + /** + * Calcule les pourcentages pour les progress bars (jauges) basés sur des objectifs réalistes + */ + private void calculerPourcentagesJauges() { + // Objectif : 1000 membres (100%) + int objectifMembres = 1000; + pourcentageMembres = totalMembres > 0 ? Math.min(100, (totalMembres * 100) / objectifMembres) : 0; + + // Objectif : 50 organisations (100%) + int objectifOrganisations = 50; + pourcentageOrganisations = totalEntites > 0 ? Math.min(100, (totalEntites * 100) / objectifOrganisations) : 0; + + // Objectif : 10 000 000 FCFA de revenus (100%) + // Pour l'instant, si revenus = 0, on met 0% + try { + String revenusStr = revenusGlobaux.replaceAll("[^0-9]", ""); + if (!revenusStr.isEmpty()) { + long revenusLong = Long.parseLong(revenusStr); + long objectifRevenus = 10_000_000L; // 10 millions FCFA + pourcentageRevenus = revenusLong > 0 ? Math.min(100, (int) ((revenusLong * 100) / objectifRevenus)) : 0; + } else { + pourcentageRevenus = 0; + } + } catch (Exception e) { + pourcentageRevenus = 0; + } + + // Objectif : 100 activités journalières (100%) + int objectifActivite = 100; + pourcentageActivite = activiteJournaliere > 0 ? Math.min(100, (activiteJournaliere * 100) / objectifActivite) : 0; + } + + // Getters pour les pourcentages des jauges + public int getPourcentageMembres() { return pourcentageMembres; } + public void setPourcentageMembres(int pourcentageMembres) { this.pourcentageMembres = pourcentageMembres; } + + public int getPourcentageOrganisations() { return pourcentageOrganisations; } + public void setPourcentageOrganisations(int pourcentageOrganisations) { this.pourcentageOrganisations = pourcentageOrganisations; } + + public int getPourcentageRevenus() { return pourcentageRevenus; } + public void setPourcentageRevenus(int pourcentageRevenus) { this.pourcentageRevenus = pourcentageRevenus; } + + public int getPourcentageActivite() { return pourcentageActivite; } + public void setPourcentageActivite(int pourcentageActivite) { this.pourcentageActivite = pourcentageActivite; } + // Classes internes public static class Alerte { private UUID id; diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/audit/journal.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/audit/journal.xhtml index 1b0315a..f3296ba 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/audit/journal.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/audit/journal.xhtml @@ -23,14 +23,14 @@ - + + - + - - - + + @@ -39,32 +39,44 @@
- + + - - - + + + + + - + + - - - + + + + + - + + - - - + + + + + - + + - - - + + + + +
@@ -181,7 +193,7 @@ - +
@@ -258,12 +270,15 @@
- + + + + + + + + +
@@ -380,10 +395,12 @@ - + + + + + + @@ -423,14 +440,17 @@
- - + + + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/cotisations/gestion.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/cotisations/gestion.xhtml index fd62bce..0e37385 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/cotisations/gestion.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/cotisations/gestion.xhtml @@ -47,144 +47,83 @@
-
-
-
-
- Collecté ce mois -
- -
-
-
#{cotisationsGestionBean.montantCollecte}
- -
- - #{cotisationsGestionBean.progressionMensuelle}% de l'objectif -
-
-
-
+ + + + + + + + + + -
-
-
-
- Membres à jour -
- -
-
-
#{cotisationsGestionBean.membresAJour}
- -
- - #{cotisationsGestionBean.pourcentageMembresAJour}% conformes -
-
-
-
+ + + + + + + + + + + -
-
-
-
- En attente -
- -
-
-
#{cotisationsGestionBean.montantEnAttente}
-
- #{cotisationsGestionBean.nombreCotisationsEnAttente} cotisations -
-
- - À traiter rapidement -
-
-
-
+ + + + + + + + + + + + -
-
-
-
- Impayés -
- -
-
-
#{cotisationsGestionBean.montantImpayes}
-
- #{cotisationsGestionBean.joursRetardMoyen}j de retard moy. -
-
- - Action requise -
-
-
-
+ + + + + + + + + + + + -
-
-
-
- Revenus 2024 -
- -
-
-
#{cotisationsGestionBean.revenus2024}
-
- - #{cotisationsGestionBean.croissanceAnnuelle} -
-
- Croissance annuelle -
-
-
-
+ + + + + + + + + + -
-
-
-
- Prélèvements Auto -
- -
-
-
#{cotisationsGestionBean.prelevementsActifs}
-
- #{cotisationsGestionBean.montantPrelevementsPrevu} FCFA/mois -
-
- - Automatique -
-
-
-
+ + + + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/demandes/gestion.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/demandes/gestion.xhtml index 838e30f..45939d6 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/demandes/gestion.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/demandes/gestion.xhtml @@ -10,127 +10,89 @@
- -
-
-
-

- - Gestion des Demandes d'Aide -

-

- Traitement et suivi des demandes d'assistance • - #{demandeBean.demandes.size()} demandes • - #{demandeBean.enAttente} en attente -

-
-
- - - - - -
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +
-
-
-
-
- En Attente -
- -
-
-
#{demandeBean.enAttente}
-
- - +3 - depuis hier -
-
-
-
+ + + + + + + + + -
-
-
-
- Urgentes -
- -
-
-
#{demandeBean.urgentes}
-
- -
-
33% du total
-
-
-
+ + + + + + + + + -
-
-
-
- Traitées -
- -
-
-
#{demandeBean.traitees}
-
- - 92% résolution -
-
-
-
+ + + + + + + + + -
-
-
-
- Délai Moyen -
- -
-
-
#{demandeBean.delaiMoyenTraitement} jours
-
- - -25% ce mois -
-
-
-
+ + + + + + + + +
- +
@@ -170,14 +132,22 @@
- - + + + + + + + + + + + + + + + +
@@ -186,10 +156,14 @@
- + + + + + + + +
@@ -229,10 +203,14 @@
- + + + + + + + +
@@ -243,259 +221,306 @@ - -
-
-
- - Filtres et Recherche -
+ + + +
- -
- - - - -
- -
- - - - - - - - - - -
- -
- - - - - - - - - - - -
- -
- - - - - - - - - -
- - -
- - - - -
- -
- - +
+ + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + +
+ + + + + + + + + +
- -
+
+
- +
-
- - Toutes les Demandes -
-
- - - +
+ + Toutes les Demandes +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
-
- - - - - - - - - - -
-
- #{demande.initialesDemandeur} + + + + + + + + + + +
+
+ #{demande.initialesDemandeur} +
+
+
#{demande.nomCompletDemandeur}
+ #{demande.numeroMembre} • #{demande.telephoneDemandeur} +
-
-
#{demande.nomCompletDemandeur}
- #{demande.numeroMembre} • #{demande.telephoneDemandeur} + + + +
+
+ +
+ #{demande.type}
-
-
- - -
-
- + + + + + + + + + + + + + + + +
+
+ + + +
+ #{demande.heureDepot}
- #{demande.type} -
- - - - - - - - - - - - - - - -
-
- - - + + + +
+
+ + + +
+ #{demande.dateDepotRelative}
- #{demande.heureDepot} -
- - - -
-
- - - + + + + + Non assignée + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
- #{demande.dateDepotRelative} -
- - - - - Non assignée - - - -
- - - - - - -
-
- + +
- - - - - -
+ + + + + + + + +
+ placeholder="Rechercher un membre..." + styleClass="w-full">
- - - - - - - - - - + + + + + + + + + + + + + + +
- - + + + + + + +
- - - - - - - + + + + + + + + + + +
- - + + + + +
- - - - - + + + + + + + + +
- - + + + + + + +
@@ -579,47 +628,59 @@ sizeLimit="5000000" fileLimit="5" />
- -
- - -
- - + + + + + + + + + + + + + + + + + + + - - - -
+ + + + + + + + +
- - - - - + + + + + + + + + +
- - + + + + + + +
@@ -629,23 +690,25 @@
- -
- - -
-
-
-
+ + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/evenements/gestion.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/evenements/gestion.xhtml index e39e156..fe62f42 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/evenements/gestion.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/evenements/gestion.xhtml @@ -47,85 +47,51 @@
-
-
-
-
- Total Événements -
- -
-
-
#{evenementsBean.statistiques.totalEvenements}
-
- - +#{evenementsBean.statistiques.evenementsCeMois} - ce mois -
-
-
-
+ + + + + + + + + + -
-
-
-
- Événements Actifs -
- -
-
-
#{evenementsBean.statistiques.evenementsActifs}
- -
#{evenementsBean.statistiques.tauxParticipationMoyen}% de participation
-
-
-
+ + + + + + + + + -
-
-
-
- Participants -
- -
-
-
#{evenementsBean.statistiques.participantsTotal}
-
- Moyenne: #{evenementsBean.statistiques.moyenneParticipants}/événement -
-
-
-
+ + + + + + + + + + -
-
-
-
- Budget Total -
- -
-
-
#{evenementsBean.statistiques.budgetTotal}
-
- - Suivi budgétaire optimal -
-
-
-
+ + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/finance/caisse.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/finance/caisse.xhtml index 126d3d8..7f9c9f5 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/finance/caisse.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/finance/caisse.xhtml @@ -41,66 +41,42 @@
-
-
-
-
-
-
#{caisseBean.soldePrincipal}
-
Solde Principal
-
-
- -
-
-
-
+
+ + + + + + + + -
-
-
-
-
#{caisseBean.totalEntrees}
-
Entrées (30j)
-
-
- -
-
-
-
+ + + + + + + + -
-
-
-
-
#{caisseBean.totalSorties}
-
Sorties (30j)
-
-
- -
-
-
-
+ + + + + + + + -
-
-
-
-
#{caisseBean.soldeWaveMoney}
-
Wave Money
-
-
- -
-
-
-
+ + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/finances.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/finances.xhtml index e1a4786..9cfb019 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/finances.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/finances.xhtml @@ -77,53 +77,46 @@ -
-
-
-
Revenus Totaux
-
#{rapportBean.revenusTotaux}
-
- - +#{rapportBean.croissanceRevenus}% - vs période précédente -
-
-
+
+ + + + + + + + + -
-
-
Dépenses Totales
-
#{rapportBean.depensesTotales}
-
- - +#{rapportBean.croissanceDepenses}% - vs période précédente -
-
-
+ + + + + + + + + -
-
-
Bénéfice Net
-
#{rapportBean.beneficeNet}
-
- -
-
-
+ + + + + + + + -
-
-
Trésorerie
-
#{rapportBean.tresorerie}
-
- - #{rapportBean.joursAutonomie} jours d'autonomie -
-
-
+ + + + + + + + + +
@@ -309,31 +302,42 @@
Indicateurs Clés de Performance
-
-
-
-
#{rapportBean.tauxRecouvrement}%
-
Taux de Recouvrement
-
-
-
-
-
#{rapportBean.ratioCouverture}
-
Ratio de Couverture
-
-
-
-
-
#{rapportBean.coutMoyenMembre}
-
Coût Moyen/Membre
-
-
-
-
-
#{rapportBean.revenuMoyenMembre}
-
Revenu Moyen/Membre
-
-
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/statistiques.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/statistiques.xhtml index ce3831f..1ce4092 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/statistiques.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/admin/rapports/statistiques.xhtml @@ -377,26 +377,18 @@ Indicateurs Clés de Performance -
+
-
-
-
-
- - #{kpi.libelle} -
-
#{kpi.valeur}
-
-
- -
- - #{kpi.variation}% -
-
-
-
+ + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/dashboard.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/dashboard.xhtml index 21253b4..28b03b8 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/dashboard.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/dashboard.xhtml @@ -130,100 +130,50 @@
-
-
-
-
- Communauté -
#{dashboardBean.activeMembers}
- Membres actifs -
-
- -
-
-
- - +#{dashboardBean.membresEvolutionPourcent}% - ce mois -
- -
-
+ + + + + + + + + -
-
-
-
- Trésorerie -
#{dashboardBean.totalCotisations}
- FCFA collectés -
-
- -
-
-
- - +#{dashboardBean.cotisationsEvolutionPourcent}% - vs mois dernier -
- -
-
+ + + + + + + + + -
-
-
-
- Solidarité -
#{dashboardBean.aidesDistribuees}
- FCFA distribués -
-
- -
-
-
-
- #{dashboardBean.pendingAides} - demandes en attente -
- -
-
+ + + + + + + + + + -
-
-
-
- Engagement -
#{dashboardBean.tauxParticipation}%
- Taux de participation -
-
- -
-
-
- - #{dashboardBean.upcomingEvents} - événements prévus -
- -
-
+ + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/cotisations.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/cotisations.xhtml index a6b28ed..092270b 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/cotisations.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/cotisations.xhtml @@ -43,62 +43,45 @@
-
-
-
-
-
#{membreCotisationBean.cotisationsPayees}
-
Payées
-
-
- -
-
-
-
-
-
-
-
-
#{membreCotisationBean.cotisationsEnAttente}
-
En Attente
-
-
- -
-
-
-
-
-
-
-
-
#{membreCotisationBean.montantDu}
-
Montant Dû
-
-
- -
-
-
-
-
-
-
-
-
#{membreCotisationBean.totalVerse}
-
Total Versé
-
-
- -
-
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@@ -127,11 +110,14 @@
- + + + + + + + + diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/inscription.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/inscription.xhtml index 1148118..3edd864 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/inscription.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/inscription.xhtml @@ -378,16 +378,15 @@
- + + + + + + + + + diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/liste.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/liste.xhtml index aeea54f..745098e 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/liste.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/liste.xhtml @@ -155,11 +155,15 @@
- + + + + + + + + +
@@ -278,7 +282,7 @@ - + @@ -322,7 +326,7 @@ - + @@ -422,7 +426,7 @@ - +
@@ -478,7 +482,7 @@ - + @@ -521,7 +525,7 @@ - + @@ -634,14 +638,14 @@ - + - +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/profil.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/profil.xhtml index dcc85da..744e8f6 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/profil.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/profil.xhtml @@ -17,23 +17,15 @@
-
- -
- #{membreProfilBean.membre.initiales} -
-
- - - + + + + + + + + +
@@ -47,10 +39,11 @@
-
- Numéro membre: - #{membreProfilBean.membre.numeroMembre} -
+ + + + +
Type:
-
- Entité: - #{membreProfilBean.membre.entite} -
+ + + +
-
- Adhésion: - #{membreProfilBean.membre.dateAdhesion} - (#{membreProfilBean.membre.anciennete}) -
+ + + + +
Cotisations: #{membreProfilBean.membre.cotisationStatut}
-
- Participation: - #{membreProfilBean.membre.tauxParticipation}% -
+ + + + +
@@ -118,65 +112,45 @@
-
-
-
-
-
#{membreProfilBean.statistiques.evenementsParticipes}
-
Événements
-
-
- -
-
-
-
+ + + + + + + + + -
-
-
-
-
#{membreProfilBean.statistiques.cotisationsPayees}
-
Cotisations
-
-
- -
-
-
-
+ + + + + + + + + -
-
-
-
-
#{membreProfilBean.statistiques.aidesRecues}
-
Aides reçues
-
-
- -
-
-
-
+ + + + + + + + + -
-
-
-
-
#{membreProfilBean.statistiques.scoreEngagement}
-
Score engagement
-
-
- -
-
-
-
+ + + + + + + + +
@@ -188,52 +162,52 @@
Informations de base
-
- Nom complet: - #{membreProfilBean.membre.nomComplet} -
-
- Date de naissance: - #{membreProfilBean.membre.dateNaissance} -
-
- Genre: - #{membreProfilBean.membre.genre} -
-
- Situation familiale: - #{membreProfilBean.membre.situationFamiliale} -
-
- Profession: - #{membreProfilBean.membre.profession} -
+ + + + + + + + + + + + + + + + + + + +
Coordonnées
-
- Email: - #{membreProfilBean.membre.email} -
-
- Téléphone: - #{membreProfilBean.membre.telephone} -
-
- Adresse: - #{membreProfilBean.membre.adresse} -
-
- Ville: - #{membreProfilBean.membre.ville} -
-
- Pays: - #{membreProfilBean.membre.pays} -
+ + + + + + + + + + + + + + + + + + + +
@@ -272,20 +246,20 @@
-
- Dernier paiement: - #{membreProfilBean.cotisations.dernierPaiement} -
-
- Prochaine échéance: - - #{membreProfilBean.cotisations.prochaineEcheance} - -
-
- Total payé cette année: - #{membreProfilBean.cotisations.totalAnnee} -
+ + + + + + + + + + + + + +
@@ -363,29 +337,31 @@
Statistiques participation
-
- Taux de participation: - #{membreProfilBean.statistiques.tauxParticipation}% -
+ + + + + -
- Cette année: - #{membreProfilBean.statistiques.evenementsAnnee} -
-
- Total: - #{membreProfilBean.statistiques.evenementsTotal} -
-
- En tant qu'organisateur: - #{membreProfilBean.statistiques.evenementsOrganises} -
-
- Absences: - #{membreProfilBean.statistiques.absences} -
+ + + + + + + + + + + + + + + + +
@@ -554,7 +530,7 @@ - + @@ -570,20 +546,24 @@
-
- - -
+ + + + + + -
- - -
+ + + + + + +
- + @@ -592,14 +572,18 @@
- - + + + + + + + + + + + +
@@ -609,46 +593,65 @@
- + + + + + + + + - + + + + + + + - + + + + + + + - + + + + + + + - + + + + + + + + - + + + + + + + +
- + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/recherche.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/recherche.xhtml index 6f647ed..06f42d2 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/recherche.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/membre/recherche.xhtml @@ -36,32 +36,44 @@
- + + - - - + + + + + - + + - - - + + + + + - + + - - - + + + + + - + + - - - + + + + +
@@ -325,7 +337,7 @@ - + @@ -389,14 +401,14 @@
Liste des membres
- + + - + - - - + + @@ -572,7 +584,7 @@ - + @@ -622,7 +634,7 @@ - + @@ -685,7 +697,7 @@ - + diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/activites.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/activites.xhtml index 611ee29..b31eb48 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/activites.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/activites.xhtml @@ -57,23 +57,18 @@
Indicateurs d'Activité
-
+
-
-
-
-
- - #{kpi.libelle} -
-
-
#{kpi.valeur}
-
- - #{kpi.variation}% -
-
-
+ + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/finances.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/finances.xhtml index 2880ee1..d673177 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/finances.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/finances.xhtml @@ -150,23 +150,18 @@
Indicateurs Clés de Performance
-
+
-
-
-
-
- - #{kpi.libelle} -
-
-
#{kpi.valeur}
-
- - #{kpi.variation}% -
-
-
+ + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/membres.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/membres.xhtml index 8bb0f35..7ede3e7 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/membres.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/rapport/membres.xhtml @@ -38,19 +38,23 @@ -
- +
+ + - - - + + + + - + + - - - + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/configuration/systeme.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/configuration/systeme.xhtml index 915b466..702409e 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/configuration/systeme.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/configuration/systeme.xhtml @@ -47,88 +47,51 @@
-
-
-
-
- Statut Système -
- -
-
-
Opérationnel
-
-
- Uptime - #{configurationBean.tempsActivite} -
-
-
-
+ + + + + + + + + + -
-
-
-
- Utilisateurs Actifs -
- -
-
-
#{configurationBean.utilisateursConnectes}
-
- - Sessions - #{configurationBean.sessionsActives} actives -
-
-
-
+ + + + + + + + + + -
-
-
-
- Performance -
- -
-
-
CPU #{configurationBean.cpuUtilisation}%
- -
Mémoire: #{configurationBean.memoireUtilisee}%
-
-
-
+ + + + + + + + + -
-
-
-
- Dernière Sauvegarde -
- -
-
-
#{configurationBean.derniereSauvegarde}
-
- - Auto - #{configurationBean.frequenceSauvegarde} -
-
-
-
+ + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/dashboard.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/dashboard.xhtml index 978607b..2cc2888 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/dashboard.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/dashboard.xhtml @@ -48,116 +48,51 @@
-
-
-
-
- Membres Actifs -
- -
-
-
#{superAdminBean.totalMembres}
-
- - +#{superAdminBean.croissanceMembres}% - ce mois -
-
- Données non disponibles -
- -
-
-
+ + + + + + + + + -
-
-
-
- Organisations -
- -
-
-
#{superAdminBean.totalEntites}
-
- - +#{superAdminBean.nouvellesEntites} - nouvelles -
-
- Aucune nouvelle entité ce mois -
- -
-
-
+ + + + + + + + + + + -
-
-
-
- Revenus (FCFA) -
- -
-
-
#{superAdminBean.revenusGlobaux}
-
- - +#{superAdminBean.croissanceRevenus}% - vs mois dernier -
-
- Données non disponibles -
- -
-
-
+ + + + + + + + + -
-
-
-
- Activité du Jour -
- -
-
-
#{superAdminBean.activiteJournaliere}
-
-
- En ligne - #{superAdminBean.utilisateursActifs} actifs -
-
- Aucun utilisateur actif -
- -
-
-
+ + + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/entites/gestion.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/entites/gestion.xhtml index 4e7fb08..609aedc 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/entites/gestion.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/entites/gestion.xhtml @@ -46,85 +46,50 @@
-
-
-
-
- Total Entités -
- -
-
-
#{entitesGestionBean.statistiques.totalEntites}
-
- - +8 - ce mois -
-
-
-
+ + + + + + + + + + -
-
-
-
- Entités Actives -
- -
-
-
#{entitesGestionBean.statistiques.entitesActives}
- -
92% d'activité
-
-
-
+ + + + + + + + + -
-
-
-
- Total Membres -
- -
-
-
#{entitesGestionBean.statistiques.totalMembres}
-
- Moyenne: #{entitesGestionBean.statistiques.moyenneMembresParEntite}/entité -
-
-
-
+ + + + + + + + + + -
-
-
-
- Revenus Totaux -
- -
-
-
#{entitesGestionBean.statistiques.revenus}
-
- - +15% vs année dernière -
-
-
-
+ + + + + + + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-info.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-info.xhtml index 107b950..f97d8a5 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-info.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-info.xhtml @@ -10,15 +10,34 @@ - + + + + + + - + + + + + + diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-secondary.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-secondary.xhtml index 71b9731..8822b27 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-secondary.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/templates/components/buttons/button-secondary.xhtml @@ -21,15 +21,32 @@ - + + + + + + - + + + + + + - + + + + + + - - + + + + + + + + diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/application-prod.properties b/unionflow-client-quarkus-primefaces-freya/src/main/resources/application-prod.properties index 4db1e6d..a71b3df 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/application-prod.properties +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/application-prod.properties @@ -1,14 +1,101 @@ -# Configuration UnionFlow Client - Profil Production -# Ce fichier est chargé automatiquement quand le profil 'prod' est actif +# Configuration UnionFlow Client - PRODUCTION +# Ce fichier est utilisé avec le profil Quarkus "prod" -# Configuration logging pour production -quarkus.log.console.level=WARN +# Configuration HTTP +quarkus.http.port=8086 +quarkus.http.host=0.0.0.0 +quarkus.http.root-path=/ +quarkus.http.so-reuse-port=true +quarkus.http.tcp-quick-ack=true +quarkus.http.tcp-cork=true -# Configuration MyFaces pour production +# Configuration Session HTTP - Production +quarkus.http.session-timeout=60m +quarkus.http.session-cookie-same-site=strict +quarkus.http.session-cookie-http-only=true +quarkus.http.session-cookie-secure=true + +# Configuration logging - Production +quarkus.log.console.enable=true +quarkus.log.console.level=INFO +quarkus.log.console.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{2.}] (%t) %s%e%n +quarkus.log.category."dev.lions.unionflow".level=INFO +quarkus.log.category."org.primefaces".level=WARN +quarkus.log.category."org.apache.myfaces".level=WARN + +# MyFaces Configuration - Production quarkus.myfaces.project-stage=Production -quarkus.myfaces.serialize-state-in-session=true +quarkus.myfaces.state-saving-method=server +quarkus.myfaces.number-of-views-in-session=50 +quarkus.myfaces.number-of-sequential-views-in-session=10 +quarkus.myfaces.serialize-state-in-session=false +quarkus.myfaces.client-view-state-timeout=3600000 +quarkus.myfaces.view-expired-exception-handler-redirect-page=/ +quarkus.myfaces.check-id-production-mode=true +quarkus.myfaces.strict-xhtml-links=true +quarkus.myfaces.refresh-transient-build-on-pss=true +quarkus.myfaces.resource-max-time-expires=604800000 +quarkus.myfaces.resource-buffer-size=2048 -# Configuration Keycloak pour production -%prod.quarkus.oidc.tls.verification=required -%prod.quarkus.oidc.authentication.redirect-path=/auth/callback +# PrimeFaces Configuration - Production +primefaces.THEME=none +primefaces.FONT_AWESOME=true +primefaces.CLIENT_SIDE_VALIDATION=true +primefaces.MOVE_SCRIPTS_TO_BOTTOM=true +primefaces.CSP=true +primefaces.UPLOADER=commons +primefaces.AUTO_UPDATE=false +primefaces.CACHE_PROVIDER=org.primefaces.cache.DefaultCacheProvider +primefaces.RESOURCE_HANDLER=org.primefaces.application.resource.PrimeResourceHandler +# OmniFaces Configuration - Production +omnifaces.CDN_RESOURCE_HANDLER_DISABLED=true +omnifaces.COMBINED_RESOURCE_HANDLER_DISABLED=false + +# Configuration Backend UnionFlow - Production +unionflow.backend.url=${UNIONFLOW_BACKEND_URL:https://api.lions.dev/unionflow} + +# Configuration REST Client - Production +quarkus.rest-client."unionflow-api".url=${unionflow.backend.url} +quarkus.rest-client."unionflow-api".scope=jakarta.inject.Singleton +quarkus.rest-client."unionflow-api".connect-timeout=5000 +quarkus.rest-client."unionflow-api".read-timeout=30000 +quarkus.rest-client."unionflow-api".providers=dev.lions.unionflow.client.service.RestClientExceptionMapper,dev.lions.unionflow.client.security.JwtClientRequestFilter + +# Configuration Keycloak OIDC - Production +quarkus.oidc.enabled=true +quarkus.oidc.auth-server-url=${KEYCLOAK_AUTH_SERVER_URL:https://security.lions.dev/realms/unionflow} +quarkus.oidc.client-id=unionflow-client +quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET} +quarkus.oidc.application-type=web-app +quarkus.oidc.authentication.redirect-path=/auth/callback +quarkus.oidc.authentication.restore-path-after-redirect=true +quarkus.oidc.authentication.scopes=openid,profile,email,roles +quarkus.oidc.token.issuer=https://security.lions.dev/realms/unionflow +quarkus.oidc.tls.verification=required +quarkus.oidc.authentication.cookie-same-site=strict +quarkus.oidc.authentication.java-script-auto-redirect=false +quarkus.oidc.discovery-enabled=true +quarkus.oidc.verify-access-token=true + +# Activation de la sécurité +quarkus.security.auth.enabled=true + +# Chemins publics (non protégés par OIDC) - Production +quarkus.http.auth.permission.public.paths=/,/index.xhtml,/pages/public/*,/auth/*,/q/*,/q/oidc/*,/favicon.ico,/resources/*,/META-INF/resources/*,/images/*,/jakarta.faces.resource/*,/javax.faces.resource/* +quarkus.http.auth.permission.public.policy=permit + +# Tous les autres chemins nécessitent une authentification +quarkus.http.auth.permission.authenticated.paths=/* +quarkus.http.auth.permission.authenticated.policy=authenticated + +# Configuration Session - Production +unionflow.session.timeout=${SESSION_TIMEOUT:1800} +unionflow.session.remember-me.duration=${REMEMBER_ME_DURATION:604800} + +# Configuration de sécurité - Production +unionflow.security.enable-csrf=${ENABLE_CSRF:true} +unionflow.security.password.min-length=${PASSWORD_MIN_LENGTH:8} +unionflow.security.password.require-special-chars=${PASSWORD_REQUIRE_SPECIAL:true} +unionflow.security.max-login-attempts=${MAX_LOGIN_ATTEMPTS:5} +unionflow.security.lockout-duration=${LOCKOUT_DURATION:300} diff --git a/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchResultDTO.java b/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchResultDTO.java index 5f5c7c1..f515deb 100644 --- a/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchResultDTO.java +++ b/unionflow-server-api/src/main/java/dev/lions/unionflow/server/api/dto/membre/MembreSearchResultDTO.java @@ -1,5 +1,6 @@ package dev.lions.unionflow.server.api.dto.membre; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; @@ -56,10 +57,12 @@ public class MembreSearchResultDTO { /** Indique si c'est la première page */ @Schema(description = "Indique si c'est la première page") + @JsonProperty("isFirst") private boolean isFirst; /** Indique si c'est la dernière page */ @Schema(description = "Indique si c'est la dernière page") + @JsonProperty("isLast") private boolean isLast; /** Critères de recherche utilisés */ @@ -181,19 +184,42 @@ public class MembreSearchResultDTO { * @return Résultat vide */ public static MembreSearchResultDTO empty(MembreSearchCriteria criteria) { + return empty(criteria, 20, 0); + } + + /** + * Factory method pour créer un résultat vide avec pageSize spécifique + * + * @param criteria Critères de recherche + * @param pageSize Taille de la page + * @param currentPage Page actuelle + * @return Résultat vide + */ + public static MembreSearchResultDTO empty(MembreSearchCriteria criteria, int pageSize, int currentPage) { MembreSearchResultDTO result = new MembreSearchResultDTO(); result.setMembres(List.of()); result.setTotalElements(0L); result.setTotalPages(0); - result.setCurrentPage(0); - result.setPageSize(20); + result.setCurrentPage(currentPage); + result.setPageSize(pageSize); result.setNumberOfElements(0); result.setHasNext(false); result.setHasPrevious(false); - result.setFirst(true); - result.setLast(true); + result.isFirst = true; // Assignation directe pour éviter les problèmes avec les setters Lombok + result.isLast = true; // Assignation directe pour éviter les problèmes avec les setters Lombok result.setCriteria(criteria); result.setExecutionTimeMs(0L); + // Initialiser statistics avec des valeurs vides + result.setStatistics(SearchStatistics.builder() + .membresActifs(0) + .membresInactifs(0) + .ageMoyen(0.0) + .ageMin(0) + .ageMax(0) + .nombreOrganisations(0) + .nombreRegions(0) + .ancienneteMoyenne(0.0) + .build()); return result; } } diff --git a/unionflow-server-impl-quarkus/pom.xml b/unionflow-server-impl-quarkus/pom.xml index de27189..17babdc 100644 --- a/unionflow-server-impl-quarkus/pom.xml +++ b/unionflow-server-impl-quarkus/pom.xml @@ -216,6 +216,20 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + + false + false + + + + org.jacoco diff --git a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/BaseRepository.java b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/BaseRepository.java index 18a34b5..de2db0a 100644 --- a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/BaseRepository.java +++ b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/repository/BaseRepository.java @@ -78,6 +78,10 @@ public abstract class BaseRepository { */ @Transactional public void delete(T entity) { + // Si l'entité n'est pas dans le contexte de persistance, la merger d'abord + if (!entityManager.contains(entity)) { + entity = entityManager.merge(entity); + } entityManager.remove(entity); } @@ -90,7 +94,11 @@ public abstract class BaseRepository { public boolean deleteById(UUID id) { T entity = findById(id); if (entity != null) { - delete(entity); + // S'assurer que l'entité est dans le contexte de persistance + if (!entityManager.contains(entity)) { + entity = entityManager.merge(entity); + } + entityManager.remove(entity); return true; } return false; diff --git a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/resource/MembreResource.java b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/resource/MembreResource.java index b6e79c0..785ae61 100644 --- a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/resource/MembreResource.java +++ b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/resource/MembreResource.java @@ -360,7 +360,7 @@ public class MembreResource { public Response searchMembresAdvanced( @RequestBody( description = "Critères de recherche avancée", - required = true, + required = false, content = @Content( mediaType = MediaType.APPLICATION_JSON, @@ -632,7 +632,7 @@ public class MembreResource { List membres = membreService.listerMembresPourExport( associationId, statut, type, dateAdhesionDebut, dateAdhesionFin); - return Response.ok(membres.size()).build(); + return Response.ok(Map.of("count", membres.size())).build(); } catch (Exception e) { LOG.errorf(e, "Erreur lors du comptage des membres"); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) diff --git a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/service/MembreService.java b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/service/MembreService.java index 74d6cfb..375c844 100644 --- a/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/service/MembreService.java +++ b/unionflow-server-impl-quarkus/src/main/java/dev/lions/unionflow/server/service/MembreService.java @@ -345,7 +345,7 @@ public class MembreService { long totalElements = countQueryTyped.getSingleResult(); if (totalElements == 0) { - return MembreSearchResultDTO.empty(criteria); + return MembreSearchResultDTO.empty(criteria, page.size, page.index); } // Ajout du tri et pagination @@ -488,7 +488,10 @@ public class MembreService { } return sort.getColumns().stream() - .map(column -> "m." + column.getName() + " " + column.getDirection().name()) + .map(column -> { + String direction = column.getDirection() == Sort.Direction.Descending ? "DESC" : "ASC"; + return "m." + column.getName() + " " + direction; + }) .collect(Collectors.joining(", ")); } diff --git a/unionflow-server-impl-quarkus/src/main/resources/application-test.properties b/unionflow-server-impl-quarkus/src/main/resources/application-test.properties index b97f54f..173d6db 100644 --- a/unionflow-server-impl-quarkus/src/main/resources/application-test.properties +++ b/unionflow-server-impl-quarkus/src/main/resources/application-test.properties @@ -5,19 +5,27 @@ quarkus.datasource.db-kind=h2 quarkus.datasource.username=sa quarkus.datasource.password= -quarkus.datasource.jdbc.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 +quarkus.datasource.jdbc.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=PostgreSQL # Configuration Hibernate pour tests quarkus.hibernate-orm.database.generation=drop-and-create -# Désactiver l'exécution de import.sql pendant les tests -quarkus.hibernate-orm.sql-load-script= +# Désactiver complètement l'exécution des scripts SQL au démarrage +quarkus.hibernate-orm.sql-load-script-source=none +# Empêcher Hibernate d'exécuter les scripts SQL automatiquement +# Note: Ne pas définir quarkus.hibernate-orm.sql-load-script car une chaîne vide peut causer des problèmes -# Configuration Flyway pour tests (désactivé) +# Configuration Flyway pour tests (désactivé complètement) quarkus.flyway.migrate-at-start=false quarkus.flyway.enabled=false +quarkus.flyway.baseline-on-migrate=false +# Note: Ne pas définir quarkus.flyway.locations car une chaîne vide cause une erreur de configuration # Configuration Keycloak pour tests (désactivé) quarkus.oidc.tenant-enabled=false quarkus.keycloak.policy-enforcer.enable=false +# Configuration HTTP pour tests +quarkus.http.port=0 +quarkus.http.test-port=0 + diff --git a/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/resource/MembreResourceAdvancedSearchTest.java b/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/resource/MembreResourceAdvancedSearchTest.java index 9f4f8eb..1aeca82 100644 --- a/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/resource/MembreResourceAdvancedSearchTest.java +++ b/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/resource/MembreResourceAdvancedSearchTest.java @@ -104,6 +104,7 @@ class MembreResourceAdvancedSearchTest { void testAdvancedSearchPagination() { MembreSearchCriteria criteria = MembreSearchCriteria.builder() + .statut("ACTIF") // Ajouter un critère valide .includeInactifs(true) // Inclure tous les membres .build(); @@ -286,7 +287,11 @@ class MembreResourceAdvancedSearchTest { roles = {"SUPER_ADMIN"}) @DisplayName("POST /api/membres/search/advanced doit retourner des statistiques complètes") void testAdvancedSearchStatistics() { - MembreSearchCriteria criteria = MembreSearchCriteria.builder().includeInactifs(true).build(); + MembreSearchCriteria criteria = + MembreSearchCriteria.builder() + .statut("ACTIF") // Ajouter un critère valide + .includeInactifs(true) + .build(); given() .contentType(ContentType.JSON) diff --git a/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/service/MembreServiceAdvancedSearchTest.java b/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/service/MembreServiceAdvancedSearchTest.java index 3b98131..4d1eb4c 100644 --- a/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/service/MembreServiceAdvancedSearchTest.java +++ b/unionflow-server-impl-quarkus/src/test/java/dev/lions/unionflow/server/service/MembreServiceAdvancedSearchTest.java @@ -105,13 +105,21 @@ class MembreServiceAdvancedSearchTest { if (testMembres != null) { testMembres.forEach(membre -> { if (membre.getId() != null) { - membreRepository.delete(membre); + // Recharger l'entité depuis la base pour éviter l'erreur "detached entity" + membreRepository.findByIdOptional(membre.getId()).ifPresent(m -> { + // Utiliser deleteById pour éviter les problèmes avec les entités détachées + membreRepository.deleteById(m.getId()); + }); } }); } if (testOrganisation != null && testOrganisation.getId() != null) { - organisationRepository.delete(testOrganisation); + // Recharger l'entité depuis la base pour éviter l'erreur "detached entity" + organisationRepository.findByIdOptional(testOrganisation.getId()).ifPresent(o -> { + // Utiliser deleteById pour éviter les problèmes avec les entités détachées + organisationRepository.deleteById(o.getId()); + }); } }