Exemple #1
0
        //------------------------------------------------------------------------------------------------------------------------------
        public static double CalcImputationAFaireSur(IElementACout source, IElementACout utilisateur, bool bCoutReel)
        {
            if (source == null || source.Row.RowState == DataRowState.Detached || source.Row.RowState == DataRowState.Deleted ||
                utilisateur == null || utilisateur.Row.RowState == DataRowState.Deleted || utilisateur.Row.RowState == DataRowState.Detached)
            {
                return(0);
            }
            CImputationsCouts imputations = source.GetImputationsAFaireSurUtilisateursDeCout();

            return(imputations.GetCoutImputéeA(utilisateur, bCoutReel));
        }
        //--------------------------------------------------------------------------
        public double GetCoutResume(bool bCoutReel)
        {
            Dictionary <IElementACout, bool> setElementToAPrendreEnCompte = new Dictionary <IElementACout, bool>();

            FillSetElementsACoutPourResumeCout(bCoutReel, setElementToAPrendreEnCompte);
            Dictionary <IElementACout, CImputationsCouts> cacheImputations = new Dictionary <IElementACout, CImputationsCouts>();
            //On a tous les besoins dans un hashet, maintenant, il faut sommer les couts
            double fCout = 0;

            foreach (KeyValuePair <IElementACout, bool> kv in setElementToAPrendreEnCompte)
            {
                if (kv.Value)
                {
                    IElementACout element = kv.Key;
                    if (element is CBesoin)
                    {
                        bool bSourceInSet = false;
                        foreach (IElementACout elt in element.GetSourcesDeCout(bCoutReel))
                        {
                            if (setElementToAPrendreEnCompte.ContainsKey(elt))
                            {
                                bSourceInSet = true;
                                break;
                            }
                        }
                        if (!bSourceInSet)
                        {
                            fCout += bCoutReel ? element.CoutReel : element.CoutPrevisionnel;
                        }
                        else
                        {
                            foreach (IElementACout source in element.GetSourcesDeCout(bCoutReel))
                            {
                                if (!setElementToAPrendreEnCompte.ContainsKey(source))
                                //Si la source est dans le set, elle sera ajoutée, donc on ne la prend pas
                                {
                                    CImputationsCouts imputations = null;
                                    if (!cacheImputations.TryGetValue(source, out imputations))
                                    {
                                        imputations = source.GetImputationsAFaireSurUtilisateursDeCout();
                                        cacheImputations[source] = imputations;
                                    }

                                    fCout += imputations.GetCoutImputéeA(element, bCoutReel);
                                }
                            }
                        }
                    }
                }
            }
            return(fCout);
        }
Exemple #3
0
        //------------------------------------------------------------------------------------------------------------------------------
        public static CResultAErreur RecalculeCoutsDescendants(IEnumerable <IElementACout> elements, bool bCoutReel, bool bRecursif, IIndicateurProgression indicateurDeProgression)
        {
            CConteneurIndicateurProgression indicateur = CConteneurIndicateurProgression.GetConteneur(indicateurDeProgression);

            indicateur.CanCancel = true;
            CResultAErreur result = CResultAErreur.True;
            Dictionary <IElementACout, IElementACout[]>   elementsToSources = new Dictionary <IElementACout, IElementACout[]>();
            Dictionary <IElementACout, CImputationsCouts> dicImputations    = new Dictionary <IElementACout, CImputationsCouts>();

            foreach (IElementACout elt in elements)
            {
                FillDicSources(bCoutReel, elt, bRecursif, elementsToSources);
            }

            HashSet <IElementACout> setRecalcules = new HashSet <IElementACout>();

            List <IElementACout> elementsACalculer = new List <IElementACout>();

            if (bRecursif)
            {
                foreach (IElementACout elt in elementsToSources.Keys)
                {
                    elementsACalculer.Add(elt);
                }
            }
            else
            {
                elementsACalculer.AddRange(elements);
            }


            indicateur.SetBornesSegment(0, elementsACalculer.Count());
            int nNbFaits = 0;

            try
            {
                while (elementsACalculer.Count > 0)
                {
                    if (indicateur.CancelRequest)
                    {
                        result.EmpileErreur(I.T("Operation cancelled|20184"));
                        return(result);
                    }
                    List <IElementACout> prochaineGeneration = new List <IElementACout>();
                    foreach (IElementACout elt in elementsACalculer)
                    {
                        //Vérifie qu'il est possible de calculer cet élément
                        IElementACout[] sources    = elementsToSources[elt];
                        bool            bCanCalcul = !elt.IsCoutFromSources(bCoutReel);
                        if (!bCanCalcul)
                        {
                            bCanCalcul = true;
                            foreach (IElementACout source in sources)
                            {
                                if (!setRecalcules.Contains(source) && elementsToSources.ContainsKey(source))
                                {
                                    bCanCalcul = false;
                                    break;
                                }
                            }
                        }
                        if (bCanCalcul)
                        {
                            nNbFaits++;
                            indicateur.SetValue(nNbFaits);
                            indicateur.SetInfo(elt.Libelle);
                            setRecalcules.Add(elt);
                            double fCout = 0;
                            if (elt.ShouldAjouterCoutPropreAuCoutDesSource(bCoutReel) && elt.IsCoutFromSources(bCoutReel))
                            {
                                AffecteValeurCalcSansSourcesToElement(elt, bCoutReel);
                                fCout = bCoutReel ? elt.CoutReel : elt.CoutPrevisionnel;
                            }

                            CValeursImputées valeursDeSources = GetValeursImputéesDeSources(elt);
                            valeursDeSources.Reset(bCoutReel);

                            if (elt.IsCoutFromSources(bCoutReel))
                            {
                                foreach (IElementACout source in sources)
                                {
                                    CImputationsCouts imputations = null;
                                    if (!dicImputations.TryGetValue(source, out imputations))
                                    {
                                        imputations            = source.GetImputationsAFaireSurUtilisateursDeCout();
                                        dicImputations[source] = imputations;
                                    }
                                    if (imputations != null)
                                    {
                                        double fImput = imputations.GetCoutImputéeA(elt, bCoutReel);
                                        fCout += fImput;
                                        SetValeurImputéeSurUtilisateur(source, elt, fImput, bCoutReel);
                                        valeursDeSources.SetImputation(source, fImput, bCoutReel);
                                    }
                                }
                                elt.SetCoutSansCalculDesParents(fCout, bCoutReel);
                                OnChangeCoutSansCalculCoutDescendant(elt, bCoutReel, false);
                                SetValeursImputéesDeSources(elt, valeursDeSources);
                            }
                            else
                            {
                                AffecteValeurCalcSansSourcesToElement(elt, bCoutReel);
                            }
                        }
                        else
                        {
                            prochaineGeneration.Add(elt);
                        }
                    }
                    if (prochaineGeneration.Count == elementsACalculer.Count)//On n'a rien fait, c'est la cata
                    {
                        result.EmpileErreur(I.T("Can not calculate cost. Cyclic redundancy error|20182"));
                        return(result);
                    }
                    elementsACalculer = prochaineGeneration;
                    if (!bRecursif)
                    {
                        break;
                    }
                }
            }
            finally
            {
            }
            return(result);
        }