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:
dahoud
2025-11-30 01:31:12 +00:00
parent e26ae459e4
commit f930ae7341
25 changed files with 3583 additions and 91 deletions

View File

@@ -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>

View File

@@ -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" />