com.square.core.service.implementations.ActionServiceImplementation.java Source code

Java tutorial

Introduction

Here is the source code for com.square.core.service.implementations.ActionServiceImplementation.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.core.service.implementations;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.log4j.Logger;
import org.scub.foundation.framework.base.dto.FichierDto;
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 org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.square.core.dao.interfaces.ActionAffectationDao;
import com.square.core.dao.interfaces.ActionDao;
import com.square.core.dao.interfaces.ActionDureeDao;
import com.square.core.dao.interfaces.ActionNatureDao;
import com.square.core.dao.interfaces.ActionNatureResultatDao;
import com.square.core.dao.interfaces.ActionObjetDao;
import com.square.core.dao.interfaces.ActionPrioriteDao;
import com.square.core.dao.interfaces.ActionResultatDao;
import com.square.core.dao.interfaces.ActionSousObjetDao;
import com.square.core.dao.interfaces.ActionStatutDao;
import com.square.core.dao.interfaces.ActionTypeDao;
import com.square.core.dao.interfaces.AgenceDao;
import com.square.core.dao.interfaces.CampagneDao;
import com.square.core.dao.interfaces.OpportuniteDao;
import com.square.core.dao.interfaces.PersonneDao;
import com.square.core.dao.interfaces.RessourceDao;
import com.square.core.model.Action;
import com.square.core.model.ActionAffectation;
import com.square.core.model.ActionAttribution;
import com.square.core.model.ActionDuree;
import com.square.core.model.ActionNature;
import com.square.core.model.ActionObjet;
import com.square.core.model.ActionPriorite;
import com.square.core.model.ActionSousObjet;
import com.square.core.model.ActionType;
import com.square.core.model.Campagne;
import com.square.core.model.Commentaire;
import com.square.core.model.Document;
import com.square.core.model.Opportunite;
import com.square.core.model.Personne;
import com.square.core.model.PersonneMorale;
import com.square.core.model.PersonnePhysique;
import com.square.core.model.Ressources.Agence;
import com.square.core.model.Ressources.Ressource;
import com.square.core.model.dto.ActionCreationDto;
import com.square.core.model.dto.ActionCritereRechercheDto;
import com.square.core.model.dto.ActionDto;
import com.square.core.model.dto.ActionModificationDto;
import com.square.core.model.dto.ActionNotificationInfosDto;
import com.square.core.model.dto.ActionRechercheDto;
import com.square.core.model.dto.ActionResultatDto;
import com.square.core.model.dto.ActionSyntheseDto;
import com.square.core.model.dto.CritereActionSyntheseDto;
import com.square.core.model.dto.DimensionRessourceDto;
import com.square.core.model.dto.DocumentDto;
import com.square.core.model.dto.HistoriqueCommentaireDto;
import com.square.core.model.dto.MailDto;
import com.square.core.model.dto.OpportuniteDto;
import com.square.core.model.dto.RapportDto;
import com.square.core.model.exception.ControleIntegriteException;
import com.square.core.model.plugin.EmailSquarePlugin;
import com.square.core.service.interfaces.ActionService;
import com.square.core.service.interfaces.OpportuniteService;
import com.square.core.service.interfaces.SquareMappingService;
import com.square.core.util.ActionKeyUtil;
import com.square.core.util.RessourceHabilitationUtil;
import com.square.core.util.poi.DocumentXls;
import com.square.core.util.validation.RapportUtil;
import com.square.core.util.validation.ValidationExpressionProp;
import com.square.core.util.validation.ValidationExpressionUtil;

/**
 * Implmentation du service des actions.
 * @author Sylla Mohamed Lamine (lamine08@gmail.com) - SCUB
 */
@Transactional(propagation = Propagation.REQUIRED)
public class ActionServiceImplementation implements ActionService {

    private static final String ESPACE = " ";

    /** Le logger. */
    private static Logger logger = Logger.getLogger(ActionServiceImplementation.class);

    /** Classe utilitaire pour accder aux messages. */
    private MessageSourceUtil messageSourceUtil;

    /** Mapper Dozer. */
    private MapperDozerBean mapperDozerBean;

    /** Le dao pour les actions. */
    private ActionDao actionDao;

    /** Classe utilitaire pour la vrification. */
    private ValidationExpressionUtil validationExpressionUtil;

    /** Le dao sur les personnes. */
    private PersonneDao personneDao;

    /** Le dao sur les natures d'actions. */
    private ActionNatureDao actionNatureDao;

    /** Le dao sur les types d'actions. */
    private ActionTypeDao actionTypeDao;

    /** Le dao sur les objets d'action. */
    private ActionObjetDao actionObjetDao;

    /** Le dao pour les sous objets. */
    private ActionSousObjetDao actionSousObjetDao;

    /** Le dao pour les priorits. */
    private ActionPrioriteDao actionPrioriteDao;

    /** DAO pour les dures des actions. */
    private ActionDureeDao actionDureeDao;

    /** Le dao pour les campagnes. */
    private CampagneDao campagneDao;

    /** Le service de mapping. */
    private SquareMappingService squareMappingService;

    /** Le dao sur les affectations. */
    private ActionAffectationDao actionAffectationDao;

    /** Le dao sur les ressources. */
    private RessourceDao ressourceDao;

    /** Le dao sur les agences. */
    private AgenceDao agenceDao;

    /** Le dao sur les statuts. */
    private ActionStatutDao actionStatutDao;

    /** Le dao sur les rsultats. */
    private ActionResultatDao actionResultatDao;

    /** Le dao sur les opportunits. */
    private OpportuniteDao opportuniteDao;

    /** Le service sur les opportunits. */
    private OpportuniteService opportuniteService;

    /** Habilitation des ressources . */
    private RessourceHabilitationUtil ressourceHabilitationUtil;

    /** Dao pour les natures de rsultat. */
    private ActionNatureResultatDao actionNatureResultatDao;

    private int paginationExportRecherche;

    /** PLugin des emails de square. */
    private EmailSquarePlugin emailSquarePlugin;

    /** Expditeur de l'email envoy. */
    private String expediteurNoReply;

    private static final SimpleDateFormat SDF = new SimpleDateFormat("dd/MM/yyyy");

