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

Java tutorial

Introduction

Here is the source code for com.square.adherent.noyau.service.implementations.AdherentServiceImpl.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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.lang.StringUtils;
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.exception.TechnicalException;
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.EspaceClientInternetDao;
import com.square.adherent.noyau.dao.interfaces.MagazineDao;
import com.square.adherent.noyau.dao.interfaces.OptionDao;
import com.square.adherent.noyau.dao.interfaces.OptionTypeDao;
import com.square.adherent.noyau.dao.interfaces.contrat.GarantieBaremeDao;
import com.square.adherent.noyau.dao.interfaces.contrat.GarantieDao;
import com.square.adherent.noyau.dao.interfaces.personne.PersonneDao;
import com.square.adherent.noyau.dao.interfaces.prestation.ReserveBancoDao;
import com.square.adherent.noyau.dto.adherent.BeneficiaireDto;
import com.square.adherent.noyau.dto.adherent.InfosCompteAdherentDto;
import com.square.adherent.noyau.dto.adherent.InfosEspaceAdherentDto;
import com.square.adherent.noyau.dto.adherent.InfosIdentifiantPersonneDto;
import com.square.adherent.noyau.dto.adherent.InfosOptionsAdherentDto;
import com.square.adherent.noyau.dto.adherent.OptionAdherentDto;
import com.square.adherent.noyau.dto.adherent.contrat.CoupleBaremeDto;
import com.square.adherent.noyau.dto.adherent.contrat.GarantieBaremeCriteresDto;
import com.square.adherent.noyau.dto.adherent.contrat.GarantieBaremeDto;
import com.square.adherent.noyau.dto.adherent.prestations.DemandePriseEnChargeDto;
import com.square.adherent.noyau.dto.espace.client.EspaceClientInternetDto;
import com.square.adherent.noyau.dto.prestation.CriteresPersonnesNotificationSmsDto;
import com.square.adherent.noyau.dto.produit.ReserveProduitBancoDto;
import com.square.adherent.noyau.model.data.contrat.GarantieBareme;
import com.square.adherent.noyau.model.data.espace.client.EspaceClientInternet;
import com.square.adherent.noyau.model.data.espace.client.Option;
import com.square.adherent.noyau.model.dimension.OptionType;
import com.square.adherent.noyau.service.interfaces.AdherentMappingService;
import com.square.adherent.noyau.service.interfaces.AdherentService;
import com.square.adherent.noyau.service.interfaces.EspaceClientInternetService;
import com.square.adherent.noyau.util.MessageKeyUtil;
import com.square.adherent.noyau.util.PersonneUtil;
import com.square.core.model.dto.ActionCreationDto;
import com.square.core.model.dto.AdresseDto;
import com.square.core.model.dto.CoordonneesDto;
import com.square.core.model.dto.EmailDto;
import com.square.core.model.dto.HistoriqueCommentaireDto;
import com.square.core.model.dto.PersonneCriteresRechercheDto;
import com.square.core.model.dto.PersonneDto;
import com.square.core.model.dto.PersonnePhysiqueCopieDto;
import com.square.core.model.dto.PersonneRelationDto;
import com.square.core.model.dto.PersonneSimpleDto;
import com.square.core.model.dto.RelationCriteresRechercheDto;
import com.square.core.model.dto.RelationDto;
import com.square.core.model.dto.RelationInfosDto;
import com.square.core.model.dto.TelephoneDto;
import com.square.core.service.interfaces.ActionService;
import com.square.core.service.interfaces.PersonnePhysiqueService;
import com.square.core.service.interfaces.PersonneService;
import com.square.core.service.interfaces.SquareMappingService;
import com.square.mail.core.dto.emails.EmailAvecModeleDto;
import com.square.mail.core.dto.emails.InfosModeleEmailDto;
import com.square.mail.core.service.interfaces.email.EnvoiEmailMappingService;
import com.square.mail.core.service.interfaces.email.MailService;

/**
 * Implmentation des services spcifiques aux adhrents Smatis.
 * @author Nicolas Prouteau (nicolas.prouteau@scub.net) - SCUB
 */
public class AdherentServiceImpl implements AdherentService {

    private final Logger logger = Logger.getLogger(this.getClass());

    private MailService mailService;

    private EnvoiEmailMappingService envoiEmailMappingService;

    private PersonneService personneService;

    private PersonnePhysiqueService personnePhysiqueService;

    private ActionService actionService;

    private SquareMappingService squareMappingService;

    private EspaceClientInternetService espaceClientInternetService;

    private AdherentMappingService adherentMappingService;

    private MessageSourceUtil messageSourceUtil;

    private PersonneUtil personneUtil;

    private MapperDozerBean mapperDozerBean;

    private EspaceClientInternetDao espaceClientInternetDao;

    private OptionDao optionDao;

    private MagazineDao magazineDao;

    private OptionTypeDao optionTypeDao;

    private GarantieDao garantieDao;

    private PersonneDao personneDao;

    private ReserveBancoDao reserveBancoDao;

    private GarantieBaremeDao garantieBaremeDao;

    private SimpleDateFormat sdf;

    private SimpleDateFormat sdfMois;

