From 75f8296755e15e2ab88734f3801c8362c2d8e7aa Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Thu, 2 Jun 2022 10:28:30 +0300 Subject: [PATCH] merge release/dyn-1223_sales-management-bonuses --- .../v1/Columns/ExtraBonusSumColumn.cs | 10 ++- .../v1/Managers/CalculateByTotalExpected.cs | 2 +- .../v1/Managers/CalculateDefault.cs | 2 +- .../v2/Columns/NPVBonusExpensesColumn.cs | 15 ++-- .../Calculation/CalculateByTotalExpected.cs | 2 +- .../Managers/Calculation/CalculateDefault.cs | 2 +- .../v3/Columns/DirectorBonusSumColumn.cs | 19 +++++ .../Calculation/CalculateByTotalExpected.cs | 9 ++- .../Managers/Calculation/CalculateDefault.cs | 9 ++- .../v3/PostValues.cs | 75 ++++++++++++++++++- EvoCalculator.Core.Constants/Calculation.cs | 1 + .../Models/Prepared/PreparedValues.cs | 10 +++ 12 files changed, 135 insertions(+), 21 deletions(-) create mode 100644 EvoCalculator.Core.Calculation/v3/Columns/DirectorBonusSumColumn.cs diff --git a/EvoCalculator.Core.Calculation/v1/Columns/ExtraBonusSumColumn.cs b/EvoCalculator.Core.Calculation/v1/Columns/ExtraBonusSumColumn.cs index 8f475b9..6714dac 100644 --- a/EvoCalculator.Core.Calculation/v1/Columns/ExtraBonusSumColumn.cs +++ b/EvoCalculator.Core.Calculation/v1/Columns/ExtraBonusSumColumn.cs @@ -1,4 +1,5 @@ -using EvoCalculator.Core.Base.Columns; +using System; +using EvoCalculator.Core.Base.Columns; using EvoCalculator.Core.Models.Calculation.Models.Prepared; namespace EvoCalculator.Core.Calculation.v1.Columns; @@ -10,14 +11,17 @@ public class ExtraBonusSumColumn : BaseColumnWithSum } public void ComputeValues(PreparedValues preparedValues, BaseCashflowMSFOColumn cashflowMsfoColumn, - PostValues postValues) + PostValues postValues, Constants.Calculation constants) { - Values[2] = cashflowMsfoColumn.Nominal >= preparedValues.IRR_MSFO_Plan + Values[2] = cashflowMsfoColumn.Nominal >= preparedValues.IRR_MSFO_Plan && preparedValues.BonusCoefficient == 1.0 ? -1 * postValues.BonusBase * (decimal) (cashflowMsfoColumn.Nominal / preparedValues.IRR_MSFO_Plan - 1) * (decimal) preparedValues.ExtraBonus * (decimal) (1 + preparedValues.SalaryRate) * (decimal) preparedValues.MarketRate * (decimal) preparedValues.DistrictRate : 0; + if (Math.Abs(Values[2]) < constants.MinBonus) + Values[2] = 0; + Values[0] = Sum; } } \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs b/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs index fe5834c..907beb2 100644 --- a/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs @@ -211,7 +211,7 @@ public static partial class CalculateManager sumRepaymentColumn.PostCheck(); var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); - extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn); cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn); diff --git a/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs index 5cba58c..82a4b57 100644 --- a/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs @@ -211,7 +211,7 @@ public static partial class CalculateManager sumRepaymentColumn.PostCheck(); var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); - extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn); cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn); diff --git a/EvoCalculator.Core.Calculation/v2/Columns/NPVBonusExpensesColumn.cs b/EvoCalculator.Core.Calculation/v2/Columns/NPVBonusExpensesColumn.cs index 90b868b..edd0372 100644 --- a/EvoCalculator.Core.Calculation/v2/Columns/NPVBonusExpensesColumn.cs +++ b/EvoCalculator.Core.Calculation/v2/Columns/NPVBonusExpensesColumn.cs @@ -11,15 +11,16 @@ public class NPVBonusExpensesColumn : BaseColumnWithSum } public void ComputeValues(PreparedValues preparedValues, PostValues postValues) - { + { Values[1] = -1 * (preparedValues.RatBonus + preparedValues.NsBonus + preparedValues.NsibBonus) * - (decimal) (1 + preparedValues.SalaryRate); + (decimal) (1 + preparedValues.SalaryRate) * (decimal) preparedValues.MarketRate * + (decimal) preparedValues.DistrictRate; - Values[2] = preparedValues.BonusFix > 0 - ? -preparedValues.BonusFix - : -1 * postValues.BonusBase * Convert.ToDecimal(preparedValues.Bonus) * - (decimal) (1 + preparedValues.SalaryRate) * - (decimal) preparedValues.MarketRate * (decimal) preparedValues.DistrictRate; + Values[2] = -(preparedValues.BonusFix > 0 + ? preparedValues.BonusFix * (decimal) (1 + preparedValues.SalaryRate) + : postValues.BonusBase * Convert.ToDecimal(preparedValues.Bonus) * + (decimal) (1 + preparedValues.SalaryRate) * (decimal) preparedValues.MarketRate * + (decimal) preparedValues.DistrictRate); for (var i = 3; i < Values.Length; i++) Values[i] = 0; diff --git a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs index b700b2b..f207bda 100644 --- a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs @@ -225,7 +225,7 @@ public static partial class CalculateManager sumRepaymentColumn.PostCheck(); var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); - extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn); cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn); diff --git a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs index e237946..cfe0d6e 100644 --- a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs @@ -224,7 +224,7 @@ public static partial class CalculateManager sumRepaymentColumn.PostCheck(); var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); - extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn); cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn); diff --git a/EvoCalculator.Core.Calculation/v3/Columns/DirectorBonusSumColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/DirectorBonusSumColumn.cs new file mode 100644 index 0000000..7cc5950 --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Columns/DirectorBonusSumColumn.cs @@ -0,0 +1,19 @@ +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.v3.Columns; + +public class DirectorBonusSumColumn : BaseColumnWithSum +{ + public DirectorBonusSumColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues, PostValues postValues) + { + Values[2] = -1 * (postValues.DirectorBonus + postValues.DirectorExtraBonus + preparedValues.DirectorBonusNsib + + preparedValues.RegionalDirectorBonusNsib + postValues.RegionalDirectorBonus + + postValues.RegionalDirectorExtraBonus) * (decimal) (1 + preparedValues.SalaryRate); + Values[0] = Sum; + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs index 0208c69..fb9f275 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs @@ -10,7 +10,7 @@ using CashflowColumn = EvoCalculator.Core.Calculation.v2.Columns.CashflowColumn; using CashflowLeasingColumn = EvoCalculator.Core.Calculation.v2.Columns.CashflowLeasingColumn; using CashflowMSFOColumnVT2 = EvoCalculator.Core.Calculation.v2.Columns.CashflowMSFOColumnVT2; using CashflowNPVColumn = EvoCalculator.Core.Calculation.v2.Columns.CashflowNPVColumn; -using DirectorBonusSumColumn = EvoCalculator.Core.Calculation.v2.Columns.DirectorBonusSumColumn; +using DirectorBonusSumColumn = EvoCalculator.Core.Calculation.v3.Columns.DirectorBonusSumColumn; using ExpensesColumn = EvoCalculator.Core.Calculation.v2.Columns.ExpensesColumn; using GPS_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.GPS_GrColumn; using KaskoNmperGrColumn = EvoCalculator.Core.Calculation.v2.Columns.KaskoNmperGrColumn; @@ -232,7 +232,7 @@ public static partial class CalculateManager sumRepaymentColumn.PostCheck(); var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); - extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn); cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn); @@ -242,6 +242,11 @@ public static partial class CalculateManager var npvFinalColumn = new NPVFinalColumn(maxColumnLength, dateTempColumn); npvFinalColumn.ComputeValues(cashflowNpvFinalColumn, npvWeightColumn); + + postValues.ComputeDirectorBonus(); + postValues.ComputeDirectorExtraBonus(cashflowMsfoColumn); + postValues.ComputeRegionalDirectorBonus(); + postValues.ComputeRegionalDirectorExtraBonus(cashflowMsfoColumn); var directorBonusSumColumn = new DirectorBonusSumColumn(preparedValues.Nmper + 1); directorBonusSumColumn.ComputeValues(preparedValues, postValues); diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs index b071f08..dbb9234 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs @@ -10,7 +10,7 @@ using CashflowColumn = EvoCalculator.Core.Calculation.v2.Columns.CashflowColumn; using CashflowLeasingColumn = EvoCalculator.Core.Calculation.v2.Columns.CashflowLeasingColumn; using CashflowMSFOColumnVT1 = EvoCalculator.Core.Calculation.v2.Columns.CashflowMSFOColumnVT1; using CashflowNPVColumn = EvoCalculator.Core.Calculation.v2.Columns.CashflowNPVColumn; -using DirectorBonusSumColumn = EvoCalculator.Core.Calculation.v2.Columns.DirectorBonusSumColumn; +using DirectorBonusSumColumn = EvoCalculator.Core.Calculation.v3.Columns.DirectorBonusSumColumn; using ExpensesColumn = EvoCalculator.Core.Calculation.v2.Columns.ExpensesColumn; using GPS_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.GPS_GrColumn; using KaskoNmperGrColumn = EvoCalculator.Core.Calculation.v2.Columns.KaskoNmperGrColumn; @@ -231,7 +231,7 @@ public static partial class CalculateManager sumRepaymentColumn.PostCheck(); var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); - extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn); cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn); @@ -242,6 +242,11 @@ public static partial class CalculateManager var npvFinalColumn = new NPVFinalColumn(maxColumnLength, dateTempColumn); npvFinalColumn.ComputeValues(cashflowNpvFinalColumn, npvWeightColumn); + postValues.ComputeDirectorBonus(); + postValues.ComputeDirectorExtraBonus(cashflowMsfoColumn); + postValues.ComputeRegionalDirectorBonus(); + postValues.ComputeRegionalDirectorExtraBonus(cashflowMsfoColumn); + var directorBonusSumColumn = new DirectorBonusSumColumn(preparedValues.Nmper + 1); directorBonusSumColumn.ComputeValues(preparedValues, postValues); diff --git a/EvoCalculator.Core.Calculation/v3/PostValues.cs b/EvoCalculator.Core.Calculation/v3/PostValues.cs index 3523e0c..4c92adf 100644 --- a/EvoCalculator.Core.Calculation/v3/PostValues.cs +++ b/EvoCalculator.Core.Calculation/v3/PostValues.cs @@ -7,18 +7,26 @@ namespace EvoCalculator.Core.Calculation.v3; public class PostValues : v2.PostValues { public decimal ContractEconomyWithVAT; + public decimal DirectorBonus; + public decimal DirectorExtraBonus; + public decimal RegionalDirectorBonus; + public decimal RegionalDirectorExtraBonus; + private readonly Constants.Calculation _constants; - public PostValues(PreparedValues preparedValues) : base(preparedValues) + public PostValues(PreparedValues _preparedValues) : base(_preparedValues) { + _constants = new Constants.Calculation(); } public override void ComputeBaseCost(BaseColumn kaskoNmperGrColumn, BaseColumn tlmGrColumn, BaseColumn gpsGrColumn) { - BaseCost = (_preparedValues.PlPrice + _preparedValues.InsuranceOsago + Math.Abs(kaskoNmperGrColumn.Values[0]) + BaseCost = (_preparedValues.PlPrice - _preparedValues.ImportProgramSum + _preparedValues.InsuranceOsago + + Math.Abs(kaskoNmperGrColumn.Values[0]) + Math.Abs(tlmGrColumn.Values[0]) + Math.Abs(gpsGrColumn.Values[0]) + _preparedValues.Rats + _preparedValues.Registration + _preparedValues.TrackerCost + - _preparedValues.TLMCost + _preparedValues.TransportTaxGr + _preparedValues.InsuranceFinGAPNmper) * + _preparedValues.TLMCost + _preparedValues.TransportTaxGr + + _preparedValues.InsuranceFinGAPNmper) * (decimal) _preparedValues.Leasing0K + _preparedValues.NsibBrutto; } @@ -27,4 +35,65 @@ public class PostValues : v2.PostValues { ContractEconomyWithVAT = this.ContractEconomy + creditVATColumn.GetValue(0); } + + public void ComputeDirectorBonus() + { + if ((_preparedValues.DirectorBonusFix > 0 && _preparedValues.DirectorBonus > 0 && + _preparedValues.BonusCoefficient < 1) + || (_preparedValues.DirectorBonusFix > 0 && _preparedValues.DirectorBonus == 0)) + { + DirectorBonus = _preparedValues.DirectorBonusFix; + } + else + { + DirectorBonus = this.BonusBase * (decimal) _preparedValues.DirectorBonus * + (decimal) _preparedValues.BonusCoefficient * + (decimal) _preparedValues.MarketRate * (decimal) _preparedValues.DistrictRate; + } + } + + public void ComputeDirectorExtraBonus(BaseColumnWithNominal cashflowMSFOColumn) + { + if (cashflowMSFOColumn.Nominal >= _preparedValues.IRR_MSFO_Plan && _preparedValues.BonusCoefficient == 1.0) + { + DirectorExtraBonus = this.BonusBase * + (decimal) (cashflowMSFOColumn.Nominal / _preparedValues.IRR_MSFO_Plan - 1) * + (decimal) _preparedValues.DirectorExtraBonus * (decimal) _preparedValues.MarketRate * + (decimal) _preparedValues.DistrictRate; + + if (DirectorExtraBonus < _constants.MinBonus) + DirectorExtraBonus = 0; + } + else + DirectorExtraBonus = 0; + } + + public void ComputeRegionalDirectorBonus() + { + if (_preparedValues.RegionalDirectorBonusFix > 0) + { + RegionalDirectorBonus = _preparedValues.RegionalDirectorBonusFix; + } + else + { + RegionalDirectorBonus = this.BonusBase * (decimal) _preparedValues.RegionalDirectorBonus * + (decimal) _preparedValues.MarketRate * (decimal) _preparedValues.DistrictRate; + } + } + + public void ComputeRegionalDirectorExtraBonus(BaseColumnWithNominal cashflowMSFOColumn) + { + if (cashflowMSFOColumn.Nominal >= _preparedValues.IRR_MSFO_Plan && _preparedValues.BonusCoefficient == 1.0) + { + RegionalDirectorExtraBonus = this.BonusBase * + (decimal) (cashflowMSFOColumn.Nominal / _preparedValues.IRR_MSFO_Plan - 1) * + (decimal) _preparedValues.RegionalDirectorExtraBonus * + (decimal) _preparedValues.MarketRate * + (decimal) _preparedValues.DistrictRate; + if (RegionalDirectorExtraBonus < _constants.MinBonus) + RegionalDirectorExtraBonus = 0; + } + else + RegionalDirectorExtraBonus = 0; + } } \ No newline at end of file diff --git a/EvoCalculator.Core.Constants/Calculation.cs b/EvoCalculator.Core.Constants/Calculation.cs index be2467f..18574f3 100644 --- a/EvoCalculator.Core.Constants/Calculation.cs +++ b/EvoCalculator.Core.Constants/Calculation.cs @@ -11,4 +11,5 @@ public class Calculation public double IncomeTaxValue = 0.2; public int MaxOnePolicePeriod = 16; public double VatValue = 0.2; + public decimal MinBonus = 100; } \ No newline at end of file diff --git a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs index de715dd..e59a571 100644 --- a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs +++ b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs @@ -45,6 +45,7 @@ public class PreparedValues public decimal PlPriceWithVAT { get; set; } public decimal PlPriceVAT { get; set; } public decimal Discount { get; set; } + public decimal ImportProgramSum { get; set; } public decimal AcceptSum { get; set; } public string PlTypeId { get; set; } public string BrandId { get; set; } @@ -138,6 +139,15 @@ public class PreparedValues public double IRR_MSFO_Plan { get; set; } public double ExtraBonus { get; set; } public double DirectorBonus { get; set; } + public decimal DirectorBonusFix { get; set; } + public double DirectorExtraBonus { get; set; } + public decimal RegionalDirectorBonusFinGAP { get; set; } + public double RegionalDirectorBonus { get; set; } + public decimal RegionalDirectorBonusFix { get; set; } + public double RegionalDirectorExtraBonus { get; set; } + public double BonusCoefficient { get; set; } + public double ProfitExpected { get; set; } = 0; + public decimal DogCredit => PlPrice + (Insurance + Rats + Registration + TrackerCost + TLMCost + TransportTaxGr) *