//-------------------------------------------------------------------------- public static CResultAErreur LinkProjetToWorkflowStep(CProjet projet, CWorkflow workflow, string strTypeEtape, bool bSynchronizeStarts) { CResultAErreur result = CResultAErreur.True; CTypeEtapeWorkflow typeEtape = new CTypeEtapeWorkflow(projet.ContexteDonnee); if (!typeEtape.ReadIfExists(new CFiltreData(CObjetDonnee.c_champIdUniversel + "=@1", strTypeEtape))) { result.EmpileErreur(I.T("Workflow step type @1 doesn't exists|20196", strTypeEtape)); return(result); } if (typeEtape.Workflow.Id != workflow.TypeWorkflow.Id) { result.EmpileErreur(I.T("Workflow step type @1 doesn't belong to workflow type @2|20197"), strTypeEtape, workflow.TypeWorkflow.Libelle); return(result); } CBlocWorkflowProjet blocProjet = typeEtape.Bloc as CBlocWorkflowProjet; if (blocProjet == null) { result.EmpileErreur(I.T("Step type @1 is not a valid project step|20198", typeEtape.Libelle)); return(result); } CResultAErreurType <CEtapeWorkflow> resEtape = workflow.CreateOrGetEtapeInCurrentContexte(typeEtape); if (!resEtape) { result.EmpileErreur(resEtape.Erreur); return(result); } if (resEtape.DataType == null) { result.EmpileErreur(I.T("Erreur while creating step for type '@1'|20199", typeEtape.Libelle)); return(result); } CWorkflow sousWkf = blocProjet.GetOrCreateWorkflowInCurrentContexte(resEtape.DataType); if (sousWkf == null) { result.EmpileErreur(I.T("Erreur while creating workflow for stef @1|20200", resEtape.DataType.Libelle)); return(result); } sousWkf.SetValeurChamp(blocProjet.IdChampProjet.Value, projet); projet.GanttId = blocProjet.GetGanttId(resEtape.DataType); return(SynchroniseWorkflow( sousWkf, projet, projet.DateDebutReel != null && projet.DateFinRelle == null, bSynchronizeStarts)); }
//--------------------------------------------------- //S'assure que le projet est bien créé internal CResultAErreurType <CProjet> GetOrCreateProjetInCurrentContexte(CEtapeWorkflow etape, CProjet projetParent, IEnumerable <CProjet> predecesseurs) { CResultAErreurType <CProjet> resProjet = new CResultAErreurType <CProjet>(); CWorkflow workflow = GetOrCreateWorkflowInCurrentContexte(etape); if (workflow == null) { resProjet.EmpileErreur(I.T("Can not create workflow for step @1|20143", etape.Libelle)); return(resProjet); } if (m_nIdChampProjet == null) { resProjet.EmpileErreur(I.T("Workflow step @1 doesn't define a field to store associated project|20142", etape.Libelle)); return(resProjet); } CProjet projet = workflow.GetValeurChamp(m_nIdChampProjet.Value) as CProjet; //SC 8/5/2013 : s'assure que le projet a le bon parent ! if (projetParent != null && projet != null && projetParent != projet.Projet) { projet = null; } string strGanttId = GetGanttId(etape); if (projet == null) { //Création du projet projet = new CProjet(etape.ContexteDonnee); CTypeProjet typeProjet = null; if (m_dbKeyTypeProjet != null) //s'il est null, pas d'erreur ça peut être les formules d'initialisation qui le remplissent { typeProjet = new CTypeProjet(etape.ContexteDonnee); if (!typeProjet.ReadIfExists(m_dbKeyTypeProjet)) { resProjet.EmpileErreur(I.T("Project type @1 for step @2 doesn't exists|20144", m_dbKeyTypeProjet.StringValue, etape.Libelle)); return(resProjet); } } projet.CreateNewInCurrentContexte(); projet.TypeProjet = typeProjet; projet.GanttId = strGanttId; DateTime?dateDebut = null; foreach (CProjet pred in predecesseurs) { if (dateDebut == null || pred.DateFinGantt > dateDebut.Value) { dateDebut = pred.DateFinGantt; } } if (dateDebut == null) { dateDebut = DateTime.Now; } projet.DateDebutPlanifiee = dateDebut; if (typeProjet != null) { projet.DateFinPlanifiee = projet.DateDebutPlanifiee.Value.AddHours(typeProjet.DureeDefautHeures); } projet.Projet = projetParent; projet.Libelle = etape.Libelle; CContexteEvaluationExpression ctxEval = new CContexteEvaluationExpression(etape); foreach (CAffectationsProprietes affectation in AffectationsCreationEtDemarrage) { bool bAppliquer = affectation.FormuleCondition == null || affectation.FormuleCondition is C2iExpressionVrai; if (affectation.FormuleCondition != null) { CResultAErreur res = affectation.FormuleCondition.Eval(ctxEval); if (res && res.Data != null && CUtilBool.BoolFromString(res.Data.ToString()) == true) { bAppliquer = true; } } if (bAppliquer) { affectation.AffecteProprietes(projet, etape, new CFournisseurPropDynStd()); } } foreach (CProjet predecesseur in predecesseurs) { projet.AddPredecessor(predecesseur); } CResultAErreur result = workflow.SetValeurChamp(m_nIdChampProjet.Value, projet); if (!result) { resProjet.EmpileErreur(result.MessageErreur); return(resProjet); } } resProjet.DataType = projet; return(resProjet); }
//-------------------------------------------------------------------------- /// <summary> /// Resynchronise un workflow avec un projet /// </summary> /// <param name="wkf"></param> /// <param name="projetRacine"></param> public static CResultAErreur SynchroniseWorkflow( CWorkflow wkf, CProjet projetParent, bool bShouldStartWorkflow, bool bSynchroniserStarts) { CResultAErreur result = CResultAErreur.True; //Identifie toutes les étapes BlocWorkflowWorkflow List <CTypeEtapeWorkflow> lstTypeWkfWkf = new List <CTypeEtapeWorkflow>(); foreach (CTypeEtapeWorkflow typeEtape in wkf.TypeWorkflow.Etapes) { if (typeEtape.Bloc is CBlocWorkflowWorkflow) { lstTypeWkfWkf.Add(typeEtape); } } foreach (CTypeEtapeWorkflow typeEtape in lstTypeWkfWkf) { CResultAErreurType <CEtapeWorkflow> resEtape = wkf.CreateOrGetEtapeInCurrentContexte(typeEtape); if (!resEtape || resEtape.DataType == null) { result.EmpileErreur(I.T("Error while creating step '@1'", typeEtape.Libelle)); result.EmpileErreur(resEtape.Erreur); return(result); } CBlocWorkflowWorkflow blocWkfWkf = typeEtape.Bloc as CBlocWorkflowWorkflow; CEtapeWorkflow etape = resEtape.DataType; CWorkflow sousWorkflow = blocWkfWkf.GetOrCreateWorkflowInCurrentContexte(etape); //Trouve le projet associé à l'étape CBlocWorkflowProjet blocProjet = blocWkfWkf as CBlocWorkflowProjet; if (blocProjet != null) { CProjet projetEtape = FindProjetPourRattrapage( projetParent, etape, blocProjet); if (projetEtape != null) { if (blocProjet.IdChampProjet == null) { result.EmpileErreur(I.T("Workflow step @1 doesn't define a field to store associated project|20142", etape.Libelle)); return(result); } sousWorkflow.SetValeurChamp(blocProjet.IdChampProjet.Value, projetEtape); bool bShouldStartSousWorkflow = projetEtape.DateDebutReel != null && projetEtape.DateFinRelle == null; DateTime?oldDateDebut = projetEtape.DateDebutReel; result = SynchroniseWorkflow(sousWorkflow, projetEtape, bShouldStartSousWorkflow, bSynchroniserStarts); if (!result) { return(result); } if (bShouldStartSousWorkflow && oldDateDebut != null)//Remet les dates { etape.DateDebut = oldDateDebut; projetEtape.DateDebutReel = oldDateDebut; } } } else { result = SynchroniseWorkflow(sousWorkflow, projetParent, false, bSynchroniserStarts); } } if (bShouldStartWorkflow && !wkf.IsRunning && bSynchroniserStarts) { wkf.StartWorkflow(null); } return(result); }