    /**
     * {@inheritDoc}
     */
    @Override
    public InfosEspaceAdherentDto getInfosEspaceAdherent(Long uidPersonne) {
        if (uidPersonne == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_GET_INFOS_ESPACE_ADHERENT_UID_PERSONNE_NULL));
        }
        // On rcupre les infos de connexion de l'adhrent
        final EspaceClientInternet connexionAdherent = espaceClientInternetDao
                .getEspaceClientInternetClient(uidPersonne);
        if (connexionAdherent == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_GET_INFOS_ESPACE_ADHERENT_UID_PERSONNE_NULL,
                            new String[] { uidPersonne.toString() }));
        }
        final List<Option> optionsAdherent = optionDao.getOptionsAdherent(uidPersonne);
        // On rcupre les coordonnes de l'adhrent  partir de Square.
        final CoordonneesDto coordonneesAdherent = personneService.rechercherCoordonneesParIdPersonne(uidPersonne);
        // On vrifie que l'adhrent possde des coordonnes et un email.
        if (coordonneesAdherent == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_ENVOYER_MOT_DE_PASSE_COORDONNEES_PERSONNE_NULL,
                            new String[] { uidPersonne.toString() }));
        }

        // Mapping automatique des infos
        final InfosEspaceAdherentDto infosEspaceAdherentDto = mapperDozerBean.map(connexionAdherent,
                InfosEspaceAdherentDto.class);
        if (!coordonneesAdherent.getEmails().isEmpty()) {
            final EmailDto emailAdherent = coordonneesAdherent.getEmails().get(0);
            // Mapping manuel de l'adresse email de l'adhrent.
            infosEspaceAdherentDto.setEmail(emailAdherent.getAdresse());
        }
        // On dtermine la date de dernire modification des options
        Calendar dateDerniereModificationOptions = null;
        for (Option option : optionsAdherent) {
            final Calendar dateModificationOption = option.getDateModification();
            if (dateDerniereModificationOptions == null
                    || dateModificationOption.after(dateDerniereModificationOptions)) {
                dateDerniereModificationOptions = dateModificationOption;
            }
        }
        infosEspaceAdherentDto.setDateModificationOptions(dateDerniereModificationOptions);
        final List<OptionAdherentDto> listeOptions = mapperDozerBean.mapList(optionsAdherent,
                OptionAdherentDto.class);
        infosEspaceAdherentDto.setListeOptions(listeOptions);
        return infosEspaceAdherentDto;
    }

    @Override
    public InfosOptionsAdherentDto getInfosOptionsAdherent(Long uidPersonne) {
        if (uidPersonne == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_GET_INFOS_ESPACE_ADHERENT_UID_PERSONNE_NULL));
        }
        final List<Option> optionsAdherent = optionDao.getOptionsAdherent(uidPersonne);
        // On rcupre les coordonnes de l'adhrent  partir de Square.
        final CoordonneesDto coordonneesAdherent = personneService.rechercherCoordonneesParIdPersonne(uidPersonne);
        // On vrifie que l'adhrent possde des coordonnes et un email.
        if (coordonneesAdherent == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_ENVOYER_MOT_DE_PASSE_COORDONNEES_PERSONNE_NULL,
                            new String[] { uidPersonne.toString() }));
        }

        // Mapping automatique des infos
        final InfosOptionsAdherentDto infosOptionsAdherentDto = new InfosOptionsAdherentDto();
        // On dtermine la date de dernire modification des options
        Calendar dateDerniereModificationOptions = null;
        for (Option option : optionsAdherent) {
            final Calendar dateModificationOption = option.getDateModification();
            if (dateDerniereModificationOptions == null
                    || dateModificationOption.after(dateDerniereModificationOptions)) {
                dateDerniereModificationOptions = dateModificationOption;
            }
        }
        infosOptionsAdherentDto.setDateModificationOptions(dateDerniereModificationOptions);
        final List<OptionAdherentDto> listeOptions = mapperDozerBean.mapList(optionsAdherent,
                OptionAdherentDto.class);
        infosOptionsAdherentDto.setListeOptions(listeOptions);
        return infosOptionsAdherentDto;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<OptionAdherentDto> mettreAJourListeOptionsAdherent(Long uidPersonne,
            List<OptionAdherentDto> listeOptions) {
        if (uidPersonne == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_MAJ_OPTIONS_ADHERENT_UID_PERSONNE_NULL));
        }
        final CoordonneesDto coordonneesDto = personneService.rechercherCoordonneesParIdPersonne(uidPersonne);
        // On parcours les options pour les ajouter / mettre  jour.
        for (OptionAdherentDto option : listeOptions) {
            creerOuMajOptionAdherent(uidPersonne, option, coordonneesDto);
        }
        // On retourne les options de l'adhrent mises  jour
        final List<Option> optionsAdherent = optionDao.getOptionsAdherent(uidPersonne);
        return mapperDozerBean.mapList(optionsAdherent, OptionAdherentDto.class);
    }

    /**
     * Cr / met  jour une option d'adhrent.
     * @param uidPersonne l'identifiant de l'adhrent.
     * @param optionDto l'option  crer / mettre  jour.
     */
    private void creerOuMajOptionAdherent(Long uidPersonne, OptionAdherentDto optionDto,
            final CoordonneesDto coordonnees) {
        final Long idOptionEnvoiMutuellement = adherentMappingService.getIdTypeOptionEnvoiMutuellementEmail();
        final Long idOptionEnvoiRelevesPresta = adherentMappingService.getIdTypeOptionEnvoiRelevesPrestationEmail();
        final Long idOptionEnvoiSms = adherentMappingService.getIdTypeOptionEnvoiSms();
        final Long idNatureMobilePrive = squareMappingService.getIdNatureMobilePrive();
        final Long idNatureMobileTravail = squareMappingService.getIdNatureMobileTravail();

        Option option = null;
        if (optionDto.getId() != null) {
            option = optionDao.getOptionById(optionDto.getId());
        } else if (optionDto.getType() != null && optionDto.getType().getIdentifiant() != null) {
            option = optionDao.getOptionByPersonneAndType(uidPersonne, optionDto.getType().getIdentifiant());
        }
        final Calendar maintenant = Calendar.getInstance();
        if (option == null) {
            // Si l'option est active
            if (optionDto.isActive()) {
                // On la sauvegarde dans la base de donnes.
                option = new Option();
                final OptionType typeOption = optionTypeDao.getOptionTypeById(optionDto.getType().getIdentifiant());
                if (typeOption == null) {
                    logger.error(messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_TYPE_OPTION_INVALIDE,
                            new String[] { String.valueOf(optionDto.getType().getIdentifiant()) }));
                    throw new TechnicalException(
                            messageSourceUtil.get(MessageKeyUtil.ERROR_MAJ_OPTIONS_ADHERENT_UID_PERSONNE_NULL));
                }
                // si l'option a activer est de de type 'envoie par email'
                if (optionDto.getType() != null
                        && (idOptionEnvoiRelevesPresta.equals(optionDto.getType().getIdentifiant())
                                || idOptionEnvoiMutuellement.equals(optionDto.getType().getIdentifiant()))) {
                    // si l'adhrent n'a pas d'email
                    if (coordonnees.getEmails() == null || coordonnees.getEmails().isEmpty()) {
                        throw new TechnicalException(messageSourceUtil
                                .get(MessageKeyUtil.ERROR_MAJ_OPTIONS_ADHERENT_UID_PERSONNE_EMAIL_REQUIS));
                    }
                }
                // si l'option a activer est de de type 'envoie par sms'
                if (optionDto.getType() != null
                        && (idOptionEnvoiSms.equals(optionDto.getType().getIdentifiant()))) {
                    boolean existeTelephoneMobile = false;
                    if (coordonnees.getTelephones() != null) {
                        for (TelephoneDto telephone : coordonnees.getTelephones()) {
                            if (idNatureMobilePrive.equals(telephone.getNature().getIdentifiant())
                                    || idNatureMobileTravail.equals(telephone.getNature().getIdentifiant())) {
                                existeTelephoneMobile = true;
                                break;
                            }
                        }
                    }
                    // si l'adhrent n'a pas de telephone
                    if (!existeTelephoneMobile) {
                        throw new TechnicalException(messageSourceUtil.get(
                                MessageKeyUtil.ERROR_MAJ_OPTIONS_ADHERENT_UID_PERSONNE_TELEPHONE_MOBILE_REQUIS));
                    }
                }
                option.setType(typeOption);
                option.setUidPersonne(uidPersonne);
                option.setDateCreation(maintenant);
                option.setDateDebut(maintenant);
                option.setDateModification(maintenant);
                option.setActive(true);
                // On crer l'option
                optionDao.saveOption(option);
            }
        } else {
            // On met  jour l'option
            // Activation de l'option
            if (optionDto.isActive() && !option.isActive()) {
                // si l'option a activer est de de type 'envoie par email'
                if (optionDto.getType() != null
                        && (idOptionEnvoiRelevesPresta.equals(optionDto.getType().getIdentifiant())
                                || idOptionEnvoiMutuellement.equals(optionDto.getType().getIdentifiant()))) {
                    // si l'adhrent n'a pas d'email
                    if (coordonnees.getEmails() == null || coordonnees.getEmails().isEmpty()) {
                        throw new TechnicalException(messageSourceUtil
                                .get(MessageKeyUtil.ERROR_MAJ_OPTIONS_ADHERENT_UID_PERSONNE_EMAIL_REQUIS));
                    }
                }
                // si l'option a activer est de de type 'envoie par sms'
                if (optionDto.getType() != null
                        && (idOptionEnvoiSms.equals(optionDto.getType().getIdentifiant()))) {
                    boolean existeTelephoneMobile = false;
                    if (coordonnees.getTelephones() != null) {
                        for (TelephoneDto telephone : coordonnees.getTelephones()) {
                            if (idNatureMobilePrive.equals(telephone.getNature().getIdentifiant())
                                    || idNatureMobileTravail.equals(telephone.getNature().getIdentifiant())) {
                                existeTelephoneMobile = true;
                                break;
                            }
                        }
                    }
                    // si l'adhrent n'a pas de telephone
                    if (!existeTelephoneMobile) {
                        throw new TechnicalException(messageSourceUtil.get(
                                MessageKeyUtil.ERROR_MAJ_OPTIONS_ADHERENT_UID_PERSONNE_TELEPHONE_MOBILE_REQUIS));
                    }
                }
                option.setActive(true);
                option.setDateDebut(maintenant);
                option.setDateModification(maintenant);
                option.setDateFin(null);
            }
            // Dsactivation de l'option
            else if (!optionDto.isActive() && option.isActive()) {
                option.setActive(false);
                option.setDateModification(maintenant);
                option.setDateFin(maintenant);
            }
        }

        // Mise  jour de la date de dmatrialisation des documents seulement pour les relevs de prestation
        if (optionDto.getType() != null
                && idOptionEnvoiRelevesPresta.equals(optionDto.getType().getIdentifiant())) {
            // Rcupration des infos de connexion de la personne
            final Long idNatureEspaceAdherent = adherentMappingService.getIdNatureConnexionEspaceClient();
            final EspaceClientInternet espaceClientInternet = espaceClientInternetDao
                    .getEspaceClientInternetByPersonneAndNature(uidPersonne, idNatureEspaceAdherent);
            espaceClientInternet.setDateDerniereDematerialisation(maintenant);
            espaceClientInternet.setDateModification(maintenant);
        }
    }

    @Override
    public List<Long> getListeBeneficiairesPersonne(Long idPersonne) {
        logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_BENEFICIAIRE_PERSONNE) + idPersonne);
        return personneDao.getListeBeneficiairesPersonne(idPersonne);
    }

    @Override
    public Long getIdAdherentPrincipal(Long idPersonne) {
        logger.debug(
                messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_ADHERENT_PRINCIPAL_PERSONNE) + idPersonne);
        return personneDao.getAdherentPrincipalPersonne(idPersonne);
    }

    @Override
    public List<ReserveProduitBancoDto> getReserveProduitBancoByUser(Long idAdherent) {
        logger.debug(
                messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_INFO_RESERVE_BANCO_ADHERENT) + idAdherent);
        return reserveBancoDao.getListeReservesBancoByAdherent(idAdherent);
    }

    @Override
    public void mettreAJourMotDePasse(Long idPersonne, String motDePasse) {
        logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_MAJ_MDP_PERSONNE) + idPersonne);

        // Rcupration de la connexion de la personne correspondante.
        final Long idNature = adherentMappingService.getIdNatureConnexionEspaceClient();
        final EspaceClientInternet espaceClientInternet = espaceClientInternetDao
                .getEspaceClientInternetByPersonneAndNature(idPersonne, idNature);

        if (espaceClientInternet == null) {
            throw new BusinessException(MessageKeyUtil.ERROR_COMPTE_INEXITANT);
        }
        // Modification du mot de passe
        espaceClientInternet.setMotDePasse(motDePasse);
        espaceClientInternet.setDateModification(Calendar.getInstance());
    }

    @Override
    public boolean hasPersonneEspaceAdherent(Long uidPersonne) {
        return espaceClientInternetDao.getEspaceClientInternetClient(uidPersonne) != null;
    }

    @Override
    public boolean isPersonneAssocieeAContrat(Long uidPersonne) {
        // Une personne est associe  un contrat si elle est assure ou bnficiaire d'une garantie
        return garantieDao.isPersonneAssocieeAContrat(uidPersonne);
    }

    @Override
    public boolean isPersonnePossedeOption(Long idPersonne, Long idTypeOption) {
        return optionDao.isPersonnePossedeOption(idPersonne, idTypeOption);
    }

    @Override
    public List<Long> getListeIdsTypesOptionsSouscrites(Long uidPersonne) {
        logger.debug(
                messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_OPTIONS_SOUSCRITES_PERSONNE) + uidPersonne);
        final List<Option> listeOptions = optionDao.getListeOptionsSouscritesByPersonne(uidPersonne);
        // Rcupration des identifiant des options souscrites
        final List<Long> listeIdTypesOptionsSouscrites = new ArrayList<Long>();
        for (Option option : listeOptions) {
            if (option.getType() != null && option.getType().getId() != null) {
                listeIdTypesOptionsSouscrites.add(option.getType().getId());
            }
        }
        return listeIdTypesOptionsSouscrites;
    }

    @Override
    public void mettreAJourInfosCompteAdherent(InfosCompteAdherentDto infosCompteAdherent) {
        logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_MODIF_INFO_COMPTE_PERSONNE)
                + infosCompteAdherent.getIdAdherent());
        // On met  jour l'espace client de l'adhrent
        espaceClientInternetService.majEspaceClient(
                (EspaceClientInternetDto) mapperDozerBean.map(infosCompteAdherent, EspaceClientInternetDto.class));
        final CoordonneesDto coordonneesDto = personneService
                .rechercherCoordonneesParIdPersonne(infosCompteAdherent.getIdAdherent());
        // On met  jour les options de l'adhrent
        if (infosCompteAdherent.getListeOptions() != null) {
            for (OptionAdherentDto option : infosCompteAdherent.getListeOptions()) {
                // Cration ou mise  jour de l'option
                creerOuMajOptionAdherent(infosCompteAdherent.getIdAdherent(), option, coordonneesDto);
            }
        }
    }

    @Override
    public void desactiverOptionsEnvoiParEmail(Long uidPersonne) {
        logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_DESACTIVATION_OPTION_ENVOIE_EMAIL_PERSONNE)
                + uidPersonne);
        final CoordonneesDto coordonneesDto = personneService.rechercherCoordonneesParIdPersonne(uidPersonne);
        final OptionAdherentDto optionEnvoiMutuellement = new OptionAdherentDto();
        optionEnvoiMutuellement
                .setType(new IdentifiantLibelleDto(adherentMappingService.getIdTypeOptionEnvoiMutuellementEmail()));
        optionEnvoiMutuellement.setActive(false);
        creerOuMajOptionAdherent(uidPersonne, optionEnvoiMutuellement, coordonneesDto);
        final OptionAdherentDto optionEnvoiRelevesPrestation = new OptionAdherentDto();
        optionEnvoiRelevesPrestation.setType(
                new IdentifiantLibelleDto(adherentMappingService.getIdTypeOptionEnvoiRelevesPrestationEmail()));
        optionEnvoiRelevesPrestation.setActive(false);
        creerOuMajOptionAdherent(uidPersonne, optionEnvoiRelevesPrestation, coordonneesDto);
    }

    @Override
    public void desactiverOptionsEnvoiParTelephone(Long uidPersonne) {
        logger.debug(messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_DESACTIVATION_OPTION_ENVOIE_TEL_PERSONNE)
                + uidPersonne);
        final CoordonneesDto coordonneesDto = personneService.rechercherCoordonneesParIdPersonne(uidPersonne);
        final OptionAdherentDto optionEnvoiSms = new OptionAdherentDto();
        optionEnvoiSms.setType(new IdentifiantLibelleDto(adherentMappingService.getIdTypeOptionEnvoiSms()));
        optionEnvoiSms.setActive(false);
        creerOuMajOptionAdherent(uidPersonne, optionEnvoiSms, coordonneesDto);
    }

    @Override
    public List<Long> getListeAdherentsByIdOptionSouscrite(Long idOption) {
        logger.debug(
                messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_LISTE_ADHERENT_SOUSCRIT_OPTION) + idOption);
        return optionDao.getListeAdherentsByIdOptionSouscrite(idOption);
    }

    @Override
    public List<Long> getListeAdherentsByIdMagazineEnvoye(Long idMagazine) {
        logger.debug(
                messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_LISTE_ADHERENT_RECU_MAGAZINE) + idMagazine);
        return magazineDao.getListeAdherentsByIdMagazineEnvoye(idMagazine);
    }

    /**
     * {@inheritDoc}
     */
    public List<Long> getListePersonnesNotificationSmsByCriteres(CriteresPersonnesNotificationSmsDto criteres) {
        logger.info(
                messageSourceUtil.get(MessageKeyUtil.LOGGER_DEBUG_RECUP_PERSONNE_A_NOTIFIER_PAR_SMS_PAR_CRITERE));
        return personneDao.getListePersonnesNotificationSmsByCriteres(criteres);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void demanderPriseEnCharge(DemandePriseEnChargeDto demandePriseEnChargeDto) {
        // Vrification des paramtres...
        // L'identifiant de l'adhrent  l'origine de la demande est obligatoire
        if (demandePriseEnChargeDto.getIdAdherent() == null) {
            throw new BusinessException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PREREQUIS_ID_ADHERENT));
        }
        // On rcupre l'adhrent  l'origine de la demande de prise en charge
        PersonneSimpleDto adherent = personnePhysiqueService
                .rechercherPersonneSimpleParIdentifiant(demandePriseEnChargeDto.getIdAdherent());
        if (adherent == null) {
            logger.error(messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_ADHERENT_INTROUVABLE,
                    new String[] { String.valueOf(demandePriseEnChargeDto.getIdAdherent()) }));
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_ADHERENT_INTROUVABLE));
        }
        // L'identifiant de la personne  prendre en charge est obligatoire
        if (demandePriseEnChargeDto.getIdPersonneAPrendreEnCharge() == null) {
            throw new BusinessException(messageSourceUtil
                    .get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PREREQUIS_ID_PERSONNE_A_PRENDRE_EN_CHARGE));
        }
        PersonneSimpleDto personneAPrendreEnCharge;
        // On rcupre la personne  prendre en charge si l'identifiant de la personne  prendre en charge est diffrent de l'identifiant de l'adhrent
        if (!demandePriseEnChargeDto.getIdAdherent()
                .equals(demandePriseEnChargeDto.getIdPersonneAPrendreEnCharge())) {
            personneAPrendreEnCharge = personnePhysiqueService.rechercherPersonneSimpleParIdentifiant(
                    demandePriseEnChargeDto.getIdPersonneAPrendreEnCharge());
            if (personneAPrendreEnCharge == null) {
                logger.error(messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_PERSONNE_PRENDRE_CHARGE_INTROUVABLE,
                        new String[] { String.valueOf(demandePriseEnChargeDto.getIdPersonneAPrendreEnCharge()) }));
                throw new TechnicalException(messageSourceUtil.get(
                        MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PERSONNE_A_PRENDRE_EN_CHARGE_INTROUVABLE));
            }
        } else {
            personneAPrendreEnCharge = adherent;
        }
        // Le nom de l'tablissement est obligatoire
        if (StringUtils.isBlank(demandePriseEnChargeDto.getNomEtablissement())) {
            throw new BusinessException(messageSourceUtil
                    .get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PREREQUIS_NOM_ETABLISSEMENT));
        }
        // L'adresse de l'tablissement est obligatoire
        if (StringUtils.isBlank(demandePriseEnChargeDto.getAdresseEtablissement())) {
            throw new BusinessException(messageSourceUtil
                    .get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PREREQUIS_ADRESSE_ETABLISSEMENT));
        }
        // La ville de l'tablissement est obligatoire
        if (StringUtils.isBlank(demandePriseEnChargeDto.getVilleEtablissement())) {
            throw new BusinessException(messageSourceUtil
                    .get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PREREQUIS_VILLE_ETABLISSEMENT));
        }
        // La date d'entre dans l'tablissement est obligatoire
        if (demandePriseEnChargeDto.getDateEntree() == null) {
            throw new BusinessException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PREREQUIS_DATE_ENTREE));
        }
        // La nature des soins est obligatoire
        if (StringUtils.isBlank(demandePriseEnChargeDto.getNatureSoins())) {
            throw new BusinessException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_DEMANDE_PRISE_EN_CHARGE_PREREQUIS_NATURE_SOINS));
        }

        // Prparation de la demande de prise en charge...
        // On formate les champs textuels de l'adhrent
        adherent = personneUtil.formatterPersonneSimple(adherent);
        personneAPrendreEnCharge = personneUtil.formatterPersonneSimple(personneAPrendreEnCharge);
        logger.info(messageSourceUtil.get(MessageKeyUtil.LOGGER_INFO_DEMANDE_PRISE_CHARGE_ADHERENT,
                new String[] { String.valueOf(adherent.getId()), String.valueOf(adherent.getNumeroClient()) }));

        // On crer une action dans Square
        final ActionCreationDto action = new ActionCreationDto();
        final List<HistoriqueCommentaireDto> commentaires = new ArrayList<HistoriqueCommentaireDto>();
        final HistoriqueCommentaireDto commentaire = new HistoriqueCommentaireDto();
        sdf = new SimpleDateFormat(messageSourceUtil.get(MessageKeyUtil.FORMAT_DATE_DD_MM_YYYY));
        final StringBuffer descriptif = new StringBuffer(messageSourceUtil.get(
                MessageKeyUtil.MESSAGE_DESCRIPTIF_ADHERENT,
                new String[] {
                        personneAPrendreEnCharge.getCivilite() != null
                                ? personneAPrendreEnCharge.getCivilite().getLibelle() + " "
                                : " ",
                        personneAPrendreEnCharge.getNom(), personneAPrendreEnCharge.getPrenom(),
                        personneAPrendreEnCharge.getNumeroClient(), demandePriseEnChargeDto.getNomEtablissement(),
                        demandePriseEnChargeDto.getNumeroFaxEtablissement(),
                        demandePriseEnChargeDto.getNumeroVoieEtablissement(),
                        demandePriseEnChargeDto.getNatureVoieEtablissement(),
                        demandePriseEnChargeDto.getAdresseEtablissement(),
                        demandePriseEnChargeDto.getComplementAdresseEtablissement(),
                        demandePriseEnChargeDto.getAutreComplementEtablissement(),
                        demandePriseEnChargeDto.getCodePostalEtablissement(),
                        demandePriseEnChargeDto.getVilleEtablissement(),
                        sdf.format(demandePriseEnChargeDto.getDateEntree().getTime()),
                        demandePriseEnChargeDto.getNatureSoins(), demandePriseEnChargeDto.getCodeDiscipline() }));

        commentaire.setDescriptif(descriptif.toString());
        final Calendar now = Calendar.getInstance();
        action.setIdPersonne(adherent.getId());
        action.setIdStatut(squareMappingService.getIdStatutActionAFaire());
        action.setIdPriorite(squareMappingService.getIdActionPrioriteParDefaut());
        action.setDateAction(now);
        action.setDateAffichageAction(now);
        action.setIdAgence(adherent.getAgence().getIdentifiant());
        // Si l'adhrent a un commercial associ
        if (adherent.getCommercial() != null && adherent.getCommercial().getIdentifiant() != null) {
            action.setIdCommercial(adherent.getCommercial().getIdentifiant());
        }
        action.setIdNatureAction(squareMappingService.getIdNatureActionInternet());
        action.setIdType(squareMappingService.getIdTypeActionPrestationsSinistres());
        action.setIdObjet(squareMappingService.getIdObjetActionDemandeDevisOuPEC());
        action.setIdCreateur(demandePriseEnChargeDto.getIdCreateur());
        action.setReclamation(false);
        commentaires.add(commentaire);
        action.setCommentaires(commentaires);
        actionService.creerAction(action);

        // On rcupre les coordonnes de l'adhrent
        final CoordonneesDto coordonneesAdherent = personneService
                .rechercherCoordonneesParIdPersonne(adherent.getId());
        // On envoie un email de notification  l'adhrent si il a un email personnel
        final EmailDto emailAdherent = personneUtil.getEmailsByNature(coordonneesAdherent.getEmails(),
                squareMappingService.getIdNatureEmailPersonnel()).get(0);
        if (emailAdherent != null && StringUtils.isNotBlank(emailAdherent.getAdresse())) {
            //TODO changement de dto !
            final com.square.mail.core.dto.emails.MailDto mailToAdherentDto = new com.square.mail.core.dto.emails.MailDto();

            final InfosModeleEmailDto infosModele = new InfosModeleEmailDto();
            infosModele.setIdModeleEmail(envoiEmailMappingService.getIdModeleDemandePriseEnCharge());
            if (adherent.getCivilite() != null) {
                infosModele.setCiviliteDestinataire(adherent.getCivilite().getLibelle());
            }
            infosModele.setEmailDestinataire(emailAdherent.getAdresse());
            infosModele.setNomDestinataire(adherent.getNom());

            final EmailAvecModeleDto emailAvecModeleDto = new EmailAvecModeleDto();
            emailAvecModeleDto.setInfosModele(infosModele);
            emailAvecModeleDto.setEmail(mailToAdherentDto);
            try {
                mailService.envoyerMailDepuisModele(emailAvecModeleDto);
                logger.info(messageSourceUtil.get(
                        MessageKeyUtil.LOGGER_INFO_NOTIFICATION_DEMANDE_PECHARGE_ENVOYER_ADRESSE,
                        new String[] { emailAdherent.getAdresse() }));
            } catch (Exception e) {
                logger.error(
                        messageSourceUtil.get(MessageKeyUtil.LOGGER_ERROR_ENVOI_MAIL_NOTIFICATION_DEMANDE_PECHARGE),
                        e);
            }
        } else {
            logger.warn(messageSourceUtil.get(
                    MessageKeyUtil.LOGGER_WARN_AUCUN_MAIL_NOTIFICATION_DEMANDE_PECHARGE_ENVOYER_ADHERENT_NO_ADRESSE));
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public BeneficiaireDto ajouterBeneficiaire(Long idAdherent, BeneficiaireDto beneficiaireDto) {
        // Vrification paramtres
        if (idAdherent == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_ID_ADHERENT));
        }
        // On rcupre l'adhrent
        final PersonneSimpleDto adherent = personnePhysiqueService
                .rechercherPersonneSimpleParIdentifiant(idAdherent);
        if (adherent == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_ADHERENT_INTROUVABLE));
        }
        if (beneficiaireDto == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_BENEFICIAIRE_DTO));
        }
        if (beneficiaireDto.getCivilite() == null || beneficiaireDto.getCivilite().getIdentifiant() == null) {
            throw new BusinessException(messageSourceUtil
                    .get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_CIVILITE_BENEFICIAIRE));
        }
        if (StringUtils.isBlank(beneficiaireDto.getNom())) {
            throw new BusinessException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_NOM_BENEFICIAIRE));
        }
        if (StringUtils.isBlank(beneficiaireDto.getPrenom())) {
            throw new BusinessException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_PRENOM_BENEFICIAIRE));
        }
        if (beneficiaireDto.getDateNaissance() == null) {
            throw new BusinessException(messageSourceUtil
                    .get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_DATE_NAISSANCE_BENEFICIAIRE));
        }
        if (beneficiaireDto.getTypeRelation() == null
                || beneficiaireDto.getTypeRelation().getIdentifiant() == null) {
            throw new BusinessException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_ID_TYPE_RELATION));
        }
        if (beneficiaireDto.getIdCreateur() == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_ID_CREATEUR));
        }
        final Long idTypeRelationConjoint = squareMappingService.getIdTypeRelationConjoint();
        // Si le bnficiaire  ajouter est de type conjoint
        if (idTypeRelationConjoint.equals(beneficiaireDto.getTypeRelation().getIdentifiant())) {
            // On vrifie au pralable que l'adhrent n'a pas dj un conjoint
            final RelationCriteresRechercheDto criterias = new RelationCriteresRechercheDto();
            criterias.setIdPersonne(adherent.getId());
            criterias.setActif(true);
            final List<Long> types = new ArrayList<Long>();
            types.add(idTypeRelationConjoint);
            criterias.setTypes(types);
            final RemotePagingCriteriasDto<RelationCriteresRechercheDto> criteres = new RemotePagingCriteriasDto<RelationCriteresRechercheDto>(
                    criterias, 0, Integer.MAX_VALUE);
            final RemotePagingResultsDto<RelationInfosDto<? extends PersonneRelationDto>> result = personneService
                    .rechercherRelationsParCritreres(criteres);
            if (!result.getListResults().isEmpty()) {
                throw new BusinessException(messageSourceUtil
                        .get(MessageKeyUtil.ERROR_AJOUTER_BENEFICIAIRE_PREREQUIS_RELATION_CONJOINT_EXISTANTE));
            }
        }

        // On cr le bnficiaire dans Square
        final Calendar maintenant = Calendar.getInstance();
        final PersonnePhysiqueCopieDto infosCopie = mapperDozerBean.map(beneficiaireDto,
                PersonnePhysiqueCopieDto.class);
        infosCopie.setIdPersonneSource(adherent.getId());
        final PersonneDto beneficiaireCree = personnePhysiqueService.creerUneCopiePersonne(infosCopie);
        // On cr la relation entre l'adhrent et le bnficiaire
        final RelationDto relation = new RelationDto();
        relation.setIdPersonnePrincipale(adherent.getId());
        relation.setIdPersonne(beneficiaireCree.getIdentifiant());
        relation.setType(beneficiaireDto.getTypeRelation());
        relation.setDateDebut(maintenant);
        personneService.creerRelation(relation);
        // On cr l'action
        final ActionCreationDto action = new ActionCreationDto();
        final Calendar now = Calendar.getInstance();
        action.setIdPersonne(adherent.getId());
        action.setIdStatut(squareMappingService.getIdStatutActionAFaire());
        action.setIdPriorite(squareMappingService.getIdActionPrioriteParDefaut());
        action.setDateAction(now);
        action.setDateAffichageAction(now);
        action.setIdAgence(squareMappingService.getIdAgencePoleFidelisation());
        // Mantis 8458 : on affecte plus de commercial
        // if (adherent.getCommercial() != null && adherent.getCommercial().getIdentifiant() != null) {
        // action.setIdCommercial(adherent.getCommercial().getIdentifiant());
        // }
        action.setIdNatureAction(squareMappingService.getIdNatureActionInternet());
        action.setIdType(squareMappingService.getIdTypeActionOpportunite());
        action.setIdObjet(squareMappingService.getIdObjetActionChgtCompoFamiliale());
        action.setIdCreateur(beneficiaireDto.getIdCreateur());
        action.setReclamation(false);
        final StringBuffer descriptif = new StringBuffer(messageSourceUtil.get(
                MessageKeyUtil.MESSAGE_DESCRIPTIF_BENEFICIAIRE,
                new String[] {
                        beneficiaireDto.getTypeRelation() != null ? beneficiaireDto.getTypeRelation().getLibelle()
                                : "",
                        beneficiaireDto.getCivilite() != null ? beneficiaireDto.getCivilite().getLibelle() : " ",
                        beneficiaireDto.getNom(), beneficiaireDto.getPrenom(),
                        beneficiaireDto.getDateNaissance() != null
                                ? sdf.format(beneficiaireDto.getDateNaissance().getTime())
                                : "" }));

        final List<HistoriqueCommentaireDto> commentaires = new ArrayList<HistoriqueCommentaireDto>();
        final HistoriqueCommentaireDto commentaire = new HistoriqueCommentaireDto();
        commentaire.setDescriptif(descriptif.toString());
        commentaires.add(commentaire);
        action.setCommentaires(commentaires);
        actionService.creerAction(action);
        // On retourne le bnficiaire cr
        return mapperDozerBean.map(beneficiaireCree, BeneficiaireDto.class);
    }

    @Override
    public List<GarantieBaremeDto> getListeGarantiesBaremesAdherent(GarantieBaremeCriteresDto criteres) {
        sdfMois = new SimpleDateFormat(messageSourceUtil.get(MessageKeyUtil.FORMAT_DATE_MM));
        // Vrification paramtres
        if (criteres == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_RECUPERATION_GARANTIES_BAREMES_CRITERES_NULL));
        }
        final List<GarantieBareme> listeGarantiesBaremes = garantieBaremeDao
                .getListeGarantiesBaremesByCriteres(criteres);
        final List<GarantieBaremeDto> listeGarantiesBaremesDto = new ArrayList<GarantieBaremeDto>();
        for (GarantieBareme garantieBareme : listeGarantiesBaremes) {
            final GarantieBaremeDto garantieBaremeDto = mapperDozerBean.map(garantieBareme,
                    GarantieBaremeDto.class);
            garantieBaremeDto.setDateAdhesion(garantieBareme.getGarantie().getDateAdhesion());
            garantieBaremeDto.setDateResiliation(garantieBareme.getGarantie().getDateResiliation());
            if (garantieBareme.getGarantie().getDateAdhesion() != null) {
                garantieBaremeDto
                        .setCodeMois(sdfMois.format(garantieBareme.getGarantie().getDateAdhesion().getTime()));
            }
            // on recupere l'age de la personne
            final Long uidPersonne = garantieBareme.getGarantie().getUidBeneficiaire() != null
                    ? garantieBareme.getGarantie().getUidBeneficiaire()
                    : garantieBareme.getGarantie().getUidAssure();
            final PersonneDto personne = personnePhysiqueService.rechercherPersonneParIdentifiant(uidPersonne);
            garantieBaremeDto.setCodeAgeMin(getAge(personne.getDateNaissance()));
            garantieBaremeDto.setCodeAgeMinMillesime(getAgeMillesime(personne.getDateNaissance()));
            listeGarantiesBaremesDto.add(garantieBaremeDto);
        }
        return listeGarantiesBaremesDto;
    }

    @Override
    public List<CoupleBaremeDto> getListeCouplesBaremesAdherent(GarantieBaremeCriteresDto criteres) {
        // Vrification paramtres
        if (criteres == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(MessageKeyUtil.ERROR_RECUPERATION_GARANTIES_BAREMES_CRITERES_NULL));
        }
        final List<CoupleBaremeDto> listeCouplesBaremes = garantieBaremeDao
                .getListeCouplesBaremesByCriteres(criteres);
        return listeCouplesBaremes;
    }

    private Integer getAge(Calendar dateNaissance) {
        final Integer ageMillesime = getAgeMillesime(dateNaissance);
        final Integer age = Calendar.getInstance().get(Calendar.DAY_OF_YEAR) > dateNaissance
                .get(Calendar.DAY_OF_YEAR) ? ageMillesime : ageMillesime - 1;
        return age;
    }

    private Integer getAgeMillesime(Calendar dateNaissance) {
        return Calendar.getInstance().get(Calendar.YEAR) - dateNaissance.get(Calendar.YEAR);
    }

    @Override
    public InfosIdentifiantPersonneDto getInfosAdherentPrincipalByNumAdherent(String numAdherent) {
        // Rcupration de l'identifiant de la personne
        final PersonneCriteresRechercheDto criterias = new PersonneCriteresRechercheDto();
        criterias.setNumeroClient(numAdherent);
        final RemotePagingCriteriasDto<PersonneCriteresRechercheDto> criteres = new RemotePagingCriteriasDto<PersonneCriteresRechercheDto>(
                criterias, 0, 1);
        final RemotePagingResultsDto<PersonneSimpleDto> result = personnePhysiqueService
                .rechercherPersonneFullTextParCriteres(criteres);
        if (result == null || result.getListResults() == null || result.getListResults().size() != 1) {
            throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_PERSONNE_NUM_CLIENT_INEXISTANTE,
                    new String[] { numAdherent }));
        }
        final Long idPersonne = result.getListResults().get(0).getId();
        if (idPersonne != null) {
            final Long idPersonnePrincipale = personneDao.getAdherentPrincipalPersonne(idPersonne);
            if (idPersonnePrincipale != null) {
                // Rcupration du numro d'adhrent correspondant  la personne principale
                final PersonneDto personnePrincipale = (PersonneDto) personneService
                        .rechercherPersonneParId(idPersonnePrincipale);
                if (personnePrincipale == null) {
                    throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_PERSONNE_INEXISTANT,
                            new String[] { idPersonnePrincipale.toString() }));
                }
                // Cration du DTO contenant les identifiants
                final InfosIdentifiantPersonneDto infosIdentifiantPersonneDto = new InfosIdentifiantPersonneDto();
                infosIdentifiantPersonneDto.setIdPersonne(personnePrincipale.getIdentifiant());
                infosIdentifiantPersonneDto.setNumClient(personnePrincipale.getNumClient());
                return infosIdentifiantPersonneDto;
            }
        }
        return null;
    }

    @Override
    public List<com.square.adherent.noyau.dto.adherent.PersonneDto> getListeAssurePrincipalParPagination(
            int debutPagination, int taillePagination) {
        // Cration de l'objet de retour
        final List<com.square.adherent.noyau.dto.adherent.PersonneDto> listeAssures = new ArrayList<com.square.adherent.noyau.dto.adherent.PersonneDto>();

        // Recherche des personnes
        final PersonneCriteresRechercheDto criterias = new PersonneCriteresRechercheDto();
        final List<Long> listeNatures = new ArrayList<Long>();
        listeNatures.add(squareMappingService.getIdNaturePersonneAdherent());
        criterias.setListeNatures(listeNatures);
        final List<Long> listeReseaux = new ArrayList<Long>();
        listeReseaux.add(squareMappingService.getIdReseauIndividuel());
        criterias.setListeReseaux(listeReseaux);
        final RemotePagingCriteriasDto<PersonneCriteresRechercheDto> criteres = new RemotePagingCriteriasDto<PersonneCriteresRechercheDto>(
                criterias, debutPagination, taillePagination);
        final RemotePagingResultsDto<PersonneSimpleDto> result = personnePhysiqueService
                .rechercherPersonneFullTextParCriteres(criteres);

        // Rcupration des informations supplmentaires ncessaires
        final Long idNatureEmailPersonnel = squareMappingService.getIdNatureEmailPersonnel();
        final Long idTelephoneFixe = squareMappingService.getIdNatureTelephoneFixe();
        if (result != null && result.getListResults() != null) {
            for (PersonneSimpleDto personne : result.getListResults()) {
                final com.square.adherent.noyau.dto.adherent.PersonneDto assure = mapperDozerBean.map(personne,
                        com.square.adherent.noyau.dto.adherent.PersonneDto.class);
                // Rcupration des coordonnes
                final CoordonneesDto coordonnees = personneService
                        .rechercherCoordonneesParIdPersonne(assure.getId());
                if (coordonnees != null) {
                    if (coordonnees.getEmails() != null && coordonnees.getEmails().size() > 0) {
                        // Email
                        for (EmailDto email : coordonnees.getEmails()) {
                            if (email.getNatureEmail() != null
                                    && idNatureEmailPersonnel.equals(email.getNatureEmail().getIdentifiant())) {
                                assure.setAdresseEmail(email.getAdresse());
                                break;
                            }
                        }

                        // Tlphone
                        for (TelephoneDto telephone : coordonnees.getTelephones()) {
                            if (telephone.getNature() != null
                                    && idTelephoneFixe.equals(telephone.getNature().getIdentifiant())) {
                                assure.setNumeroTelephoneFixe(telephone.getNumero());
                                break;
                            }
                        }

                        // Adresse
                        for (AdresseDto adresse : coordonnees.getAdresses()) {
                            if (adresse.getNature() != null
                                    && idTelephoneFixe.equals(adresse.getNature().getIdentifiant())) {
                                final com.square.adherent.noyau.dto.adherent.AdresseDto adressePrincipale = mapperDozerBean
                                        .map(adresse, com.square.adherent.noyau.dto.adherent.AdresseDto.class);
                                assure.setAdressePrincipale(adressePrincipale);
                                break;
                            }
                        }
                    }
                }
                listeAssures.add(assure);
            }
        }
        return listeAssures;
    }

    @Override
    public List<com.square.adherent.noyau.dto.adherent.PersonneDto> getListeBeneficaireParPagination(
            int debutPagination, int taillePagination) {
        // Cration de l'objet de retour
        final List<com.square.adherent.noyau.dto.adherent.PersonneDto> listeBeneficiaires = new ArrayList<com.square.adherent.noyau.dto.adherent.PersonneDto>();

        // Recherche des personnes
        final PersonneCriteresRechercheDto criterias = new PersonneCriteresRechercheDto();
        final List<Long> listeNatures = new ArrayList<Long>();
        listeNatures.add(squareMappingService.getIdNaturePersonneBeneficiaireAdherent());
        criterias.setListeNatures(listeNatures);
        final List<Long> listeReseaux = new ArrayList<Long>();
        listeReseaux.add(squareMappingService.getIdReseauIndividuel());
        criterias.setListeReseaux(listeReseaux);
        final RemotePagingCriteriasDto<PersonneCriteresRechercheDto> criteres = new RemotePagingCriteriasDto<PersonneCriteresRechercheDto>(
                criterias, debutPagination, taillePagination);
        final RemotePagingResultsDto<PersonneSimpleDto> result = personnePhysiqueService
                .rechercherPersonneFullTextParCriteres(criteres);

        // Rcupration des informations supplmentaires ncessaires
        final Long idNatureEmailPersonnel = squareMappingService.getIdNatureEmailPersonnel();
        final Long idTelephoneFixe = squareMappingService.getIdNatureTelephoneFixe();
        if (result != null && result.getListResults() != null) {
            for (PersonneSimpleDto personne : result.getListResults()) {
                final com.square.adherent.noyau.dto.adherent.PersonneDto beneficiaire = mapperDozerBean
                        .map(personne, com.square.adherent.noyau.dto.adherent.PersonneDto.class);
                // Rcupration des coordonnes
                final CoordonneesDto coordonnees = personneService
                        .rechercherCoordonneesParIdPersonne(personne.getId());
                if (coordonnees != null) {
                    if (coordonnees.getEmails() != null && coordonnees.getEmails().size() > 0) {
                        // Email
                        for (EmailDto email : coordonnees.getEmails()) {
                            if (email.getNatureEmail() != null
                                    && idNatureEmailPersonnel.equals(email.getNatureEmail().getIdentifiant())) {
                                beneficiaire.setAdresseEmail(email.getAdresse());
                                break;
                            }
                        }

                        // Tlphone
                        for (TelephoneDto telephone : coordonnees.getTelephones()) {
                            if (telephone.getNature() != null
                                    && idTelephoneFixe.equals(telephone.getNature().getIdentifiant())) {
                                beneficiaire.setNumeroTelephoneFixe(telephone.getNumero());
                                break;
                            }
                        }

                        // Adresse
                        for (AdresseDto adresse : coordonnees.getAdresses()) {
                            if (adresse.getNature() != null
                                    && idTelephoneFixe.equals(adresse.getNature().getIdentifiant())) {
                                final com.square.adherent.noyau.dto.adherent.AdresseDto adressePrincipale = mapperDozerBean
                                        .map(adresse, com.square.adherent.noyau.dto.adherent.AdresseDto.class);
                                beneficiaire.setAdressePrincipale(adressePrincipale);
                                break;
                            }
                        }
                    }
                }
                listeBeneficiaires.add(beneficiaire);
            }
        }
        return listeBeneficiaires;
    }

    @Override
    public List<BeneficiaireDto> getListeInfosBeneficiairesPersonne(Long idPersonne) {
        // Cration de l'objet de retour
        final List<BeneficiaireDto> listeBeneficiaires = new ArrayList<BeneficiaireDto>();
        // Rcupration des identifiants de bnficiaires
        final List<Long> listeIdsBeneficiaires = personneDao.getListeBeneficiairesPersonne(idPersonne);
        if (listeIdsBeneficiaires != null && listeIdsBeneficiaires.size() > 0) {
            for (Long idBeneficiaire : listeIdsBeneficiaires) {
                final PersonneDto personne = personnePhysiqueService
                        .rechercherPersonneParIdentifiant(idBeneficiaire);
                final BeneficiaireDto beneficiaire = mapperDozerBean.map(personne, BeneficiaireDto.class);
                listeBeneficiaires.add(beneficiaire);
            }
        }
        return listeBeneficiaires;
    }

    @Override
    public com.square.adherent.noyau.dto.adherent.PersonneDto getPersonneById(Long idPersonne) {
        final PersonneDto personneSquare = personnePhysiqueService.rechercherPersonneParIdentifiant(idPersonne);

        if (personneSquare != null) {
            final com.square.adherent.noyau.dto.adherent.PersonneDto personneEcm = mapperDozerBean
                    .map(personneSquare, com.square.adherent.noyau.dto.adherent.PersonneDto.class);
            // Rcupration des informations supplmentaires ncessaires
            final Long idNatureEmailPersonnel = squareMappingService.getIdNatureEmailPersonnel();
            final Long idTelephoneFixe = squareMappingService.getIdNatureTelephoneFixe();
            // Rcupration des coordonnes
            final CoordonneesDto coordonnees = personneService
                    .rechercherCoordonneesParIdPersonne(personneSquare.getIdentifiant());
            if (coordonnees != null) {
                if (coordonnees.getEmails() != null && coordonnees.getEmails().size() > 0) {
                    // Email
                    for (EmailDto email : coordonnees.getEmails()) {
                        if (email.getNatureEmail() != null
                                && idNatureEmailPersonnel.equals(email.getNatureEmail().getIdentifiant())) {
                            personneEcm.setAdresseEmail(email.getAdresse());
                            break;
                        }
                    }

                    // Tlphone
                    for (TelephoneDto telephone : coordonnees.getTelephones()) {
                        if (telephone.getNature() != null
                                && idTelephoneFixe.equals(telephone.getNature().getIdentifiant())) {
                            personneEcm.setNumeroTelephoneFixe(telephone.getNumero());
                            break;
                        }
                    }

                    // Adresse
                    for (AdresseDto adresse : coordonnees.getAdresses()) {
                        if (adresse.getNature() != null
                                && idTelephoneFixe.equals(adresse.getNature().getIdentifiant())) {
                            final com.square.adherent.noyau.dto.adherent.AdresseDto adressePrincipale = mapperDozerBean
                                    .map(adresse, com.square.adherent.noyau.dto.adherent.AdresseDto.class);
                            personneEcm.setAdressePrincipale(adressePrincipale);
                            break;
                        }
                    }
                }
            }
            return personneEcm;
        }
        return null;
    }

    @Override
    public com.square.adherent.noyau.dto.adherent.PersonneDto getPersonneByNumClient(String numClient) {
        // Recherche de la personne
        final PersonneCriteresRechercheDto criterias = new PersonneCriteresRechercheDto();
        criterias.setNumeroClient(numClient);
        final RemotePagingCriteriasDto<PersonneCriteresRechercheDto> criteres = new RemotePagingCriteriasDto<PersonneCriteresRechercheDto>(
                criterias, 0, 1);
        final RemotePagingResultsDto<PersonneSimpleDto> result = personnePhysiqueService
                .rechercherPersonneFullTextParCriteres(criteres);

        if (result != null && result.getListResults() != null) {
            final PersonneSimpleDto personneSquare = result.getListResults().get(0);
            // Rcupration des informations supplmentaires ncessaires
            final Long idNatureEmailPersonnel = squareMappingService.getIdNatureEmailPersonnel();
            final Long idTelephoneFixe = squareMappingService.getIdNatureTelephoneFixe();
            final com.square.adherent.noyau.dto.adherent.PersonneDto personneEcm = mapperDozerBean
                    .map(personneSquare, com.square.adherent.noyau.dto.adherent.PersonneDto.class);
            // Rcupration des coordonnes
            final CoordonneesDto coordonnees = personneService
                    .rechercherCoordonneesParIdPersonne(personneSquare.getId());
            if (coordonnees != null) {
                if (coordonnees.getEmails() != null && coordonnees.getEmails().size() > 0) {
                    // Email
                    for (EmailDto email : coordonnees.getEmails()) {
                        if (email.getNatureEmail() != null
                                && idNatureEmailPersonnel.equals(email.getNatureEmail().getIdentifiant())) {
                            personneEcm.setAdresseEmail(email.getAdresse());
                            break;
                        }
                    }

                    // Tlphone
                    for (TelephoneDto telephone : coordonnees.getTelephones()) {
                        if (telephone.getNature() != null
                                && idTelephoneFixe.equals(telephone.getNature().getIdentifiant())) {
                            personneEcm.setNumeroTelephoneFixe(telephone.getNumero());
                            break;
                        }
                    }

                    // Adresse
                    for (AdresseDto adresse : coordonnees.getAdresses()) {
                        if (adresse.getNature() != null
                                && idTelephoneFixe.equals(adresse.getNature().getIdentifiant())) {
                            final com.square.adherent.noyau.dto.adherent.AdresseDto adressePrincipale = mapperDozerBean
                                    .map(adresse, com.square.adherent.noyau.dto.adherent.AdresseDto.class);
                            personneEcm.setAdressePrincipale(adressePrincipale);
                            break;
                        }
                    }
                }
            }
            return personneEcm;
        }
        return null;
    }

    /**
     * Setter function.
     * @param personneService the personneService to set
     */
    public void setPersonneService(PersonneService personneService) {
        this.personneService = personneService;
    }

    /**
     * Setter function.
     * @param messageSourceUtil the messageSourceUtil to set
     */
    public void setMessageSourceUtil(MessageSourceUtil messageSourceUtil) {
        this.messageSourceUtil = messageSourceUtil;
    }

    /**
     * Setter function.
     * @param mapperDozerBean the mapperDozerBean to set
     */
    public void setMapperDozerBean(MapperDozerBean mapperDozerBean) {
        this.mapperDozerBean = mapperDozerBean;
    }

    /**
     * Setter function.
     * @param optionDao the optionDao to set
     */
    public void setOptionDao(OptionDao optionDao) {
        this.optionDao = optionDao;
    }

    /**
     * Setter function.
     * @param optionTypeDao the optionTypeDao to set
     */
    public void setOptionTypeDao(OptionTypeDao optionTypeDao) {
        this.optionTypeDao = optionTypeDao;
    }

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

    /**
     * Dfinit la valeur de personneDao.
     * @param personneDao la nouvelle valeur de personneDao
     */
    public void setPersonneDao(PersonneDao personneDao) {
        this.personneDao = personneDao;
    }

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

    /**
     * Set the magazineDao value.
     * @param magazineDao the magazineDao to set
     */
    public void setMagazineDao(MagazineDao magazineDao) {
        this.magazineDao = magazineDao;
    }

    /**
     * Setter function.
     * @param espaceClientInternetService the espaceClientInternetService to set
     */
    public void setEspaceClientInternetService(EspaceClientInternetService espaceClientInternetService) {
        this.espaceClientInternetService = espaceClientInternetService;
    }

    /**
     * Setter function.
     * @param espaceClientInternetDao the espaceClientInternetDao to set
     */
    public void setEspaceClientInternetDao(EspaceClientInternetDao espaceClientInternetDao) {
        this.espaceClientInternetDao = espaceClientInternetDao;
    }

    /**
     * Setter function.
     * @param actionService the actionService to set
     */
    public void setActionService(ActionService actionService) {
        this.actionService = actionService;
    }

    /**
     * Setter function.
     * @param squareMappingService the squareMappingService to set
     */
    public void setSquareMappingService(SquareMappingService squareMappingService) {
        this.squareMappingService = squareMappingService;
    }

    /**
     * Setter function.
     * @param personneUtil the personneUtil to set
     */
    public void setPersonneUtil(PersonneUtil personneUtil) {
        this.personneUtil = personneUtil;
    }

    /**
     * Setter function.
     * @param mailService the mailService to set
     */
    public void setMailService(MailService mailService) {
        this.mailService = mailService;
    }

    /**
     * Setter function.
     * @param envoiEmailMappingService the envoiEmailMappingService to set
     */
    public void setEnvoiEmailMappingService(EnvoiEmailMappingService envoiEmailMappingService) {
        this.envoiEmailMappingService = envoiEmailMappingService;
    }

    /**
     * Setter function.
     * @param personnePhysiqueService the personnePhysiqueService to set
     */
    public void setPersonnePhysiqueService(PersonnePhysiqueService personnePhysiqueService) {
        this.personnePhysiqueService = personnePhysiqueService;
    }

    /**
     * Set the value of garantieBaremeDao.
     * @param garantieBaremeDao the garantieBaremeDao to set
     */
    public void setGarantieBaremeDao(GarantieBaremeDao garantieBaremeDao) {
        this.garantieBaremeDao = garantieBaremeDao;
    }

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

}