feat(v3.0): implémentation Phases 0-8 — RBAC, lifecycle, multi-org, plans, dashboards

Phase 0 : @RolesAllowed SUPER_ADMIN sur POST/DELETE organisations ; AuthenticationFilter pages super-admin
Phase 2 : OrganisationModuleService, @RequiresModule, ModuleAccessFilter, RoleService, PermissionChecker
Phase 3 : multi-org context switching (OrganisationContextFilter, headers X-Active-Organisation-Id / X-Active-Role)
Phase 4 : feature-gating navigation par typeOrganisation (web MenuBean + mobile MorePage)
Phase 5 : MemberLifecycleService — 8 transitions (activer/suspendre/radier/archiver/inviter/accepter/expirer/rappels)
Phase 6 : FormuleAbonnement Option C (planCommercial, apiAccess, federationAccess, quotas) + SouscriptionOrganisation méthodes quota
Phase 7 : DashboardResource SUPER_ADMIN ajouté ; DashboardBean.checkAccessAndRedirect() ; dashboards distincts par rôle
Phase 8 : MembreResourceLifecycleRbacTest, SouscriptionQuotaOptionCTest, OrganisationContextHolderTest, OrganisationContextFilterMultiOrgTest, MemberLifecycleServiceTest
This commit is contained in:
dahoud
2026-04-06 16:49:47 +00:00
parent 39e98a9cb3
commit aef5548e87
34 changed files with 823 additions and 86 deletions

View File

