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

Java tutorial

Introduction

Here is the source code for com.square.adherent.noyau.service.implementations.CotisationServiceImpl.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.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
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.base.paging.RemotePagingSort;
import org.scub.foundation.framework.core.messagesource.MessageSourceUtil;

import com.square.adherent.noyau.dao.interfaces.contrat.ContratMoyenPaiementDao;
import com.square.adherent.noyau.dao.interfaces.contrat.GarantieDao;
import com.square.adherent.noyau.dto.DimensionAdherentCriteresRechercheDto;
import com.square.adherent.noyau.dto.IdentifiantLibelleOrdreDto;
import com.square.adherent.noyau.dto.adherent.contrat.ContratSimpleDto;
import com.square.adherent.noyau.dto.adherent.contrat.CritereRechercheContratDto;
import com.square.adherent.noyau.dto.adherent.contrat.CritereRechercheGarantieDto;
import com.square.adherent.noyau.dto.cotisation.CodeAiaLibelleDto;
import com.square.adherent.noyau.dto.cotisation.CotisationDto;
import com.square.adherent.noyau.dto.cotisation.CotisationsCriteresRechercheDto;
import com.square.adherent.noyau.dto.cotisation.DetailCotisationDto;
import com.square.adherent.noyau.dto.cotisation.DetailEncaissementDto;
import com.square.adherent.noyau.dto.cotisation.PersonneCotisationDto;
import com.square.adherent.noyau.dto.cotisation.RetourCotisationDto;
import com.square.adherent.noyau.dto.produit.CriteresInfosProduitsDto;
import com.square.adherent.noyau.dto.produit.InfosProduitDto;
import com.square.adherent.noyau.model.data.contrat.Garantie;
import com.square.adherent.noyau.model.dimension.ContratMoyenPaiement;
import com.square.adherent.noyau.plugin.ConstantesAiaPlugin;
import com.square.adherent.noyau.plugin.CotisationsPlugin;
import com.square.adherent.noyau.plugin.dto.cotisation.CotisationPluginDto;
import com.square.adherent.noyau.plugin.dto.cotisation.CotisationsCriteresPluginDto;
import com.square.adherent.noyau.plugin.dto.cotisation.DetailCotisationPluginDto;
import com.square.adherent.noyau.plugin.dto.cotisation.DetailEncaissementPluginDto;
import com.square.adherent.noyau.plugin.dto.cotisation.ErreurRetourPluginDto;
import com.square.adherent.noyau.plugin.dto.cotisation.RetourCotisationsPluginDto;
import com.square.adherent.noyau.service.interfaces.AdherentMappingService;
import com.square.adherent.noyau.service.interfaces.ContratService;
import com.square.adherent.noyau.service.interfaces.CotisationService;
import com.square.adherent.noyau.util.MessageKeyUtil;
import com.square.core.model.dto.PersonneDto;
import com.square.core.service.interfaces.PersonnePhysiqueService;
import com.square.price.core.dto.ProduitCriteresDto;
import com.square.price.core.dto.ProduitDto;
import com.square.price.core.service.interfaces.ProduitService;

/**
 * Implmentation de CotisationService.
 * @author Anthony GUILLEMETTE (anthony.guillemette@scub.net) - SCUB
 */
public class CotisationServiceImpl implements CotisationService {

    private CotisationsPlugin cotisationsPlugin;

    private MapperDozerBean mapperDozerBean;

    private ConstantesAiaPlugin constantesAiaPlugin;

    private ContratMoyenPaiementDao contratMoyenPaiementDao;

    private PersonnePhysiqueService personnePhysiqueService;

    private GarantieDao garantieDao;

    private ProduitService produitService;

    private MessageSourceUtil messageSourceUtil;

    private ContratService contratService;

    private AdherentMappingService adherentMappingService;

    private static final String LOGIN_COTISATION_AIA = "batch00";