    @Override
    public RemotePagingResultsDto<ActionRechercheDto> rechercherActionParCritere(
            RemotePagingCriteriasDto<ActionCritereRechercheDto> criteres) {
        if (criteres == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_RECHERCHE_ACTION_DTO_NULL));
        }
        // Les actions trouves sous forme de dto.
        final List<ActionRechercheDto> listeActions = actionDao.rechercheActionParCriteres(criteres);
        final RemotePagingResultsDto<ActionRechercheDto> result = new RemotePagingResultsDto<ActionRechercheDto>();
        result.setListResults(listeActions);
        result.setTotalResults(actionDao.nombreTotalAction(criteres));
        logger.info("Demande de recherche NOMBRE DE RESULTAT " + result.getListResults().size() + "/"
                + result.getTotalResults());
        return result;
    }

    @Override
    public ActionCreationDto creerAction(ActionCreationDto actionCreationDto) {
        // Vrification que les informations ne sont pas null
        final RapportDto rapport = new RapportDto();
        verificationAction(actionCreationDto, rapport);

        if (rapport.getEnErreur()) {
            RapportUtil.logRapport(rapport, logger);
            throw new ControleIntegriteException(rapport);
        }
        // Vrification de l'existance en base des donnes lies

        // Vrification que l'idpersonne existe
        final Personne personne = personneDao.rechercherPersonneParId(actionCreationDto.getIdPersonne());
        if (personne == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDPERSONNE_INEXISTANT));
        }

        // Vrification que la nature de l'action existe
        final ActionNature actionNature = actionNatureDao
                .rechercherNatureActionParId(actionCreationDto.getIdNatureAction());
        if (actionNature == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_NATURE_ACTION_INEXISTANT));
        }
        // Vrification que le type existe
        final ActionType actionType = actionTypeDao.rechercherTypeActionParId(actionCreationDto.getIdType());
        if (actionType == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_TYPE_ACTION_INEXISTANT));
        }
        // Vrification que l'objet existe
        final ActionObjet actionObjet = actionObjetDao.rechercherObjetActionParId(actionCreationDto.getIdObjet());
        if (actionObjet == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_OBJET_INEXISTANT));
        }
        // Vrification que le sous objet existe
        ActionSousObjet actionSousObjet = null;
        if (actionCreationDto.getIdSousObjet() != null) {
            actionSousObjet = actionSousObjetDao.rechercherSousObjetActionParId(actionCreationDto.getIdSousObjet());
            if (actionSousObjet == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_SOUS_OBJET_INEXISTANT));
            }
        }
        // Vrification que la priorit existe
        ActionPriorite actionPriorite = null;
        if (actionCreationDto.getIdPriorite() != null) {
            actionPriorite = actionPrioriteDao.rechercherPrioriteActionParId(actionCreationDto.getIdPriorite());
            if (actionPriorite == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_PRIORITE_INEXISTANTE));
            }
        }
        // Vrification que la campagne existe
        Campagne actionCampagne = null;
        if (actionCreationDto.getIdCampagne() != null) {
            actionCampagne = campagneDao.rechercherCampagneParId(actionCreationDto.getIdCampagne());
            if (actionCampagne == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_CAMPAGNE_INEXISTANTE));
            }
        }
        // Vrification que l'agence existe
        Agence agence = null;
        if (actionCreationDto.getIdAgence() != null) {
            agence = agenceDao.rechercheAgenceParId(actionCreationDto.getIdAgence());
            if (agence == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_AGENCE_INEXISTANTE));
            }
        }
        // Vrification que la ressource existe
        Ressource ressource = null;
        if (actionCreationDto.getIdCommercial() != null) {
            ressource = ressourceDao.rechercherRessourceParId(actionCreationDto.getIdCommercial());
            if (ressource == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_COMMERCIAL_INEXISTANTE));
            }
        }

        // Vrification de la notification
        if (actionCreationDto.getRappel() != null && actionCreationDto.getRappel()) {
            if (actionCreationDto.getIdNotificationList() != null) {
                final ActionNotificationInfosDto notification = squareMappingService
                        .getActionNotificationParId(actionCreationDto.getIdNotificationList());
                if (notification == null) {
                    throw new BusinessException(
                            messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_RAPPEL_SANS_TEMPS));
                }
            } else {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_RAPPEL_SANS_TEMPS));
            }
        }

        // Vrification que la dure existe
        ActionDuree dureeAction = null;
        if (actionCreationDto.getIdDuree() != null) {
            dureeAction = actionDureeDao.rechercherDureeActionParId(actionCreationDto.getIdDuree());
            if (dureeAction == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DUREE_INEXISTANTE));
            }
        }

        // Cration d'une nouvelle action
        final Action action = new Action();

        // ActionDto -> Action
        mapperAction(actionCreationDto, action, actionNature, actionType, actionObjet, actionSousObjet,
                actionPriorite, actionCampagne, dureeAction);

        final Opportunite opportunite = opportuniteDao
                .rechercherOpportuniteParId(actionCreationDto.getIdOpportunite());

        Action actionSource = null;
        if (actionCreationDto.getIdActionSource() != null) {
            actionSource = actionDao.rechercherActionParId(actionCreationDto.getIdActionSource());
            if (actionSource == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDSOURCE_INEXISTANTE));
            }
        } else {
            // Si l'action source n'est pas renseigne mais que l'opportunit est renseigne, l'action source est la dernire action lie  l'opportunit
            if (opportunite != null) {
                // Recherche des actions lies  l'opportunit
                final CritereActionSyntheseDto critereActionSyntheseDto = new CritereActionSyntheseDto();
                critereActionSyntheseDto.setIdOpportunite(opportunite.getId());
                critereActionSyntheseDto.setIdPersonne(personne.getId());
                final List<Stack<ActionSyntheseDto>> listeActionsOpportunite = recupererActionsSynthese(
                        critereActionSyntheseDto);
                if (listeActionsOpportunite != null && !listeActionsOpportunite.isEmpty()) {
                    if (listeActionsOpportunite.get(0).peek() != null) {
                        actionSource = actionDao
                                .rechercherActionParId(listeActionsOpportunite.get(0).peek().getId());
                    }
                }
            }
        }
        if (actionSource != null) {
            // On reprend la campagne
            action.setCampagne(actionSource.getCampagne());
            if (actionNature != null) {
                action.setNature(actionNature);
            } else {
                action.setNature(actionSource.getNature());
            }
            action.setActionSource(actionSource);
        }

        // Crer l'affectation vers une personne.
        if (actionCreationDto.getIdActionSource() == null) {
            final ActionAffectation actionAffectation = new ActionAffectation();
            // Vrification que l'idpersonne existe
            actionAffectation.setPersonne(personne);
            actionAffectation.setOpportunite(opportunite);
            actionAffectation.setDateCreation(Calendar.getInstance());
            actionAffectation.setSupprime(false);
            actionAffectationDao.creerActionAffectation(actionAffectation);
            action.setActionAffectation(actionAffectation);
        } else {
            // Cration d'un action lie : Identifiant de la personne correspondant  l'action source
            final ActionAffectation actionAffectation = new ActionAffectation();
            actionAffectation.setPersonne(actionSource.getActionAffectation().getPersonne());
            actionAffectation.setOpportunite(opportunite);
            actionAffectation.setDateCreation(Calendar.getInstance());
            actionAffectation.setSupprime(false);
            // Si l'action source possde une opportunit on la rcupre
            if (actionSource.getActionAffectation() != null
                    && actionSource.getActionAffectation().getOpportunite() != null) {
                actionAffectation.setOpportunite(actionSource.getActionAffectation().getOpportunite());
            }
            actionAffectationDao.creerActionAffectation(actionAffectation);
            action.setActionAffectation(actionAffectation);
        }

        // Le crateur de l'action : si pas spcifi, l'utilisateur connect
        action.setRessource(actionCreationDto.getIdCreateur() != null
                ? ressourceDao.rechercherRessourceParId(actionCreationDto.getIdCreateur())
                : ressourceHabilitationUtil.getUtilisateurConnecte());

        // ATTRIBUTIONS DE L'ACTION
        final ActionAttribution actionAttribution = new ActionAttribution();

        // Rcupration du commercial
        if (actionCreationDto.getIdCommercial() != null) {
            actionAttribution.setRessource(ressource);
        }
        actionAttribution.setAgence(agence);

        action.setActionAttribution(actionAttribution);
        action.setDate(actionCreationDto.getDateAction());
        action.setVisibleAgenda(actionCreationDto.getVisibleAgenda() != null
                && actionCreationDto.getVisibleAgenda().booleanValue());

        final Long idStatutAction = actionCreationDto.getIdStatut() != null ? actionCreationDto.getIdStatut()
                : squareMappingService.getIdStatutActionParDefaut();
        action.setStatut(actionStatutDao.rechercherStatutActionParId(idStatutAction));
        if (squareMappingService.getIdStatutActionTermine().equals(idStatutAction)) {
            action.setDateTerminee(Calendar.getInstance());
        }

        // Constuction du commentaire
        if (actionCreationDto.getCommentaires() != null) {
            final List<Commentaire> commentaires = mapperDozerBean.mapList(actionCreationDto.getCommentaires(),
                    Commentaire.class);
            action.setCommentaires(commentaires);
        }

        // Affectation des documents
        if (actionCreationDto.getDocuments() != null) {
            final List<Document> documents = mapperDozerBean.mapList(actionCreationDto.getDocuments(),
                    Document.class);
            action.setDocuments(documents);
        }

        // Cration de l'action
        actionDao.creerAction(action);

        // Action -> ActionDto
        mapperDozerBean.map(action, actionCreationDto);
        return actionCreationDto;
    }

    /**
     * Mthode prive qui vrifie si les champs obligatoires sont renseigns.
     * @param actionDto les donnes sources
     * @param rapport le rapport  remplir au fur et  mesure
     */
    private void verificationAction(ActionCreationDto actionDto, RapportDto rapport) {
        if (actionDto == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DTO_NULL));
        }

        final ValidationExpressionProp[] propsAction = new ValidationExpressionProp[] {
                new ValidationExpressionProp("dateAction", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DATE_ACTION_NULL)),
                new ValidationExpressionProp("idPersonne", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDPERSONNE_NULL)),
                new ValidationExpressionProp("idNatureAction", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_NATURE_ACTION_NULL)),
                new ValidationExpressionProp("idType", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_TYPE_ACTION_NULL)),
                new ValidationExpressionProp("idObjet", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_OBJET_NULL)),
                new ValidationExpressionProp("idAgence", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_AGENCE_NULL)) };

        validationExpressionUtil.verifierSiVide(rapport, actionDto, propsAction);

        if (actionDto.getDateAction() != null) {
            // On vrifie que la date d'action est postrieure  la date courante
            final Calendar dateCourante = DateUtils.truncate(Calendar.getInstance(), Calendar.DAY_OF_MONTH);
            final Calendar dateAction = DateUtils.truncate((Calendar) actionDto.getDateAction().clone(),
                    Calendar.DAY_OF_MONTH);
            if (dateAction.before(dateCourante)) {
                rapport.ajoutRapport(actionDto.getClass().getSimpleName() + ".dateAction",
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DATE_ACTION_INVALIDE), true);
            }
        }

        // On ne peut rendre visible une action dans l'agenda que si elle a une date de dbut, une dure
        if (actionDto.getVisibleAgenda() != null && actionDto.getVisibleAgenda().booleanValue()
                && (actionDto.getDateAction() == null || actionDto.getIdDuree() == null)) {
            rapport.ajoutRapport(actionDto.getClass().getSimpleName() + ".isVisibleAgenda",
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IMPOSSIBLE_VISIBLE_AGENDA), true);
        }
    }

    /**
     * Mthode prive qui crer un objet action  partir d'un objet actionDto.
     * @param actionDto l'action dto Source
     * @param action l'action resultante
     */
    private void mapperAction(ActionCreationDto actionCreationDto, Action action, ActionNature natureAction,
            ActionType typeAction, ActionObjet objetAction, ActionSousObjet sousObjetAction,
            ActionPriorite prioriteAction, Campagne campagne, ActionDuree dureeAction) {
        action.setDate(actionCreationDto.getDateAction());
        // Nature Action
        if (natureAction != null) {
            action.setNature(natureAction);
        }
        // Type
        if (typeAction != null) {
            action.setType(typeAction);
        }
        // Objet
        if (objetAction != null) {
            action.setObjet(objetAction);
        }
        // Sous objet
        if (sousObjetAction != null) {
            action.setSousObjet(sousObjetAction);
        }
        // Priorit
        if (prioriteAction != null) {
            action.setPriorite(prioriteAction);
        } else {
            action.setPriorite(actionPrioriteDao
                    .rechercherPrioriteActionParId(squareMappingService.getIdActionPrioriteParDefaut()));
        }
        // Campagne
        if (campagne != null) {
            action.setCampagne(campagne);
        }
        // Dure
        if (dureeAction != null) {
            action.setDuree(dureeAction);
        }
        // Enregistrement de la date de notification
        if (actionCreationDto.getRappel() != null && actionCreationDto.getRappel()) {
            if (actionCreationDto.getIdNotificationList() != null) {
                final ActionNotificationInfosDto notification = squareMappingService
                        .getActionNotificationParId(actionCreationDto.getIdNotificationList());
                final Calendar soustraction = Calendar.getInstance();
                soustraction.clear();
                final Long dateTime = -notification.getNotification().getTimeInMillis()
                        + actionCreationDto.getDateAction().getTimeInMillis();
                soustraction.setTimeInMillis(dateTime);
                action.setDateNotification(soustraction);
            }
        } else {
            action.setDateNotification(null);
        }
        // Rclamation
        if (actionCreationDto.getReclamation() != null) {
            action.setReclamation(actionCreationDto.getReclamation());
        } else {
            action.setReclamation(false);
        }
        // Mail notification
        if (actionCreationDto.getMePrevenirParMail() != null) {
            action.setMailNotification(actionCreationDto.getMePrevenirParMail());
        } else {
            action.setMailNotification(false);
        }
        // Date d'affichage
        if (actionCreationDto.getDateAffichageAction() != null) {
            action.setDateAffichage(actionCreationDto.getDateAffichageAction());
        }
        // Date de cration
        action.setDateCreation(Calendar.getInstance());
    }

    @Override
    public ActionResultatDto modifierAction(ActionModificationDto actionModificationDto) {
        // Dto null
        if (actionModificationDto == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DTO_NULL));
        }

        // Identifiant de l'action null
        if (actionModificationDto.getIdAction() == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDACTION_NULL));
        }

        // Rcupration de l'action correspondant
        final Action actionAModifier = actionDao.rechercherActionParId(actionModificationDto.getIdAction());
        if (actionAModifier == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_INEXISTANTE));
        }
        if (logger.isDebugEnabled()) {
            logger.debug("bug 0008864 : modifierAction(ActionModificationDto)");
            logger.debug("recuperation de l'action : " + actionModificationDto.getIdAction());
            logger.debug("dateCreation = " + (actionAModifier.getDateCreation() != null
                    ? SDF.format(actionAModifier.getDateCreation().getTime())
                    : "null"));
        }

        Agence agence = null;
        if (actionModificationDto.getAgence() != null
                && actionModificationDto.getAgence().getIdentifiant() != null) {
            agence = agenceDao.rechercheAgenceParId(actionModificationDto.getAgence().getIdentifiant());
            if (agence == null) {
                logger.error(
                        "L'agence id = " + actionModificationDto.getAgence().getIdentifiant() + "n'existe pas.");
                throw new TechnicalException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_AGENCE_INEXISTANTE));
            }
        }

        // Rcupration de la ressource correspondant au commercial (on permet dsormais le changement de ressource mme si existant)
        Ressource commercial = null;
        if (actionAModifier.getActionAttribution() != null && actionModificationDto.getRessource() != null
                && actionModificationDto.getRessource().getIdentifiant() != null) {
            commercial = ressourceDao
                    .rechercherRessourceParId(actionModificationDto.getRessource().getIdentifiant());
            if (commercial == null) {
                logger.error(
                        "La ressource " + actionModificationDto.getRessource().getIdentifiant() + " n'existe pas");
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_COMMERCIAL_INEXISTANTE));
            }
        }

        // Rcupration de la dure
        ActionDuree dureeAction = null;
        if (actionModificationDto.getIdDuree() != null) {
            dureeAction = actionDureeDao.rechercherDureeActionParId(actionModificationDto.getIdDuree());
            if (dureeAction == null) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DUREE_INEXISTANTE));
            }
        }

        final RapportDto rapport = new RapportDto();

        // Vrification de la nature
        if (actionModificationDto.getNatureAction() == null
                || actionModificationDto.getNatureAction().getIdentifiant() == null) {
            rapport.ajoutRapport(ActionModificationDto.class.getSimpleName() + ".nature",
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_NATURE_ACTION_NULL), true);
        }

        // Pour une action de nature "tlphone sortant" passant au statut "termin"
        if (actionModificationDto.getNatureAction() != null
                && squareMappingService.getIdNatureActionTelephoneSortant()
                        .equals(actionModificationDto.getNatureAction().getIdentifiant())
                && actionModificationDto.getStatut() != null && squareMappingService.getIdStatutActionTermine()
                        .equals(actionModificationDto.getStatut().getIdentifiant())) {
            // On vrifie que le rsultat de la nature est renseign
            if (actionModificationDto.getNatureResultat() == null
                    || actionModificationDto.getNatureResultat().getIdentifiant() == null) {
                rapport.ajoutRapport(ActionModificationDto.class.getSimpleName() + ".natureResultat",
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_NATURE_RESULTAT_ACTION_NULL),
                        true);
            }
        }

        // vrification que la nature de resultat est selectionne pour la nature d'action visite sortante si on demande la vrification
        if (!BooleanUtils.isFalse(actionModificationDto.getVerifierResultatNatureAction())
                && actionModificationDto.getNatureAction() != null
                && squareMappingService.getIdNatureActionVisiteSortante()
                        .equals(actionModificationDto.getNatureAction().getIdentifiant())
                && actionModificationDto.getNatureResultat() == null && squareMappingService
                        .getIdStatutActionTermine().equals(actionModificationDto.getStatut().getIdentifiant())) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_NATURE_RESULTAT_VISITE_SORTANTE));
        }

        // Contrle du statut
        final ValidationExpressionProp[] propsAction = new ValidationExpressionProp[] {
                new ValidationExpressionProp("statut", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_STATUT_NULL)),
                new ValidationExpressionProp("dateAction", null,
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DATE_ACTION_NULL)) };

        validationExpressionUtil.verifierSiVide(rapport, actionModificationDto, propsAction);

        if (actionModificationDto.getDateAction() != null) {
            // On copie la date de l'action enregistre en base
            final Calendar ancienneDateAction = DateUtils.truncate((Calendar) actionAModifier.getDate().clone(),
                    Calendar.HOUR);
            // On copie la nouvelle date d'action
            final Calendar nouvelleDateAction = DateUtils
                    .truncate((Calendar) actionModificationDto.getDateAction().clone(), Calendar.HOUR);
            // Si la date de l'action est modifie
            if (!ancienneDateAction.equals(nouvelleDateAction)) {
                // On vrifie que la date d'action est postrieure  la date courante
                if (DateUtils.truncate(nouvelleDateAction, Calendar.DAY_OF_MONTH)
                        .before(DateUtils.truncate(Calendar.getInstance(), Calendar.DAY_OF_MONTH))) {
                    rapport.ajoutRapport(actionModificationDto.getClass().getSimpleName() + ".dateAction",
                            messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DATE_ACTION_INVALIDE), true);
                }
            }
        }

        // Une action ne peut tre termine sans tre attribue
        if (actionModificationDto.getStatut() != null
                && squareMappingService.getIdStatutActionTermine()
                        .equals(actionModificationDto.getStatut().getIdentifiant())
                && (actionModificationDto.getRessource() == null
                        || actionModificationDto.getRessource().getIdentifiant() == null)) {
            rapport.ajoutRapport(ActionModificationDto.class.getSimpleName() + ".statut",
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_TERMINEE_SANS_ATTRIBUTION), true);
        }

        // On ne peut rendre visible une action dans l'agenda que si elle a une date de dbut, une dure
        if (actionModificationDto.getVisibleAgenda() != null
                && actionModificationDto.getVisibleAgenda().booleanValue()
                && (actionModificationDto.getDateAction() == null || actionModificationDto.getIdDuree() == null)) {
            rapport.ajoutRapport(actionModificationDto.getClass().getSimpleName() + ".isVisibleAgenda",
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IMPOSSIBLE_VISIBLE_AGENDA), true);
        }

        // Prsence d'erreurs empchant la modification de l'action
        if (rapport.getEnErreur()) {
            // On retourne le rapport d'erreur
            RapportUtil.logRapport(rapport, logger);
            throw new ControleIntegriteException(rapport);
        }

        // Vrification de l'existance des nouveaux champs
        verificationExistanceModification(actionModificationDto, actionAModifier);

        // Vrification de la rgle de gestion de l'opportunit en cours
        if (Boolean.TRUE.equals(actionModificationDto.getVerifierRegleGestionOpportuniteEnCours())) {
            verifierRegleGestionOpportuniteOuverte(actionModificationDto, actionAModifier);
        }

        // Modification de l'action
        if (actionModificationDto.getNatureAction() != null
                && actionModificationDto.getNatureAction().getIdentifiant() != null) {
            final ActionNature nature = actionNatureDao
                    .rechercherNatureActionParId(actionModificationDto.getNatureAction().getIdentifiant());
            if (nature == null) {
                throw new TechnicalException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_NATURE_ACTION_INEXISTANT));
            }
            actionAModifier.setNature(nature);
        }
        // modification du type d'action
        final IdentifiantLibelleDto typeAction = actionModificationDto.getTypeAction();
        if (actionModificationDto.getTypeAction() != null && typeAction.getIdentifiant() != null) {
            actionAModifier.setType(actionTypeDao.rechercherTypeActionParId(typeAction.getIdentifiant()));
        }

        // modificatio de l'objet d'action
        final IdentifiantLibelleDto objetAction = actionModificationDto.getObjetAction();
        if (actionModificationDto.getObjetAction() != null && objetAction.getIdentifiant() != null) {
            actionAModifier.setObjet(actionObjetDao.rechercherObjetActionParId(objetAction.getIdentifiant()));
        }
        // affectation au pot commun
        if (actionModificationDto.getAffectationPotCommun() != null
                && actionModificationDto.getAffectationPotCommun()) {
            actionAModifier.getActionAttribution()
                    .setAgence(agenceDao.rechercheAgenceParId(squareMappingService.getIdentifiantAgenceFrance()));
            actionAModifier.getActionAttribution().setRessource(null);
        }
        if (actionModificationDto.getRappelMail() != null) {
            actionAModifier.setMailNotification(actionModificationDto.getRappelMail());
        }
        // action tlphone sortant ou visite sortante
        if (actionModificationDto.getNatureAction() != null
                && (squareMappingService.getIdNatureActionTelephoneSortant()
                        .equals(actionModificationDto.getNatureAction().getIdentifiant())
                        || squareMappingService.getIdNatureActionVisiteSortante()
                                .equals(actionModificationDto.getNatureAction().getIdentifiant()))) {
            if (actionModificationDto.getNatureResultat() != null
                    && actionModificationDto.getNatureResultat().getIdentifiant() != null) {
                actionAModifier.setNatureResultat(actionNatureResultatDao.rechercherNatureResultatActionById(
                        actionModificationDto.getNatureResultat().getIdentifiant()));
            } else {
                actionAModifier.setNatureResultat(null);
            }
        }

        if (agence != null) {
            // si on affecte une action de relance (qui n'avait pas d'agence)  une agence, on affecte aussi l'opp  l'agence
            if (actionAModifier.getActionAttribution().getAgence() == null
                    && actionAModifier.getType().getId().equals(squareMappingService.getIdTypeActionRelance())
                    && actionAModifier.getActionAffectation().getOpportunite() != null) {
                actionAModifier.getActionAffectation().getOpportunite().getOpportuniteAttribution()
                        .setAgence(agence);
            }
            actionAModifier.getActionAttribution().setAgence(agence);
        }

        if (commercial != null) {
            // si on affecte une action de relance (qui n'avait pas de ressource)  une ressource, on affecte aussi l'opp  la ressource
            if (actionAModifier.getActionAttribution().getRessource() == null
                    && actionAModifier.getType().getId().equals(squareMappingService.getIdTypeActionRelance())
                    && actionAModifier.getActionAffectation().getOpportunite() != null) {
                actionAModifier.getActionAffectation().getOpportunite().getOpportuniteAttribution()
                        .setRessource(commercial);
            }
            actionAModifier.getActionAttribution().setRessource(commercial);
        }

        final Long idStatutTermine = squareMappingService.getIdStatutTerminer();

        // Rsultat
        // Cration d'une opportunit si le rsultat passe  opportunit
        OpportuniteDto opportuniteCree = null;
        if (actionAModifier.getResultat() == null) {
            if (actionModificationDto.getResultat() != null && actionModificationDto.getResultat().getIdentifiant()
                    .equals(squareMappingService.getIdResultatOpportunite())) {
                actionAModifier.setStatut(actionStatutDao.rechercherStatutActionParId(idStatutTermine));
                opportuniteCree = creationOpportunite(actionAModifier);
            } else if (actionModificationDto.getResultat() != null && actionModificationDto.getResultat()
                    .getIdentifiant().equals(squareMappingService.getIdResultatRelance())) {
                actionAModifier.setStatut(actionStatutDao.rechercherStatutActionParId(idStatutTermine));
            } else {
                actionAModifier.setStatut(actionStatutDao
                        .rechercherStatutActionParId(actionModificationDto.getStatut().getIdentifiant()));
            }
            if (actionModificationDto.getResultat() != null) {
                actionAModifier.setResultat(actionResultatDao
                        .rechercherActionResultatParId(actionModificationDto.getResultat().getIdentifiant()));
            }
        } else {
            if (actionModificationDto.getResultat() != null && actionModificationDto.getResultat().getIdentifiant()
                    .equals(squareMappingService.getIdResultatOpportunite())) {
                if (!actionAModifier.getResultat().getId()
                        .equals(squareMappingService.getIdResultatOpportunite())) {
                    actionAModifier.setStatut(actionStatutDao.rechercherStatutActionParId(idStatutTermine));
                    opportuniteCree = creationOpportunite(actionAModifier);
                }
            } else if (actionModificationDto.getResultat() != null && actionModificationDto.getResultat()
                    .getIdentifiant().equals(squareMappingService.getIdResultatRelance())) {
                actionAModifier.setStatut(actionStatutDao.rechercherStatutActionParId(idStatutTermine));
            } else {
                actionAModifier.setStatut(actionStatutDao
                        .rechercherStatutActionParId(actionModificationDto.getStatut().getIdentifiant()));
            }
            if (actionModificationDto.getResultat() != null) {
                actionAModifier.setResultat(actionResultatDao
                        .rechercherActionResultatParId(actionModificationDto.getResultat().getIdentifiant()));
            }
        }

        // Mise  jour de la date de l'action
        if (idStatutTermine.equals(actionModificationDto.getStatut().getIdentifiant())) {
            // Si l'action passe au statut "termin", on met  jour la date termine de l'action en prenant la date courante
            actionAModifier.setDateTerminee(Calendar.getInstance());
        } else {
            actionAModifier.setDate(actionModificationDto.getDateAction());
        }

        // Priorit
        if (actionModificationDto.getPriorite() != null
                && actionModificationDto.getPriorite().getIdentifiant() != null) {
            // Rcupration de la priorit
            final ActionPriorite priorite = actionPrioriteDao
                    .rechercherPrioriteActionParId(actionModificationDto.getPriorite().getIdentifiant());
            if (priorite != null) {
                actionAModifier.setPriorite(priorite);
            }
        }

        // Dure de l'action
        if (dureeAction != null) {
            actionAModifier.setDuree(dureeAction);
        }

        // Action visible ou non dans l'agenda
        actionAModifier.setVisibleAgenda(actionModificationDto.getVisibleAgenda() != null
                && actionModificationDto.getVisibleAgenda().booleanValue());

        // Construction de la date de notification
        if (actionModificationDto.getRappel() != null && actionModificationDto.getRappel()) {
            if (actionModificationDto.getIdNotification() != null) {
                final ActionNotificationInfosDto notification = squareMappingService
                        .getActionNotificationParId(actionModificationDto.getIdNotification());
                final Calendar soustraction = Calendar.getInstance();
                soustraction.clear();
                final Long dateTime = -notification.getNotification().getTimeInMillis()
                        + actionAModifier.getDate().getTimeInMillis();
                soustraction.setTimeInMillis(dateTime);
                actionAModifier.setDateNotification(soustraction);
            } else {
                actionAModifier.setDateNotification(null);
            }
        } else {
            actionAModifier.setDateNotification(null);
        }
        // Constuction du commentaire
        if (actionModificationDto.getCommentaire() != null) {
            final Commentaire commentaire = mapperDozerBean.map(actionModificationDto.getCommentaire(),
                    Commentaire.class);
            if (actionModificationDto.getCommentaire().getRessource() != null) {
                final Ressource ressource = ressourceDao
                        .rechercherRessourceParId(actionModificationDto.getCommentaire().getRessource().getId());
                commentaire.setRessource(ressource);
            }
            if (actionAModifier.getCommentaires() == null) {
                final List<Commentaire> list = new ArrayList<Commentaire>();
                list.add(commentaire);
                actionAModifier.setCommentaires(list);
            } else {
                actionAModifier.getCommentaires().add(commentaire);
            }
        }

        // Envoi d'un email si demand
        if (actionAModifier.isMailNotification()
                && squareMappingService.getIdStatutActionTermine().equals(actionAModifier.getStatut().getId())) {
            if (actionAModifier.getRessource() != null) {
                final Ressource createur = actionAModifier.getRessource();
                if (createur.getEmail() == null || "".equals(createur.getEmail())) {
                    throw new BusinessException(
                            messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_EMAIL_CREATEUR_ACTION_VIDE));
                }
                final List<String> listeDestinataires = new ArrayList<String>();
                listeDestinataires.add(createur.getEmail());
                final String titre = messageSourceUtil.get(ActionKeyUtil.TITRE_EMAIL_FIN_ACTION);
                String personneAction = "";
                String type = "";
                String objet = "";
                String sousObjet = "";
                String nature = "";
                String campagne = "";
                if (actionAModifier.getActionAffectation() != null
                        && actionAModifier.getActionAffectation().getPersonne() != null) {
                    final Personne personne = actionAModifier.getActionAffectation().getPersonne();
                    if (personne instanceof PersonnePhysique) {
                        final PersonnePhysique personnePhysique = (PersonnePhysique) actionAModifier
                                .getActionAffectation().getPersonne();
                        personneAction = personnePhysique.getNom() + ESPACE + personnePhysique.getPrenom();
                    } else if (personne instanceof PersonneMorale) {
                        final PersonneMorale personneMorale = (PersonneMorale) actionAModifier
                                .getActionAffectation().getPersonne();
                        personneAction = personneMorale.getRaisonSociale();
                    }
                }
                if (actionAModifier.getType() != null) {
                    type = actionAModifier.getType().getLibelle();
                }
                if (actionAModifier.getObjet() != null) {
                    objet = actionAModifier.getObjet().getLibelle();
                }
                if (actionAModifier.getSousObjet() != null) {
                    sousObjet = actionAModifier.getSousObjet().getLibelle();
                }
                if (actionAModifier.getNature() != null) {
                    nature = actionAModifier.getNature().getLibelle();
                }
                if (actionAModifier.getCampagne() != null) {
                    campagne = actionAModifier.getCampagne().getLibelle();
                }
                final String message = messageSourceUtil.get(ActionKeyUtil.MESSAGE_EMAIL_FIN_ACTION,
                        new String[] { personneAction, type, objet, sousObjet, nature, campagne });
                final MailDto mailDto = new MailDto(expediteurNoReply, listeDestinataires, titre, message, null,
                        false);
                emailSquarePlugin.envoyerEmail(mailDto);
            }
        }
        // Renseignement de la date de modification
        actionAModifier.setDateModification(Calendar.getInstance());

        final ActionResultatDto resultat = new ActionResultatDto();
        if (opportuniteCree != null) {
            resultat.setIdOpportunite(opportuniteCree.getIdOpportunite());
        }
        return resultat;
    }

    @Override
    public ActionDto modifierAction(ActionDto actionDto) {
        if (actionDto == null || actionDto.getIdentifiant() == null) {
            return null;
        }
        final Action actionAModifier = actionDao.rechercherActionParId(actionDto.getIdentifiant());

        // La date de cration ne devrait pas pouvoir tre modifi, on la sauvegarde pour la remettre aprs le mapping
        final Calendar dateCreation = actionAModifier.getDateCreation();
        mapperDozerBean.map(actionDto, actionAModifier);
        actionAModifier.setDateCreation(dateCreation);

        if (actionDto.getStatut() != null) {
            actionAModifier
                    .setStatut(actionStatutDao.rechercherStatutActionParId(actionDto.getStatut().getIdentifiant()));
            if (actionDto.getStatut().getIdentifiant().equals(squareMappingService.getIdStatutActionTermine())) {
                actionAModifier.setDateTerminee(Calendar.getInstance());
            }
        }
        if (actionDto.getResultat() != null) {
            actionAModifier.setResultat(
                    actionResultatDao.rechercherActionResultatParId(actionDto.getResultat().getIdentifiant()));
        }
        if (actionDto.getNatureAction() != null) {
            actionAModifier.setNature(
                    actionNatureDao.rechercherNatureActionParId(actionDto.getNatureAction().getIdentifiant()));
        }
        if (actionDto.getType() != null) {
            actionAModifier.setType(actionTypeDao.rechercherTypeActionParId(actionDto.getType().getIdentifiant()));
        }

        if (actionDto.getObjet() != null) {
            actionAModifier
                    .setObjet(actionObjetDao.rechercherObjetActionParId(actionDto.getObjet().getIdentifiant()));
        }
        if (actionDto.getSousObjet() != null) {
            actionAModifier.setSousObjet(
                    actionSousObjetDao.rechercherSousObjetActionParId(actionDto.getSousObjet().getIdentifiant()));
        }
        if (actionDto.getPriorite() != null) {
            actionAModifier.setPriorite(
                    actionPrioriteDao.rechercherPrioriteActionParId(actionDto.getPriorite().getIdentifiant()));
        }
        if (actionDto.getCampagne() != null) {
            actionAModifier
                    .setCampagne(campagneDao.rechercherCampagneParId(actionDto.getCampagne().getIdentifiant()));
        }
        if (actionDto.getNatureResultat() != null && actionDto.getNatureResultat().getIdentifiant() != null) {
            actionAModifier.setNatureResultat(actionNatureResultatDao
                    .rechercherNatureResultatActionById(actionDto.getNatureResultat().getIdentifiant()));
        }
        if (actionDto.getAgence() != null) {
            final ActionAttribution actionAttribution = actionAModifier.getActionAttribution() == null
                    ? new ActionAttribution()
                    : actionAModifier.getActionAttribution();
            final Agence agence = agenceDao.rechercheAgenceParId(actionDto.getAgence().getIdentifiant());
            Ressource ressource = null;
            if (actionDto.getRessource() != null) {
                ressource = ressourceDao.rechercherRessourceParId(actionDto.getRessource().getIdentifiant());
            }
            actionAttribution.setRessource(ressource);
            actionAttribution.setAgence(agence);
            actionAModifier.setActionAttribution(actionAttribution);
        }
        if (actionDto.getIdOpportunite() != null || actionDto.getIdPersonne() != null) {
            final Personne personne = actionDto.getIdPersonne() == null ? null
                    : personneDao.rechercherPersonneParId(actionDto.getIdPersonne());
            final Opportunite opportunite = actionDto.getIdOpportunite() == null ? null
                    : opportuniteDao.rechercherOpportuniteParId(actionDto.getIdOpportunite());
            final ActionAffectation actionAffectation = actionAModifier.getActionAffectation() == null
                    ? new ActionAffectation()
                    : actionAModifier.getActionAffectation();
            actionAffectation.setPersonne(personne);
            actionAffectation.setOpportunite(opportunite);
            actionAffectation.setDateCreation(Calendar.getInstance());
            actionAffectation.setSupprime(false);
            actionAffectationDao.creerActionAffectation(actionAffectation);
            actionAModifier.setActionAffectation(actionAffectation);
        }
        if (actionDto.getIdActionSource() != null) {
            final Action actionSource = actionDao.rechercherActionParId(actionDto.getIdActionSource());
            actionAModifier.setActionSource(actionSource);
        }
        if (actionDto.getDuree() != null && actionDto.getDuree().getIdentifiant() != null) {
            actionAModifier
                    .setDuree(actionDureeDao.rechercherDureeActionParId(actionDto.getDuree().getIdentifiant()));
        }
        // Renseignement de la date de modification
        if (actionAModifier != null) {
            actionAModifier.setDateModification(Calendar.getInstance());
        }
        return rechercherActionParIdentifiant(actionDto.getIdentifiant());
    }

    /**
     * Mthode prive pour la cration d'opportunit.
     * @param actionAModifier les donnes de l'action pour crer l'opportunite
     */
    private OpportuniteDto creationOpportunite(Action actionAModifier) {
        final OpportuniteDto opportuniteDto = new OpportuniteDto();
        opportuniteDto.setIdActionSource(actionAModifier.getId());
        if (actionAModifier.getActionAffectation() != null
                && actionAModifier.getActionAffectation().getPersonne() != null) {
            opportuniteDto.setIdPersonnePhysique(actionAModifier.getActionAffectation().getPersonne().getId());
        }
        if (actionAModifier.getNature() != null) {
            opportuniteDto.setIdNature(actionAModifier.getNature().getId());
        }
        if (actionAModifier.getCampagne() != null) {
            opportuniteDto.setIdCampagne(actionAModifier.getCampagne().getId());
        }
        if (actionAModifier.getActionAttribution() != null
                && actionAModifier.getActionAttribution().getAgence() != null) {
            opportuniteDto.setIdAgence(actionAModifier.getActionAttribution().getAgence().getId());
        }
        if (actionAModifier.getActionAttribution() != null
                && actionAModifier.getActionAttribution().getRessource() != null) {
            opportuniteDto.setIdRessource(actionAModifier.getActionAttribution().getRessource().getId());
        }
        if (actionAModifier.getType() != null) {
            opportuniteDto.setIdType(actionAModifier.getType().getId());
        }
        if (actionAModifier.getObjet() != null) {
            opportuniteDto.setIdObjet(actionAModifier.getObjet().getId());
        }
        if (actionAModifier.getSousObjet() != null) {
            opportuniteDto.setIdSousObjet(actionAModifier.getSousObjet().getId());
        }
        final OpportuniteDto opportuniteCree = opportuniteService.creerOpportunite(opportuniteDto);
        return opportuniteCree;
    }

    /**
     * Mthode prive pour vrifier l'existance des champs lors de la modification.
     * @param actionModificationDto les nouvelles donnes de l'action
     * @param actionAModifier l'action  modifier
     */
    private void verificationExistanceModification(ActionModificationDto actionModificationDto,
            Action actionAModifier) {

        // Statut inexistant
        if (actionStatutDao.rechercherStatutParId(actionModificationDto.getStatut().getIdentifiant()) == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_STATUT_INEXISTANT));
        }

        final IdentifiantLibelleDto natureAction = actionModificationDto.getNatureAction();
        final IdentifiantLibelleDto statutAction = actionModificationDto.getStatut();
        final IdentifiantLibelleDto natureResultat = actionModificationDto.getNatureResultat();
        final IdentifiantLibelleDto typeAction = actionModificationDto.getTypeAction();
        final IdentifiantLibelleDto objetAction = actionModificationDto.getObjetAction();
        // Si l'action passe au statut "termin" et a pour nature "tlphone sortant"
        if (natureAction != null
                && squareMappingService.getIdNatureActionTelephoneSortant().equals(natureAction.getIdentifiant())
                && statutAction != null
                && squareMappingService.getIdStatutActionTermine().equals(statutAction.getIdentifiant())) {
            // On vrifie que la nature du rsultat est renseigne et qu'elle existe bien dans la base de donnes
            if (natureResultat == null || (natureResultat != null && actionNatureResultatDao
                    .rechercherNatureResultatActionById(natureResultat.getIdentifiant()) == null)) {
                throw new BusinessException(
                        messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_NATURE_RESULTAT_INEXISTANT));
            }
        }

        // Rsultat inexistant
        if (actionModificationDto.getResultat() != null && actionResultatDao
                .rechercherActionResultatParId(actionModificationDto.getResultat().getIdentifiant()) == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_RESULTAT_INEXISTANT));
        }

        // Identifiant de notification inexistant
        if (actionModificationDto.getIdNotification() != null && squareMappingService
                .getActionNotificationParId(actionModificationDto.getIdNotification()) == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDNOTIFICATION_INEXISTANT));
        }

        // type d'action innexistant
        if (actionModificationDto.getTypeAction() != null && typeAction.getIdentifiant() != null
                && actionTypeDao.rechercherTypeActionParId(typeAction.getIdentifiant()) == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_TYPE_ACTION_INEXISTANT));
        }

        // objet d'action innexistant
        if (actionModificationDto.getObjetAction() != null && objetAction.getIdentifiant() != null
                && actionObjetDao.rechercherObjetActionParId(objetAction.getIdentifiant()) == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_OBJET_INEXISTANT));
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void supprimerAction(Long idAction) {
        logger.info("Suppression de l'action (id = " + idAction + ") ...");
        if (idAction == null) {
            throw new BusinessException(messageSourceUtil
                    .get(ActionKeyUtil.MESSAGE_ERREUR_SUPPRIMER_ACTION_PARAM_ID_ACTION_OBLIGATOIRE));
        }
        // On rcupre l'action  supprimer
        final Action actionASupprimer = actionDao.rechercherActionParId(idAction);
        // On vrifie que l'action  supprimer existe bien
        if (actionASupprimer == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_SUPPRIMER_ACTION_ACTION_INEXISTANTE,
                            new String[] { idAction.toString() }));
        }
        // On supprime l'action
        supprimerAction(actionASupprimer, false);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void supprimerActionsPersonne(Long idPersonne) {
        if (idPersonne == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDPERSONNE_INEXISTANT));
        }
        // On rcupre les actions  supprimer
        final CritereActionSyntheseDto critereActionSyntheseDto = new CritereActionSyntheseDto();
        critereActionSyntheseDto.setIdPersonne(idPersonne);
        final List<Action> actions = actionDao.rechercherActionsSources(critereActionSyntheseDto);
        for (Action actionASupprimer : actions) {
            // On supprime l'action
            supprimerAction(actionASupprimer, true);
        }
    }

    /**
     * Supprime une action.
     * @param action l'action  supprimer
     * @param logiquement si c'est une suppression logique ou physique
     */
    private void supprimerAction(Action actionASupprimer, boolean suppressionLogique) {
        // On recherche des actions lies  l'action  supprimer
        final List<Action> actionsLiees = actionDao.rechercherActionsLiees(actionASupprimer.getId(), null, false);
        // Si l'action possde des actions lies
        if (actionsLiees != null && !actionsLiees.isEmpty()) {
            // On supprime ses actions lies une  une
            for (Action actionLiee : actionsLiees) {
                supprimerAction(actionLiee, suppressionLogique);
            }
        }
        // On supprime l'action
        if (suppressionLogique) {
            actionDao.supprimerLogiquement(actionASupprimer);
        } else {
            actionDao.supprimerAction(actionASupprimer);
            logger.info("action (id = " + actionASupprimer.getId() + ") supprime avec succs");
        }
    }

    @Override
    public ActionDto rechercherActionParIdentifiant(Long idAction) {
        if (idAction == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDACTION_NULL));
        }

        final Action action = actionDao.rechercherActionParId(idAction);

        if (action == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDACTION_INEXISTANT));
        }
        // Rcupration des informations
        final ActionDto resultat = mapperDozerBean.map(action, ActionDto.class);
        // Crateur
        if (action.getRessource() != null) {
            resultat.setCreateur((DimensionRessourceDto) mapperDozerBean.map(action.getRessource(),
                    DimensionRessourceDto.class));
        }
        // Notification
        if (action.getDateNotification() != null) {
            resultat.setRappel(true);
            final Long idNotification = squareMappingService.getIdNotification(action.getDate(),
                    action.getDateNotification());
            resultat.setIdNotificationList(idNotification);
        } else {
            resultat.setRappel(false);
            resultat.setIdNotificationList(null);
        }
        // La ressource
        if (action.getActionAttribution().getRessource() != null) {
            resultat.setRessource((DimensionRessourceDto) mapperDozerBean
                    .map(action.getActionAttribution().getRessource(), DimensionRessourceDto.class));
        }
        if (action.getActionAttribution().getAgence() != null) {
            resultat.setAgence(new IdentifiantLibelleDto(action.getActionAttribution().getAgence().getId(),
                    action.getActionAttribution().getAgence().getLibelle()));
        }
        // Commentaire
        if (action.getCommentaires() != null && !action.getCommentaires().isEmpty()) {
            final List<HistoriqueCommentaireDto> commentaires = mapperDozerBean.mapList(action.getCommentaires(),
                    HistoriqueCommentaireDto.class);
            if (commentaires != null && commentaires.size() > 0) {
                for (HistoriqueCommentaireDto historiqueCommentaireDto : commentaires) {
                    historiqueCommentaireDto.setDateAction(action.getDate());
                    if (action.getObjet() != null) {
                        historiqueCommentaireDto.setObjet(action.getObjet().getLibelle());
                    }
                    if (action.getSousObjet() != null) {
                        historiqueCommentaireDto.setSousObjet(action.getSousObjet().getLibelle());
                    }
                    if (action.getActionAttribution() != null
                            && action.getActionAttribution().getRessource() != null) {
                        final String attribution = genererLibelleRessource(
                                action.getActionAttribution().getRessource());
                        historiqueCommentaireDto.setAttribution(attribution);
                    }
                }
            }

            resultat.setCommentaires(commentaires);
        }
        return resultat;
    }

    @Override
    public ActionDto rechercherActionParIdentifiantExterieur(String idExterieur) {
        if (idExterieur == null) {
            return null;
        }
        final Action action = actionDao.rechercherActionParIdExterieur(Long.parseLong(idExterieur));
        if (action != null) {
            return rechercherActionParIdentifiant(action.getId());
        } else {
            return null;
        }
    }

    @Override
    public List<HistoriqueCommentaireDto> rechercherNotesActions(Long idAction) {
        if (idAction == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDACTION_NULL));
        }
        final Action action = actionDao.rechercherActionParId(idAction);
        if (action == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDACTION_INEXISTANT));
        }
        // Historique des messages
        final List<HistoriqueCommentaireDto> historique = new ArrayList<HistoriqueCommentaireDto>();
        if (action.getActionSource() != null) {
            rechercherHistoriqueCommentaire(historique, action.getActionSource().getId());
        }

        Collections.sort(historique);
        return historique;
    }

    /**
     * Mthode prive pour rechercher l'historique des commentaires des action.
     * @param historique l'historique
     * @param idAction l'identifiant de l'action
     */
    private void rechercherHistoriqueCommentaire(List<HistoriqueCommentaireDto> historique, Long idAction) {

        // Recherche de l'action
        final Action action = actionDao.rechercherActionParId(idAction);

        historique.add(constructionCommentaire(action));

        if (action.getActionSource() != null) {
            rechercherHistoriqueCommentaire(historique, action.getActionSource().getId());
        }
    }

    @Override
    public List<Stack<ActionSyntheseDto>> recupererActionsSynthese(CritereActionSyntheseDto critere) {
        // Vrifications
        if (critere == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_DTO_NULL));
        }
        if (critere.getIdPersonne() == null) {
            throw new BusinessException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDPERSONNE_NULL));
        }
        if (personneDao.rechercherPersonneParId(critere.getIdPersonne()) == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDPERSONNE_INEXISTANT));
        }
        // Vrification sur l'opportunite
        if (critere.getIdOpportunite() != null
                && opportuniteDao.rechercherOpportuniteParId(critere.getIdOpportunite()) == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_OPPORTUNITE_INEXISTANTE));
        }

        // Rcupration des actions sources
        final List<Action> actionsSources = actionDao.rechercherActionsSources(critere);

        // Liste rsultat
        final List<Stack<ActionSyntheseDto>> listeActions = new ArrayList<Stack<ActionSyntheseDto>>();

        // Parcours des actions sources pour recherche les actions lies
        for (Action actionSource : actionsSources) {
            // Cration d'une nouvelle pile
            final Stack<ActionSyntheseDto> stack = new Stack<ActionSyntheseDto>();
            // Ajout de l'action source dans la pile
            final ActionSyntheseDto actionSyntheseDto = mapperDozerBean.map(actionSource, ActionSyntheseDto.class);
            actionSyntheseDto.setNiveau(0);
            actionSyntheseDto.setAttribueA(genererLibelleAttribueA(actionSource.getActionAttribution()));
            stack.push(actionSyntheseDto);
            // Recherche des actions lies  l'action source
            rechercherActionsLiees(stack, actionSource.getId(), actionSyntheseDto.getNiveau(),
                    critere.getIdOpportunite(), critere.getFiltrerDateCreation());
            // Enregistrement de la pile
            listeActions.add(stack);
        }

        return listeActions;
    }

    /**
     * Mthode prive rcursive qui recherche les actions lies.
     * @param idActionSource l'identifiant de l'action source
     * @param niveau le niveau
     * @param filtrerDateEffet bollen pour indiquer si on filtre ou non sur la date d'effet
     */
    private void rechercherActionsLiees(Stack<ActionSyntheseDto> pileEnCours, Long idActionSource, int niveau,
            Long idOpportunite, Boolean filtrerDateEffet) {
        final Long idTypeActionRelance = squareMappingService.getIdTypeActionRelance();
        final List<Action> actionsLiees = actionDao.rechercherActionsLiees(idActionSource, idOpportunite,
                filtrerDateEffet);
        for (Action actionLiee : actionsLiees) {
            // Ajout de l'action source dans la pile
            final ActionSyntheseDto actionSyntheseDto = mapperDozerBean.map(actionLiee, ActionSyntheseDto.class);
            // On incrmente le niveau des actions de type Relance
            int niveauSuivant = 0;
            if (actionLiee.getType() != null && idTypeActionRelance.equals(actionLiee.getType().getId())) {
                niveauSuivant = niveau + 1;
            }
            actionSyntheseDto.setNiveau(niveauSuivant);
            actionSyntheseDto.setAttribueA(genererLibelleAttribueA(actionLiee.getActionAttribution()));
            // Rcupration si la date d'action est ditable
            if (actionEditable(actionLiee)) {
                actionSyntheseDto.setDateActionEditable(true);
            }
            pileEnCours.push(actionSyntheseDto);
            rechercherActionsLiees(pileEnCours, actionLiee.getId(), niveauSuivant, idOpportunite, filtrerDateEffet);
        }
    }

    /**
     * Gnre un libell pour la resource passe en paramtre.
     * @param resource la resource pour laquelle on souhaite gnrer un libell
     * @return le libell gnr
     */
    private String genererLibelleRessource(Ressource resource) {
        if (resource != null) {
            return resource.getNom() + ESPACE + resource.getPrenom();
        } else {
            return "";
        }
    }

    /**
     * Gnre le libell attribu   partir des infos d'attribution de l'action.
     * @param actionAttribution attribution de l'action
     * @return libell gnr
     */
    private String genererLibelleAttribueA(ActionAttribution actionAttribution) {
        final StringBuffer libelleAttribueA = new StringBuffer();
        final String attributionRessource = genererLibelleRessource(actionAttribution.getRessource());
        if (!StringUtils.isBlank(attributionRessource)) {
            libelleAttribueA.append(attributionRessource);
            libelleAttribueA.append(", ");
        }
        final String attributionAgence = actionAttribution.getAgence().getLibelle();
        libelleAttribueA.append(attributionAgence);
        return libelleAttribueA.toString();
    }

    /**
     * Mthode prive permettant de savoir si une action est la dernire action de relance d'une opportunit et que la date d'action est gale  la date de
     * cration.
     * @param action l'action  vrifier
     * @return true si l'action correspond false sinon
     */
    private boolean actionEditable(Action action) {
        // Si l'action possde une action source, que son rsultat est null et que son statut n'est pas termin
        // Alors c'est une action de relance
        Boolean editable = false;
        if (action.getActionSource() != null && action.getResultat() == null
                && !action.getStatut().equals(squareMappingService.getIdStatutTerminer())) {
            // L'action doit comporter une opportunite
            if (action.getActionAffectation() != null && action.getActionAffectation().getOpportunite() != null) {
                // Vrification au niveau des dates
                final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
                final String dateAction = sdf.format(action.getDate().getTime());
                final String dateCreation = sdf.format(action.getDateCreation().getTime());

                if (dateAction.equals(dateCreation)) {
                    editable = true;
                }
            }
        }
        return editable;
    }

    /**
     * Mthode prive permettant de constuire un commentaire  partir d'une action.
     * @param action l'action
     * @return l'historique commentaire correspondant
     */
    private HistoriqueCommentaireDto constructionCommentaire(Action action) {
        final HistoriqueCommentaireDto historiqueCommentaireDto = new HistoriqueCommentaireDto();
        historiqueCommentaireDto.setDateAction(action.getDate());
        if (action.getCommentaires() != null && !action.getCommentaires().isEmpty()) {
            String text = "";
            for (Commentaire commentaire : action.getCommentaires()) {
                text += "<br/>";
                if (commentaire.getDescriptif() != null) {
                    if (commentaire.getRessource() != null) {
                        text += commentaire.getRessource().getNom() + " ";
                        text += commentaire.getRessource().getPrenom() + " : ";
                    }
                    // else {
                    // text += "Non attribu : ";
                    // }
                    text += commentaire.getDescriptif();
                }
            }
            historiqueCommentaireDto.setDescriptif(text);
        }
        if (action.getObjet() != null) {
            historiqueCommentaireDto.setObjet(action.getObjet().getLibelle());
        }
        if (action.getSousObjet() != null) {
            historiqueCommentaireDto.setSousObjet(action.getSousObjet().getLibelle());
        }
        if (action.getActionAttribution() != null && action.getActionAttribution().getRessource() != null) {
            final String attribution = genererLibelleRessource(action.getActionAttribution().getRessource());
            historiqueCommentaireDto.setAttribution(attribution);
        }
        return historiqueCommentaireDto;
    }

    @Override
    public void transfererActionsPersonne(Long idPersonneSource, Long idPersonneCible) {
        logger.debug("Transfert des actions de la personne source " + idPersonneSource + " vers la personne cible "
                + idPersonneCible);
        if (idPersonneSource == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_TRANSFERT_PERSONNE_SOURCE_NULL));
        }
        if (idPersonneCible == null) {
            throw new BusinessException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_TRANSFERT_PERSONNE_CIBLE_NULL));
        }
        // Rcupration de la personne cible
        final Personne personneCible = personneDao.rechercherPersonneParId(idPersonneCible);
        if (personneCible == null) {
            throw new BusinessException(messageSourceUtil
                    .get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_TRANSFERT_PERSONNE_CIBLE_INEXISTANTE));
        }
        // Rcupration des affectations d'actions de la personne source
        final List<ActionAffectation> listeActionsAffectation = actionAffectationDao
                .rechercherActionAffectationPersonne(idPersonneSource);
        // Transfert des actions (affectations)
        for (ActionAffectation actionAffectation : listeActionsAffectation) {
            actionAffectation.setPersonne(personneCible);
            actionAffectation.setDateModification(Calendar.getInstance());
        }
    }

    @Override
    public void attacherDocuments(Long idAction, List<DocumentDto> documents) {
        if (idAction == null) {
            throw new TechnicalException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_IDACTION_NULL));
        }
        final Action action = actionDao.rechercherActionParId(idAction);
        if (action == null) {
            throw new TechnicalException(messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_INEXISTANTE));
        }

        if (action.getDocuments() == null) {
            action.setDocuments(new ArrayList<Document>());
        }
        action.getDocuments().clear();
        final List<Document> nouvelleListe = mapperDozerBean.mapList(documents, Document.class);
        action.getDocuments().addAll(nouvelleListe);
    }

    @Override
    public FichierDto exporterRechercheActionsParCriteres(
            RemotePagingCriteriasDto<ActionCritereRechercheDto> criteres) {
        final String nomFichier = "exportRechercheActions.xls";
        final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

        final String[] entetes = new String[] { "Priorit", "A faire le", "Cre le", "Type", "Objet",
                "Sous-objet", "Statut", "Num. Client", "Agence / Ple", "Commerciale", "Crateur",
                "Termine le" };
        final Integer[] entetesWidth = new Integer[] { 5500, 5500, 5500, 5500, 11000, 11000, 5500, 5500, 5500, 5500,
                5500, 5500 };

        final DocumentXls documentXls = new DocumentXls(nomFichier, entetes, entetesWidth);

        // on recupere le resultat de la recherche par pagination
        int start = 0;
        RemotePagingResultsDto<ActionRechercheDto> resultats;
        do {
            // on redefinit la pagination
            criteres.setFirstResult(start);
            criteres.setMaxResult(paginationExportRecherche);
            resultats = rechercherActionParCritere(criteres);
            start += resultats.getListResults().size();
            // on integre les resultats au fichier
            for (ActionRechercheDto action : resultats.getListResults()) {
                final String[] infosLignes = new String[] { action.getPriorite(),
                        action.getDateAction() != null ? sdf.format(action.getDateAction().getTime()) : "",
                        action.getDateCreation() != null ? sdf.format(action.getDateCreation().getTime()) : "",
                        action.getType(), action.getObjet(), action.getSousObjet(), action.getStatut(),
                        action.getNumeroClient(), action.getAgence() != null ? action.getAgence().getLibelle() : "",
                        action.getCommercial() != null
                                ? action.getCommercial().getNom() + " " + action.getCommercial().getPrenom()
                                : "",
                        action.getCreateur() != null
                                ? action.getCreateur().getNom() + " " + action.getCreateur().getPrenom()
                                : "",
                        action.getDateTerminee() != null ? sdf.format(action.getDateTerminee().getTime()) : "" };
                documentXls.ajouterLigne(infosLignes);
            }
        } while (start < resultats.getTotalResults());

        return documentXls.cloturerDocument();
    }

    /**
     * Vrifie la rgle de gestion de l'opportunit en cours pour la modification d'une action. <br/>
     * On ne peut pas passer une action de type relance  "Termin" si l'opportunit associe est en cours.
     * @param actionModificationDto les nouvelles donnes de l'action
     * @param actionAModifier l'action  modifier
     */
    private void verifierRegleGestionOpportuniteOuverte(ActionModificationDto actionModificationDto,
            Action actionAModifier) {
        // Exception si on passe le statut d'une action de type "Relance"  "Termin" si l'opportunit associe est en cours
        if (actionModificationDto.getStatut() != null
                && squareMappingService.getIdStatutTerminer()
                        .equals(actionModificationDto.getStatut().getIdentifiant())
                && actionAModifier.getType() != null
                && squareMappingService.getIdTypeActionRelance().equals(actionAModifier.getType().getId())) {
            if (actionAModifier.getActionAffectation() != null
                    && actionAModifier.getActionAffectation().getOpportunite() != null
                    && actionAModifier.getActionAffectation().getOpportunite().getStatut() != null) {
                final Long idStatutOpportunite = actionAModifier.getActionAffectation().getOpportunite().getStatut()
                        .getId();
                if (squareMappingService.getIdStatutOpportuniteEnAttente().equals(idStatutOpportunite)
                        || squareMappingService.getIdStatutOpportuniteNonRenseigne().equals(idStatutOpportunite)) {
                    throw new BusinessException(messageSourceUtil
                            .get(ActionKeyUtil.MESSAGE_ERREUR_ACTION_RELANCE_TERMINEE_OPPORTUNITE_EN_COURS));
                }
            }
        }
    }

    @Override
    public void transfererActionsParCritere(ActionCritereRechercheDto criteres, Long idAgenceCible,
            Long idRessourceCible) {
        if (criteres == null) {
            throw new TechnicalException(
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_RECHERCHE_ACTION_DTO_NULL));
        }
        final RapportDto rapport = new RapportDto();
        if (idAgenceCible == null) {
            rapport.ajoutRapport(ActionRechercheDto.class.getSimpleName() + ".agence.id",
                    messageSourceUtil.get(ActionKeyUtil.MESSAGE_ERREUR_TRANSFERT_ACTION_AGENCE_NULL), true);
        }
        if (rapport.getEnErreur()) {
            RapportUtil.logRapport(rapport, logger);
            throw new ControleIntegriteException(rapport);
        }

        final Agence agence = agenceDao.rechercheAgenceParId(idAgenceCible);
        Ressource ressource = null;
        if (idRessourceCible != null) {
            ressource = ressourceDao.rechercherRessourceParId(idRessourceCible);
        }

        final RemotePagingCriteriasDto<ActionCritereRechercheDto> criteresDto = new RemotePagingCriteriasDto<ActionCritereRechercheDto>(
                criteres, 0, Integer.MAX_VALUE);

        // on recupere la liste des actions via les criteres de recherche
        final List<ActionRechercheDto> results = actionDao.rechercheActionParCriteres(criteresDto);
        logger.debug("Nombre total d'actions  transfrer : " + results.size());

        // on transfere les actions vers la ressource cible
        for (ActionRechercheDto actionRechercheDto : results) {
            final Action actionAModifier = actionDao.rechercherActionParId(actionRechercheDto.getId());
            actionAModifier.getActionAttribution().setAgence(agence);
            actionAModifier.getActionAttribution().setRessource(ressource);
        }
    }

    @Override
    public void notifier(Long idAction) {
        final Action action = actionDao.rechercherActionParId(idAction);
        action.setNotifier(true);
    }

    /**
     * Modifie validationExpressionUtil.
     * @param validationExpressionUtil la nouvelle valeur de validationExpressionUtil
     */
    public void setValidationExpressionUtil(ValidationExpressionUtil validationExpressionUtil) {
        this.validationExpressionUtil = validationExpressionUtil;
    }

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

    /**
     * Modifie actionNatureDao.
     * @param actionNatureDao la nouvelle valeur de actionNatureDao
     */
    public void setActionNatureDao(ActionNatureDao actionNatureDao) {
        this.actionNatureDao = actionNatureDao;
    }

    /**
     * Modifie actionTypeDao.
     * @param actionTypeDao la nouvelle valeur de actionTypeDao
     */
    public void setActionTypeDao(ActionTypeDao actionTypeDao) {
        this.actionTypeDao = actionTypeDao;
    }

    /**
     * Modifie actionObjetDao.
     * @param actionObjetDao la nouvelle valeur de actionObjetDao
     */
    public void setActionObjetDao(ActionObjetDao actionObjetDao) {
        this.actionObjetDao = actionObjetDao;
    }

    /**
     * Modifie actionSousObjetDao.
     * @param actionSousObjetDao la nouvelle valeur de actionSousObjetDao
     */
    public void setActionSousObjetDao(ActionSousObjetDao actionSousObjetDao) {
        this.actionSousObjetDao = actionSousObjetDao;
    }

    /**
     * Modifie actionPrioriteDao.
     * @param actionPrioriteDao la nouvelle valeur de actionPrioriteDao
     */
    public void setActionPrioriteDao(ActionPrioriteDao actionPrioriteDao) {
        this.actionPrioriteDao = actionPrioriteDao;
    }

    /**
     * Modifie campagneDao.
     * @param campagneDao la nouvelle valeur de campagneDao
     */
    public void setCampagneDao(CampagneDao campagneDao) {
        this.campagneDao = campagneDao;
    }

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

    /**
     * Modifie actionAffectationDao.
     * @param actionAffectationDao la nouvelle valeur de actionAffectationDao
     */
    public void setActionAffectationDao(ActionAffectationDao actionAffectationDao) {
        this.actionAffectationDao = actionAffectationDao;
    }

    /**
     * Modifie la valeur de ressourceDao.
     * @param ressourceDao the ressourceDao to set
     */
    public void setRessourceDao(RessourceDao ressourceDao) {
        this.ressourceDao = ressourceDao;
    }

    /**
     * Modifie la valeur de agenceDao.
     * @param agenceDao the agenceDao to set
     */
    public void setAgenceDao(AgenceDao agenceDao) {
        this.agenceDao = agenceDao;
    }

    /**
     * Modifie actionStatutDao.
     * @param actionStatutDao la nouvelle valeur de actionStatutDao
     */
    public void setActionStatutDao(ActionStatutDao actionStatutDao) {
        this.actionStatutDao = actionStatutDao;
    }

    /**
     * Modifie actionResultatDao.
     * @param actionResultatDao la nouvelle valeur de actionResultatDao
     */
    public void setActionResultatDao(ActionResultatDao actionResultatDao) {
        this.actionResultatDao = actionResultatDao;
    }

    /**
     * Modifie la valeur de ressourceHabilitationUtil.
     * @param ressourceHabilitationUtil the ressourceHabilitationUtil to set
     */
    public void setRessourceHabilitationUtil(RessourceHabilitationUtil ressourceHabilitationUtil) {
        this.ressourceHabilitationUtil = ressourceHabilitationUtil;
    }

    /**
     * Modifie la valeur de messageSourceUtil.
     * @param messageSourceUtil the messageSourceUtil to set
     */
    public void setMessageSourceUtil(MessageSourceUtil messageSourceUtil) {
        this.messageSourceUtil = messageSourceUtil;
    }

    /**
     * Modifie la valeur de mapperDozerBean.
     * @param mapperDozerBean the mapperDozerBean to set
     */
    public void setMapperDozerBean(MapperDozerBean mapperDozerBean) {
        this.mapperDozerBean = mapperDozerBean;
    }

    /**
     * Modifie la valeur de actionDao.
     * @param actionDao the actionDao to set
     */
    public void setActionDao(ActionDao actionDao) {
        this.actionDao = actionDao;
    }

    /**
     * Modifie opportuniteDao.
     * @param opportuniteDao la nouvelle valeur de opportuniteDao
     */
    public void setOpportuniteDao(OpportuniteDao opportuniteDao) {
        this.opportuniteDao = opportuniteDao;
    }

    /**
     * Modifie opportuniteService.
     * @param opportuniteService la nouvelle valeur de opportuniteService
     */
    public void setOpportuniteService(OpportuniteService opportuniteService) {
        this.opportuniteService = opportuniteService;
    }

    /**
     * Dfinition de actionNatureResultatDao.
     * @param actionNatureResultatDao the actionNatureResultatDao to set
     */
    public void setActionNatureResultatDao(ActionNatureResultatDao actionNatureResultatDao) {
        this.actionNatureResultatDao = actionNatureResultatDao;
    }

    /**
     * Set the paginationExportRecherche value.
     * @param paginationExportRecherche the paginationExportRecherche to set
     */
    public void setPaginationExportRecherche(int paginationExportRecherche) {
        this.paginationExportRecherche = paginationExportRecherche;
    }

    /**
     * Dfinit la valeur de emailSquarePlugin.
     * @param emailSquarePlugin la nouvelle valeur de emailSquarePlugin
     */
    public void setEmailSquarePlugin(EmailSquarePlugin emailSquarePlugin) {
        this.emailSquarePlugin = emailSquarePlugin;
    }

    /**
     * Dfinit la valeur de expediteurNoReply.
     * @param expediteurNoReply la nouvelle valeur de expediteurNoReply
     */
    public void setExpediteurNoReply(String expediteurNoReply) {
        this.expediteurNoReply = expediteurNoReply;
    }

    @Override
    public int countActionsParCriteres(ActionCritereRechercheDto criteres) {
        return actionDao.nombreTotalAction(new RemotePagingCriteriasDto<ActionCritereRechercheDto>(criteres, 0, 1));
    }

    /**
     * Dfinit la valeur de actionDureeDao.
     * @param actionDureeDao la nouvelle valeur de actionDureeDao
     */
    public void setActionDureeDao(ActionDureeDao actionDureeDao) {
        this.actionDureeDao = actionDureeDao;
    }
}