Beispiel #1
0
        //--------------------------------------------------------------------------
        private CResultAErreur StartOrRestartProjet(CEtapeWorkflow etape)
        {
            CResultAErreur result = CResultAErreur.True;
            CResultAErreurType <CProjet> resProjet = CGestionnaireProjetsDeWorkflow.AssureProjetRunnable(etape, this);

            if (!resProjet)
            {
                result.EmpileErreur(resProjet.Erreur);
                return(result);
            }
            CProjet projet = resProjet.DataType;

            if (projet == null)
            {
                return(result);
            }

            if (etape.DateDebut == null)
            {
                etape.DateDebut = DateTime.Now;
            }

            if (projet.ProjetsFils.Count == 0)
            {
                if (projet.DateDebutReel == null || GererIteration)
                {
                    projet.DateDebutReel = etape.DateDebut.Value;
                    projet.DateFinRelle  = null;
                }
                else if (!projet.HasOptionLienEtape(EOptionLienProjetEtape.StepKeepDates))
                {
                    projet.DateDebutReel = etape.DateDebut.Value;
                    projet.DateFinRelle  = null;
                }
            }
            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());
                }
            }
            System.Console.WriteLine("Démarrage projet " + projet.Libelle);
            return(result);
        }
Beispiel #2
0
        //---------------------------------------------------
        public override CResultAErreur  EndEtapeNoSave(CEtapeWorkflow etape)
        {
            CResultAErreur result = CResultAErreur.True;

            CResultAErreurType <CProjet> resProjet = GetOrCreateProjetInCurrentContexte(etape,
                                                                                        CGestionnaireProjetsDeWorkflow.FindProjetParent(etape),
                                                                                        CGestionnaireProjetsDeWorkflow.FindPredecesseurs(etape));

            if (!resProjet)
            {
                result.EmpileErreur(resProjet.Erreur);
                return(result);
            }
            CProjet projet = resProjet.DataType;

            if (projet == null)
            {
                return(result);
            }
            System.Console.WriteLine("Fin projet " + projet.Libelle);
            DateTime dt = etape.DateFin == null ?DateTime.Now:etape.DateFin.Value;

            if (projet.ProjetsFils.Count == 0)
            {
                if (!projet.HasOptionLienEtape(EOptionLienProjetEtape.StepKeepDates) ||
                    projet.DateFinRelle == null)
                {
                    projet.DateFinRelle = dt;
                }
            }

            if (projet.HasOptionLienEtape(EOptionLienProjetEtape.ResetFlagOnEndStep))
            {
                projet.OptionLienEtapeCode = (int)EOptionLienProjetEtape.Standard;
            }

            return(base.EndEtapeNoSave(etape));
        }
        //--------------------------------------------------------------------------
        /// <summary>
        /// Retourne un projet pouvant être executé pour l'étape demandée<BR>
        /// </BR>
        /// Cette fonction se charge de la mise à jour de toutes la structure du projet
        /// </summary>
        /// <param name="etape"></param>
        /// <returns></returns>
        public static CResultAErreurType <CProjet> AssureProjetRunnable(CEtapeWorkflow etape, CBlocWorkflowProjet blocProjet)
        {
            CResultAErreurType <CProjet> resProjet = new CResultAErreurType <CProjet>();
            CProjet projet = GetProjetDirectementAssocie(etape);

            int nNumLastIteration = 0;

            if (projet != null)
            {
                nNumLastIteration = projet.NumeroIteration;
                if (projet.GanttId == "")
                {
                    projet.GanttId = blocProjet.GetGanttId(etape);
                }
            }

            CProjet projetParent = FindProjetParent(etape);

            if (projetParent != null && projet != null &&
                projetParent != projet.Projet)
            {
                projet = null;
            }

            if (projet == null)
            {
                resProjet = blocProjet.GetOrCreateProjetInCurrentContexte(etape,
                                                                          FindProjetParent(etape),
                                                                          FindPredecesseurs(etape));
                return(resProjet);
            }

            if (
                projet.DateFinRelle == null ||
                !blocProjet.GererIteration ||
                projet.HasOptionLienEtape(EOptionLienProjetEtape.NoIteration))
            {
                if ((!blocProjet.GererIteration || projet.HasOptionLienEtape(EOptionLienProjetEtape.NoIteration)) &&
                    !projet.HasOptionLienEtape(EOptionLienProjetEtape.StepKeepDates))
                {
                    projet.DateFinRelle = null;
                }
                resProjet.DataType = projet;
                return(resProjet);
            }

            //Il faut créer une ittération pour ce projet
            IEnumerable <CProjet> predecesseurs = FindPredecesseurs(etape);

            CProjet newProjet = projet.Clone(false) as CProjet;

            //Remet les dates à null
            newProjet.DateDebutReel = null;
            newProjet.DateFinRelle  = null;

            //Met les deux projets sur la même barre de gantt
            if (projet.GanttId.Length == 0)
            {
                projet.GanttId = blocProjet.GetGanttId(etape);
            }
            newProjet.GanttId = projet.GanttId;

            DateTime?dateDebut = null;

            foreach (CProjet pred in predecesseurs)
            {
                if (dateDebut == null || pred.DateFinGantt > dateDebut.Value)
                {
                    dateDebut = pred.DateFinGantt;
                }
            }
            if (dateDebut == null)
            {
                dateDebut = DateTime.Now;
            }
            if (dateDebut != null)
            {
                newProjet.DateDebutPlanifiee = dateDebut.Value;
                newProjet.DateFinPlanifiee   = dateDebut.Value.AddHours(projet.DureeEnHeure.Value);
            }
            newProjet.DateDebutAuto   = true;
            newProjet.NumeroIteration = nNumLastIteration + 1;

            //Supprime toutes les dépendances du nouveau projet
            CObjetDonneeAIdNumerique.Delete(newProjet.LiensDeProjetAttaches, true);

            //Change le workflow lancé
            etape.WorkflowLancé.SetValeurChamp(blocProjet.IdChampProjet.Value, newProjet);

            //Crée les liens vers les prédécesseurs
            foreach (CProjet pred in predecesseurs)
            {
                newProjet.AddPredecessor(pred);
            }

            //Met à jour les successeurs
            foreach (CTypeEtapeWorkflow typeSucc in FindTypesSuccesseurs(etape.TypeEtape))
            {
                CEtapeWorkflow succ = etape.Workflow.GetEtapeForType(typeSucc);
                if (succ != null)
                {
                    resProjet = AssureProjetRunnable(succ, succ.TypeEtape.Bloc as CBlocWorkflowProjet);
                    CProjet prjSucc = resProjet.DataType;
                    if (prjSucc != null)
                    {
                        //Si le projet est lié à l'ancien, on déplace le lien
                        CLienDeProjet lien = prjSucc.GetLienToPredecesseur(projet);
                        if (lien != null)
                        {
                            lien.ProjetA = newProjet;
                        }
                    }
                }
            }
            newProjet.AutoMoveDependancies();

            CContexteEvaluationExpression ctxEval = new CContexteEvaluationExpression(etape);

            foreach (CAffectationsProprietes affectation in blocProjet.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(newProjet, etape, new CFournisseurPropDynStd());
                }
            }

            resProjet.DataType = newProjet;
            return(resProjet);
        }