//------------------------------------------------------------------------------------------------------------------------------ private static void AffecteValeurCalcSansSourcesToElement(IElementACout element, bool bCoutReel) { if (element == null) { return; } double fCout = element.CalculeTonCoutPuisqueTuNeCalculePasAPartirDesSourcesDeCout(bCoutReel); element.SetCoutSansCalculDesParents(fCout, bCoutReel); CValeursImputées valeurs = GetValeursImputéesDeSources(element); valeurs.Reset(bCoutReel); valeurs.SetImputation(element, fCout, bCoutReel); SetValeurImputéeSurUtilisateur(element, element, fCout, bCoutReel); }
//------------------------------------------------------------------------------------------------------------------------------ private static void UpdateValeurAAjouterAuxSourceDeElement(IElementACout element, bool bCoutReel) { if (!element.ShouldAjouterCoutPropreAuCoutDesSource(bCoutReel)) { return; } double fOld = GetValeurImputéeDeSource(element, element, bCoutReel); double fNew = element.CalculeTonCoutPuisqueTuNeCalculePasAPartirDesSourcesDeCout(bCoutReel); if (fOld != fNew) { double fCout = bCoutReel ? element.CoutReel : element.CoutPrevisionnel; fCout -= fOld; fCout += fNew; SetValeurImputéeDeSource(element, element, fNew, bCoutReel); element.SetCoutSansCalculDesParents(fCout, bCoutReel); } }
//------------------------------------------------------------------------------------------------------------------------------ private static void RecalcCoutMontant(IElementACout source, bool bCoutReel, HashSet <DataRow> setDejaRecalcules) { if (source == null) { return; } if (setDejaRecalcules.Contains(source.Row.Row)) { return; } setDejaRecalcules.Add(source.Row.Row); if (source.Row.RowState == DataRowState.Deleted || source.Row.RowState == DataRowState.Detached) { source.VersionToReturn = DataRowVersion.Original; } CImputationsCouts imputations = source.GetImputationsAFaireSurUtilisateursDeCout(); HashSet <IElementACout> elementsModifies = new HashSet <IElementACout>(); CValeursImputées newValeurs = GetValeursImputéesSurUtilisateurs(source); newValeurs.Reset(bCoutReel); CValeursImputées oldValeurs = GetValeursImputéesSurUtilisateurs(source); HashSet <string> newElementsImputes = new HashSet <string>(); if (source.Row.RowState != DataRowState.Deleted && source.Row.RowState != DataRowState.Deleted) { if (!source.IsCoutFromSources(bCoutReel)) { double fCout = source.CalculeTonCoutPuisqueTuNeCalculePasAPartirDesSourcesDeCout(bCoutReel); source.SetCoutSansCalculDesParents(fCout, bCoutReel); SetValeurImputéeDeSource(source, source, bCoutReel ? source.CoutReel : source.CoutPrevisionnel, bCoutReel); newValeurs.SetImputation(source, bCoutReel ? source.CoutReel : source.CoutPrevisionnel, bCoutReel); newElementsImputes.Add(source.IdUniversel); } } foreach (CImputationCout imputation in imputations.Imputations) { newElementsImputes.Add(imputation.UtilisateurDeCout.IdUniversel); IElementACout utilisateur = imputation.UtilisateurDeCout; if (utilisateur.Row.RowState == DataRowState.Deleted || utilisateur.Row.RowState == DataRowState.Deleted) { newValeurs.SetImputation(utilisateur, 0, bCoutReel); } else { double fOld = oldValeurs.GetImputation(utilisateur, bCoutReel); double fNew = 0; if (source.Row.RowState != DataRowState.Deleted && source.Row.RowState != DataRowState.Detached) { fNew = source.CalcImputationAFaireSur(utilisateur, bCoutReel); } if (Math.Abs(fOld - fNew) > 0.01) { elementsModifies.Add(utilisateur); setDejaRecalcules.Remove(utilisateur.Row.Row); double fVal = bCoutReel ? utilisateur.CoutReel : utilisateur.CoutPrevisionnel; fVal -= fOld; fVal += fNew; utilisateur.SetCoutSansCalculDesParents(fVal, bCoutReel); SetValeurImputéeDeSource(utilisateur, source, fNew, bCoutReel); } newValeurs.SetImputation(utilisateur, fNew, bCoutReel); } CUtilElementACout.SetValeursImputéesSurUtilisateurs(source, newValeurs); } //Enlève les valeurs qui ont été imputées sur des éléments qui ne sont plus imputés foreach (IElementACout utilisateur in oldValeurs.GetObjetsImputés(source.ContexteDonnee)) { if (!newElementsImputes.Contains(utilisateur.IdUniversel)) { //On avait imputé ce type, mais il ne faut plus //Vérifie que le coût de cet utilisateur intègre bien mon cout CValeursImputées valeurs = GetValeursImputéesDeSources(utilisateur); if (valeurs.ContainsElement(source, bCoutReel)) { double fImput = oldValeurs.GetImputation(utilisateur, bCoutReel); if (fImput > 0.001) { elementsModifies.Add(utilisateur); setDejaRecalcules.Remove(utilisateur.Row.Row); double fVal = bCoutReel ? utilisateur.CoutReel : utilisateur.CoutPrevisionnel; fVal -= fImput; utilisateur.SetCoutSansCalculDesParents(fVal, bCoutReel); SetValeurImputéeDeSource(utilisateur, source, 0, bCoutReel); } } } } if (source.Row.RowState != DataRowState.Deleted && source.Row.RowState != DataRowState.Detached) { source.TypesCoutsParentsARecalculer &= bCoutReel ? ~ETypeCout.réel : ~ETypeCout.Prévisionnel; } foreach (IElementACout eltModif in elementsModifies) { RecalcCoutMontant(eltModif, bCoutReel, setDejaRecalcules); } }