Configure Maven repository for unionflow-server-api dependency

This commit is contained in:
dahoud
2025-12-10 01:08:17 +00:00
commit 4a0c5f9d33
320 changed files with 33373 additions and 0 deletions

View File

@@ -0,0 +1,443 @@
package dev.lions.unionflow.server.service;
import dev.lions.unionflow.server.api.dto.organisation.OrganisationDTO;
import dev.lions.unionflow.server.api.enums.organisation.StatutOrganisation;
import dev.lions.unionflow.server.api.enums.organisation.TypeOrganisation;
import dev.lions.unionflow.server.entity.Organisation;
import dev.lions.unionflow.server.repository.OrganisationRepository;
import io.quarkus.panache.common.Page;
import io.quarkus.panache.common.Sort;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.NotFoundException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import org.jboss.logging.Logger;
/**
* Service métier pour la gestion des organisations
*
* @author UnionFlow Team
* @version 1.0
* @since 2025-01-15
*/
@ApplicationScoped
public class OrganisationService {
private static final Logger LOG = Logger.getLogger(OrganisationService.class);
@Inject OrganisationRepository organisationRepository;
/**
* Crée une nouvelle organisation
*
* @param organisation l'organisation à créer
* @return l'organisation créée
*/
@Transactional
public Organisation creerOrganisation(Organisation organisation) {
LOG.infof("Création d'une nouvelle organisation: %s", organisation.getNom());
// Vérifier l'unicité de l'email
if (organisationRepository.findByEmail(organisation.getEmail()).isPresent()) {
throw new IllegalArgumentException("Une organisation avec cet email existe déjà");
}
// Vérifier l'unicité du nom
if (organisationRepository.findByNom(organisation.getNom()).isPresent()) {
throw new IllegalArgumentException("Une organisation avec ce nom existe déjà");
}
// Vérifier l'unicité du numéro d'enregistrement si fourni
if (organisation.getNumeroEnregistrement() != null
&& !organisation.getNumeroEnregistrement().isEmpty()) {
if (organisationRepository
.findByNumeroEnregistrement(organisation.getNumeroEnregistrement())
.isPresent()) {
throw new IllegalArgumentException(
"Une organisation avec ce numéro d'enregistrement existe déjà");
}
}
// Définir les valeurs par défaut
if (organisation.getStatut() == null) {
organisation.setStatut("ACTIVE");
}
if (organisation.getTypeOrganisation() == null) {
organisation.setTypeOrganisation("ASSOCIATION");
}
organisationRepository.persist(organisation);
LOG.infof(
"Organisation créée avec succès: ID=%s, Nom=%s", organisation.getId(), organisation.getNom());
return organisation;
}
/**
* Met à jour une organisation existante
*
* @param id l'ID de l'organisation
* @param organisationMiseAJour les données de mise à jour
* @param utilisateur l'utilisateur effectuant la modification
* @return l'organisation mise à jour
*/
@Transactional
public Organisation mettreAJourOrganisation(
UUID id, Organisation organisationMiseAJour, String utilisateur) {
LOG.infof("Mise à jour de l'organisation ID: %s", id);
Organisation organisation =
organisationRepository
.findByIdOptional(id)
.orElseThrow(() -> new NotFoundException("Organisation non trouvée avec l'ID: " + id));
// Vérifier l'unicité de l'email si modifié
if (!organisation.getEmail().equals(organisationMiseAJour.getEmail())) {
if (organisationRepository.findByEmail(organisationMiseAJour.getEmail()).isPresent()) {
throw new IllegalArgumentException("Une organisation avec cet email existe déjà");
}
organisation.setEmail(organisationMiseAJour.getEmail());
}
// Vérifier l'unicité du nom si modifié
if (!organisation.getNom().equals(organisationMiseAJour.getNom())) {
if (organisationRepository.findByNom(organisationMiseAJour.getNom()).isPresent()) {
throw new IllegalArgumentException("Une organisation avec ce nom existe déjà");
}
organisation.setNom(organisationMiseAJour.getNom());
}
// Mettre à jour les autres champs
organisation.setNomCourt(organisationMiseAJour.getNomCourt());
organisation.setDescription(organisationMiseAJour.getDescription());
organisation.setTelephone(organisationMiseAJour.getTelephone());
organisation.setAdresse(organisationMiseAJour.getAdresse());
organisation.setVille(organisationMiseAJour.getVille());
organisation.setCodePostal(organisationMiseAJour.getCodePostal());
organisation.setRegion(organisationMiseAJour.getRegion());
organisation.setPays(organisationMiseAJour.getPays());
organisation.setSiteWeb(organisationMiseAJour.getSiteWeb());
organisation.setObjectifs(organisationMiseAJour.getObjectifs());
organisation.setActivitesPrincipales(organisationMiseAJour.getActivitesPrincipales());
organisation.marquerCommeModifie(utilisateur);
LOG.infof("Organisation mise à jour avec succès: ID=%s", id);
return organisation;
}
/**
* Supprime une organisation
*
* @param id l'UUID de l'organisation
* @param utilisateur l'utilisateur effectuant la suppression
*/
@Transactional
public void supprimerOrganisation(UUID id, String utilisateur) {
LOG.infof("Suppression de l'organisation ID: %s", id);
Organisation organisation =
organisationRepository
.findByIdOptional(id)
.orElseThrow(() -> new NotFoundException("Organisation non trouvée avec l'ID: " + id));
// Vérifier qu'il n'y a pas de membres actifs
if (organisation.getNombreMembres() > 0) {
throw new IllegalStateException(
"Impossible de supprimer une organisation avec des membres actifs");
}
// Soft delete - marquer comme inactive
organisation.setActif(false);
organisation.setStatut("DISSOUTE");
organisation.marquerCommeModifie(utilisateur);
LOG.infof("Organisation supprimée (soft delete) avec succès: ID=%s", id);
}
/**
* Trouve une organisation par son ID
*
* @param id l'UUID de l'organisation
* @return Optional contenant l'organisation si trouvée
*/
public Optional<Organisation> trouverParId(UUID id) {
return organisationRepository.findByIdOptional(id);
}
/**
* Trouve une organisation par son email
*
* @param email l'email de l'organisation
* @return Optional contenant l'organisation si trouvée
*/
public Optional<Organisation> trouverParEmail(String email) {
return organisationRepository.findByEmail(email);
}
/**
* Liste toutes les organisations actives
*
* @return liste des organisations actives
*/
public List<Organisation> listerOrganisationsActives() {
return organisationRepository.findAllActives();
}
/**
* Liste toutes les organisations actives avec pagination
*
* @param page numéro de page
* @param size taille de la page
* @return liste paginée des organisations actives
*/
public List<Organisation> listerOrganisationsActives(int page, int size) {
return organisationRepository.findAllActives(Page.of(page, size), Sort.by("nom").ascending());
}
/**
* Recherche d'organisations par nom
*
* @param recherche terme de recherche
* @param page numéro de page
* @param size taille de la page
* @return liste paginée des organisations correspondantes
*/
public List<Organisation> rechercherOrganisations(String recherche, int page, int size) {
return organisationRepository.findByNomOrNomCourt(
recherche, Page.of(page, size), Sort.by("nom").ascending());
}
/**
* Recherche avancée d'organisations
*
* @param nom nom (optionnel)
* @param typeOrganisation type (optionnel)
* @param statut statut (optionnel)
* @param ville ville (optionnel)
* @param region région (optionnel)
* @param pays pays (optionnel)
* @param page numéro de page
* @param size taille de la page
* @return liste filtrée des organisations
*/
public List<Organisation> rechercheAvancee(
String nom,
String typeOrganisation,
String statut,
String ville,
String region,
String pays,
int page,
int size) {
return organisationRepository.rechercheAvancee(
nom, typeOrganisation, statut, ville, region, pays, Page.of(page, size));
}
/**
* Active une organisation
*
* @param id l'ID de l'organisation
* @param utilisateur l'utilisateur effectuant l'activation
* @return l'organisation activée
*/
@Transactional
public Organisation activerOrganisation(UUID id, String utilisateur) {
LOG.infof("Activation de l'organisation ID: %s", id);
Organisation organisation =
organisationRepository
.findByIdOptional(id)
.orElseThrow(() -> new NotFoundException("Organisation non trouvée avec l'ID: " + id));
organisation.activer(utilisateur);
LOG.infof("Organisation activée avec succès: ID=%s", id);
return organisation;
}
/**
* Suspend une organisation
*
* @param id l'UUID de l'organisation
* @param utilisateur l'utilisateur effectuant la suspension
* @return l'organisation suspendue
*/
@Transactional
public Organisation suspendreOrganisation(UUID id, String utilisateur) {
LOG.infof("Suspension de l'organisation ID: %s", id);
Organisation organisation =
organisationRepository
.findByIdOptional(id)
.orElseThrow(() -> new NotFoundException("Organisation non trouvée avec l'ID: " + id));
organisation.suspendre(utilisateur);
LOG.infof("Organisation suspendue avec succès: ID=%s", id);
return organisation;
}
/**
* Obtient les statistiques des organisations
*
* @return map contenant les statistiques
*/
public Map<String, Object> obtenirStatistiques() {
LOG.info("Calcul des statistiques des organisations");
long totalOrganisations = organisationRepository.count();
long organisationsActives = organisationRepository.countActives();
long organisationsInactives = totalOrganisations - organisationsActives;
long nouvellesOrganisations30Jours =
organisationRepository.countNouvellesOrganisations(LocalDate.now().minusDays(30));
return Map.of(
"totalOrganisations", totalOrganisations,
"organisationsActives", organisationsActives,
"organisationsInactives", organisationsInactives,
"nouvellesOrganisations30Jours", nouvellesOrganisations30Jours,
"tauxActivite",
totalOrganisations > 0 ? (organisationsActives * 100.0 / totalOrganisations) : 0.0,
"timestamp", LocalDateTime.now());
}
/**
* Convertit une entité Organisation en DTO
*
* @param organisation l'entité à convertir
* @return le DTO correspondant
*/
public OrganisationDTO convertToDTO(Organisation organisation) {
if (organisation == null) {
return null;
}
OrganisationDTO dto = new OrganisationDTO();
// Conversion de l'ID UUID vers UUID (pas de conversion nécessaire maintenant)
dto.setId(organisation.getId());
// Informations de base
dto.setNom(organisation.getNom());
dto.setNomCourt(organisation.getNomCourt());
dto.setDescription(organisation.getDescription());
dto.setEmail(organisation.getEmail());
dto.setTelephone(organisation.getTelephone());
dto.setTelephoneSecondaire(organisation.getTelephoneSecondaire());
dto.setEmailSecondaire(organisation.getEmailSecondaire());
dto.setAdresse(organisation.getAdresse());
dto.setVille(organisation.getVille());
dto.setCodePostal(organisation.getCodePostal());
dto.setRegion(organisation.getRegion());
dto.setPays(organisation.getPays());
dto.setLatitude(organisation.getLatitude());
dto.setLongitude(organisation.getLongitude());
dto.setSiteWeb(organisation.getSiteWeb());
dto.setLogo(organisation.getLogo());
dto.setReseauxSociaux(organisation.getReseauxSociaux());
dto.setObjectifs(organisation.getObjectifs());
dto.setActivitesPrincipales(organisation.getActivitesPrincipales());
dto.setNombreMembres(organisation.getNombreMembres());
dto.setNombreAdministrateurs(organisation.getNombreAdministrateurs());
dto.setBudgetAnnuel(organisation.getBudgetAnnuel());
dto.setDevise(organisation.getDevise());
dto.setDateFondation(organisation.getDateFondation());
dto.setNumeroEnregistrement(organisation.getNumeroEnregistrement());
dto.setNiveauHierarchique(organisation.getNiveauHierarchique());
// Conversion de l'organisation parente (UUID → UUID, pas de conversion nécessaire)
if (organisation.getOrganisationParenteId() != null) {
dto.setOrganisationParenteId(organisation.getOrganisationParenteId());
}
// Conversion du type d'organisation (String → Enum)
if (organisation.getTypeOrganisation() != null) {
try {
dto.setTypeOrganisation(
TypeOrganisation.valueOf(organisation.getTypeOrganisation().toUpperCase()));
} catch (IllegalArgumentException e) {
// Valeur par défaut si la conversion échoue
LOG.warnf(
"Type d'organisation inconnu: %s, utilisation de ASSOCIATION par défaut",
organisation.getTypeOrganisation());
dto.setTypeOrganisation(TypeOrganisation.ASSOCIATION);
}
} else {
dto.setTypeOrganisation(TypeOrganisation.ASSOCIATION);
}
// Conversion du statut (String → Enum)
if (organisation.getStatut() != null) {
try {
dto.setStatut(
StatutOrganisation.valueOf(organisation.getStatut().toUpperCase()));
} catch (IllegalArgumentException e) {
// Valeur par défaut si la conversion échoue
LOG.warnf(
"Statut d'organisation inconnu: %s, utilisation de ACTIVE par défaut",
organisation.getStatut());
dto.setStatut(StatutOrganisation.ACTIVE);
}
} else {
dto.setStatut(StatutOrganisation.ACTIVE);
}
// Champs de base DTO
dto.setDateCreation(organisation.getDateCreation());
dto.setDateModification(organisation.getDateModification());
dto.setActif(organisation.getActif());
dto.setVersion(organisation.getVersion() != null ? organisation.getVersion() : 0L);
// Champs par défaut
dto.setOrganisationPublique(
organisation.getOrganisationPublique() != null
? organisation.getOrganisationPublique()
: true);
dto.setAccepteNouveauxMembres(
organisation.getAccepteNouveauxMembres() != null
? organisation.getAccepteNouveauxMembres()
: true);
dto.setCotisationObligatoire(
organisation.getCotisationObligatoire() != null
? organisation.getCotisationObligatoire()
: false);
dto.setMontantCotisationAnnuelle(organisation.getMontantCotisationAnnuelle());
return dto;
}
/**
* Convertit un DTO en entité Organisation
*
* @param dto le DTO à convertir
* @return l'entité correspondante
*/
public Organisation convertFromDTO(OrganisationDTO dto) {
if (dto == null) {
return null;
}
return Organisation.builder()
.nom(dto.getNom())
.nomCourt(dto.getNomCourt())
.description(dto.getDescription())
.email(dto.getEmail())
.telephone(dto.getTelephone())
.adresse(dto.getAdresse())
.ville(dto.getVille())
.codePostal(dto.getCodePostal())
.region(dto.getRegion())
.pays(dto.getPays())
.siteWeb(dto.getSiteWeb())
.objectifs(dto.getObjectifs())
.activitesPrincipales(dto.getActivitesPrincipales())
.build();
}
}