feat: BackupService real pg_dump, OrganisationService region stats, SystemConfigService overrides

- BackupService: DB-persisted metadata (BackupRecord/BackupConfig entities + V16 Flyway migration),
  real pg_dump execution via ProcessBuilder, soft-delete on deleteBackup, pg_restore manual guidance
- OrganisationService: repartitionRegion now queries Adresse entities (was Map.of() stub)
- SystemConfigService: in-memory config overrides via AtomicReference (no DB dependency)
- SystemMetricsService: null-guard on MemoryMXBean in getSystemStatus() (fixes test NPE)
- Souscription workflow: SouscriptionService, SouscriptionResource, FormuleAbonnementRepository,
  V11 Flyway migration, admin REST clients
- Flyway V8-V15: notes membres, types référence, type orga constraint, seed roles,
  première connexion, Wave checkout URL, Wave telephone column length fix
- .gitignore: added uploads/ and .claude/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
dahoud
2026-04-04 16:14:30 +00:00
parent 9c66909eff
commit e00a9301d8
98 changed files with 5571 additions and 636 deletions

View File

@@ -7,6 +7,7 @@ import dev.lions.unionflow.server.api.dto.organisation.response.OrganisationSumm
import dev.lions.unionflow.server.api.enums.membre.StatutMembre;
import dev.lions.unionflow.server.entity.Membre;
import dev.lions.unionflow.server.entity.MembreOrganisation;
import dev.lions.unionflow.server.repository.AdresseRepository;
import dev.lions.unionflow.server.repository.EvenementRepository;
import dev.lions.unionflow.server.repository.MembreOrganisationRepository;
import dev.lions.unionflow.server.repository.MembreRepository;
@@ -56,6 +57,9 @@ public class OrganisationService {
@Inject
MembreOrganisationRepository membreOrganisationRepository;
@Inject
AdresseRepository adresseRepository;
@Inject
EvenementRepository evenementRepository;
@@ -159,7 +163,11 @@ public class OrganisationService {
organisation.setTelephone(organisationMiseAJour.getTelephone());
organisation.setTelephoneSecondaire(organisationMiseAJour.getTelephoneSecondaire());
organisation.setEmailSecondaire(organisationMiseAJour.getEmailSecondaire());
// Adresse gérée via l'entité Adresse (Cat.2)
organisation.setAdresse(organisationMiseAJour.getAdresse());
organisation.setVille(organisationMiseAJour.getVille());
organisation.setRegion(organisationMiseAJour.getRegion());
organisation.setPays(organisationMiseAJour.getPays());
organisation.setCodePostal(organisationMiseAJour.getCodePostal());
organisation.setLatitude(organisationMiseAJour.getLatitude());
organisation.setLongitude(organisationMiseAJour.getLongitude());
organisation.setSiteWeb(organisationMiseAJour.getSiteWeb());
@@ -309,6 +317,8 @@ public class OrganisationService {
.dateAdhesion(LocalDate.now())
.build();
membreOrganisationRepository.persist(mo);
organisation.ajouterMembre();
organisationRepository.persist(organisation);
LOG.infof("Utilisateur %s associé à l'organisation %s (MembreOrganisation créé)", emailNorm, organisation.getNom());
}
@@ -481,8 +491,13 @@ public class OrganisationService {
.collect(Collectors.groupingBy(
o -> o.getTypeOrganisation() != null ? o.getTypeOrganisation() : "NON_DEFINI",
Collectors.counting()));
// TODO Cat.2 : repartitionRegion via Adresse
Map<String, Long> repartitionRegion = Map.of();
Map<String, Long> repartitionRegion = adresseRepository
.find("organisation IS NOT NULL AND region IS NOT NULL")
.list()
.stream()
.collect(Collectors.groupingBy(
a -> a.getRegion(),
Collectors.counting()));
Map<String, Object> map = new HashMap<>();
map.put("totalAssociations", total);
@@ -514,6 +529,11 @@ public class OrganisationService {
dto.setTelephone(organisation.getTelephone());
dto.setTelephoneSecondaire(organisation.getTelephoneSecondaire());
dto.setEmailSecondaire(organisation.getEmailSecondaire());
dto.setAdresse(organisation.getAdresse());
dto.setVille(organisation.getVille());
dto.setRegion(organisation.getRegion());
dto.setPays(organisation.getPays());
dto.setCodePostal(organisation.getCodePostal());
dto.setLatitude(organisation.getLatitude());
dto.setLongitude(organisation.getLongitude());
dto.setSiteWeb(organisation.getSiteWeb());
@@ -648,6 +668,13 @@ public class OrganisationService {
.devise(req.devise() != null ? req.devise() : defaultsService.getDevise())
.cotisationObligatoire(req.cotisationObligatoire() != null ? req.cotisationObligatoire() : false)
.montantCotisationAnnuelle(req.montantCotisationAnnuelle())
.adresse(req.adresse())
.ville(req.ville())
.region(req.region())
.pays(req.pays())
.codePostal(req.codePostal())
.organisationPublique(req.organisationPublique() != null ? req.organisationPublique() : true)
.accepteNouveauxMembres(req.accepteNouveauxMembres() != null ? req.accepteNouveauxMembres() : true)
.build();
}
@@ -683,6 +710,13 @@ public class OrganisationService {
.devise(req.devise() != null ? req.devise() : defaultsService.getDevise())
.cotisationObligatoire(req.cotisationObligatoire() != null ? req.cotisationObligatoire() : false)
.montantCotisationAnnuelle(req.montantCotisationAnnuelle())
.adresse(req.adresse())
.ville(req.ville())
.region(req.region())
.pays(req.pays())
.codePostal(req.codePostal())
.organisationPublique(req.organisationPublique() != null ? req.organisationPublique() : true)
.accepteNouveauxMembres(req.accepteNouveauxMembres() != null ? req.accepteNouveauxMembres() : true)
.build();
}
}