diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/dto/AssociationDTO.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/dto/AssociationDTO.java index df1ad39..12be9e5 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/dto/AssociationDTO.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/dto/AssociationDTO.java @@ -2,6 +2,7 @@ package dev.lions.unionflow.client.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import java.time.LocalDate; @@ -9,6 +10,14 @@ import java.time.LocalDateTime; import java.io.Serializable; import java.util.UUID; +/** + * DTO client pour les organisations (alias historique Association). + * + * Harmonisé avec le contrat serveur `OrganisationDTO`: + * - `dateCreation`/`dateModification` d'audit (LocalDateTime) alignés sur BaseDTO avec pattern JSON + * - `dateFondation` (LocalDate) pour la date de création fonctionnelle de l'organisation + */ +@JsonIgnoreProperties(ignoreUnknown = true) public class AssociationDTO implements Serializable { private static final long serialVersionUID = 1L; @@ -28,9 +37,13 @@ public class AssociationDTO implements Serializable { @JsonProperty("typeOrganisation") private String typeAssociation; + // Date de fondation (fonctionnelle), côté serveur: OrganisationDTO.dateFondation + @JsonProperty("dateFondation") @JsonFormat(pattern = "yyyy-MM-dd") - private LocalDate dateCreation; + private LocalDate dateFondation; + // Côté serveur: OrganisationDTO.numeroEnregistrement + @JsonProperty("numeroEnregistrement") private String numeroRegistre; private String statut; private Integer nombreMembres; @@ -40,11 +53,23 @@ public class AssociationDTO implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime dateDerniereActivite; + + // Champs d'audit issus de BaseDTO (côté serveur) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime dateCreation; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime dateModification; + + private Long version; + private Boolean actif; private String region; private String ville; private String quartier; private String pays; + // Aligné sur OrganisationDTO.codePostal + private String codePostal; // Constructeurs public AssociationDTO() {} @@ -53,7 +78,7 @@ public class AssociationDTO implements Serializable { this.nom = nom; this.typeAssociation = typeAssociation; this.statut = "ACTIVE"; - this.dateCreation = LocalDate.now(); + this.dateFondation = LocalDate.now(); this.nombreMembres = 0; } @@ -82,8 +107,8 @@ public class AssociationDTO implements Serializable { public String getTypeAssociation() { return typeAssociation; } public void setTypeAssociation(String typeAssociation) { this.typeAssociation = typeAssociation; } - public LocalDate getDateCreation() { return dateCreation; } - public void setDateCreation(LocalDate dateCreation) { this.dateCreation = dateCreation; } + public LocalDate getDateFondation() { return dateFondation; } + public void setDateFondation(LocalDate dateFondation) { this.dateFondation = dateFondation; } public String getNumeroRegistre() { return numeroRegistre; } public void setNumeroRegistre(String numeroRegistre) { this.numeroRegistre = numeroRegistre; } @@ -117,6 +142,21 @@ public class AssociationDTO implements Serializable { public String getPays() { return pays; } public void setPays(String pays) { this.pays = pays; } + + public String getCodePostal() { return codePostal; } + public void setCodePostal(String codePostal) { this.codePostal = codePostal; } + + public LocalDateTime getDateCreation() { return dateCreation; } + public void setDateCreation(LocalDateTime dateCreation) { this.dateCreation = dateCreation; } + + public LocalDateTime getDateModification() { return dateModification; } + public void setDateModification(LocalDateTime dateModification) { this.dateModification = dateModification; } + + public Long getVersion() { return version; } + public void setVersion(Long version) { this.version = version; } + + public Boolean getActif() { return actif; } + public void setActif(Boolean actif) { this.actif = actif; } // Propriétés dérivées public String getTypeLibelle() { diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/AssociationService.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/AssociationService.java index a128608..bcbb5cf 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/AssociationService.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/service/AssociationService.java @@ -54,15 +54,13 @@ public interface AssociationService { @Path("/{id}") void supprimer(@PathParam("id") UUID id); - @PUT + // Côté serveur: POST /{id}/activer + @POST @Path("/{id}/activer") AssociationDTO activer(@PathParam("id") UUID id); - @PUT - @Path("/{id}/desactiver") - AssociationDTO desactiver(@PathParam("id") UUID id); - - @PUT + // Suspension: POST /{id}/suspendre (alias historique "désactiver") + @POST @Path("/{id}/suspendre") AssociationDTO suspendre(@PathParam("id") UUID id); diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/OrganisationsBean.java b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/OrganisationsBean.java index 994a35c..c0eae32 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/OrganisationsBean.java +++ b/unionflow-client-quarkus-primefaces-freya/src/main/java/dev/lions/unionflow/client/view/OrganisationsBean.java @@ -104,6 +104,18 @@ public class OrganisationsBean implements Serializable { .count(); organisationsInactives = totalOrganisations - organisationsActives; } + } catch (dev.lions.unionflow.client.service.RestClientExceptionMapper.UnauthorizedException e) { + // Non bloquant: afficher une info et calculer depuis la liste + LOGGER.warning("Statistiques non autorisées (401): " + e.getMessage()); + FacesContext.getCurrentInstance().addMessage(null, + new FacesMessage(FacesMessage.SEVERITY_INFO, + "Information", + "Statistiques indisponibles (non autorisé) — affichage des données sans stats.")); + totalOrganisations = organisations.size(); + organisationsActives = organisations.stream() + .filter(o -> o.getStatut() != null && StatutOrganisationConstants.ACTIVE.equals(o.getStatut())) + .count(); + organisationsInactives = totalOrganisations - organisationsActives; } catch (Exception e) { LOGGER.warning("Impossible de charger les statistiques: " + e.getMessage()); // Fallback: calculer depuis la liste @@ -118,8 +130,23 @@ public class OrganisationsBean implements Serializable { public void preparerNouvelleOrganisation() { nouvelleOrganisation = new AssociationDTO(); nouvelleOrganisation.setStatut(StatutOrganisationConstants.ACTIVE); - nouvelleOrganisation.setTypeAssociation("ASSOCIATION"); - nouvelleOrganisation.setDateCreation(java.time.LocalDate.now()); + + // S'assurer que le catalogue des types est chargé avant d'initialiser le formulaire + if (typesCatalogue == null || typesCatalogue.isEmpty()) { + chargerTypesOrganisation(); + } + + // Déterminer un type par défaut dynamique (premier type actif du catalogue) + String typeDefaut = null; + if (typesCatalogue != null) { + typeDefaut = typesCatalogue.stream() + .filter(t -> t.getActif() == null || Boolean.TRUE.equals(t.getActif())) + .map(TypeOrganisationClientDTO::getCode) + .findFirst() + .orElse(null); + } + nouvelleOrganisation.setTypeAssociation(typeDefaut); + nouvelleOrganisation.setDateFondation(java.time.LocalDate.now()); } public void creerOrganisation() { @@ -207,7 +234,7 @@ public class OrganisationsBean implements Serializable { public void desactiverOrganisation(AssociationDTO organisation) { try { - associationService.desactiver(organisation.getId()); + associationService.suspendre(organisation.getId()); organisation.setStatut(StatutOrganisationConstants.INACTIVE); FacesContext.getCurrentInstance().addMessage(null, @@ -277,6 +304,14 @@ public class OrganisationsBean implements Serializable { organisationsFiltrees = organisations; } + /** + * Recharge la liste et les statistiques (DRY) + */ + public void recharger() { + chargerOrganisations(); + chargerStatistiques(); + } + // Getters & Setters public List getOrganisations() { return organisations; } public void setOrganisations(List organisations) { this.organisations = organisations; } diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/organisation/liste.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/organisation/liste.xhtml index 8ac277d..1289c3a 100644 --- a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/organisation/liste.xhtml +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/secure/organisation/liste.xhtml @@ -144,7 +144,7 @@ -
- - - - - - -
-
- - - - - - - -
-
- - - - - - -
-
- - - - - -
-
- - - - - - -
-
- - - - - -
-
- - - - - -
-
- - - - - - -
+ + + +
-
- - - - - - -
-
- - - - - - -
-
- - - - - -
-
- - - - - - -
-
- - - - - -
-
- - - - - - -
+ + + +
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/organisations.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/organisations.xhtml new file mode 100644 index 0000000..c289142 --- /dev/null +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/pages/super-admin/organisations.xhtml @@ -0,0 +1,212 @@ + + + + Gestion des Organisations + + + + + +
+
+
+
Organisations
+ + CRUD complet des organisations. Respect DRY/WOU: composants réutilisés et simplicité. + +
+
+ + +
+
+
+ + +
+ + Total + + +
+
+ + Actives + + +
+
+ + Inactives + + +
+
+ +
+
+
+ + + +
+
+ + + + +
+
+ + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/ui/includes/organisation-form.xhtml b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/ui/includes/organisation-form.xhtml new file mode 100644 index 0000000..fe6ba95 --- /dev/null +++ b/unionflow-client-quarkus-primefaces-freya/src/main/resources/META-INF/resources/ui/includes/organisation-form.xhtml @@ -0,0 +1,101 @@ + + + + +
+
+ +
+ + + +
+ + +
+ + + + + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+ +