/// //////////////////////////////////////////////////
        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);
            }
        }
        /// //////////////////////////////////////////////////
        public CResultAErreur StartProcessMultiples(CValise2iSerializable valiseProcess,
                                                    CReferenceObjetDonnee[] refsCible,
                                                    int?nIdVersion,
                                                    IIndicateurProgression indicateur)
        {
            using (C2iSponsor sponsor = new C2iSponsor())
            {
                sponsor.Register(indicateur);

                CResultAErreur result = CResultAErreur.True;
                //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                using (CContexteDonnee contexteDeSession = new CContexteDonnee(IdSession, true, false))
                {
                    result = valiseProcess.GetObjet(typeof(CContexteDonnee), contexteDeSession);
                    if (!result)
                    {
                        result.EmpileErreur(I.T("Error while process recovering|30014"));
                        return(result);
                    }
                    CProcess leProcessAExecuter = (CProcess)result.Data;

                    CObjetDonneeAIdNumerique objetCible = null;

                    ///Stef, 290808 : ouvre une session spécifique pour le process
                    ///Pour pouvoir gérer le changement d'utilisateur proprement
                    CSousSessionClient session = CSousSessionClient.GetNewSousSession(contexteDeSession.IdSession);
                    session.OpenSession(new CAuthentificationSessionSousSession(contexteDeSession.IdSession), leProcessAExecuter.Libelle, ETypeApplicationCliente.Process);
                    CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(contexteDeSession.IdSession);
                    //TESTDBKEYOK
                    if (sessionOriginale.GetInfoUtilisateur() != null)
                    {
                        session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur);
                    }

                    try
                    {
                        //Charge les éléments pour la nouvelle session;
                        //Stef 08/12/2007 : le contexte ne reçoit plus les notifications
                        using (CContexteDonnee contexte = new CContexteDonnee(session.IdSession, true, false))
                        {
                            result = contexte.SetVersionDeTravail(nIdVersion, true);
                            if (!result)
                            {
                                return(result);
                            }
                            if (leProcessAExecuter.SurTableauDeTypeCible)
                            {
                                ArrayList lst = new ArrayList();
                                foreach (CReferenceObjetDonnee refCibleTmp in refsCible)
                                {
                                    object tmp = refCibleTmp.GetObjet(contexte);
                                    if (tmp != null)
                                    {
                                        lst.Add(tmp);
                                    }
                                }
                                return(ExecuteProcess(session, lst, leProcessAExecuter, contexte, false, indicateur));
                            }
                            try
                            {
                                if (!leProcessAExecuter.ModeAsynchrone)
                                {
                                    session.BeginTrans(IsolationLevel.ReadCommitted);
                                }
                                foreach (CReferenceObjetDonnee refCible in refsCible)
                                {
                                    bool bShouldStart = true;
                                    if (refCible != null)
                                    {
                                        objetCible = (CObjetDonneeAIdNumerique)refCible.GetObjet(contexte);
                                        if (objetCible == null)
                                        {
                                            ///Stef 26/1//2009 : si l'objet n'existe pas, c'est qu'il n'y a rien à déclenché.
                                            ///cela résoud un problème : si un process avant celui-ci a supprimé le targetElement
                                            ///il ne faut pas lancer ce process là !

                                            /*result.EmpileErreur(I.T("Target object @1 does not exist|30015", refCible.ToString()));
                                             * return result;*/
                                            bShouldStart = false;
                                        }
                                    }
                                    if (bShouldStart)
                                    {
                                        result = ExecuteProcess(
                                            session,
                                            objetCible,
                                            leProcessAExecuter,
                                            contexte, true, indicateur);
                                        if (!result)
                                        {
                                            result.EmpileErreur(I.T("Execution error on element @1|30016", objetCible.DescriptionElement));
                                            return(result);
                                        }
                                    }
                                }
                                if (result)
                                {
                                    result = contexte.SaveAll(true);
                                }
                            }
                            catch (Exception e)
                            {
                                result.EmpileErreur(new CErreurException(e));
                            }
                            finally
                            {
                                if (result)
                                {
                                    result = session.CommitTrans();
                                }
                                if (!result)
                                {
                                    session.RollbackTrans();
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        result.EmpileErreur(new CErreurException(e));
                    }
                    finally
                    {
                        try
                        {
                            session.CloseSession();
                        }
                        catch
                        {
                        }
                    }
                    return(result);
                }
            }
        }