feat: PHASE 1 - Adresses et Rôles/Permissions
PHASE 1.1 - Entité Adresse: - Création entité Adresse avec types (SIEGE_SOCIAL, BUREAU, DOMICILE, AUTRE) - Relations flexibles: Organisation, Membre, Evenement - Enum TypeAdresse dans module API (DRY/WOU) - Repository et Service AdresseService - Relations bidirectionnelles mises à jour PHASE 1.2 - Système Rôles et Permissions: - Entité Role avec types (SYSTEME, ORGANISATION, PERSONNALISE) - Entité Permission avec structure MODULE > RESSOURCE > ACTION - Tables de liaison MembreRole et RolePermission - Repositories pour toutes les entités - Services RoleService et PermissionService - Relations bidirectionnelles dans Membre Respect strict DRY/WOU: - Enums dans module API réutilisables - Patterns de service cohérents - Relations JPA standardisées
This commit is contained in:
@@ -42,8 +42,6 @@ public class MembreInscriptionBean implements Serializable {
|
||||
|
||||
// Propriétés système
|
||||
private String numeroGenere;
|
||||
private String membreIdString; // ID du membre en mode modification
|
||||
private boolean modeModification = false;
|
||||
|
||||
// Informations personnelles
|
||||
private String prenom;
|
||||
@@ -105,10 +103,8 @@ public class MembreInscriptionBean implements Serializable {
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
// Générer un numéro de membre automatiquement (seulement en mode création)
|
||||
if (!modeModification) {
|
||||
this.numeroGenere = "M" + System.currentTimeMillis();
|
||||
}
|
||||
// Générer un numéro de membre automatiquement
|
||||
this.numeroGenere = "M" + System.currentTimeMillis();
|
||||
|
||||
// Charger les organisations actives
|
||||
try {
|
||||
@@ -120,61 +116,6 @@ public class MembreInscriptionBean implements Serializable {
|
||||
}
|
||||
}
|
||||
|
||||
// Getters/Setters pour mode modification
|
||||
public String getMembreIdString() {
|
||||
return membreIdString;
|
||||
}
|
||||
|
||||
public void setMembreIdString(String membreIdString) {
|
||||
this.membreIdString = membreIdString;
|
||||
}
|
||||
|
||||
public boolean isModeModification() {
|
||||
return modeModification;
|
||||
}
|
||||
|
||||
// Méthode appelée par f:viewAction pour charger le membre en mode modification
|
||||
public void chargerMembreSiModification() {
|
||||
if (membreIdString != null && !membreIdString.isEmpty()) {
|
||||
try {
|
||||
java.util.UUID id = java.util.UUID.fromString(membreIdString);
|
||||
MembreDTO membre = membreService.obtenirParId(id);
|
||||
|
||||
if (membre != null) {
|
||||
modeModification = true;
|
||||
// Remplir tous les champs avec les données du membre
|
||||
this.numeroGenere = membre.getNumeroMembre();
|
||||
this.prenom = membre.getPrenom();
|
||||
this.nom = membre.getNom();
|
||||
this.email = membre.getEmail();
|
||||
this.telephone = membre.getTelephone();
|
||||
this.dateNaissance = membre.getDateNaissance();
|
||||
this.adresse = membre.getAdresse();
|
||||
this.ville = membre.getVille();
|
||||
this.nationalite = membre.getNationalite();
|
||||
this.profession = membre.getProfession();
|
||||
this.situationMatrimoniale = membre.getStatutMatrimonial();
|
||||
this.organisationId = membre.getAssociationId() != null ? membre.getAssociationId().toString() : null;
|
||||
// TODO: Charger les autres champs si disponibles
|
||||
|
||||
LOGGER.info("Membre chargé pour modification: " + membre.getNomComplet());
|
||||
} else {
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Membre introuvable"));
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOGGER.severe("ID invalide: " + membreIdString);
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur", "Identifiant de membre invalide"));
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement du membre: " + e.getMessage());
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur",
|
||||
"Impossible de charger le membre: " + e.getMessage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Actions
|
||||
public String inscrire() {
|
||||
try {
|
||||
|
||||
@@ -196,15 +196,15 @@ public class MembreListeBean implements Serializable {
|
||||
}
|
||||
|
||||
// Propriétés pour la page de modification
|
||||
private String membreSelectionneIdString;
|
||||
private UUID membreSelectionneId;
|
||||
private MembreDTO membreSelectionne;
|
||||
|
||||
public String getMembreSelectionneIdString() {
|
||||
return membreSelectionneIdString;
|
||||
public UUID getMembreSelectionneId() {
|
||||
return membreSelectionneId;
|
||||
}
|
||||
|
||||
public void setMembreSelectionneIdString(String membreSelectionneIdString) {
|
||||
this.membreSelectionneIdString = membreSelectionneIdString;
|
||||
public void setMembreSelectionneId(UUID membreSelectionneId) {
|
||||
this.membreSelectionneId = membreSelectionneId;
|
||||
}
|
||||
|
||||
public MembreDTO getMembreSelectionne() {
|
||||
@@ -216,16 +216,10 @@ public class MembreListeBean implements Serializable {
|
||||
}
|
||||
|
||||
public void chargerMembreSelectionne() {
|
||||
if (membreSelectionneIdString != null && !membreSelectionneIdString.isEmpty()) {
|
||||
if (membreSelectionneId != null) {
|
||||
try {
|
||||
UUID id = UUID.fromString(membreSelectionneIdString);
|
||||
membreSelectionne = membreService.obtenirParId(id);
|
||||
membreSelectionne = membreService.obtenirParId(membreSelectionneId);
|
||||
LOGGER.info("Membre chargé pour modification: " + membreSelectionne.getNomComplet());
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOGGER.severe("ID invalide: " + membreSelectionneIdString);
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erreur",
|
||||
"Identifiant de membre invalide"));
|
||||
} catch (Exception e) {
|
||||
LOGGER.severe("Erreur lors du chargement du membre: " + e.getMessage());
|
||||
FacesContext.getCurrentInstance().addMessage(null,
|
||||
|
||||
@@ -6,24 +6,18 @@
|
||||
xmlns:p="http://primefaces.org/ui"
|
||||
template="/templates/main-template.xhtml">
|
||||
|
||||
<ui:define name="title">#{empty param.id ? 'Inscription' : 'Modification'} Membre - UnionFlow</ui:define>
|
||||
|
||||
<!-- Charger le membre si ID fourni (mode modification) -->
|
||||
<f:metadata>
|
||||
<f:viewParam name="id" value="#{membreInscriptionBean.membreIdString}" />
|
||||
<f:viewAction action="#{membreInscriptionBean.chargerMembreSiModification}" />
|
||||
</f:metadata>
|
||||
<ui:define name="title">Inscription Membre - UnionFlow</ui:define>
|
||||
|
||||
<ui:define name="content">
|
||||
<!-- En-tête -->
|
||||
<ui:include src="/templates/components/layout/page-header.xhtml">
|
||||
<ui:param name="icon" value="#{empty param.id ? 'pi pi-user-plus text-primary' : 'pi pi-pencil text-warning'}" />
|
||||
<ui:param name="title" value="#{empty param.id ? 'Inscription Nouveau Membre' : 'Modifier le Membre'}" />
|
||||
<ui:param name="description" value="#{empty param.id ? 'Formulaire complet d\'inscription avec photo et documents' : 'Modifiez les informations du membre'}" />
|
||||
<ui:param name="icon" value="pi pi-user-plus text-primary" />
|
||||
<ui:param name="title" value="Inscription Nouveau Membre" />
|
||||
<ui:param name="description" value="Formulaire complet d'inscription avec photo et documents" />
|
||||
<ui:define name="actions">
|
||||
<div>
|
||||
<div class="text-900 font-medium">Numéro: #{membreInscriptionBean.numeroGenere}</div>
|
||||
<small class="text-600">#{empty param.id ? 'Généré automatiquement' : 'Existant'}</small>
|
||||
<small class="text-600">Généré automatiquement</small>
|
||||
</div>
|
||||
</ui:define>
|
||||
</ui:include>
|
||||
@@ -100,7 +94,7 @@
|
||||
|
||||
<div class="field">
|
||||
<p:outputLabel for="dateNaissance" value="Date de naissance" />
|
||||
<p:calendar id="dateNaissance" value="#{membreInscriptionBean.dateNaissance}"
|
||||
<p:calendar id="dateNaissance" value="#{membreInscriptionBean.dateNaissance}" required="true"
|
||||
pattern="dd/MM/yyyy" showIcon="true" yearNavigator="true" yearRange="1920:2030"
|
||||
monthNavigator="true" requiredMessage="La date de naissance est obligatoire"
|
||||
styleClass="w-full" />
|
||||
@@ -113,7 +107,7 @@
|
||||
</div>
|
||||
<div class="field">
|
||||
<p:outputLabel for="sexe" value="Sexe" />
|
||||
<p:selectOneMenu id="sexe" value="#{membreInscriptionBean.sexe}" styleClass="w-full">
|
||||
<p:selectOneMenu id="sexe" value="#{membreInscriptionBean.sexe}" required="true" styleClass="w-full">
|
||||
<f:selectItem itemLabel="Sélectionner..." itemValue="" noSelectionOption="true" />
|
||||
<f:selectItems value="#{membreInscriptionBean.sexeOptions}" />
|
||||
</p:selectOneMenu>
|
||||
@@ -148,6 +142,7 @@
|
||||
<div class="field">
|
||||
<p:outputLabel for="contactUrgenceNom" value="Nom complet" />
|
||||
<p:inputText id="contactUrgenceNom" value="#{membreInscriptionBean.contactUrgenceNom}"
|
||||
required="true" requiredMessage="Le nom du contact d'urgence est obligatoire"
|
||||
styleClass="w-full" />
|
||||
<p:message for="contactUrgenceNom" />
|
||||
</div>
|
||||
@@ -155,12 +150,13 @@
|
||||
<div class="field">
|
||||
<p:outputLabel for="contactUrgenceTelephone" value="Téléphone" />
|
||||
<p:inputText id="contactUrgenceTelephone" value="#{membreInscriptionBean.contactUrgenceTelephone}"
|
||||
required="true" requiredMessage="Le téléphone du contact d'urgence est obligatoire"
|
||||
styleClass="w-full" />
|
||||
<p:message for="contactUrgenceTelephone" />
|
||||
</div>
|
||||
<div class="field">
|
||||
<p:outputLabel for="contactUrgenceLien" value="Lien de parenté" />
|
||||
<p:selectOneMenu id="contactUrgenceLien" value="#{membreInscriptionBean.contactUrgenceLien}" styleClass="w-full">
|
||||
<p:selectOneMenu id="contactUrgenceLien" value="#{membreInscriptionBean.contactUrgenceLien}" required="true" styleClass="w-full">
|
||||
<f:selectItem itemLabel="Sélectionner..." itemValue="" noSelectionOption="true" />
|
||||
<f:selectItems value="#{membreInscriptionBean.contactUrgenceLienOptions}" />
|
||||
</p:selectOneMenu>
|
||||
@@ -221,6 +217,7 @@
|
||||
<div class="field">
|
||||
<p:outputLabel for="adresse" value="Adresse complète" />
|
||||
<p:inputTextarea id="adresse" value="#{membreInscriptionBean.adresse}" rows="4"
|
||||
required="true" requiredMessage="L'adresse est obligatoire"
|
||||
styleClass="w-full" />
|
||||
<p:message for="adresse" />
|
||||
</div>
|
||||
@@ -228,7 +225,8 @@
|
||||
<div class="formgrid grid">
|
||||
<div class="field col">
|
||||
<p:outputLabel for="ville" value="Ville" />
|
||||
<p:inputText id="ville" value="#{membreInscriptionBean.ville}" styleClass="w-full" />
|
||||
<p:inputText id="ville" value="#{membreInscriptionBean.ville}" required="true"
|
||||
requiredMessage="La ville est obligatoire" styleClass="w-full" />
|
||||
<p:message for="ville" />
|
||||
</div>
|
||||
<div class="field col">
|
||||
@@ -255,6 +253,7 @@
|
||||
<div class="field col">
|
||||
<p:outputLabel for="telephoneMobile" value="Téléphone mobile" />
|
||||
<p:inputText id="telephoneMobile" value="#{membreInscriptionBean.telephoneMobile}"
|
||||
required="true" requiredMessage="Le téléphone mobile est obligatoire"
|
||||
styleClass="w-full" />
|
||||
<p:message for="telephoneMobile" />
|
||||
</div>
|
||||
@@ -279,7 +278,7 @@
|
||||
</div>
|
||||
<div class="field">
|
||||
<p:outputLabel for="typeAdhesion" value="Type d'adhésion" />
|
||||
<p:selectOneMenu id="typeAdhesion" value="#{membreInscriptionBean.typeAdhesion}" styleClass="w-full">
|
||||
<p:selectOneMenu id="typeAdhesion" value="#{membreInscriptionBean.typeAdhesion}" required="true" styleClass="w-full">
|
||||
<f:selectItem itemLabel="Sélectionner..." itemValue="" noSelectionOption="true" />
|
||||
<f:selectItems value="#{membreInscriptionBean.typeAdhesionOptions}" />
|
||||
</p:selectOneMenu>
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
iconOnly="true"/>
|
||||
<!-- DRY/WOU: Composite Component action-button-edit-nav -->
|
||||
<uf:action-button-edit-nav itemId="#{membre.id}"
|
||||
editPage="/pages/secure/membre/inscription.xhtml"
|
||||
editPage="/pages/secure/membre/modifier.xhtml"
|
||||
iconOnly="true"/>
|
||||
<ui:include src="/templates/components/buttons/button-icon.xhtml">
|
||||
<ui:param name="icon" value="pi pi-dollar" />
|
||||
|
||||
Reference in New Issue
Block a user