    @Override
    public List<IdentifiantLibelleDto> rechercherModesPaiementParCriteres(String libelle) {
        //on recupere la liste de moyens de paiement AIA
        final List<String> moyensPaiementAia = new ArrayList<String>();
        //FIXME : Que doit-on insrer dans le fichier de constantes pour ces valeurs.
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementBvr());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementCarteBancaire());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementCetip());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementCheque());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementChequeAvecCoupon());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementChequeManuel());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementDomiciliation());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementDSSContributions());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementEspeces());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementInterne());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementMandat());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementOrdreMultiple());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementOrdrePermanent());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementPrecompte());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementPrelevement());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementPrelevementAccelere());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementTip());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementVCS());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementVirement());
        moyensPaiementAia.add(constantesAiaPlugin.getMoyenPaiementVirementEncaissement());

        // on recupere les modes de paiements
        final DimensionAdherentCriteresRechercheDto criteres = new DimensionAdherentCriteresRechercheDto();
        criteres.setLibelle(libelle);
        final List<ContratMoyenPaiement> listeMoyensPaiement = contratMoyenPaiementDao
                .getMoyensPaiementContratByCriteres(criteres);

        // on filtre suivant les valeurs disponibles dans les constantes aia
        final List<IdentifiantLibelleDto> listeFinale = new ArrayList<IdentifiantLibelleDto>();
        for (ContratMoyenPaiement moyenPaiement : listeMoyensPaiement) {
            if (moyensPaiementAia.contains(moyenPaiement.getIdentifiantExterieur())) {
                if (StringUtils.isBlank(libelle)
                        || moyenPaiement.getLibelle().toLowerCase().startsWith(libelle.toLowerCase())) {
                    listeFinale.add((IdentifiantLibelleDto) mapperDozerBean.map(moyenPaiement,
                            IdentifiantLibelleDto.class));
                }
            }
        }
        return new ArrayList<IdentifiantLibelleDto>();
    }

    private List<CodeAiaLibelleDto> getListeStatutsCotisation() {
        final List<CodeAiaLibelleDto> liste = new ArrayList<CodeAiaLibelleDto>();
        //FIXME open source
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getStatutPrimeAnnulante(),
                constantesAiaPlugin.getStatutPrimeLibelleAnnulante()));
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getStatutPrimeAnnulee(),
                constantesAiaPlugin.getStatutPrimeLibelleAnnulee()));
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getStatutPrimeBloquee(),
                constantesAiaPlugin.getStatutPrimeLibelleBloquee()));
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getStatutPrimeDemandee(),
                constantesAiaPlugin.getStatutPrimeLibelleDemandee()));
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getStatutPrimeEnInstance(),
                constantesAiaPlugin.getStatutPrimeLibelleEnInstance()));
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getStatutPrimeRemboursee(),
                constantesAiaPlugin.getStatutPrimeLibelleRemboursee()));
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getStatutPrimeSoldee(),
                constantesAiaPlugin.getStatutPrimeLibelleSoldee()));
        return liste;
    }

    private Map<String, CodeAiaLibelleDto> getMapStatutsEncaissement() {
        final List<CodeAiaLibelleDto> liste = new ArrayList<CodeAiaLibelleDto>();
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getSituationEncaissementEnInstance(),
                constantesAiaPlugin.getSituationEncaissementLibelleEnInstance()));
        liste.add(new CodeAiaLibelleDto(constantesAiaPlugin.getSituationEncaissementSoldee(),
                constantesAiaPlugin.getSituationEncaissementLibelleSoldee()));

        final Map<String, CodeAiaLibelleDto> map = new HashMap<String, CodeAiaLibelleDto>();
        for (CodeAiaLibelleDto codeAiaLibelleDto : liste) {
            map.put(codeAiaLibelleDto.getCodeAia(), codeAiaLibelleDto);
        }
        return map;
    }

    private Map<String, CodeAiaLibelleDto> getMapStatutsCotisation() {
        final List<CodeAiaLibelleDto> liste = getListeStatutsCotisation();

        final Map<String, CodeAiaLibelleDto> map = new HashMap<String, CodeAiaLibelleDto>();
        for (CodeAiaLibelleDto codeAiaLibelleDto : liste) {
            map.put(codeAiaLibelleDto.getCodeAia(), codeAiaLibelleDto);
        }
        return map;
    }

    @Override
    public List<CodeAiaLibelleDto> rechercherSituationsParCriteres(String libelle) {
        final List<CodeAiaLibelleDto> liste = new ArrayList<CodeAiaLibelleDto>();
        for (CodeAiaLibelleDto situationCotisationDto : getListeStatutsCotisation()) {
            if (StringUtils.isBlank(libelle)
                    || situationCotisationDto.getLibelle().toLowerCase().startsWith(libelle.toLowerCase())) {
                liste.add(situationCotisationDto);
            }
        }

        // on tri par ordre alphabtique
        Collections.sort(liste, new Comparator<CodeAiaLibelleDto>() {
            @Override
            public int compare(CodeAiaLibelleDto o1, CodeAiaLibelleDto o2) {
                return o1.getLibelle().compareTo(o2.getLibelle());
            }
        });

        return liste;
    }

    @Override
    public RetourCotisationDto recupererCotisations(
            final RemotePagingCriteriasDto<CotisationsCriteresRechercheDto> criteresCotisations) {
        final CotisationsCriteresRechercheDto criteriasCotisations = criteresCotisations.getCriterias();
        if (criteriasCotisations.getUidPersonne() == null) {
            throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_PERSONNE_OBLIGATOIRE));
        }
        // on recupere l'eid de la personne
        final PersonneDto personne = personnePhysiqueService
                .rechercherPersonneParIdentifiant(criteriasCotisations.getUidPersonne());
        if (personne == null) {
            throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_PERSONNE_INEXISTANT,
                    new String[] { criteriasCotisations.getUidPersonne().toString() }));
        }

        // si aucune date, on filtre les 6 derniers mois en mode normal et 2 prochains mois en mode simulation
        Calendar dateDebut = criteriasCotisations.getDateDebut();
        Calendar dateFin = criteriasCotisations.getDateFin();
        if (criteriasCotisations.getDateDebut() == null) {
            if (criteriasCotisations.isSimulation()) {
                dateDebut = Calendar.getInstance();
            } else {
                dateDebut = Calendar.getInstance();
                dateDebut.add(Calendar.MONTH, -6);
            }
        }
        if (criteriasCotisations.getDateFin() == null) {
            if (criteriasCotisations.isSimulation()) {
                dateFin = Calendar.getInstance();
                dateFin.add(Calendar.MONTH, 2);
            } else {
                dateFin = Calendar.getInstance();
            }
        }

        // on recupere les cotisations dans AIA
        final CotisationsCriteresPluginDto criteresCotisationsAia = new CotisationsCriteresPluginDto();
        criteresCotisationsAia.setPersonne(personne.getIdext());
        criteresCotisationsAia.setDateEffet(Calendar.getInstance());
        criteresCotisationsAia.setDateDebut(dateDebut);
        criteresCotisationsAia.setDateFin(dateFin);
        criteresCotisationsAia.setContrat(criteriasCotisations.getContrat());
        if (criteriasCotisations.getIdModePaiement() != null) {
            final DimensionAdherentCriteresRechercheDto criteresMoyensPaiement = new DimensionAdherentCriteresRechercheDto();
            criteresMoyensPaiement.setId(criteriasCotisations.getIdModePaiement());
            final List<ContratMoyenPaiement> listeMoyensPaiement = contratMoyenPaiementDao
                    .getMoyensPaiementContratByCriteres(criteresMoyensPaiement);
            if (listeMoyensPaiement.size() != 1) {
                throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_MOYEN_PAIEMENT_INEXISTANT,
                        new Long[] { criteriasCotisations.getIdModePaiement() }));
            }
            criteresCotisationsAia.setModePaiement(listeMoyensPaiement.get(0).getIdentifiantExterieur());
        }
        if (!criteriasCotisations.isSimulation()) {
            criteresCotisationsAia.setMontantMax(criteriasCotisations.getMontantMax());
            criteresCotisationsAia.setMontantMin(criteriasCotisations.getMontantMin());
            if (criteriasCotisations.isSimulation()) {
                criteresCotisationsAia.setOperation(CotisationsCriteresPluginDto.OPERATION_SIMULATION);
            } else {
                criteresCotisationsAia.setOperation(CotisationsCriteresPluginDto.OPERATION_COTISATION);
            }
            if (criteriasCotisations.getSituation() != null) {
                criteresCotisationsAia.setSituation(criteriasCotisations.getSituation().getCodeAia());
            }
        }
        //FIXME open source : validation test testRcuprerCotisations
        final RetourCotisationsPluginDto retourAia = cotisationsPlugin.recupererCotisations(LOGIN_COTISATION_AIA,
                criteresCotisationsAia);
        if (retourAia.getErreurs() != null && retourAia.getErreurs().size() > 0) {
            final StringBuffer message = new StringBuffer();
            for (ErreurRetourPluginDto erreur : retourAia.getErreurs()) {
                if (message.length() > 0) {
                    message.append("<br />");
                }
                message.append(erreur.getLabel());
            }
            throw new BusinessException(message.toString());
        }

        final Long idFamilleGarantieSante = adherentMappingService.getIdFamilleGarantieSante();

        final Map<String, CodeAiaLibelleDto> mapStatutsEncaissement = getMapStatutsEncaissement();
        final Map<String, CodeAiaLibelleDto> mapStatutsCotisation = getMapStatutsCotisation();

        final int nombreTotal = retourAia.getListeCotisations().size();
        int compteur = 0;

        final List<CotisationDto> listeLignes = new ArrayList<CotisationDto>();
        for (CotisationPluginDto cotisationAiaDto : retourAia.getListeCotisations()) {
            ContratMoyenPaiement moyenPaiement = null;
            if (StringUtils.isNotBlank(cotisationAiaDto.getMoyenPaiement())) {
                // on recupere le mode de paiement par son eid
                final DimensionAdherentCriteresRechercheDto criteresMoyensPaiement = new DimensionAdherentCriteresRechercheDto();
                criteresMoyensPaiement.setIdentifiantExterieur(cotisationAiaDto.getMoyenPaiement());
                final List<ContratMoyenPaiement> listeMoyensPaiement = contratMoyenPaiementDao
                        .getMoyensPaiementContratByCriteres(criteresMoyensPaiement);
                if (listeMoyensPaiement.size() != 1) {
                    throw new BusinessException(
                            messageSourceUtil.get(MessageKeyUtil.ERROR_MOYEN_PAIEMENT_INEXISTANT,
                                    new String[] { cotisationAiaDto.getMoyenPaiement() }));
                }
                moyenPaiement = listeMoyensPaiement.get(0);
            }

            final CotisationDto cotisationDto = new CotisationDto();
            cotisationDto.setMontant(cotisationAiaDto.getMontant());
            cotisationDto.setMontantRegle(cotisationAiaDto.getMontantRegle());
            cotisationDto.setSituation(mapStatutsCotisation.get(cotisationAiaDto.getStatut()));
            cotisationDto.setDateDebut(cotisationAiaDto.getDateDebut());
            cotisationDto.setDateFin(cotisationAiaDto.getDateFin());
            cotisationDto.setJourPaiement(cotisationAiaDto.getJourPaiement());
            if (moyenPaiement != null) {
                cotisationDto.setModePaiement(
                        new IdentifiantLibelleDto(moyenPaiement.getId(), moyenPaiement.getLibelle()));
            }

            final Map<String, Boolean> mapTypeContrats = new HashMap<String, Boolean>();

            // on parcours les dtails de cotisation
            final List<DetailCotisationDto> listeDetailsCotisation = new ArrayList<DetailCotisationDto>();
            for (DetailCotisationPluginDto detailCotisationAia : cotisationAiaDto.getListeDetailsCotisation()) {
                // on recupere le bnficiaire
                final PersonneDto beneficiaire = personnePhysiqueService.rechercherPersonneParIdentifiantExterieur(
                        detailCotisationAia.getIdentifiantBeneficiaire());
                if (beneficiaire == null) {
                    throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_PERSONNE_INEXISTANT,
                            new String[] { detailCotisationAia.getIdentifiantBeneficiaire() }));
                }
                final PersonneCotisationDto personneCotisation = mapperDozerBean.map(beneficiaire,
                        PersonneCotisationDto.class);
                if (personneCotisation.getNom() != null) {
                    personneCotisation.setNom(personneCotisation.getNom().toUpperCase());
                }
                if (personneCotisation.getPrenom() != null) {
                    personneCotisation.setPrenom(StringUtils.capitalize(personneCotisation.getPrenom()));
                }

                final DetailCotisationDto detailCotisationDto = new DetailCotisationDto();
                // on recupere la garantie
                final CritereRechercheGarantieDto criteresGarantie = new CritereRechercheGarantieDto();
                criteresGarantie.setEid(detailCotisationAia.getIdentifiantGarantie());
                final List<Garantie> listeGaranties = garantieDao.getListeGarantiesByCriteres(criteresGarantie);
                if (listeGaranties.size() == 1) {
                    final Garantie garantie = listeGaranties.get(0);
                    // on recupere le produit
                    final ProduitCriteresDto criteresProduit = new ProduitCriteresDto();
                    criteresProduit.setGarantieAia(garantie.getLibelleGarantieGestion());
                    criteresProduit.setProduitAia(garantie.getLibelleProduitGestion());
                    final List<ProduitDto> listeProduits = produitService.getListeProduits(criteresProduit);
                    if (listeProduits == null || listeProduits.size() != 1) {
                        throw new BusinessException(
                                messageSourceUtil.get(MessageKeyUtil.ERROR_RECUPERATION_PRODUIT_IMPOSSIBLE));
                    }

                    // on recupere le type du contrat
                    Boolean isContratSante = mapTypeContrats.get(garantie.getContrat().getNumeroContrat());
                    if (isContratSante == null) {
                        // on recupere les produits du contrat
                        final CriteresInfosProduitsDto criteresInfosProduitsDto = new CriteresInfosProduitsDto();
                        criteresInfosProduitsDto.setIdContrat(garantie.getContrat().getId());
                        final List<InfosProduitDto> listeInfosProduits = contratService
                                .getInfosProduits(criteresInfosProduitsDto);
                        isContratSante = false;
                        for (InfosProduitDto infosProduitDto : listeInfosProduits) {
                            if (infosProduitDto.getIdFamilleGarantie().equals(idFamilleGarantieSante)) {
                                isContratSante = true;
                                break;
                            }
                        }
                        mapTypeContrats.put(garantie.getContrat().getNumeroContrat(), isContratSante);
                    }
                    detailCotisationDto.setGarantieRole((IdentifiantLibelleOrdreDto) mapperDozerBean
                            .map(garantie.getRole(), IdentifiantLibelleOrdreDto.class));
                    detailCotisationDto.setContrat(garantie.getContrat().getNumeroContrat());
                    detailCotisationDto.setGarantie(listeProduits.get(0).getLibelleCommercial());
                    detailCotisationDto.setEidGarantie(garantie.getEid());
                    if (garantie.getFamille() != null) {
                        detailCotisationDto.setFamilleGarantie((IdentifiantLibelleOrdreDto) mapperDozerBean
                                .map(garantie.getFamille(), IdentifiantLibelleOrdreDto.class));
                    }
                    detailCotisationDto.setContratSante(isContratSante);
                } else {
                    // on recherche le numro de contrat grace  l'eid du contrat rcupr via AIA
                    final CritereRechercheContratDto criteres = new CritereRechercheContratDto();
                    criteres.setContratEid(detailCotisationAia.getContratEid());
                    criteres.setIdAssure(personne.getIdentifiant());
                    final List<ContratSimpleDto> contrats = contratService.getContratsSimpleByCriteres(criteres);
                    if (contrats == null || contrats.size() != 1) {
                        throw new BusinessException(messageSourceUtil.get(MessageKeyUtil.ERROR_CONTRAT_INEXISTANT));
                    }
                    detailCotisationDto.setContrat(contrats.get(0).getNumeroContrat());
                    detailCotisationDto.setEidGarantie(detailCotisationAia.getIdentifiantGarantie());
                }
                detailCotisationDto.setBeneficiaire(personneCotisation);
                detailCotisationDto.setLibelle(detailCotisationAia.getLibelle());
                detailCotisationDto.setMontant(detailCotisationAia.getMontant());
                detailCotisationDto.setTypeEcheance(detailCotisationAia.getTypeEcheance());
                detailCotisationDto.setTypePrime(detailCotisationAia.getTypePrime());
                detailCotisationDto.setDateDebut(detailCotisationAia.getDateDebut());
                detailCotisationDto.setDateFin(detailCotisationAia.getDateFin());
                listeDetailsCotisation.add(detailCotisationDto);
            }
            cotisationDto.setListeDetailsCotisation(listeDetailsCotisation);
            // on trie les dtails
            Collections.sort(cotisationDto.getListeDetailsCotisation(), new Comparator<DetailCotisationDto>() {
                @Override
                public int compare(DetailCotisationDto o1, DetailCotisationDto o2) {
                    // tri par famille de contrat
                    if (o1.getContratSante() == null) {
                        return 1;
                    }
                    if (o2.getContratSante() == null) {
                        return -1;
                    }
                    if (o1.getContratSante().compareTo(o2.getContratSante()) != 0) {
                        return o2.getContratSante().compareTo(o1.getContratSante());
                    }
                    // tri par libelle de contrat
                    if (o1.getContrat() == null) {
                        return 1;
                    }
                    if (o2.getContrat() == null) {
                        return -1;
                    }
                    if (o1.getContrat().compareTo(o2.getContrat()) != 0) {
                        return o2.getContrat().compareTo(o1.getContrat());
                    }
                    // tri par famille de garantie
                    if (o1.getFamilleGarantie() == null || o1.getFamilleGarantie().getOrdre() == null) {
                        return 1;
                    }
                    if (o2.getFamilleGarantie() == null || o2.getFamilleGarantie().getOrdre() == null) {
                        return -1;
                    }
                    if (o1.getFamilleGarantie().getOrdre().compareTo(o2.getFamilleGarantie().getOrdre()) != 0) {
                        return o1.getFamilleGarantie().getOrdre().compareTo(o2.getFamilleGarantie().getOrdre());
                    }
                    // tri par libelle de garantie
                    if (o1.getGarantie() == null) {
                        return 1;
                    }
                    if (o2.getGarantie() == null) {
                        return -1;
                    }
                    if (o1.getGarantie().compareTo(o2.getGarantie()) != 0) {
                        return o2.getGarantie().compareTo(o1.getGarantie());
                    }
                    // tri par role de garantie
                    if (o1.getGarantieRole() == null || o1.getGarantieRole().getOrdre() == null) {
                        return 1;
                    }
                    if (o2.getGarantieRole() == null || o2.getGarantieRole().getOrdre() == null) {
                        return -1;
                    }
                    if (o1.getGarantieRole().getOrdre().compareTo(o2.getGarantieRole().getOrdre()) != 0) {
                        return o2.getGarantieRole().getOrdre().compareTo(o1.getGarantieRole().getOrdre());
                    }
                    // tri par date de naissance
                    if (o1.getBeneficiaire() == null || o1.getBeneficiaire().getDateNaissance() == null) {
                        return 1;
                    }
                    if (o2.getBeneficiaire() == null || o2.getBeneficiaire().getDateNaissance() == null) {
                        return -1;
                    }
                    if (o1.getBeneficiaire().getDateNaissance()
                            .compareTo(o2.getBeneficiaire().getDateNaissance()) != 0) {
                        // tri desc
                        return o1.getBeneficiaire().getDateNaissance()
                                .compareTo(o2.getBeneficiaire().getDateNaissance());
                    }
                    // tri par prenom
                    if (o1.getBeneficiaire() == null || o1.getBeneficiaire().getPrenom() == null) {
                        return 1;
                    }
                    if (o2.getBeneficiaire() == null || o2.getBeneficiaire().getPrenom() == null) {
                        return -1;
                    }
                    if (o1.getBeneficiaire().getPrenom().compareTo(o2.getBeneficiaire().getPrenom()) != 0) {
                        return o1.getBeneficiaire().getPrenom().compareTo(o2.getBeneficiaire().getPrenom());
                    }
                    return 0;
                }
            });

            // on parcours les dtails d'encaissements
            if (cotisationAiaDto.getListeDetailsEncaissement() != null) {
                final List<DetailEncaissementDto> listeDetailsEncaissement = new ArrayList<DetailEncaissementDto>();
                for (DetailEncaissementPluginDto detailEncaissementAia : cotisationAiaDto
                        .getListeDetailsEncaissement()) {
                    moyenPaiement = null;
                    if (StringUtils.isNotBlank(detailEncaissementAia.getMoyenPaiement())) {
                        // on recupere le mode de paiement par son eid
                        final DimensionAdherentCriteresRechercheDto criteresMoyensPaiement = new DimensionAdherentCriteresRechercheDto();
                        criteresMoyensPaiement.setIdentifiantExterieur(detailEncaissementAia.getMoyenPaiement());
                        final List<ContratMoyenPaiement> listeMoyensPaiement = contratMoyenPaiementDao
                                .getMoyensPaiementContratByCriteres(criteresMoyensPaiement);
                        if (listeMoyensPaiement.size() != 1) {
                            throw new BusinessException(
                                    messageSourceUtil.get(MessageKeyUtil.ERROR_MOYEN_PAIEMENT_INEXISTANT,
                                            new String[] { detailEncaissementAia.getMoyenPaiement() }));
                        }
                        moyenPaiement = listeMoyensPaiement.get(0);
                    }

                    final DetailEncaissementDto detailEncaissementDto = new DetailEncaissementDto();
                    detailEncaissementDto.setBanque(detailEncaissementAia.getBanque());
                    detailEncaissementDto.setCompte(detailEncaissementAia.getCompte());
                    detailEncaissementDto.setDate(detailEncaissementAia.getDate());
                    detailEncaissementDto.setDateRejet(detailEncaissementAia.getDateRejet());
                    detailEncaissementDto.setJourPaiement(detailEncaissementAia.getJourPaiement());
                    detailEncaissementDto.setMontant(detailEncaissementAia.getMontant());
                    detailEncaissementDto.setMontantNonAffecte(detailEncaissementAia.getMontantNonAffecte());
                    detailEncaissementDto.setMotifRejet(detailEncaissementAia.getMotifRejet());
                    if (moyenPaiement != null) {
                        detailEncaissementDto.setMoyenPaiement(
                                new IdentifiantLibelleDto(moyenPaiement.getId(), moyenPaiement.getLibelle()));
                    }
                    detailEncaissementDto.setNumeroCheque(detailEncaissementAia.getNumeroCheque());
                    detailEncaissementDto.setStatut(mapStatutsEncaissement.get(detailEncaissementAia.getStatut()));
                    listeDetailsEncaissement.add(detailEncaissementDto);
                }
                cotisationDto.setListeDetailsEncaissement(listeDetailsEncaissement);
                // on trie les dtails
                Collections.sort(cotisationDto.getListeDetailsEncaissement(),
                        new Comparator<DetailEncaissementDto>() {
                            @Override
                            public int compare(DetailEncaissementDto o1, DetailEncaissementDto o2) {
                                if (o1.getDate() == null) {
                                    return -1;
                                }
                                if (o2.getDate() == null) {
                                    return 1;
                                }
                                // tri date croissant
                                return o1.getDate().compareTo(o2.getDate());
                            }
                        });
            }

            if (criteresCotisations.getFirstResult() <= compteur
                    && compteur < (criteresCotisations.getFirstResult() + criteresCotisations.getMaxResult())) {
                listeLignes.add(cotisationDto);
            }

            compteur++;
        }

        final String orderCotisationDateDebut = adherentMappingService.getOrderCotisationDateDebut();
        final String orderCotisationMontant = adherentMappingService.getOrderCotisationMontant();
        final String orderCotisationMontantRegle = adherentMappingService.getOrderCotisationMontantRegle();
        final String orderCotisationSituation = adherentMappingService.getOrderCotisationSituation();

        if (criteresCotisations.getListeSorts() != null && criteresCotisations.getListeSorts().size() > 0) {
            // on trie les dtails
            Collections.sort(listeLignes, new Comparator<CotisationDto>() {
                @Override
                public int compare(CotisationDto o1, CotisationDto o2) {
                    for (RemotePagingSort remotePagingSort : criteresCotisations.getListeSorts()) {
                        if (remotePagingSort.getSortField().equals(orderCotisationDateDebut)
                                && o1.getDateDebut().compareTo(o2.getDateDebut()) != 0) {
                            if (remotePagingSort.getSortAsc() == RemotePagingSort.REMOTE_PAGING_SORT_ASC) {
                                return o1.getDateDebut().compareTo(o2.getDateDebut());
                            } else {
                                return o2.getDateDebut().compareTo(o1.getDateDebut());
                            }
                        }
                        if (remotePagingSort.getSortField().equals(orderCotisationMontant)
                                && o1.getMontant().compareTo(o2.getMontant()) != 0) {
                            if (remotePagingSort.getSortAsc() == RemotePagingSort.REMOTE_PAGING_SORT_ASC) {
                                return o1.getMontant().compareTo(o2.getMontant());
                            } else {
                                return o2.getMontant().compareTo(o1.getMontant());
                            }
                        }
                        if (remotePagingSort.getSortField().equals(orderCotisationMontantRegle)
                                && o1.getMontantRegle().compareTo(o2.getMontantRegle()) != 0) {
                            if (remotePagingSort.getSortAsc() == RemotePagingSort.REMOTE_PAGING_SORT_ASC) {
                                return o1.getMontantRegle().compareTo(o2.getMontantRegle());
                            } else {
                                return o2.getMontantRegle().compareTo(o1.getMontantRegle());
                            }
                        }
                        if (remotePagingSort.getSortField().equals(orderCotisationSituation)
                                && o1.getSituation().getLibelle().compareTo(o2.getSituation().getLibelle()) != 0) {
                            if (remotePagingSort.getSortAsc() == RemotePagingSort.REMOTE_PAGING_SORT_ASC) {
                                return o1.getSituation().getLibelle().compareTo(o2.getSituation().getLibelle());
                            } else {
                                return o2.getSituation().getLibelle().compareTo(o1.getSituation().getLibelle());
                            }
                        }
                    }
                    return 0;
                }
            });
        }

        final RemotePagingResultsDto<CotisationDto> results = new RemotePagingResultsDto<CotisationDto>();
        results.setListResults(listeLignes);
        results.setTotalResults(nombreTotal);

        final RetourCotisationDto retour = new RetourCotisationDto();
        retour.setResultatsCotisation(results);
        retour.setSolde(retourAia.getSolde());
        return retour;
    }

    /**
     * Set the cotisationsPlugin value.
     * @param cotisationsPlugin the cotisationsPlugin to set
     */
    public void setCotisationsPlugin(CotisationsPlugin cotisationsPlugin) {
        this.cotisationsPlugin = cotisationsPlugin;
    }

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

    /**
     * Set the contratMoyenPaiementDao value.
     * @param contratMoyenPaiementDao the contratMoyenPaiementDao to set
     */
    public void setContratMoyenPaiementDao(ContratMoyenPaiementDao contratMoyenPaiementDao) {
        this.contratMoyenPaiementDao = contratMoyenPaiementDao;
    }

    /**
     * Set the constantesAiaPlugin value.
     * @param constantesAiaPlugin the constantesAiaPlugin to set
     */
    public void setConstantesAiaPlugin(ConstantesAiaPlugin constantesAiaPlugin) {
        this.constantesAiaPlugin = constantesAiaPlugin;
    }

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

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

    /**
     * Set the produitService value.
     * @param produitService the produitService to set
     */
    public void setProduitService(ProduitService produitService) {
        this.produitService = produitService;
    }

    /**
     * Set the garantieDao value.
     * @param garantieDao the garantieDao to set
     */
    public void setGarantieDao(GarantieDao garantieDao) {
        this.garantieDao = garantieDao;
    }

    /**
     * Set the contratService value.
     * @param contratService the contratService to set
     */
    public void setContratService(ContratService contratService) {
        this.contratService = contratService;
    }

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

}