@@ -1547,7 +1547,7 @@ class MembreImportExportServiceTest {
membreSansDate.setEmail(null);
membreSansDate.setTelephone(null);
membreSansDate.setStatutCompte(null);
membreSansDate.setAssociationNom(null);
membreSansDate.setOrganisationNom(null);
membreSansDate.setDateNaissance(null); // null → branche else → createCell("")
byte[] excelData = importExportService.exporterVersExcel(
@@ -1567,14 +1567,14 @@ class MembreImportExportServiceTest {
m1.setNom("A"); m1.setPrenom("B");
m1.setEmail("a@test.com");
m1.setStatutCompte("ACTIF");
m1.setAssociationNom("Org1"); // non-null pour lambda dans creerOngletStatistiques
m1.setOrganisationNom("Org1"); // non-null pour lambda dans creerOngletStatistiques (organisationNom)
MembreResponse m2 = new MembreResponse();
m2.setId(UUID.randomUUID());
m2.setNom("C"); m2.setPrenom("D");
m2.setEmail("c@test.com");
m2.setStatutCompte("INACTIF");
m2.setAssociationNom(null); // null → lambda branche false
m2.setOrganisationNom(null); // null → lambda branche false (organisationNom)
byte[] excelData = importExportService.exporterVersExcel(
List.of(m1, m2),
@@ -1695,15 +1695,15 @@ class MembreImportExportServiceTest {
@Test
@Order(205)
@DisplayName("exporterVersPDF avec membres ayant associationNom non-null → lambda stats associationNom != null")
void exporterVersPDF_avecAssociationNom_couvreStatistiques() throws Exception {
// Créer membres avec associationNom non-null pour la lambda dans ajouterStatistiquesPDF
@DisplayName("exporterVersPDF avec membres ayant organisationNom non-null → lambda stats organisationNom != null")
void exporterVersPDF_avecOrganisationNom_couvreStatistiques() throws Exception {
// Créer membres avec organisationNom non-null pour la lambda dans ajouterStatistiquesPDF
MembreResponse m1 = new MembreResponse();
m1.setId(UUID.randomUUID());
m1.setNom("Alpha");
m1.setPrenom("Beta");
m1.setEmail("alpha@test.com");
m1.setAssociationNom("Union Test"); // non-null → lambda filter true
m1.setOrganisationNom("Union Test"); // non-null → organisationNom lambda filter true
m1.setStatutCompte("ACTIF"); // couvre ACTIF count
MembreResponse m2 = new MembreResponse();
@@ -1711,7 +1711,7 @@ class MembreImportExportServiceTest {
m2.setNom("Gamma");
m2.setPrenom("Delta");
m2.setEmail("gamma@test.com");
m2.setAssociationNom(null); // null → lambda filter false
m2.setOrganisationNom(null); // null → organisationNom lambda filter false
m2.setStatutCompte("INACTIF"); // couvre INACTIF count
MembreResponse m3 = new MembreResponse();
@@ -1719,7 +1719,7 @@ class MembreImportExportServiceTest {
m3.setNom("Epsilon");
m3.setPrenom("Zeta");
m3.setEmail("epsilon@test.com");
m3.setAssociationNom("Union Test");
m3.setOrganisationNom("Union Test");
m3.setStatutCompte("SUSPENDU"); // couvre SUSPENDU count
byte[] pdfData = importExportService.exporterVersPDF(
@@ -2068,7 +2068,7 @@ class MembreImportExportServiceTest {
membreNull.setEmail(null); // null → ternaire → ""
membreNull.setTelephone(null); // null → ternaire → ""
membreNull.setStatutCompte(null); // null → ternaire → ""
membreNull.setAssociationNom(null);
membreNull.setOrganisationNom(null);
byte[] csvData = importExportService.exporterVersCSV(
List.of(membreNull),
@@ -2119,7 +2119,7 @@ class MembreImportExportServiceTest {
membreNulls.setEmail(null); // null → L959 false branch
membreNulls.setTelephone(null);
membreNulls.setStatutCompte(null);
membreNulls.setAssociationNom(null);
membreNulls.setOrganisationNom(null);
membreNulls.setDateNaissance(null);
// Toutes colonnes pour passer par L948, L949, L959

View File

@@ -286,9 +286,9 @@ class MembreServiceExportAndSummaryTest {
membreService.convertToSummaryResponse(membre);
assertThat(resp).isNotNull();
// Branche mo.getOrganisation() != null → true → organisationId et associationNom remplis
// Branche mo.getOrganisation() != null → true → organisationId et organisationNom remplis
assertThat(resp.organisationId()).isEqualTo(orgId);
assertThat(resp.associationNom()).isEqualTo("Lions Club Dakar");
assertThat(resp.organisationNom()).isEqualTo("Lions Club Dakar");
}
@Test
@@ -306,9 +306,9 @@ class MembreServiceExportAndSummaryTest {
membreService.convertToSummaryResponse(membre);
assertThat(resp).isNotNull();
// Branche false → organisationId et associationNom restent null
// Branche false → organisationId et organisationNom restent null
assertThat(resp.organisationId()).isNull();
assertThat(resp.associationNom()).isNull();
assertThat(resp.organisationNom()).isNull();
}
@Test
@@ -324,7 +324,7 @@ class MembreServiceExportAndSummaryTest {
assertThat(resp).isNotNull();
assertThat(resp.organisationId()).isNull();
assertThat(resp.associationNom()).isNull();
assertThat(resp.organisationNom()).isNull();
}
@Test

View File

@@ -105,7 +105,7 @@ class MembreServiceFinalBranchesTest {
assertThat(result).isNotNull().isInstanceOf(MembreResponse.class);
MembreResponse response = (MembreResponse) result;
assertThat(response.getOrganisationId()).isNull();
assertThat(response.getAssociationNom()).isNull();
assertThat(response.getOrganisationNom()).isNull();
assertThat(response.getDateAdhesion()).isEqualTo(LocalDate.of(2024, 6, 1));
}

View File

@@ -817,7 +817,7 @@ class MembreServiceTest {
MembreResponse resp = membreService.convertToResponse(m);
assertThat(resp.getOrganisationId()).isEqualTo(orgId);
assertThat(resp.getAssociationNom()).isEqualTo("Lions Club");
assertThat(resp.getOrganisationNom()).isEqualTo("Lions Club");
assertThat(resp.getDateAdhesion()).isEqualTo(LocalDate.of(2022, 6, 1));
}
@@ -836,7 +836,7 @@ class MembreServiceTest {
MembreResponse resp = membreService.convertToResponse(m);
assertThat(resp.getOrganisationId()).isNull();
assertThat(resp.getAssociationNom()).isNull();
assertThat(resp.getOrganisationNom()).isNull();
}
@Test
@@ -1050,7 +1050,7 @@ class MembreServiceTest {
MembreSummaryResponse resp = membreService.convertToSummaryResponse(m);
assertThat(resp.organisationId()).isEqualTo(orgId);
assertThat(resp.associationNom()).isEqualTo("Assoc Test");
assertThat(resp.organisationNom()).isEqualTo("Assoc Test");
}
@Test