コード例 #1
0
ファイル: CProjetServeur.cs プロジェクト: ykebaili/Timos
        //-------------------------------------------------------------------
        public override CResultAErreur TraitementAvantSauvegarde(CContexteDonnee contexte)
        {
            CResultAErreur result = CResultAErreur.True;

            try
            {
                result = base.TraitementAvantSauvegarde(contexte);
            }
            catch (Exception e)
            {
                result.EmpileErreur(new CErreurException(e));
                return(result);
            }
            if (!result)
            {
                return(result);
            }
            DataTable table = contexte.Tables[GetNomTable()];

            if (table == null)
            {
                return(result);
            }
            HashSet <CProjet>     projetsARecalculer     = new HashSet <CProjet>();
            HashSet <CMetaProjet> metaProjetsARecalculer = new HashSet <CMetaProjet>();
            bool       bIsCalculatingAsynchrones         = CGestionnaireProjetsAsynchrones.IsModeCalculProjet(contexte);
            List <int> lstProjetsAsynchrones             = new List <int>();
            List <int> lstMetasProjetsAsynchrones        = new List <int>();

            foreach (DataRow row in new ArrayList(table.Rows))
            {
                if (!bIsCalculatingAsynchrones)
                {
                    GereProjetAsynchrone(row);
                }
                if (row.RowState == DataRowState.Modified || row.RowState == DataRowState.Added)
                {
                    CProjet projet = new CProjet(row);

                    if (projet.ModeCalculDatesParentes == (int)EModeCalculDatesProjet.Suspended)
                    {
                        projet.ModeCalculDatesParentes = (int)EModeCalculDatesProjet.Automatic;
                    }
                    if (projet.IsNew())
                    {
                        result = CreateVersionRecursif(projet);
                        if (!result)
                        {
                            return(result);
                        }
                        projetsARecalculer.Add(projet);
                    }
                    // Si les dates réelles (Début ou fin ) sont renseignées, alors on mes le flag Dates Auto à False
                    if ((projet.DateDebutReel != null || projet.DateFinRelle != null) && !projet.HasChilds())
                    {
                        projet.DateDebutAuto = false;
                    }

                    // Si les dates planifiées on changées, force le Parent de plus haut niveau à recalculer ses dates
                    if (!row.HasVersion(DataRowVersion.Original) ||
                        (row[CProjet.c_champDateDebutPlanifiee] != row[CProjet.c_champDateDebutPlanifiee, DataRowVersion.Original] ||
                         row[CProjet.c_champDateFinPlanifiee] != row[CProjet.c_champDateFinPlanifiee, DataRowVersion.Original] ||
                         row[CProjet.c_champDateDebutReel] != row[CProjet.c_champDateDebutReel, DataRowVersion.Original] ||
                         row[CProjet.c_champDateFinReel] != row[CProjet.c_champDateFinReel, DataRowVersion.Original] ||
                         row[CProjet.c_champPctAvancement] != row[CProjet.c_champPctAvancement, DataRowVersion.Original] ||
                         row[CProjet.c_champPoids] != row[CProjet.c_champPoids, DataRowVersion.Original])
                        )
                    {
                        foreach (CRelationMetaProjet_Projet rel in projet.RelationsMetaProjets)
                        {
                            if (rel.IsValide() && rel.MetaProjet.IsValide())
                            {
                                if (rel.MetaProjet.ModeUpdateAsynchrone && rel.MetaProjet.Row.RowState != DataRowState.Added || bIsCalculatingAsynchrones)
                                {
                                    lstMetasProjetsAsynchrones.Add(rel.MetaProjet.Id);
                                }
                                else
                                {
                                    metaProjetsARecalculer.Add(rel.MetaProjet);
                                }
                            }
                        }
                        if (projet.IsNew() && !projet.HasChilds())
                        {
                            projet.CalcWeight(false);
                            projet.CalcProgress(false);
                        }
                        projet = projet.Projet;
                        while (projet != null && projet.IsValide())
                        {
                            if (!projet.ModeUpdateAsynchrone || projet.Row.RowState == DataRowState.Added || bIsCalculatingAsynchrones)
                            {
                                projetsARecalculer.Add(projet);
                                projet = projet.Projet;
                            }
                            else
                            {
                                lstProjetsAsynchrones.Add(projet.Id);
                                break;
                            }
                        }
                    }
                }

                if (row.RowState == DataRowState.Deleted)
                {
                    CProjet projet = new CProjet(row);
                    projet.VersionToReturn = DataRowVersion.Original;
                    if (projet.Projet != null && projet.Projet.IsValide())
                    {
                        projetsARecalculer.Add(projet.Projet);
                    }
                }
            }
            //Tri les projets par profondeur (du plus profond au moins profond)


            List <CProjet> lstProjetsTries = new List <CProjet>();

            foreach (CProjet projet in projetsARecalculer)
            {
                if (projet.Row.RowState != DataRowState.Deleted)
                {
                    lstProjetsTries.Add(projet);
                }
            }
            try
            {
                lstProjetsTries.Sort(delegate(CProjet x, CProjet y)
                {
                    return(-x.CodeSystemeComplet.Length.CompareTo(y.CodeSystemeComplet.Length));
                });
            }
            catch (Exception ex)
            {
                result.EmpileErreur(new CErreurException(ex));
                return(result);
            }



            // Recalcul les dates PLANIFIEES des projets marqués A recalculés, et leur Avancement
            foreach (CProjet projet in lstProjetsTries)
            {
                if (projet.HasChilds())
                {
                    projet.UpdateDateDebutPlanifieeCalculeeFromChilds();
                    projet.UpdateDateFinPlanifieeCalculeeFromChilds();
                    projet.UpdateDateDebutReelleFromFils();
                    projet.UpdateDateFinReelleFromFils();
                }
                projet.UpdateWeight();
                projet.UpdateProgress();
            }
            foreach (CMetaProjet meta in metaProjetsARecalculer)
            {
                meta.UpdateDateDebutPlanifieeFromChilds(true);
                meta.UpdateDateFinPlanifieeFromChilds(true);
                meta.UpdateDateDebutReelleFromChilds(true);
                meta.UpdateDateFinReelleFromChilds(true);
                meta.CalcProgress(false);
            }
            if (!bIsCalculatingAsynchrones)
            {
                CGestionnaireProjetsAsynchrones.ASyncCalc(IdSession, lstProjetsAsynchrones, lstMetasProjetsAsynchrones);
            }
            return(result);
        }