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 - + + + + - - - Rechercher - - - - - - - Statut - - - - - - - - - - - - - Type - - - - - - - - - - - - - - Priorité - - - - - - - - - - - - - Date - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - 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 - - - - - - - - - - - - - + + - - - - - - + + + + + + + + + Demandeur * + placeholder="Rechercher un membre..." + styleClass="w-full"> - Type de demande * - - - - - - - - - + + + + + + + + + + + + + + + - Objet * - + + + + + + + - Priorité - - - - - - + + + + + + + + + + + - Date d'échéance - + + + + + - Assigner à - - - - + + + + + + + + + - Description détaillée - + + + + + + + @@ -579,47 +628,59 @@ sizeLimit="5000000" fileLimit="5" /> - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + - Assigner à * - - - - + + + + + + + + + + - Commentaire - + + + + + + + @@ -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 @@ Actualiser - + + + + + + + + + @@ -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()); + }); } }
- Traitement et suivi des demandes d'assistance • - #{demandeBean.demandes.size()} demandes • - #{demandeBean.enAttente} en attente -