com.square.adherent.noyau.service.implementations.ContratServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.square.adherent.noyau.service.implementations.ContratServiceImpl.java

Source

/*
 * This file is a part of Square, Customer Relationship Management Software for insurance's companies
 * Copyright (C) 2010-2012  SCUB <square@scub.net> - Mutuelle SMATIS FRANCE  <square@smatis.fr >
 * 
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package com.square.adherent.noyau.service.implementations;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.apache.log4j.Logger;
import org.scub.foundation.framework.base.dto.IdentifiantLibelleDto;
import org.scub.foundation.framework.base.exception.BusinessException;
import org.scub.foundation.framework.base.mapping.util.MapperDozerBean;
import org.scub.foundation.framework.base.paging.RemotePagingCriteriasDto;
import org.scub.foundation.framework.base.paging.RemotePagingResultsDto;
import org.scub.foundation.framework.core.messagesource.MessageSourceUtil;

import com.square.adherent.noyau.dao.interfaces.contrat.ContratDao;
import com.square.adherent.noyau.dao.interfaces.contrat.GarantieDao;
import com.square.adherent.noyau.dao.interfaces.prestation.ReserveBancoDao;
import com.square.adherent.noyau.dto.adherent.contrat.AjustementDto;
import com.square.adherent.noyau.dto.adherent.contrat.ContratCollectifCriteresDto;
import com.square.adherent.noyau.dto.adherent.contrat.ContratDto;
import com.square.adherent.noyau.dto.adherent.contrat.ContratPersonneMoraleDto;
import com.square.adherent.noyau.dto.adherent.contrat.ContratSimpleDto;
import com.square.adherent.noyau.dto.adherent.contrat.CoordonneesBancairesDto;
import com.square.adherent.noyau.dto.adherent.contrat.CritereRechercheContratDto;
import com.square.adherent.noyau.dto.adherent.contrat.CritereRechercheGarantieDto;
import com.square.adherent.noyau.dto.adherent.contrat.GarantieBeneficiaireDto;
import com.square.adherent.noyau.dto.adherent.contrat.GarantieDto;
import com.square.adherent.noyau.dto.adherent.contrat.GarantiePersonneMoraleDto;
import com.square.adherent.noyau.dto.adherent.contrat.GarantieSimpleDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosBanqueDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosContratsBeneficiaireDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosContratsDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosContratsPersonneMoraleDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosGarantieBeneficiaireDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosGarantiePersonneMoraleDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosPaiementDto;
import com.square.adherent.noyau.dto.adherent.contrat.InfosPaiementPersonneMoraleDto;
import com.square.adherent.noyau.dto.adherent.contrat.ListeContratsDto;
import com.square.adherent.noyau.dto.adherent.contrat.PopulationCriteresDto;
import com.square.adherent.noyau.dto.adherent.contrat.PopulationDto;
import com.square.adherent.noyau.dto.adherent.contrat.ProduitCollectifAdherentCriteresDto;
import com.square.adherent.noyau.dto.adherent.contrat.ProduitCollectifAdherentDto;
import com.square.adherent.noyau.dto.adherent.contrat.RatioPrestationCotisationDto;
import com.square.adherent.noyau.dto.adherent.contrat.RecapitulatifGarantiesContratDto;
import com.square.adherent.noyau.dto.adherent.contrat.RecapitulatifPopulationDto;
import com.square.adherent.noyau.dto.adherent.contrat.ReserveBancoDto;
import com.square.adherent.noyau.dto.adherent.contrat.SyntheseContratPersonneMoraleDto;
import com.square.adherent.noyau.dto.adherent.contrat.TypePayeurCriteresDto;
import com.square.adherent.noyau.dto.adherent.contrat.TypePayeurDto;
import com.square.adherent.noyau.dto.adherent.contrat.ValeursStatutsPopulationDto;
import com.square.adherent.noyau.dto.produit.CriteresInfosProduitsDto;
import com.square.adherent.noyau.dto.produit.InfosProduitDto;
import com.square.adherent.noyau.dto.produit.ReserveProduitBancoDto;
import com.square.adherent.noyau.model.data.contrat.AjustementTarif;
import com.square.adherent.noyau.model.data.contrat.Contrat;
import com.square.adherent.noyau.model.data.contrat.Garantie;
import com.square.adherent.noyau.model.data.contrat.SyntheseContrat;
import com.square.adherent.noyau.service.interfaces.AdherentMappingService;
import com.square.adherent.noyau.service.interfaces.ContratService;
import com.square.adherent.noyau.util.MessageKeyUtil;
import com.square.core.model.dto.PersonneBaseDto;
import com.square.core.model.dto.PersonneCriteresRechercheDto;
import com.square.core.model.dto.PersonneDto;
import com.square.core.model.dto.PersonneMoraleDto;
import com.square.core.model.dto.PersonneSimpleDto;
import com.square.core.service.interfaces.PersonnePhysiqueService;
import com.square.core.service.interfaces.PersonneService;
import com.square.core.service.interfaces.SquareMappingService;
import com.square.price.core.dto.ProduitCriteresDto;
import com.square.price.core.dto.ProduitDto;
import com.square.price.core.service.interfaces.ProduitService;
import com.square.price.core.service.interfaces.TarificateurMappingService;

/**
 * Implmentation de ContratService.
 * @author Nicolas PELTIER (nicolas.peltier@scub.net) - SCUB
 */
public class ContratServiceImpl implements ContratService {

    private static final char[] DELIMITERS = { ' ', '-', '_' };

    /** DAO Contrat. */
    private ContratDao contratDao;

    /** DAO Garantie. */
    private GarantieDao garantieDao;

    /** DAO ReserveBanco. */
    private ReserveBancoDao reserveBancoDao;

    /** MapperDozerBean. */
    private MapperDozerBean mapperDozerBean;

    /** Service des constantes des adhrents. */
    private AdherentMappingService adherentMappingService;

    /** Service des personnes physiques. */
    private PersonnePhysiqueService personnePhysiqueService;

    /** Service des personnes. */
    private PersonneService personneService;

    /** Service des produits. */
    private ProduitService produitService;

    /** Service des constantes de mapping du tarificateur. */
    private TarificateurMappingService tarificateurMappingService;

    /** Gestionnaire des messages. */
    private MessageSourceUtil messageSourceUtil;

    /** Dlai pour considrer une garantie sant comme inactive. */
    private int delaiMoisInactiviteGarantieSante;

    /** Service de mapping Square. */
    private SquareMappingService squareMappingService;

    /** Logger. */
    private Logger logger = Logger.getLogger(ContratServiceImpl.class);

