/// //////////////////////////////////////////////////
        public CResultAErreur RepriseProcess(int nIdProcessEnExecution,
                                             int nIdAction,
                                             IIndicateurProgression indicateur)
        {
            using (C2iSponsor sponsor = new C2iSponsor())
            {
                sponsor.Register(indicateur);
                CResultAErreur result = CResultAErreur.True;

                ///Stef, 290808 : ouvre une session spécifique pour le process
                ///Pour pouvoir gérer le changement d'utilisateur proprement
                CSousSessionClient session = CSousSessionClient.GetNewSousSession(IdSession);
                session.OpenSession(new CAuthentificationSessionSousSession(IdSession), "Continue process " + nIdProcessEnExecution, ETypeApplicationCliente.Process);
                CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(IdSession);
                //TESTDBKEYTODO
                if (sessionOriginale.GetInfoUtilisateur() != null)
                {
                    session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur);
                }
                try
                {
                    //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                    using (CContexteDonnee contexteDonnee = new CContexteDonnee(session.IdSession, true, false))
                    {
                        CProcessEnExecutionInDb processEnExecution = new CProcessEnExecutionInDb(contexteDonnee);
                        if (!processEnExecution.ReadIfExists(nIdProcessEnExecution))
                        {
                            result.EmpileErreur(I.T("Current action @1 doesn't exist|30012", nIdProcessEnExecution.ToString()));
                            return(result);
                        }
                        result = contexteDonnee.SetVersionDeTravail(processEnExecution.IdVersionExecution, true);
                        if (!result)
                        {
                            return(result);
                        }
                        CBrancheProcess          branche           = processEnExecution.BrancheEnCours;
                        CContexteExecutionAction contexteExecution = new CContexteExecutionAction(
                            processEnExecution, branche, branche.Process.GetValeurChamp(CProcess.c_strIdVariableElement), contexteDonnee, indicateur);
                        CAction action = branche.Process.GetActionFromId(nIdAction);
                        if (action == null)
                        {
                            result.EmpileErreur(I.T("Impossible to resume the processing : the action @1 doesn't exist|30013", nIdAction.ToString()));
                            return(result);
                        }
                        bool bTrans = false;
                        if (branche.Process.ModeTransactionnel)
                        {
                            session.BeginTrans();
                            bTrans = true;
                        }
                        try
                        {
                            result = branche.ExecuteAction(action, contexteExecution, true);
                        }
                        catch (Exception e)
                        {
                            result.EmpileErreur(new CErreurException(e));
                        }
                        finally
                        {
                            if (bTrans)
                            {
                                if (result)
                                {
                                    result = session.CommitTrans();
                                    if (result)
                                    {
                                        contexteExecution.OnEndProcess();
                                    }
                                }
                                else
                                {
                                    session.RollbackTrans();
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    result.EmpileErreur(new CErreurException(e));
                }
                finally
                {
                    try
                    {
                        session.CloseSession();
                    }
                    catch { }
                }
                return(result);
            }
        }
        //Le data du result contient la valeur de retour du process
        protected CResultAErreur ExecuteProcess(
            CSessionClient session,
            object objetCible,
            CProcess leProcessAExecuter,
            CContexteDonnee contexte,
            bool bSauvegardeDuContexteExecutionExterne,
            IIndicateurProgression indicateur)
        {
            using (C2iSponsor sponsor = new C2iSponsor())
            {
                sponsor.Register(indicateur);
                /// Stef, le 2/4/08 : pb rencontré : leProcessAExecuter peut être
                /// lié à un autre CContexteDonnee que celui dans lequel on execute l'action
                /// en effet, il est alloué dans un CContexteDonnee, mais un autre CContexteDonnee
                /// peut être recréé pour que l'execution.
                /// OR, dans ce cas, les variables calculées évaluées par le CProcess se trouvent dans
                /// le contexte du process, donc, pas dans le contexte d'execution et les modifs
                /// sur ces variables ne sont donc pas sauvegardées !
                /// d'où la ligne suivante : leProcessAExecuter.ContexteDonnee = contexte
                leProcessAExecuter.ContexteDonnee = contexte;
                //Fin Stef 2/4/08
                CResultAErreur          result        = CResultAErreur.True;
                CProcessEnExecutionInDb processEnExec = new CProcessEnExecutionInDb(contexte);
                processEnExec.CreateNewInCurrentContexte();
                if (objetCible is CObjetDonneeAIdNumerique)
                {
                    processEnExec.ElementLie = (CObjetDonneeAIdNumerique)objetCible;
                }
                else
                {
                    processEnExec.ElementLie = null;
                }
                processEnExec.Libelle = leProcessAExecuter.Libelle;
                processEnExec.DbKeyEvennementDeclencheur = leProcessAExecuter.InfoDeclencheur.DbKeyEvenementDeclencheur;
                processEnExec.IdVersionExecution         = contexte.IdVersionDeTravail;

                CBrancheProcess branche = new CBrancheProcess(leProcessAExecuter);
                branche.IsModeAsynchrone = leProcessAExecuter.ModeAsynchrone;
                CSessionClient sessionSource = CSessionClient.GetSessionForIdSession(IdSession);

                //TESTDBKEYTODO
                branche.KeyUtilisateur          = sessionSource.GetInfoUtilisateur().KeyUtilisateur;
                branche.ConfigurationImpression = sessionSource.ConfigurationsImpression;

                CContexteExecutionAction contexteExecution = new CContexteExecutionAction(
                    processEnExec,
                    branche,
                    objetCible,
                    contexte,
                    leProcessAExecuter.ModeAsynchrone ? null : indicateur);
                contexteExecution.SauvegardeContexteExterne = bSauvegardeDuContexteExecutionExterne;
                //Mode synchrone
                if (!leProcessAExecuter.ModeAsynchrone)
                {
                    bool bTrans = false;
                    if (!bSauvegardeDuContexteExecutionExterne && leProcessAExecuter.ModeTransactionnel)
                    {
                        contexte.SaveAll(true);//Sauve le contexte en execution avant démarrage
                        session.BeginTrans();
                        bTrans = true;
                    }
                    try
                    {
                        result = branche.ExecuteAction(leProcessAExecuter.GetActionDebut(), contexteExecution, true);
                    }
                    catch (Exception e)
                    {
                        result.EmpileErreur(new CErreurException(e));
                    }
                    finally
                    {
                        if (bTrans)
                        {
                            if (result)
                            {
                                result = session.CommitTrans();
                                if (result)
                                {
                                    contexteExecution.OnEndProcess();
                                }
                            }
                            else
                            {
                                session.RollbackTrans();
                            }
                        }
                    }


                    if (!result)
                    {
                        result.EmpileErreur(I.T("Erreur in @1 process|20001", leProcessAExecuter.Libelle));
                    }
                    if (leProcessAExecuter.VariableDeRetour != null)
                    {
                        result.Data = leProcessAExecuter.GetValeurChamp(leProcessAExecuter.VariableDeRetour.IdVariable);
                    }
                    return(result);
                }
                else
                {
                    //Ouvre une nouvelle session pour éxecuter le process
                    if (leProcessAExecuter.ModeAsynchrone)
                    {
                        CSessionProcessServeurSuivi sessionAsync = new CSessionProcessServeurSuivi();
                        result = sessionAsync.OpenSession(new CAuthentificationSessionProcess(),
                                                          "Process " + leProcessAExecuter.Libelle,
                                                          session);
                        if (!result)
                        {
                            return(result);
                        }
                        session = sessionAsync;
                    }
                    contexteExecution.ChangeIdSession(session.IdSession);
                    contexteExecution.HasSessionPropre = true;
                    m_brancheToExecute         = branche;
                    m_actionToExecute          = leProcessAExecuter.GetActionDebut();
                    m_contexteExecutionProcess = contexteExecution;
                    Thread th = new Thread(new ThreadStart(DemarreProcess));
                    th.Start();
                    return(result);
                }
            }
        }