//------------------------------------------------------------------------------------------------------------------------------ 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); }
//------------------------------------------------------------------------------------------------------------------------------ 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); }