    @Override
    public ContratSimpleDto getContratSantePersonne(Long idPersonne) {
        logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_CONTRAT_SANTE_PERSONNE,
                new String[] { String.valueOf(idPersonne) }));
        // On recherche le contrat en cours de la personne
        Contrat contrat = contratDao.getContratSantePersonneEnCours(idPersonne);
        // Si la personne n'a aucun contrat en cours, on recherche un contrat rsili dans un dlai de X mois
        if (contrat == null) {
            final Calendar dateInactivite = Calendar.getInstance();
            final int jour = dateInactivite.get(Calendar.DAY_OF_MONTH);
            final int mois = dateInactivite.get(Calendar.MONTH);
            final int annee = dateInactivite.get(Calendar.YEAR);
            dateInactivite.clear();
            dateInactivite.set(annee, mois, jour);
            dateInactivite.add(Calendar.MONTH, -delaiMoisInactiviteGarantieSante);
            contrat = contratDao.getContratSantePersonneInactifXMois(idPersonne, dateInactivite);
        }
        // Si la personne n'a aucun contrat en cours et aucun contrat rsili
        if (contrat == null) {
            // On recherche un contrat  venir pour cette personne
            contrat = contratDao.getContratSantePersonneAVenir(idPersonne);
        }
        return mapperDozerBean.map(contrat, ContratSimpleDto.class);
    }

    @Override
    public List<InfosProduitDto> getInfosProduits(CriteresInfosProduitsDto criteresInfosProduitsDto) {
        logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_INFO_PRODUIT_PAR_CRITERES));
        if (criteresInfosProduitsDto.getNumeroClient() != null
                && !"".equals(criteresInfosProduitsDto.getNumeroClient())) {
            // Rcupration de l'indentifiant de la personne
            final PersonneCriteresRechercheDto criteriasPersonne = new PersonneCriteresRechercheDto();
            criteriasPersonne.setNumeroClient(criteresInfosProduitsDto.getNumeroClient());
            final RemotePagingCriteriasDto<PersonneCriteresRechercheDto> criteresPersonne = new RemotePagingCriteriasDto<PersonneCriteresRechercheDto>(
                    criteriasPersonne, 0, 1);
            final RemotePagingResultsDto<PersonneSimpleDto> listePersonnes = personnePhysiqueService
                    .rechercherPersonneFullTextParCriteres(criteresPersonne);
            if (listePersonnes == null || listePersonnes.getListResults() == null
                    || listePersonnes.getListResults().size() != 1) {
                throw new BusinessException(
                        messageSourceUtil.get(MessageKeyUtil.ERROR_PERSONNE_NUM_CLIENT_INEXISTANTE,
                                new String[] { criteresInfosProduitsDto.getNumeroClient() }));
            }
            criteresInfosProduitsDto.setIdAssure(listePersonnes.getListResults().get(0).getId());
        }
        final List<InfosProduitDto> listeInfosProduit = garantieDao.getInfosProduits(criteresInfosProduitsDto);
        if (listeInfosProduit != null && listeInfosProduit.size() > 0) {
            // Rcupration des infos de la personne rattache aux produits.
            for (InfosProduitDto infosProduit : listeInfosProduit) {
                final PersonneDto personne = personnePhysiqueService
                        .rechercherPersonneParIdentifiant(infosProduit.getIdPersonne());
                if (personne == null) {
                    throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_PERSONNE_INEXISTANT,
                            new String[] { infosProduit.getIdPersonne().toString() }));
                }
                infosProduit.setNomPersonne(personne.getNom());
                infosProduit.setPrenomPersonne(personne.getPrenom());
                infosProduit.setDateNaissancePersonne(personne.getDateNaissance());
            }
        }
        return listeInfosProduit;
    }

    @Override
    public ContratDto getContrat(Long uidContrat) {
        final Contrat contrat = contratDao.getContratById(uidContrat);
        if (contrat == null) {
            throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_CONTRAT_INEXISTANT));
        }
        final ContratDto contratDto = mapperDozerBean.map(contrat, ContratDto.class);

        // Rcupration des ajustements du contrat
        final List<AjustementTarif> listeAjustements = contratDao.getListeAjustementsFromContrat(uidContrat);
        final List<AjustementDto> listeAjustementsDto = mapperDozerBean.mapList(listeAjustements,
                AjustementDto.class);
        if (listeAjustementsDto != null && listeAjustementsDto.size() > 0) {
            for (AjustementDto ajustementDto : listeAjustementsDto) {
                final String[] decoupeNumContrat = contrat.getNumeroContrat().split("/");
                if (decoupeNumContrat.length > 1) {
                    final String reference = decoupeNumContrat[decoupeNumContrat.length - 2] + "/"
                            + decoupeNumContrat[decoupeNumContrat.length - 1];
                    ajustementDto.setReference(reference);
                }
            }
        }
        contratDto.setListeAjustements(listeAjustementsDto);

        // Rcupration de la liste des bnficiaires
        final List<Long> listUidContrat = new ArrayList<Long>();
        listUidContrat.add(uidContrat);
        final List<GarantieBeneficiaireDto> listeBeneficiaires = contratDao
                .getListeBeneficiairesFromContrats(listUidContrat, contrat.getUidAssure(), false);

        // Rcupration de la liste des garanties
        final CritereRechercheGarantieDto criteres = new CritereRechercheGarantieDto();
        criteres.setListeIdsContrat(listUidContrat);
        // si contrat en cours, on recupere les garanties en cours
        if (contrat.getStatut().getId().equals(adherentMappingService.getIdStatutContratEnCours())) {
            criteres.setIdStatutGarantie(adherentMappingService.getIdStatutGarantieEnCours());
        }
        // si contrat futur, on recupere les garanties futur
        else if (contrat.getStatut().getId().equals(adherentMappingService.getIdStatutContratFutur())) {
            criteres.setIdStatutGarantie(adherentMappingService.getIdStatutGarantieFutur());
        }
        // si contrat rsili, on recupere les garanties rsili
        else if (contrat.getStatut().getId().equals(adherentMappingService.getIdStatutContratResilie())) {
            criteres.setIdStatutGarantie(adherentMappingService.getIdStatutGarantieResiliee());
        }
        final List<Garantie> listeGaranties = garantieDao.getListeGarantiesByCriteres(criteres);

        // Rcupration du rcapitulatif des garanties du contrat
        final RecapitulatifGarantiesContratDto recapitulatif = construireRecapitulatif(listeBeneficiaires,
                listeGaranties);
        contratDto.setRecapitulatifGarantiesContrat(recapitulatif);

        // Rcupration de la liste des garanties
        final List<GarantieDto> listeGarantieDtos = new ArrayList<GarantieDto>();
        final List<Integer> listeProduitsDejaPresents = new ArrayList<Integer>();
        if (listeGaranties != null && listeGaranties.size() > 0) {
            final Integer idCritereMontantSouscrit = tarificateurMappingService
                    .getIdentifiantCriterePrimeSouscrite();
            for (Garantie garantie : listeGaranties) {
                final GarantieDto garantieDto = new GarantieDto();
                garantieDto.setId(garantie.getId());
                final ProduitCriteresDto critereProduit = new ProduitCriteresDto();
                critereProduit.setProduitAia(garantie.getLibelleProduitGestion());
                critereProduit.setGarantieAia(garantie.getLibelleGarantieGestion());
                final List<ProduitDto> listeProduits = produitService.getListeProduits(critereProduit);
                if (listeProduits == null || listeProduits.size() != 1) {
                    throw new BusinessException(
                            messageSourceUtil.get(MessageKeyUtil.ERROR_RECUPERATION_PRODUIT_IMPOSSIBLE));
                }
                final ProduitDto produit = listeProduits.get(0);
                if (!listeProduitsDejaPresents.contains(produit.getIdentifiant())) {
                    listeProduitsDejaPresents.add(produit.getIdentifiant());
                    garantieDto.setIdProduit(produit.getIdentifiant());
                    garantieDto.setLibelle(produit.getLibelleCommercial());
                    garantieDto.setCodeGeneration(garantie.getCodeGeneration());
                    garantieDto.setCodeTarif(garantie.getCodeTarif());
                    garantieDto.setLibelleGarantieGestion(garantie.getLibelleGarantieGestion());
                    garantieDto.setLibelleProduitGestion(garantie.getLibelleProduitGestion());
                    final IdentifiantLibelleDto statutDto = mapperDozerBean.map(garantie.getStatut(),
                            IdentifiantLibelleDto.class);
                    garantieDto.setStatut(statutDto);
                    garantieDto.setLoiMadelin(garantie.getLoiMadelin());

                    // On dfinit le montant souscrit si le produit est issu de la gamme prvoyance et si il a le critre montant soucrit
                    final Boolean isProduitPrevoyance = produitService
                            .isItGammePrevoyance(produit.getGamme().getIdentifiant());
                    final Boolean hasCritereMontantSouscrit = produitService
                            .isProduitPossedeCritere(produit.getIdentifiant(), idCritereMontantSouscrit);
                    if (isProduitPrevoyance && hasCritereMontantSouscrit) {
                        garantieDto.setMontantSouscrit(garantie.getMontantSouscrit());
                    }

                    listeGarantieDtos.add(garantieDto);
                }
            }
        }
        contratDto.setListeGaranties(listeGarantieDtos);

        // Rcupration des infos de paiement de cotisation
        final InfosPaiementDto infosPaiementCotisation = new InfosPaiementDto();
        contratDto.setInfosPaiementCotisation(infosPaiementCotisation);
        final IdentifiantLibelleDto moyenPaiementCotisation = mapperDozerBean
                .map(contrat.getMoyenPaiementCotisation(), IdentifiantLibelleDto.class);
        infosPaiementCotisation.setMoyenPaiement(moyenPaiementCotisation);
        final IdentifiantLibelleDto frequencePaiementCotisation = mapperDozerBean
                .map(contrat.getFrequencePaiementCotisation(), IdentifiantLibelleDto.class);
        infosPaiementCotisation.setFrequencePaiement(frequencePaiementCotisation);
        infosPaiementCotisation.setJourPaiement(contrat.getJourPaiementCotisation());

        // Rcupration des infos de paiement de prestation
        final InfosPaiementDto infosPaiementPrestation = new InfosPaiementDto();
        final IdentifiantLibelleDto moyenPaiementPrestation = mapperDozerBean
                .map(contrat.getMoyenPaiementPrestation(), IdentifiantLibelleDto.class);
        infosPaiementPrestation.setMoyenPaiement(moyenPaiementPrestation);
        contratDto.setInfosPaiementPrestation(infosPaiementPrestation);

        // Rcupration des informations du souscripteur
        final IdentifiantLibelleDto souscripteurDto = new IdentifiantLibelleDto();
        final PersonneBaseDto souscripteur = personneService.rechercherPersonneParId(contrat.getUidSouscripteur());
        // Si aucune personne n'est trouve
        if (souscripteur == null) {
            throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_SOUSCRIPTEUR_CONTRAT_INEXISTANT,
                    new String[] { contrat.getUidSouscripteur().toString(), contrat.getNumeroContrat() }));
        }
        if (souscripteur instanceof PersonneDto) {
            final PersonneDto souscripteurPPDto = (PersonneDto) souscripteur;
            souscripteurDto.setIdentifiant(souscripteurPPDto.getIdentifiant());
            souscripteurDto.setLibelle(souscripteurPPDto.getPrenom() + " " + souscripteurPPDto.getNom());
        } else {
            final PersonneMoraleDto souscripteurPMDto = (PersonneMoraleDto) souscripteur;
            souscripteurDto.setIdentifiant(souscripteurPMDto.getId());
            souscripteurDto.setLibelle(souscripteurPMDto.getRaisonSociale());
        }
        contratDto.setSouscripteur(souscripteurDto);
        if (contrat.getBanqueCotisation() != null) {
            final InfosBanqueDto infosBanqueCotisation = new InfosBanqueDto();
            infosBanqueCotisation.setCle(contrat.getBanqueCotisation().getCle());
            infosBanqueCotisation.setCodeBanque(contrat.getBanqueCotisation().getCodeBanque());
            infosBanqueCotisation.setCodeGuichet(contrat.getBanqueCotisation().getCodeGuichet());
            infosBanqueCotisation.setCodeCompte(contrat.getBanqueCotisation().getCompte());
            contratDto.setInfoBanqueCotisation(infosBanqueCotisation);
        }
        if (contrat.getBanquePrestation() != null) {
            final InfosBanqueDto infosBanquePrestation = new InfosBanqueDto();
            infosBanquePrestation.setCle(contrat.getBanquePrestation().getCle());
            infosBanquePrestation.setCodeBanque(contrat.getBanquePrestation().getCodeBanque());
            infosBanquePrestation.setCodeGuichet(contrat.getBanquePrestation().getCodeGuichet());
            infosBanquePrestation.setCodeCompte(contrat.getBanquePrestation().getCompte());
            contratDto.setInfoBanquePrestation(infosBanquePrestation);
        }
        // Rcupration des informations du type de payeur
        final IdentifiantLibelleDto typePayeurDto = mapperDozerBean.map(contrat.getTypePayeur(),
                IdentifiantLibelleDto.class);
        contratDto.setTypePayeur(typePayeurDto);

        return contratDto;
    }

    @Override
    public ListeContratsDto getListeContrats(Long uidPersonne) {
        final ListeContratsDto listeContratsDto = new ListeContratsDto();

        // Rcupration du dernier contrat sant en cours ou,  dfaut de contrat sant, du dernier contrat prvoyance en cours,
        // ou  dfaut de contrat prvoyance, du dernier contrat sant futur ou,  dfaut du contrat sant futur, du dernier contrat prvoyance futur
        // ou  dfaut du dernier contrat rsili
        final Long idStatutContratEnCours = adherentMappingService.getIdStatutContratEnCours();
        final Long idStatutContratFutur = adherentMappingService.getIdStatutContratFutur();
        Contrat contratPrinc = contratDao.getDernierContratPersonneByNatureContrat(uidPersonne,
                adherentMappingService.getIdNatureContratSante(), idStatutContratEnCours);
        if (contratPrinc == null) {
            contratPrinc = contratDao.getDernierContratPersonneByNatureContrat(uidPersonne,
                    adherentMappingService.getIdNatureContratPrevoyance(), idStatutContratEnCours);
        }
        if (contratPrinc == null) {
            contratPrinc = contratDao.getDernierContratPersonneByNatureContrat(uidPersonne,
                    adherentMappingService.getIdNatureContratSante(), idStatutContratFutur);
        }
        if (contratPrinc == null) {
            contratPrinc = contratDao.getDernierContratPersonneByNatureContrat(uidPersonne,
                    adherentMappingService.getIdNatureContratPrevoyance(), idStatutContratFutur);
        }
        if (contratPrinc == null) {
            contratPrinc = contratDao.getDernierContratRadiePersonne(uidPersonne);
        }

        if (contratPrinc != null) {

            // Rcupration des informations de synthse du contrat
            final SyntheseContrat syntheseContrat = contratDao.getSyntheseContrat(uidPersonne);
            if (syntheseContrat == null) {
                throw new BusinessException(
                        messageSourceUtil.get(MessageKeyUtil.ERROR_SYNTHESE_CONTRAT_INEXISTANTE));
            }

            final InfosContratsDto infosContrats = new InfosContratsDto();
            infosContrats.setDatePremiereMutualisation(syntheseContrat.getDatePremiereMutualisation());
            infosContrats.setNbAnneesFidelite(syntheseContrat.getNbAnneesFidelite());
            infosContrats.setNbMoisFidelite(syntheseContrat.getNbMoisFidelite());
            infosContrats.setTeletransmission(syntheseContrat.getTeletransmission());
            final List<ReserveProduitBancoDto> listeReservesProduitBanco = reserveBancoDao
                    .getListeReservesBancoByAdherent(uidPersonne);
            final List<ReserveBancoDto> listeReservesBanco = mapperDozerBean.mapList(listeReservesProduitBanco,
                    ReserveBancoDto.class);
            infosContrats.setListeReservesBanco(listeReservesBanco);

            final IdentifiantLibelleDto segmentDto = mapperDozerBean.map(contratPrinc.getSegment(),
                    IdentifiantLibelleDto.class);
            infosContrats.setSegment(segmentDto);
            final IdentifiantLibelleDto statutDto = mapperDozerBean.map(contratPrinc.getStatut(),
                    IdentifiantLibelleDto.class);
            infosContrats.setStatut(statutDto);
            if (contratPrinc.getTypePayeur() != null) {
                infosContrats.setGestionDuContrat(contratPrinc.getTypePayeur().getLibelle());
            }
            infosContrats.setGestionnaire(contratPrinc.getGestionnaire());
            infosContrats.setPopulation(contratPrinc.getPopulation());

            // Rcupration du dernier contrat radi
            final Contrat dernierContratRadie = contratDao.getDernierContratRadiePersonne(uidPersonne);
            if (dernierContratRadie != null && !(dernierContratRadie.getMotifResiliation() != null
                    && (dernierContratRadie.getMotifResiliation().getId()
                            .equals(adherentMappingService.getIdMotifResiliationSansEffet())
                            || dernierContratRadie.getMotifResiliation().getId()
                                    .equals(adherentMappingService.getIdMotifResiliationErreurDeSaisie())))) {
                infosContrats.setDateDerniereRadiation(dernierContratRadie.getDateResiliation());
                if (dernierContratRadie.getMotifResiliation() != null) {
                    infosContrats.setMotifDerniereRadiation(dernierContratRadie.getMotifResiliation().getLibelle());
                }
            }

            // Rcupration des ratios sur les 3 dernires annes
            // Rcupration de la liste des bnficiaires du contrat principal
            final List<Long> listeIdContratPrinc = new ArrayList<Long>();
            listeIdContratPrinc.add(contratPrinc.getId());
            final List<GarantieBeneficiaireDto> listeBeneficiairesContratPrinc = contratDao
                    .getListeBeneficiairesFromContrats(listeIdContratPrinc, uidPersonne, true);
            final List<RatioPrestationCotisationDto> listeRatios = new ArrayList<RatioPrestationCotisationDto>();
            if (listeBeneficiairesContratPrinc != null && listeBeneficiairesContratPrinc.size() > 0) {
                for (GarantieBeneficiaireDto beneficiaire : listeBeneficiairesContratPrinc) {
                    final List<RatioPrestationCotisationDto> listRatioDto = contratDao
                            .getRatioPrestationCotisationPersonne(beneficiaire.getIdBenef());
                    if (listRatioDto != null) {
                        for (RatioPrestationCotisationDto ratioDto : listRatioDto) {
                            final PersonneDto personneDto = personnePhysiqueService
                                    .rechercherPersonneParIdentifiant(ratioDto.getPersonne().getIdentifiant());
                            ratioDto.getPersonne().setLibelle(personneDto.getNom() + " " + personneDto.getPrenom());
                            listeRatios.add(ratioDto);
                        }
                    }
                }
            }
            infosContrats.setListeRatiosPrestationCotisation(listeRatios);

            // Rcupration des contrats en cours
            final CritereRechercheContratDto criteresContrat = new CritereRechercheContratDto();
            criteresContrat.setIdAssure(uidPersonne);
            criteresContrat.setHasContratEnCours(true);
            final List<Contrat> listeContrats = contratDao.getContratsByCriteres(criteresContrat);
            final List<Long> listeIdsContrats = new ArrayList<Long>();
            if (listeContrats != null && listeContrats.size() > 0) {
                for (Contrat contrat : listeContrats) {
                    listeIdsContrats.add(contrat.getId());
                }
            }
            // Rcupration de la liste des bnficiaires
            final List<GarantieBeneficiaireDto> listeBeneficiaires = contratDao
                    .getListeBeneficiairesFromContrats(listeIdsContrats, uidPersonne, true);
            // Rcupration de la liste des garanties des contrats
            final List<Garantie> listeGaranties = new ArrayList<Garantie>();
            if (listeContrats != null && listeContrats.size() > 0) {
                final CritereRechercheGarantieDto criteresGarantie = new CritereRechercheGarantieDto();
                criteresGarantie.setListeIdsContrat(listeIdsContrats);
                criteresGarantie.setHasGarantieEnCours(true);
                listeGaranties.addAll(garantieDao.getListeGarantiesByCriteres(criteresGarantie));
            }
            final RecapitulatifGarantiesContratDto listeGarantiesContrat = construireRecapitulatif(
                    listeBeneficiaires, listeGaranties);
            infosContrats.setListeGarantiesContrat(listeGarantiesContrat);

            listeContratsDto.setInfosContrats(infosContrats);
        }

        // Rcupration de la liste des contrats
        final CritereRechercheContratDto criteresContrat = new CritereRechercheContratDto();
        criteresContrat.setIdAssure(uidPersonne);
        final List<Contrat> listeContrats = contratDao.getContratsByCriteres(criteresContrat);
        if (listeContrats != null && listeContrats.size() > 0) {
            final List<ContratSimpleDto> listeContratsSimples = mapperDozerBean.mapList(listeContrats,
                    ContratSimpleDto.class);
            listeContratsDto.setListeContrats(listeContratsSimples);
        }
        return listeContratsDto;
    }

    @Override
    public InfosContratsBeneficiaireDto hasContratAssureBeneficiaire(Long idAssure, Long idBeneficiaire) {
        final InfosContratsBeneficiaireDto infosContratsBenef = new InfosContratsBeneficiaireDto();
        final List<Garantie> listeGaranties = garantieDao.getListeGarantiesBeneficiaire(idAssure, idBeneficiaire);
        infosContratsBenef.setHasContrats(!listeGaranties.isEmpty());
        boolean hasContratsActifs = false;
        for (Garantie garantie : listeGaranties) {
            final Long idStatutGarantie = garantie.getStatut().getId();
            // Si la garantie a le statut en cours
            // ou le statut rsil mais avec une date de rsiliation future
            if (adherentMappingService.getIdStatutGarantieEnCours().equals(idStatutGarantie)
                    || (adherentMappingService.getIdStatutGarantieResiliee().equals(idStatutGarantie)
                            && garantie.getDateResiliation().after(Calendar.getInstance()))) {
                hasContratsActifs = true;
            }
        }
        infosContratsBenef.setHasContratsActifs(hasContratsActifs);
        return infosContratsBenef;
    }

    /**
     * Construit le rcapitulatif des garanties d'un contrat.
     * @param listeBeneficiaires la liste des bnficiaires.
     * @param listeGaranties la liste des garanties.
     * @return le rcapitulatif.
     */
    private RecapitulatifGarantiesContratDto construireRecapitulatif(
            List<GarantieBeneficiaireDto> listeBeneficiaires, List<Garantie> listeGaranties) {
        final RecapitulatifGarantiesContratDto recapitulatif = new RecapitulatifGarantiesContratDto();
        final List<GarantieBeneficiaireDto> listeBenefsRecap = new ArrayList<GarantieBeneficiaireDto>();
        for (GarantieBeneficiaireDto benef : listeBeneficiaires) {
            // Rcupration du nom et du prnom du bnficiaire
            final PersonneDto personneDto = personnePhysiqueService
                    .rechercherPersonneParIdentifiant(benef.getIdBenef());
            if (personneDto == null) {
                throw new BusinessException(
                        messageSourceUtil.get(MessageKeyUtil.ERROR_BENEFICIAIRE_CONTRAT_INEXISTANT));
            }
            benef.setNom(personneDto.getNom().toUpperCase());
            benef.setPrenom(WordUtils.capitalizeFully(personneDto.getPrenom(), DELIMITERS));
            listeBenefsRecap.add(benef);
        }
        recapitulatif.setListeBeneficiaires(listeBenefsRecap);
        final List<GarantieSimpleDto> listeGarantiesSimples = new ArrayList<GarantieSimpleDto>();
        final List<Integer> listeProduitsDejaPresents = new ArrayList<Integer>();
        if (listeGaranties != null && listeGaranties.size() > 0) {
            for (Garantie garantie : listeGaranties) {
                final GarantieSimpleDto garantieSimpleDto = new GarantieSimpleDto();
                garantieSimpleDto.setId(garantie.getId());
                garantieSimpleDto.setIdContrat(garantie.getContrat().getId());
                final ProduitCriteresDto critereProduit = new ProduitCriteresDto();
                critereProduit.setProduitAia(garantie.getLibelleProduitGestion());
                critereProduit.setGarantieAia(garantie.getLibelleGarantieGestion());
                final List<ProduitDto> listeProduits = produitService.getListeProduits(critereProduit);
                if (listeProduits == null || listeProduits.size() != 1) {
                    throw new BusinessException(
                            messageSourceUtil.get(MessageKeyUtil.ERROR_RECUPERATION_PRODUIT_IMPOSSIBLE));
                }
                final ProduitDto produit = listeProduits.get(0);
                if (!listeProduitsDejaPresents.contains(produit.getIdentifiant())) {
                    listeProduitsDejaPresents.add(produit.getIdentifiant());
                    garantieSimpleDto.setIdGamme(Long.valueOf(produit.getGamme().getIdentifiant()));
                    garantieSimpleDto.setIdProduit(produit.getIdentifiant());
                    garantieSimpleDto.setLibelle(produit.getLibelleCommercial());
                    if (produit.getFormulePresta() != null) {
                        garantieSimpleDto.setIdFormulePresta(produit.getFormulePresta().getIdentifiant());
                        garantieSimpleDto.setLibelleFormulePresta(produit.getFormulePresta().getLibelle());
                    }
                    final IdentifiantLibelleDto segmentDto = mapperDozerBean.map(garantie.getSegment(),
                            IdentifiantLibelleDto.class);
                    garantieSimpleDto.setSegment(segmentDto);
                    final List<InfosGarantieBeneficiaireDto> listeInfosGarantiesBeneficiaires = new ArrayList<InfosGarantieBeneficiaireDto>();
                    final InfosGarantieBeneficiaireDto infosGarantieBeneficiaireDto = new InfosGarantieBeneficiaireDto();
                    infosGarantieBeneficiaireDto.setIdBeneficiaire(garantie.getUidBeneficiaire());
                    infosGarantieBeneficiaireDto.setDateAdhesion(garantie.getDateAdhesion());
                    infosGarantieBeneficiaireDto.setDateResiliation(garantie.getDateResiliation());
                    final IdentifiantLibelleDto statutDto = mapperDozerBean.map(garantie.getStatut(),
                            IdentifiantLibelleDto.class);
                    infosGarantieBeneficiaireDto.setStatut(statutDto);
                    listeInfosGarantiesBeneficiaires.add(infosGarantieBeneficiaireDto);
                    garantieSimpleDto.setListeInfosGarantiesBeneficiaires(listeInfosGarantiesBeneficiaires);
                    listeGarantiesSimples.add(garantieSimpleDto);
                } else {
                    for (GarantieSimpleDto garantieDto : listeGarantiesSimples) {
                        if (garantieDto.getIdProduit().equals(produit.getIdentifiant())) {
                            Integer indexBenefExistant = null;
                            for (int i = 0; i < garantieDto.getListeInfosGarantiesBeneficiaires().size(); i++) {
                                if (garantieDto.getListeInfosGarantiesBeneficiaires().get(i).getIdBeneficiaire()
                                        .equals(garantie.getUidBeneficiaire())) {
                                    indexBenefExistant = i;
                                    break;
                                }
                            }
                            final IdentifiantLibelleDto statutDto = mapperDozerBean.map(garantie.getStatut(),
                                    IdentifiantLibelleDto.class);
                            if (indexBenefExistant != null) {
                                final InfosGarantieBeneficiaireDto infoGarantieBenefDto = garantieDto
                                        .getListeInfosGarantiesBeneficiaires().get(indexBenefExistant);
                                if (infoGarantieBenefDto.getDateAdhesion().before(garantie.getDateAdhesion())) {
                                    infoGarantieBenefDto.setDateAdhesion(garantie.getDateAdhesion());
                                    infoGarantieBenefDto.setDateResiliation(garantie.getDateResiliation());
                                    infoGarantieBenefDto.setStatut(statutDto);
                                }
                            } else {
                                final InfosGarantieBeneficiaireDto infosGarantieBeneficiaireDto = new InfosGarantieBeneficiaireDto();
                                infosGarantieBeneficiaireDto.setIdBeneficiaire(garantie.getUidBeneficiaire());
                                infosGarantieBeneficiaireDto.setDateAdhesion(garantie.getDateAdhesion());
                                infosGarantieBeneficiaireDto.setDateResiliation(garantie.getDateResiliation());
                                infosGarantieBeneficiaireDto.setStatut(statutDto);
                                garantieDto.getListeInfosGarantiesBeneficiaires().add(infosGarantieBeneficiaireDto);
                            }
                        }
                    }
                }
            }
        }
        recapitulatif.setListeGaranties(listeGarantiesSimples);
        return recapitulatif;
    }

    @Override
    public String getGestionnaireContratCollectif(Long uidPersonne) {
        return contratDao.getGestionnaireContratCollectif(uidPersonne);
    }

    @Override
    public ContratPersonneMoraleDto getContratPersonneMorale(Long uidContrat) {
        final Contrat contrat = contratDao.getContratById(uidContrat);
        if (contrat == null) {
            throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_CONTRAT_INEXISTANT));
        }
        final ContratPersonneMoraleDto contratDto = mapperDozerBean.map(contrat, ContratPersonneMoraleDto.class);
        final IdentifiantLibelleDto typeGestionDto = mapperDozerBean.map(contrat.getTypePayeur(),
                IdentifiantLibelleDto.class);
        contratDto.setTypeGestion(typeGestionDto);
        final List<String> listeProduitsGestion = contratDao
                .getListeProduitsGestionFromContrat(contrat.getIdentifiantExterieur());
        if (listeProduitsGestion != null && listeProduitsGestion.size() > 0) {
            String produitGestion = listeProduitsGestion.get(0);
            if (listeProduitsGestion.size() > 1) {
                for (int i = 1; i < listeProduitsGestion.size(); i++) {
                    produitGestion = produitGestion + ", " + listeProduitsGestion.get(i);
                }
            }
            contratDto.setProduitGestion(produitGestion);
        }
        contratDto.setNbAdherents(contratDao.getNombreAdherentsContrat(contrat.getIdentifiantExterieur()));
        contratDto.setNbBeneficiaires(contratDao.getNombreBeneficiairesContrat(contrat.getIdentifiantExterieur()));
        InfosPaiementPersonneMoraleDto infosPaiement = new InfosPaiementPersonneMoraleDto();
        if (contrat.getBanqueCotisation() != null) {
            infosPaiement = mapperDozerBean.map(contrat.getBanqueCotisation(),
                    InfosPaiementPersonneMoraleDto.class);
        }
        if (contrat.getTermePaiement() != null) {
            infosPaiement.setTypeEcheance(contrat.getTermePaiement().getLibelle());
        }
        if (contrat.getFrequencePaiementCotisation() != null) {
            final IdentifiantLibelleDto frequencePaiementDto = mapperDozerBean
                    .map(contrat.getFrequencePaiementCotisation(), IdentifiantLibelleDto.class);
            infosPaiement.setFrequencePaiement(frequencePaiementDto);
        }
        if (contrat.getMoyenPaiementCotisation() != null) {
            final IdentifiantLibelleDto moyenPaiementDto = mapperDozerBean.map(contrat.getMoyenPaiementCotisation(),
                    IdentifiantLibelleDto.class);
            infosPaiement.setMoyenPaiement(moyenPaiementDto);
        }
        infosPaiement.setJourPaiement(contrat.getJourPaiementCotisation());
        contratDto.setInfosPaiement(infosPaiement);

        // Construction du rcapitulatif des populations
        final RecapitulatifPopulationDto recapitulatifPopulation = contratDao
                .getRecapitulatifPopulationContrat(contrat.getIdentifiantExterieur());
        // Tri en fonction des populations
        if (recapitulatifPopulation.getListeValeursPopulation() != null
                && recapitulatifPopulation.getListeValeursPopulation().size() > 1) {
            // Rcupration de l'ordre de la population
            for (ValeursStatutsPopulationDto valeurStatutPopulation : recapitulatifPopulation
                    .getListeValeursPopulation()) {
                final Integer ordre = adherentMappingService
                        .getOrdrePopulation(valeurStatutPopulation.getLibellePopulation());
                valeurStatutPopulation.setOrdrePopulation(ordre);
            }
            // Tri
            final Comparator<ValeursStatutsPopulationDto> comparatorPopulation = new Comparator<ValeursStatutsPopulationDto>() {
                @Override
                public int compare(ValeursStatutsPopulationDto o1, ValeursStatutsPopulationDto o2) {
                    if (o1 == null || o1.getOrdrePopulation() == null) {
                        return 1;
                    } else if (o2 == null || o2.getOrdrePopulation() == null) {
                        return -1;
                    } else {
                        return o1.getOrdrePopulation().compareTo(o2.getOrdrePopulation());
                    }
                }
            };
            Collections.sort(recapitulatifPopulation.getListeValeursPopulation(), comparatorPopulation);
        }
        contratDto.setRecapitulatifPopulation(recapitulatifPopulation);

        // Rcupration de la liste des garanties
        final List<Garantie> listeGaranties = garantieDao
                .getListeGarantiesContratPersonneMorale(contrat.getIdentifiantExterieur());
        final List<GarantiePersonneMoraleDto> listeGarantiesDto = new ArrayList<GarantiePersonneMoraleDto>();
        final List<String> listeProduitsDejaPresents = new ArrayList<String>();
        if (listeGaranties != null && listeGaranties.size() > 0) {
            for (Garantie garantie : listeGaranties) {
                final ProduitCriteresDto critereProduit = new ProduitCriteresDto();
                critereProduit.setProduitAia(garantie.getLibelleProduitGestion());
                critereProduit.setGarantieAia(garantie.getLibelleGarantieGestion());
                final List<ProduitDto> listeProduits = produitService.getListeProduits(critereProduit);
                if (listeProduits == null || listeProduits.size() != 1) {
                    logger.error(messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_RECUP_PRODUIT, new String[] {
                            garantie.getLibelleProduitGestion(), garantie.getLibelleGarantieGestion() }));
                    // On ne traite pas cette garantie car le produit n'a pas t trouv
                    contratDto.getListeProduitsNonTrouves().add(
                            messageSourceUtil.get(MessageKeyUtil.MESSAGE_LIBELLE_PRODUIT_NON_TROUVE, new String[] {
                                    garantie.getLibelleProduitGestion(), garantie.getLibelleGarantieGestion() }));
                    continue;
                }
                final ProduitDto produit = listeProduits.get(0);
                if (!listeProduitsDejaPresents.contains(produit.getLibelleCommercial())) {
                    listeProduitsDejaPresents.add(produit.getLibelleCommercial());
                    final GarantiePersonneMoraleDto garantieDto = new GarantiePersonneMoraleDto();
                    garantieDto.setId(garantie.getId());
                    garantieDto.setIdProduit(produit.getIdentifiant());
                    garantieDto.setLibelle(produit.getLibelleCommercial());
                    if (produit.getFormulePresta() != null) {
                        garantieDto.setIdFormulePresta(produit.getFormulePresta().getIdentifiant());
                        garantieDto.setLibelleFormulePresta(produit.getFormulePresta().getLibelle());
                    }
                    final IdentifiantLibelleDto statut = (IdentifiantLibelleDto) mapperDozerBean
                            .map(garantie.getStatut(), IdentifiantLibelleDto.class);
                    garantieDto.setStatut(statut);
                    garantieDto.setIdNatureProduit(produit.getGamme().getIdCategorie());
                    garantieDto.setDateSignature(garantie.getDateSignature());

                    final List<InfosGarantiePersonneMoraleDto> listeInfosGarantie = new ArrayList<InfosGarantiePersonneMoraleDto>();
                    final InfosGarantiePersonneMoraleDto infosGarantie = mapperDozerBean.map(garantie,
                            InfosGarantiePersonneMoraleDto.class);
                    // On initialise le statut de la garantie au statut de la premire garantie trouve
                    infosGarantie.setStatut(statut);
                    listeInfosGarantie.add(infosGarantie);
                    garantieDto.setListeInfosGarantie(listeInfosGarantie);
                    listeGarantiesDto.add(garantieDto);
                } else {
                    if (listeGarantiesDto != null && listeGarantiesDto.size() > 0) {
                        for (GarantiePersonneMoraleDto garantieDto : listeGarantiesDto) {
                            if (produit.getLibelleCommercial().equals(garantieDto.getLibelle())) {
                                // Mis  jour des champs pour le tri si ncessaire
                                final Long idStatutGarantieExistant = garantieDto.getStatut().getIdentifiant();
                                final Long idNouveauStatutGarantie = garantie.getStatut().getId();
                                if (adherentMappingService.getNiveauImportanceStatutGarantie(
                                        idStatutGarantieExistant) < adherentMappingService
                                                .getNiveauImportanceStatutGarantie(idNouveauStatutGarantie)) {
                                    final IdentifiantLibelleDto statut = mapperDozerBean.map(garantie.getStatut(),
                                            IdentifiantLibelleDto.class);
                                    garantieDto.setStatut(statut);
                                }
                                if (produit.getGamme().getIdCategorie() < garantieDto.getIdNatureProduit()) {
                                    garantieDto.setIdNatureProduit(produit.getGamme().getIdCategorie());
                                }
                                if (garantie.getDateSignature().before(garantieDto.getDateSignature())) {
                                    garantieDto.setDateSignature(garantie.getDateSignature());
                                }
                                // Gestion des infos de garantie
                                if (garantieDto.getListeInfosGarantie() != null
                                        && garantieDto.getListeInfosGarantie().size() > 0) {
                                    final InfosGarantiePersonneMoraleDto infosGarantie = mapperDozerBean
                                            .map(garantie, InfosGarantiePersonneMoraleDto.class);
                                    infosGarantie.setStatut((IdentifiantLibelleDto) mapperDozerBean
                                            .map(garantie.getStatut(), IdentifiantLibelleDto.class));
                                    boolean isExiste = false;
                                    for (InfosGarantiePersonneMoraleDto infos : garantieDto
                                            .getListeInfosGarantie()) {
                                        // On ajoute si a n'est pas un "doublon"
                                        if (infosGarantie.getCodeTarif().equals(infos.getCodeTarif())
                                                && infosGarantie.getLibelleGarantieGestion()
                                                        .equals(infos.getLibelleGarantieGestion())
                                                && infosGarantie.getLibellePopulation()
                                                        .equals(infos.getLibellePopulation())
                                                && (infosGarantie.getMontantSouscrit() == null
                                                        && infos.getMontantSouscrit() == null
                                                        || (infosGarantie.getMontantSouscrit() != null
                                                                && infos.getMontantSouscrit() != null
                                                                && infosGarantie.getMontantSouscrit()
                                                                        .equals(infos.getMontantSouscrit())))) {
                                            isExiste = true;
                                            // On met  jour le statut d'une garantie si le nouveau statut est plus important que l'ancien
                                            final Long idStatutExistant = infos.getStatut().getIdentifiant();
                                            final Long idNouveauStatut = infosGarantie.getStatut().getIdentifiant();
                                            if (adherentMappingService.getNiveauImportanceStatutGarantie(
                                                    idStatutExistant) < adherentMappingService
                                                            .getNiveauImportanceStatutGarantie(idNouveauStatut)) {
                                                infos.setStatut(infosGarantie.getStatut());
                                            }
                                            break;
                                        }
                                    }
                                    if (!isExiste) {
                                        garantieDto.getListeInfosGarantie().add(infosGarantie);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        if (listeGarantiesDto != null && listeGarantiesDto.size() > 1) {
            // Tri des infos de garantie dans chaque garantie
            final Comparator<InfosGarantiePersonneMoraleDto> comparatorListeInfosGarantie = new Comparator<InfosGarantiePersonneMoraleDto>() {
                @Override
                public int compare(InfosGarantiePersonneMoraleDto o1, InfosGarantiePersonneMoraleDto o2) {
                    if (o1 == null) {
                        return -1;
                    } else if (o2 == null) {
                        return 1;
                    } else {
                        final IdentifiantLibelleDto statut1 = o1.getStatut();
                        final IdentifiantLibelleDto statut2 = o2.getStatut();
                        if (statut1 == null || statut1.getIdentifiant() == null) {
                            return -1;
                        } else if (statut2 == null || statut2.getIdentifiant() == null) {
                            return 1;
                        } else {
                            // On rcupre le niveau d'importance des statuts de chaque garantie
                            final Integer niveauImportanceStatut1 = adherentMappingService
                                    .getNiveauImportanceStatutGarantie(statut1.getIdentifiant());
                            final Integer niveauImportanceStatut2 = adherentMappingService
                                    .getNiveauImportanceStatutGarantie(statut2.getIdentifiant());
                            int compareStatut = niveauImportanceStatut1.compareTo(niveauImportanceStatut2);
                            // On inverse le rsultat de comparaison
                            // Niveau d'importance du statut 1 > au niveau d'importance du statut 2
                            if (compareStatut == 1) {
                                // La garantie 1 doit donc apparaitre avant la garantie 2
                                compareStatut = -1;
                            } else if (compareStatut == -1) { // Niveau d'importance du statut 1 < au niveau d'importance du statut 2
                                // La garantie 2 doit donc apparaitre avant la garantie 1
                                compareStatut = 1;
                            }
                            if (compareStatut == 0) {
                                final String libellePopulation1 = o1.getLibellePopulation();
                                final String libellePopulation2 = o2.getLibellePopulation();
                                if (StringUtils.isBlank(libellePopulation1)) {
                                    return -1;
                                } else if (StringUtils.isBlank(libellePopulation2)) {
                                    return 1;
                                } else {
                                    // On compare par rapport au libell population de la garantie
                                    final Integer ordreO1 = adherentMappingService
                                            .getOrdrePopulation(libellePopulation1);
                                    final Integer ordreO2 = adherentMappingService
                                            .getOrdrePopulation(o2.getLibellePopulation());
                                    if (ordreO1 == null) {
                                        return -1;
                                    } else if (ordreO2 == null) {
                                        return 1;
                                    } else {
                                        return ordreO1.compareTo(ordreO2);
                                    }
                                }
                            } else {
                                return compareStatut;
                            }
                        }
                    }
                }
            };
            for (GarantiePersonneMoraleDto garantie : listeGarantiesDto) {
                Collections.sort(garantie.getListeInfosGarantie(), comparatorListeInfosGarantie);
            }

            // Tri des garanties
            final Comparator<GarantiePersonneMoraleDto> comparator = new Comparator<GarantiePersonneMoraleDto>() {
                @Override
                public int compare(GarantiePersonneMoraleDto o1, GarantiePersonneMoraleDto o2) {
                    if (o1 == null) {
                        return 1;
                    } else if (o2 == null) {
                        return -1;
                    } else {
                        if (o1.getStatut() == null && o2.getStatut() != null) {
                            return 1;
                        } else if (o1.getStatut() != null && o2.getStatut() == null) {
                            return -1;
                        } else {
                            if ((o1.getStatut() == null && o2.getStatut() == null)
                                    || (o1.getStatut().getIdentifiant() == null
                                            && o2.getStatut().getIdentifiant() == null)
                                    || (o1.getStatut().getIdentifiant().equals(o2.getStatut().getIdentifiant()))) {
                                if (o1.getIdNatureProduit() == null && o2.getIdNatureProduit() != null) {
                                    return 1;
                                } else if (o1.getIdNatureProduit() != null && o2.getIdNatureProduit() == null) {
                                    return -1;
                                } else if ((o1.getIdNatureProduit() == null && o2.getIdNatureProduit() == null)
                                        || (o1.getIdNatureProduit().equals(o2.getIdNatureProduit()))) {
                                    if (o1.getDateSignature() == null) {
                                        return 1;
                                    } else if (o2.getDateSignature() == null) {
                                        return -1;
                                    } else {
                                        return o2.getDateSignature().compareTo(o1.getDateSignature());
                                    }
                                } else {
                                    return o1.getIdNatureProduit().compareTo(o2.getIdNatureProduit());
                                }
                            } else if (o1.getStatut().getIdentifiant() == null) {
                                return 1;
                            } else if (o2.getStatut().getIdentifiant() == null) {
                                return -1;
                            } else {
                                final Integer niveauImportanceStatut1 = adherentMappingService
                                        .getNiveauImportanceStatutGarantie(o1.getStatut().getIdentifiant());
                                final Integer niveauImportanceStatut2 = adherentMappingService
                                        .getNiveauImportanceStatutGarantie(o2.getStatut().getIdentifiant());
                                return niveauImportanceStatut2.compareTo(niveauImportanceStatut1);
                            }
                        }
                    }
                }
            };
            Collections.sort(listeGarantiesDto, comparator);
        }
        contratDto.setListeGaranties(listeGarantiesDto);
        return contratDto;
    }

    @Override
    public InfosContratsPersonneMoraleDto getInfosContratPersonneMorale(Long uidPersonneMorale) {
        final InfosContratsPersonneMoraleDto infosContrat = new InfosContratsPersonneMoraleDto();

        // Rcupration du dernier contrat sant ou,  dfaut de contrat sant, dernier contrat prvoyance
        Contrat contratPrinc = contratDao.getDernierContratPersonneMoraleByCriteres(uidPersonneMorale,
                adherentMappingService.getIdNatureContratSante(),
                adherentMappingService.getIdStatutContratEnCours());
        if (contratPrinc == null) {
            contratPrinc = contratDao.getDernierContratPersonneMoraleByCriteres(uidPersonneMorale,
                    adherentMappingService.getIdNatureContratPrevoyance(),
                    adherentMappingService.getIdStatutContratEnCours());
        }

        if (contratPrinc != null) {
            // Rcupration des informations de synthse du contrat
            final SyntheseContrat syntheseContrat = contratDao.getSyntheseContrat(uidPersonneMorale);
            if (syntheseContrat == null) {
                throw new BusinessException(
                        messageSourceUtil.get(MessageKeyUtil.ERROR_SYNTHESE_CONTRAT_INEXISTANTE));
            }

            final SyntheseContratPersonneMoraleDto syntheseContrats = new SyntheseContratPersonneMoraleDto();
            syntheseContrats.setDatePremiereMutualisation(syntheseContrat.getDatePremiereMutualisation());
            syntheseContrats.setNbAnneesFidelite(syntheseContrat.getNbAnneesFidelite());
            syntheseContrats.setNbMoisFidelite(syntheseContrat.getNbMoisFidelite());
            final IdentifiantLibelleDto statutDto = mapperDozerBean.map(contratPrinc.getStatut(),
                    IdentifiantLibelleDto.class);
            syntheseContrats.setStatut(statutDto);
            if (contratPrinc.getTypePayeur() != null) {
                syntheseContrats.setGestionDuContrat(contratPrinc.getTypePayeur().getLibelle());
            }
            syntheseContrats.setGestionnaire(contratPrinc.getGestionnaire());

            // Rcupration du dernier contrat radi
            final Contrat dernierContratRadie = contratDao.getDernierContratRadiePersonneMorale(uidPersonneMorale);
            if (dernierContratRadie != null) {
                syntheseContrats.setDateDerniereRadiation(dernierContratRadie.getDateResiliation());
                if (dernierContratRadie.getMotifResiliation() != null) {
                    syntheseContrats
                            .setMotifDerniereRadiation(dernierContratRadie.getMotifResiliation().getLibelle());
                }
            }

            // Rcupration de la population
            final List<PopulationDto> listePopulations = contratDao.getListePopulations(uidPersonneMorale);
            // Tri de la population
            if (listePopulations != null && listePopulations.size() > 1) {
                // Rcupration de l'ordre
                for (PopulationDto populationDto : listePopulations) {
                    final Integer ordre = adherentMappingService.getOrdrePopulation(populationDto.getLibelle());
                    populationDto.setOrdre(ordre);
                }

                // Tri
                final Comparator<PopulationDto> comparator = new Comparator<PopulationDto>() {
                    @Override
                    public int compare(PopulationDto o1, PopulationDto o2) {
                        if (o1 == null || o1.getOrdre() == null) {
                            return 1;
                        } else if (o2 == null || o2.getOrdre() == null) {
                            return -1;
                        } else {
                            return o1.getOrdre().compareTo(o2.getOrdre());
                        }
                    }
                };
                Collections.sort(listePopulations, comparator);
            }
            syntheseContrats.setPopulation(listePopulations);
            infosContrat.setSyntheseContrat(syntheseContrats);

        }
        // Rcupration des contrats de la personne morale
        final List<Contrat> listeContrats = contratDao.getListeContratsPersonneMorale(uidPersonneMorale);
        if (listeContrats != null && listeContrats.size() > 0) {
            final List<ContratSimpleDto> listeContratsSimples = mapperDozerBean.mapList(listeContrats,
                    ContratSimpleDto.class);
            infosContrat.setListeContrats(listeContratsSimples);
        }
        return infosContrat;
    }

    @Override
    public Boolean hasPersonneContrats(Long idPersonne) {
        return contratDao.hasPersonneContrats(idPersonne);
    }

    @Override
    public List<ContratSimpleDto> getContratsSimpleByCriteres(CritereRechercheContratDto criteres) {
        final List<Contrat> listeContrats = contratDao.getContratsByCriteres(criteres);
        return mapperDozerBean.mapList(listeContrats, ContratSimpleDto.class);
    }

    @Override
    public List<CoordonneesBancairesDto> getListeCoordonneesBancaires(Long idPersonne) {
        final Long idMoyenPaiementCheque = adherentMappingService.getIdMoyenPaiementCheque();
        final Long idMoyenPaiementEspece = adherentMappingService.getIdMoyenPaiementEspece();

        final CritereRechercheContratDto criteres = new CritereRechercheContratDto();
        criteres.setIdAssure(idPersonne);
        criteres.setHasContratEnCours(true);
        final List<Contrat> listeContrat = contratDao.getContratsByCriteres(criteres);

        final List<CoordonneesBancairesDto> listeCoordonneesBancaires = new ArrayList<CoordonneesBancairesDto>();
        for (Contrat contrat : listeContrat) {
            final CoordonneesBancairesDto coordonneesBancaires = new CoordonneesBancairesDto();
            coordonneesBancaires.setNumeroContrat(contrat.getNumeroContrat());
            if (contrat.getMoyenPaiementCotisation() != null
                    && !idMoyenPaiementCheque.equals(contrat.getMoyenPaiementCotisation().getId())
                    && !idMoyenPaiementEspece.equals(contrat.getMoyenPaiementCotisation().getId())) {
                coordonneesBancaires.setInfosBanque(
                        (InfosBanqueDto) mapperDozerBean.map(contrat.getBanqueCotisation(), InfosBanqueDto.class));
            }
            final InfosPaiementDto infosPaiement = new InfosPaiementDto();
            infosPaiement.setFrequencePaiement((IdentifiantLibelleDto) mapperDozerBean
                    .map(contrat.getFrequencePaiementCotisation(), IdentifiantLibelleDto.class));
            infosPaiement.setMoyenPaiement((IdentifiantLibelleDto) mapperDozerBean
                    .map(contrat.getMoyenPaiementCotisation(), IdentifiantLibelleDto.class));
            infosPaiement.setJourPaiement(contrat.getJourPaiementCotisation());
            coordonneesBancaires.setInfosPaiement(infosPaiement);
            listeCoordonneesBancaires.add(coordonneesBancaires);
        }
        return listeCoordonneesBancaires;
    }

    @Override
    public Boolean hasDroitAffichageCotisation(Long idPersonne) {
        final PersonneSimpleDto personne = personnePhysiqueService
                .rechercherPersonneSimpleParIdentifiant(idPersonne);
        if (personne != null && personne.getSegment() != null && personne.getSegment().getIdentifiant() != null) {
            if (personne.getSegment().getIdentifiant().equals(squareMappingService.getIdSegmentIndividuel())) {
                return true;
            } else {
                final ListeContratsDto listeContrats = getListeContrats(idPersonne);
                for (ContratSimpleDto contratSimpleDto : listeContrats.getListeContrats()) {
                    final Contrat contrat = contratDao.getContratById(contratSimpleDto.getIdentifiant());
                    if (contrat.getTypePayeur().getId().equals(adherentMappingService.getIdTypePayeurAssure())) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    @Override
    public List<String> getListeContratsCollectifsByCriteres(ContratCollectifCriteresDto criteres) {
        logger.info(messageSourceUtil.get(MessageKeyUtil.LOGGER_INFO_RECUP_LISTE_CONTRAT_ENTREPRISE));
        return contratDao.getListeContratsCollectifsByCriteres(criteres);
    }

    @Override
    public List<String> getListePopulationsByCriteres(PopulationCriteresDto criteres) {
        logger.info(messageSourceUtil.get(MessageKeyUtil.LOGGER_INFO_RECUP_LISTE_POPULATION_CONTRAT_ENTREPRISE));
        return contratDao.getListePopulationsByCriteres(criteres);
    }

    @Override
    public List<ProduitCollectifAdherentDto> getListeProduitsCollectifsAdherent(
            ProduitCollectifAdherentCriteresDto criteres) {
        return contratDao.getListeProduitsCollectifsAdherent(criteres,
                adherentMappingService.getIdRoleGarantieAssure(),
                adherentMappingService.getIdStatutGarantieEnCours(),
                adherentMappingService.getIdStatutGarantieFutur());
    }

    @Override
    public List<TypePayeurDto> getListeTypesPayeurs(TypePayeurCriteresDto criteres) {
        return contratDao.getListeTypesPayeurs(criteres, adherentMappingService.getIdRoleGarantieAssure());
    }

    @Override
    public int countContrats(Long idPersonne, boolean personneMorale) {
        final CritereRechercheContratDto criteresContrat = new CritereRechercheContratDto();
        if (personneMorale) {
            criteresContrat.setIdAssureNull(true);
            criteresContrat.setIdSouscripteur(idPersonne);
        } else {
            criteresContrat.setIdAssure(idPersonne);
        }
        return contratDao.countContratsByCriteres(criteresContrat);
    }

    /**
     * Dfinit la valeur de contratDao.
     * @param contratDao la nouvelle valeur de contratDao
     */
    public void setContratDao(ContratDao contratDao) {
        this.contratDao = contratDao;
    }

    /**
     * Dfinit la valeur de mapperDozerBean.
     * @param mapperDozerBean la nouvelle valeur de mapperDozerBean
     */
    public void setMapperDozerBean(MapperDozerBean mapperDozerBean) {
        this.mapperDozerBean = mapperDozerBean;
    }

    /**
     * Dfinit la valeur de delaiMoisInactiviteGarantieSante.
     * @param delaiMoisInactiviteGarantieSante la nouvelle valeur de delaiMoisInactiviteGarantieSante
     */
    public void setDelaiMoisInactiviteGarantieSante(int delaiMoisInactiviteGarantieSante) {
        this.delaiMoisInactiviteGarantieSante = delaiMoisInactiviteGarantieSante;
    }

    /**
     * Dfinit la valeur de garantieDao.
     * @param garantieDao la nouvelle valeur de garantieDao
     */
    public void setGarantieDao(GarantieDao garantieDao) {
        this.garantieDao = garantieDao;
    }

    /**
     * Dfinit la valeur de personnePhysiqueService.
     * @param personnePhysiqueService la nouvelle valeur de personnePhysiqueService
     */
    public void setPersonnePhysiqueService(PersonnePhysiqueService personnePhysiqueService) {
        this.personnePhysiqueService = personnePhysiqueService;
    }

    /**
     * Dfinit la valeur de produitService.
     * @param produitService la nouvelle valeur de produitService
     */
    public void setProduitService(ProduitService produitService) {
        this.produitService = produitService;
    }

    /**
     * Dfinit la valeur de messageSourceUtil.
     * @param messageSourceUtil la nouvelle valeur de messageSourceUtil
     */
    public void setMessageSourceUtil(MessageSourceUtil messageSourceUtil) {
        this.messageSourceUtil = messageSourceUtil;
    }

    /**
     * Dfinit la valeur de logger.
     * @param logger la nouvelle valeur de logger
     */
    public void setLogger(Logger logger) {
        this.logger = logger;
    }

    /**
     * Dfinit la valeur de reserveBancoDao.
     * @param reserveBancoDao la nouvelle valeur de reserveBancoDao
     */
    public void setReserveBancoDao(ReserveBancoDao reserveBancoDao) {
        this.reserveBancoDao = reserveBancoDao;
    }

    /**
     * Dfinit la valeur de personneService.
     * @param personneService la nouvelle valeur de personneService
     */
    public void setPersonneService(PersonneService personneService) {
        this.personneService = personneService;
    }

    /**
     * Dfinit la valeur de tarificateurMappingService.
     * @param tarificateurMappingService la nouvelle valeur de tarificateurMappingService
     */
    public void setTarificateurMappingService(TarificateurMappingService tarificateurMappingService) {
        this.tarificateurMappingService = tarificateurMappingService;
    }

    /**
     * Dfinit la valeur de squareMappingService.
     * @param squareMappingService la nouvelle valeur de squareMappingService
     */
    public void setSquareMappingService(SquareMappingService squareMappingService) {
        this.squareMappingService = squareMappingService;
    }

    /**
     * Dfinit la valeur de adherentMappingService.
     * @param adherentMappingService la nouvelle valeur de adherentMappingService
     */
    public void setAdherentMappingService(AdherentMappingService adherentMappingService) {
        this.adherentMappingService = adherentMappingService;
    }
}