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

@@ -719,4 +719,27 @@ public class OrganisationService {
.accepteNouveauxMembres(req.accepteNouveauxMembres() != null ? req.accepteNouveauxMembres() : true)
.build();
}
/**
* Retourne la liste des organisations d'un membre (pour le sélecteur multi-org).
* Inclut les infos nécessaires au sélecteur : id, nom, type, catégorie, modules, rôle du membre.
*/
public java.util.List<java.util.Map<String, Object>> listerOrganisationsParMembre(java.util.UUID membreId) {
java.util.List<MembreOrganisation> liens = membreOrganisationRepository.findOrganisationsActivesParMembre(membreId);
return liens.stream().map(lien -> {
Organisation org = lien.getOrganisation();
java.util.Map<String, Object> entry = new java.util.LinkedHashMap<>();
entry.put("organisationId", org.getId());
entry.put("nom", org.getNom());
entry.put("nomCourt", org.getNomCourt());
entry.put("typeOrganisation", org.getTypeOrganisation());
entry.put("categorieType", org.getCategorieType());
entry.put("modulesActifs", org.getModulesActifs());
entry.put("statut", org.getStatut());
entry.put("statutMembre", lien.getStatutMembre() != null ? lien.getStatutMembre().name() : null);
entry.put("roleOrg", lien.getRoleOrg());
entry.put("dateAdhesion", lien.getDateAdhesion());
return entry;
}).toList();
}
}