From 247d950145c4743750647e71394e1466e502e821 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Fri, 19 May 2023 13:13:05 +0300 Subject: [PATCH] merge release/dyn-2846_sale-irr-pi --- .../v1/Columns/CashflowMSFOFinalColumn.cs | 2 +- .../v1/Columns/CashflowNPVFinalColumn.cs | 2 +- .../v1/Columns/VATColumn.cs | 11 +- .../v1/Managers/CalculateByTotalExpected.cs | 8 +- .../v1/Managers/CalculateDefault.cs | 8 +- .../Calculation/CalculateByTotalExpected.cs | 8 +- .../Managers/Calculation/CalculateDefault.cs | 8 +- .../v3/Columns/ExtraBonusSumColumn.cs | 28 ++ .../v3/Columns/PIColumn.cs | 23 - .../v3/Columns/PIColumn/BasePIColumn.cs | 27 ++ .../v3/Columns/PIColumn/PIColumnVT1.cs | 19 + .../v3/Columns/PIColumn/PIColumnVT2.cs | 86 ++++ .../v3/Columns/VATRecoverableColumn.cs | 2 +- .../v3/Managers/Calculation/CalculateByPI.cs | 393 ++++++++++++++++++ .../Calculation/CalculateByTotalExpected.cs | 15 +- .../Managers/Calculation/CalculateDefault.cs | 13 +- .../v3/PostValues.cs | 38 +- .../Models/Prepared/PreparedValues.cs | 1 + .../Calculation/v3/CalculationController.cs | 3 +- 19 files changed, 622 insertions(+), 73 deletions(-) create mode 100644 EvoCalculator.Core.Calculation/v3/Columns/ExtraBonusSumColumn.cs delete mode 100644 EvoCalculator.Core.Calculation/v3/Columns/PIColumn.cs create mode 100644 EvoCalculator.Core.Calculation/v3/Columns/PIColumn/BasePIColumn.cs create mode 100644 EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT1.cs create mode 100644 EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs create mode 100644 EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs diff --git a/EvoCalculator.Core.Calculation/v1/Columns/CashflowMSFOFinalColumn.cs b/EvoCalculator.Core.Calculation/v1/Columns/CashflowMSFOFinalColumn.cs index 06cd8f0..b019268 100644 --- a/EvoCalculator.Core.Calculation/v1/Columns/CashflowMSFOFinalColumn.cs +++ b/EvoCalculator.Core.Calculation/v1/Columns/CashflowMSFOFinalColumn.cs @@ -10,7 +10,7 @@ public class CashflowMSFOFinalColumn : BaseColumnWithNominal } public void ComputeValues(PreparedValues preparedValues, BaseCashflowMSFOColumn cashflowMsfoColumn, - ExtraBonusSumColumn extraBonusSumColumn) + BaseColumn extraBonusSumColumn) { Values[0] = -preparedValues.AcquisitionExpenses; Values[1] = cashflowMsfoColumn.Values[1]; diff --git a/EvoCalculator.Core.Calculation/v1/Columns/CashflowNPVFinalColumn.cs b/EvoCalculator.Core.Calculation/v1/Columns/CashflowNPVFinalColumn.cs index 1709243..a4e501e 100644 --- a/EvoCalculator.Core.Calculation/v1/Columns/CashflowNPVFinalColumn.cs +++ b/EvoCalculator.Core.Calculation/v1/Columns/CashflowNPVFinalColumn.cs @@ -9,7 +9,7 @@ public class CashflowNPVFinalColumn : BaseColumn { } - public void ComputeValues(PreparedValues preparedValues, ExtraBonusSumColumn extraBonusSumColumn, + public void ComputeValues(PreparedValues preparedValues, BaseColumn extraBonusSumColumn, BaseColumn cashflowNpvColumn) { Values[0] = -preparedValues.AcquisitionExpenses; diff --git a/EvoCalculator.Core.Calculation/v1/Columns/VATColumn.cs b/EvoCalculator.Core.Calculation/v1/Columns/VATColumn.cs index 39edcf7..53b6a3d 100644 --- a/EvoCalculator.Core.Calculation/v1/Columns/VATColumn.cs +++ b/EvoCalculator.Core.Calculation/v1/Columns/VATColumn.cs @@ -6,8 +6,11 @@ namespace EvoCalculator.Core.Calculation.v1.Columns; public class VATColumn : BaseColumnWithSum { - public VATColumn(int count) : base(count) + private Constants.Calculation constants; + + public VATColumn(int count, Constants.Calculation constants) : base(count) { + this.constants = constants; } public void PostCheck() @@ -15,13 +18,13 @@ public class VATColumn : BaseColumnWithSum new CheckTools().CheckColumnForLessThanZeroValue(Values); } - public void ComputeValues(Constants.Calculation constants, SumColumn sumColumn, PreparedValues preparedValues) + public void ComputeValues(SumColumn sumColumn, PreparedValues preparedValues) { Values[0] = 0; Values[1] = preparedValues.FirstPaymentNdsAbs > 0 ? preparedValues.FirstPaymentNdsAbs - : (decimal) constants.VatValue * sumColumn.Values[1]; - for (var i = 2; i < Values.Length; i++) Values[i] = (decimal) constants.VatValue * sumColumn.Values[i]; + : (decimal)constants.VatValue * sumColumn.Values[1]; + for (var i = 2; i < Values.Length; i++) Values[i] = (decimal)constants.VatValue * sumColumn.Values[i]; Values[0] = Sum; } diff --git a/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs b/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs index 680ba33..48b08a2 100644 --- a/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v1/Managers/CalculateByTotalExpected.cs @@ -16,7 +16,7 @@ public static partial class CalculateManager var additionalData = requestCalculation.additionalData; var validationErrors = new Validation().ValidateRequest(requestCalculation); - if (validationErrors.Count > 0) return new ManagerResult {Errors = validationErrors}; + if (validationErrors.Count > 0) return new ManagerResult { Errors = validationErrors }; var constants = new Constants.Calculation(); @@ -94,8 +94,8 @@ public static partial class CalculateManager cashflowMsfoColumn.ComputeValues(); cashflowMsfoColumn.PostCheck(additionalData); - var vatColumn = new VATColumn(preparedValues.Nmper + 1); - vatColumn.ComputeValues(new Constants.Calculation(), sumColumn, preparedValues); + var vatColumn = new VATColumn(preparedValues.Nmper + 1, new Constants.Calculation()); + vatColumn.ComputeValues(sumColumn, preparedValues); vatColumn.PostCheck(); var acceptSumColumn = new AcceptSumColumn(preparedValues.Nmper + 1); @@ -188,7 +188,7 @@ public static partial class CalculateManager nsibBruttoGrColumn, nsibExpensesColumn); if (nsibBruttoGrColumn.Sum != 0) - cashflowNsibColumn.ComputeValues((decimal) cashflowLeasingColumn.IRR); + cashflowNsibColumn.ComputeValues((decimal)cashflowLeasingColumn.IRR); var revenueColumn = new RevenueColumn(preparedValues.Nmper + 1); revenueColumn.ComputeValues(nsibBruttoGrColumn, nsibExpensesColumn, cashflowNsibColumn); diff --git a/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs index 35a256a..e500caa 100644 --- a/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v1/Managers/CalculateDefault.cs @@ -17,7 +17,7 @@ public static partial class CalculateManager var validationErrors = new Validation().ValidateRequest(requestCalculation); - if (validationErrors.Count > 0) return new ManagerResult {Errors = validationErrors}; + if (validationErrors.Count > 0) return new ManagerResult { Errors = validationErrors }; var constants = new Constants.Calculation(); @@ -89,8 +89,8 @@ public static partial class CalculateManager cashflowMsfoColumn.PostCheck(additionalData); sumColumn.PostCheck(); - var vatColumn = new VATColumn(preparedValues.Nmper + 1); - vatColumn.ComputeValues(new Constants.Calculation(), sumColumn, preparedValues); + var vatColumn = new VATColumn(preparedValues.Nmper + 1, new Constants.Calculation()); + vatColumn.ComputeValues( sumColumn, preparedValues); vatColumn.PostCheck(); var sumWithVatColumn = @@ -188,7 +188,7 @@ public static partial class CalculateManager nsibBruttoGrColumn, nsibExpensesColumn); if (nsibBruttoGrColumn.Sum != 0) - cashflowNsibColumn.ComputeValues((decimal) cashflowLeasingColumn.IRR); + cashflowNsibColumn.ComputeValues((decimal)cashflowLeasingColumn.IRR); var revenueColumn = new RevenueColumn(preparedValues.Nmper + 1); revenueColumn.ComputeValues(nsibBruttoGrColumn, nsibExpensesColumn, cashflowNsibColumn); diff --git a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs index 7fc1cab..c66d953 100644 --- a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateByTotalExpected.cs @@ -30,7 +30,7 @@ public static partial class CalculateManager var flags = requestCalculation.Flags; var validationErrors = new Validation().ValidateRequest(requestCalculation); - if (validationErrors.Count > 0) return new ManagerResult {Errors = validationErrors}; + if (validationErrors.Count > 0) return new ManagerResult { Errors = validationErrors }; var constants = new Constants.Calculation(); @@ -109,8 +109,8 @@ public static partial class CalculateManager cashflowMsfoColumn.ComputeValues(); cashflowMsfoColumn.PostCheck(additionalData); - var vatColumn = new VATColumn(preparedValues.Nmper + 1); - vatColumn.ComputeValues(new Constants.Calculation(), sumColumn, preparedValues); + var vatColumn = new VATColumn(preparedValues.Nmper + 1, new Constants.Calculation()); + vatColumn.ComputeValues(sumColumn, preparedValues); vatColumn.PostCheck(); var acceptSumColumn = new AcceptSumColumn(preparedValues.Nmper + 1); @@ -203,7 +203,7 @@ public static partial class CalculateManager nsibBruttoGrColumn, nsibExpensesColumn); if (nsibBruttoGrColumn.Sum != 0) - cashflowNsibColumn.ComputeValues((decimal) cashflowLeasingColumn.IRR); + cashflowNsibColumn.ComputeValues((decimal)cashflowLeasingColumn.IRR); var revenueColumn = new RevenueColumn(preparedValues.Nmper + 1); revenueColumn.ComputeValues(nsibBruttoGrColumn, nsibExpensesColumn, cashflowNsibColumn); diff --git a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs index f2406b5..a7ea203 100644 --- a/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v2/Managers/Calculation/CalculateDefault.cs @@ -30,7 +30,7 @@ public static partial class CalculateManager var flags = requestCalculation.Flags; var validationErrors = new Validation().ValidateRequest(requestCalculation); - if (validationErrors.Count > 0) return new ManagerResult {Errors = validationErrors}; + if (validationErrors.Count > 0) return new ManagerResult { Errors = validationErrors }; var constants = new Constants.Calculation(); @@ -103,8 +103,8 @@ public static partial class CalculateManager cashflowMsfoColumn.PostCheck(additionalData); sumColumn.PostCheck(flags); - var vatColumn = new VATColumn(preparedValues.Nmper + 1); - vatColumn.ComputeValues(new Constants.Calculation(), sumColumn, preparedValues); + var vatColumn = new VATColumn(preparedValues.Nmper + 1, new Constants.Calculation()); + vatColumn.ComputeValues(sumColumn, preparedValues); vatColumn.PostCheck(); var sumWithVatColumn = @@ -202,7 +202,7 @@ public static partial class CalculateManager nsibBruttoGrColumn, nsibExpensesColumn); if (nsibBruttoGrColumn.Sum != 0) - cashflowNsibColumn.ComputeValues((decimal) cashflowLeasingColumn.IRR); + cashflowNsibColumn.ComputeValues((decimal)cashflowLeasingColumn.IRR); var revenueColumn = new RevenueColumn(preparedValues.Nmper + 1); revenueColumn.ComputeValues(nsibBruttoGrColumn, nsibExpensesColumn, cashflowNsibColumn); diff --git a/EvoCalculator.Core.Calculation/v3/Columns/ExtraBonusSumColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/ExtraBonusSumColumn.cs new file mode 100644 index 0000000..8666915 --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Columns/ExtraBonusSumColumn.cs @@ -0,0 +1,28 @@ +using System; +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Calculation.v2.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.v3.Columns; + +public class ExtraBonusSumColumn : BaseColumnWithSum +{ + public ExtraBonusSumColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues, BaseCashflowMSFOColumn cashflowMsfoColumn, + v3.PostValues postValues, Constants.Calculation constants) + { + Values[2] = cashflowMsfoColumn.Nominal >= postValues.PlanIRRMSFO && preparedValues.BonusCoefficient == 1.0 + ? -1 * postValues.BonusBase * + (decimal) (cashflowMsfoColumn.Nominal / postValues.PlanIRRMSFO - 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/v3/Columns/PIColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn.cs deleted file mode 100644 index 8713a05..0000000 --- a/EvoCalculator.Core.Calculation/v3/Columns/PIColumn.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Linq; -using EvoCalculator.Core.Base.Columns; -using EvoCalculator.Core.Models.Calculation.Models.Prepared; - -namespace EvoCalculator.Core.Calculation.v3.Columns; - -public class PIColumn : BaseColumnWithNPV -{ - public PIColumn(int count) : base(count) - { - } - - public void ComputeValues(PreparedValues preparedValues, BaseColumn cashflowMSFOWithCFColumn, - BaseColumn cashflowMSFOColumn) - { - for (var i = 1; i < Values.Length; i++) - { - Values[i] = NPV(cashflowMSFOWithCFColumn.Values.Skip(1).Take(i), preparedValues.LoanRate); - } - - Values[0] = -Values[^1] / (cashflowMSFOColumn.GetValue(0) + cashflowMSFOColumn.GetValue(1)); - } -} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/BasePIColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/BasePIColumn.cs new file mode 100644 index 0000000..cf6be68 --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/BasePIColumn.cs @@ -0,0 +1,27 @@ +using System.Linq; +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.v3.Columns; + +public class BasePIColumn : BaseColumnWithNPV +{ + protected readonly PreparedValues _preparedValues; + + public BasePIColumn(int count, PreparedValues preparedValues) : + base(count) + { + _preparedValues = preparedValues; + } + + protected void FillValues(BaseColumn cashflowMSFOColumn, BaseColumn cashflowMSFOWithCFColumn) + { + for (var i = 1; i < Values.Length; i++) + { + Values[i] = NPV(cashflowMSFOWithCFColumn.Values.Skip(1).Take(i), _preparedValues.LoanRate); + } + + Values[0] = -Values[^1] / (cashflowMSFOColumn.GetValue(0) + + cashflowMSFOColumn.GetValue(1)); + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT1.cs b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT1.cs new file mode 100644 index 0000000..46ffcda --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT1.cs @@ -0,0 +1,19 @@ +using System.Linq; +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Calculation.v2.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.v3.Columns; + +public class PIColumnVT1 : BasePIColumn +{ + public PIColumnVT1(int count, PreparedValues preparedValues) : + base(count, preparedValues) + { + } + + public void ComputeValues(BaseColumn cashflowMSFOColumn, BaseColumn cashflowMSFOWithCFColumn) + { + FillValues(cashflowMSFOColumn, cashflowMSFOWithCFColumn); + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs new file mode 100644 index 0000000..55a3837 --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs @@ -0,0 +1,86 @@ +using System; +using System.Linq; +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Base.Interfaces.Columns; +using EvoCalculator.Core.Calculation.v1.Columns; +using EvoCalculator.Core.Calculation.v2.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using TridentGoalSeek; +using CashflowMSFOColumnVT2 = EvoCalculator.Core.Calculation.v2.Columns.CashflowMSFOColumnVT2; + +namespace EvoCalculator.Core.Calculation.v3.Columns; + +public class PIColumnVT2 : BasePIColumn, IColumnWithGoalSeek +{ + private readonly PercentPaymentColumn _percentPaymentColumn; + protected SumColumn _sumColumn; + private CashflowMSFOColumnVT2 _cashflowMsfoColumn; + private readonly PostValues _postValues; + private SumCreditColumn _sumCreditColumn; + private CreditPaymentColumn _creditPaymentColumn; + private VATRecoverableColumn _vatRecoverableColumn; + private CashflowMSFOWithCFColumn _cashflowMSFOWithCFColumn; + private VATColumn _vatColumn; + private SumWithVATColumnVT1 _sumWithVatColumn; + private CreditColumn _creditColumn; + + + public PIColumnVT2(int count, PreparedValues preparedValues, CashflowMSFOWithCFColumn cashflowMsfoWithCfColumn, + CashflowMSFOColumnVT2 cashflowMsfoColumn, PercentPaymentColumn percentPaymentColumn, PostValues postValues, + SumColumn sumColumn, SumCreditColumn sumCreditColumn, CreditPaymentColumn creditPaymentColumn, + VATRecoverableColumn vatRecoverableColumn, VATColumn vatColumn, SumWithVATColumnVT1 sumWithVatColumn, + CreditColumn creditColumn) : base( + count, + preparedValues) + { + _cashflowMSFOWithCFColumn = cashflowMsfoWithCfColumn; + _cashflowMsfoColumn = cashflowMsfoColumn; + _percentPaymentColumn = percentPaymentColumn; + _postValues = postValues; + _sumColumn = sumColumn; + _sumCreditColumn = sumCreditColumn; + _creditPaymentColumn = creditPaymentColumn; + _vatRecoverableColumn = vatRecoverableColumn; + _vatColumn = vatColumn; + _sumWithVatColumn = sumWithVatColumn; + _creditColumn = creditColumn; + } + + public decimal Calculate(decimal inputVariable) + { + _sumColumn.ComputeValues(inputVariable); + _cashflowMsfoColumn.ComputeValues(); + _vatColumn.ComputeValues(_sumColumn, _preparedValues); + _sumWithVatColumn.ComputeValues(); + _sumCreditColumn.ComputeValues(_preparedValues, _sumWithVatColumn); + _creditColumn.ComputeValues(_preparedValues, _sumCreditColumn); + _vatRecoverableColumn.ComputeValues(_vatColumn); + _creditPaymentColumn.ComputeValues(_preparedValues, _sumCreditColumn, _creditColumn); + + _cashflowMSFOWithCFColumn.ComputeValues(_preparedValues, _sumCreditColumn, _cashflowMsfoColumn, + _creditPaymentColumn, _vatRecoverableColumn); + + FillValues(_cashflowMsfoColumn, _cashflowMSFOWithCFColumn); + + return Convert.ToDecimal(Values.GetValue(0)); + } + + public void ComputeValues(decimal requiredValue) + { + var NUMBER_OF_LARGE_PERCENTS = _percentPaymentColumn.Values + .Skip(2) + .Take(_percentPaymentColumn.Values.Length - 1) + .Where(x => x >= 10).ToArray().Length; + + var goalSeek = new GoalSeek(this); + goalSeek.SeekResult(requiredValue, + new GoalSeekOptions( + startingStabPoint: + (_postValues.BaseCost - _preparedValues.FirstPaymentSum) / NUMBER_OF_LARGE_PERCENTS + , maximumAttempts: 1000 + , initialTineSpacing: 1000 + // , trimFinalInputValue: true + // , acceptanceToDecimalPlaces: 2 + )); + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Columns/VATRecoverableColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/VATRecoverableColumn.cs index 5fe7ba9..d3bed20 100644 --- a/EvoCalculator.Core.Calculation/v3/Columns/VATRecoverableColumn.cs +++ b/EvoCalculator.Core.Calculation/v3/Columns/VATRecoverableColumn.cs @@ -24,7 +24,7 @@ public class VATRecoverableColumn : BaseColumnWithSum { Values[0] = 0; - for (var i = 3; i < Values.Length; i += 3) + for (var i = 6; i < Values.Length; i += 3) { var vatSum = vatColumn.Values.Skip(1).Take(i).Sum(); var vatRecoverableSum = this.Values.Skip(1).Take(i - 1).Sum(); diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs new file mode 100644 index 0000000..ae38623 --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs @@ -0,0 +1,393 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using EvoCalculator.Core.Calculation.v1.Columns; +using EvoCalculator.Core.Calculation.v2.Columns; +using EvoCalculator.Core.Calculation.v3.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Manager; +using EvoCalculator.Core.Models.Calculation.Models.Request; +using EvoCalculator.Core.Tools.Validation; +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 CashflowMSFOColumnVT2 = EvoCalculator.Core.Calculation.v2.Columns.CashflowMSFOColumnVT2; +using CashflowNPVColumn = EvoCalculator.Core.Calculation.v2.Columns.CashflowNPVColumn; +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; +using NegativeCashflowColumn = EvoCalculator.Core.Calculation.v3.Columns.NegativeCashflowColumn; +using NPVBonusExpensesColumn = EvoCalculator.Core.Calculation.v2.Columns.NPVBonusExpensesColumn; +using SumColumn = EvoCalculator.Core.Calculation.v3.Columns.SumColumn; +using SumCreditColumn = EvoCalculator.Core.Calculation.v3.Columns.SumCreditColumn; +using TaxColumn = EvoCalculator.Core.Calculation.v2.Columns.TaxColumn; +using TLM_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.TLM_GrColumn; +using ExtraBonusSumColumn = EvoCalculator.Core.Calculation.v3.Columns.ExtraBonusSumColumn; + +namespace EvoCalculator.Core.Calculation.v3.Managers.Calculation; + +public static partial class CalculateManager +{ + public static ManagerResult CalculateByPI(RequestCalculation requestCalculation) + { + var preparedValues = requestCalculation.preparedValues; + var preparedPayments = requestCalculation.preparedPayments; + var additionalData = requestCalculation.additionalData; + var flags = requestCalculation.Flags; + + var validationErrors = new Validation().ValidateRequest(requestCalculation); + if (validationErrors.Count > 0) return new ManagerResult { Errors = validationErrors }; + + var constants = new Constants.Calculation(); + + var postValues = new PostValues(preparedValues); + + + var maxColumnLength = preparedValues.Nmper > preparedValues.NmperDeprecation + ? preparedValues.Nmper + 1 + : preparedValues.NmperDeprecation + 2; + + try + { + var dateColumn = new DateColumn(preparedValues.Nmper + 1); + dateColumn.ComputeValues(preparedValues, constants); + + var dateTempColumn = new DateTempColumn(maxColumnLength); + dateTempColumn.ComputeValues(preparedValues); + + var percentPaymentColumn = new PercentPaymentColumn(preparedPayments.Rows.Length + 1); + percentPaymentColumn.ComputeValues(preparedPayments); + + var kaskoNmperGrColumn = new KaskoNmperGrColumn(preparedValues.Nmper + 1); + kaskoNmperGrColumn.ComputeValues(preparedValues, constants); + kaskoNmperGrColumn.PostCheck(); + + var finGAPNmperGrColumn = new FinGAPNmperGrColumn(preparedValues.Nmper + 1, preparedValues); + finGAPNmperGrColumn.ComputeValues(); + finGAPNmperGrColumn.PostCheck(); + + var tlmGrColumn = new TLM_GrColumn(preparedPayments.Rows.Length + 1); + tlmGrColumn.ComputeValues(preparedPayments, preparedValues); + tlmGrColumn.PostCheck(); + + + var gpsGrColumn = new GPS_GrColumn(preparedPayments.Rows.Length + 1); + gpsGrColumn.ComputeValues(preparedPayments, preparedValues); + gpsGrColumn.PostCheck(); + + var kaskoBonusGrSumColumn = new KaskoBonusGrSumColumn(preparedValues.Nmper + 1); + kaskoBonusGrSumColumn.ComputeValues(preparedValues, kaskoNmperGrColumn); + + postValues.ComputeBonusBase(kaskoBonusGrSumColumn); + + var npvBonusExpensesColumn = new NPVBonusExpensesColumn(preparedValues.Nmper + 1); + npvBonusExpensesColumn.ComputeValues(preparedValues, postValues); + + postValues.ComputeBaseCost(kaskoNmperGrColumn, tlmGrColumn, gpsGrColumn); + + var agentComissionExpensesColumn = new AgentComissionExpensesColumn(preparedValues.Nmper + 1); + agentComissionExpensesColumn.ComputeValues(preparedValues); + + var evoKaskoNmperGrColumn = new EvoKaskoNmperGrColumn(preparedValues.Nmper + 1, preparedValues); + evoKaskoNmperGrColumn.ComputeValues(); + + var negativeCashflowColumn = new NegativeCashflowColumn(preparedValues.Nmper + 1); + negativeCashflowColumn.ComputeValues(kaskoNmperGrColumn, finGAPNmperGrColumn, evoKaskoNmperGrColumn); + + var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1); + nsibBruttoGrColumn.ComputeValues(preparedValues); + + var sumColumn = new SumColumn( + preparedValues.Nmper + 1 + , dateTempColumn + , preparedValues + , percentPaymentColumn + , postValues + , nsibBruttoGrColumn + , preparedPayments + ); + + var subsidyExpensesColumn = new SubsidyExpensesColumn(preparedValues.Nmper + 1); + subsidyExpensesColumn.ComputeValues(preparedValues); + + var cashflowMsfoColumn = new CashflowMSFOColumnVT2(preparedValues.Nmper + 1, dateTempColumn, postValues, + preparedValues, percentPaymentColumn, sumColumn, negativeCashflowColumn, nsibBruttoGrColumn, + tlmGrColumn, gpsGrColumn, npvBonusExpensesColumn, agentComissionExpensesColumn, + subsidyExpensesColumn); + + + var vatColumn = new VATColumn(preparedValues.Nmper + 1, new Constants.Calculation()); + + + var sumWithVatColumn = + new SumWithVATColumnVT1(preparedValues.Nmper + 1, sumColumn, preparedValues, constants); + + var sumCreditColumn = new SumCreditColumn(preparedValues.LoanRatePeriod + 2); + + var creditColumn = new CreditColumn(preparedValues.LoanRatePeriod + 4); + + var vatRecoverableColumn = new VATRecoverableColumn(64, preparedValues); + + var creditPaymentColumn = new CreditPaymentColumn(preparedValues.LoanRatePeriod + 4); + + var cashflowMsfoWithCfColumn = new CashflowMSFOWithCFColumn( + new[] { preparedValues.LoanRatePeriod + 4, preparedValues.Nmper + 1 } + .Max()); + + + var piColumn = new PIColumnVT2(61, preparedValues, cashflowMsfoWithCfColumn, cashflowMsfoColumn, + percentPaymentColumn, postValues, sumColumn, sumCreditColumn, creditPaymentColumn, + vatRecoverableColumn, vatColumn, sumWithVatColumn, creditColumn); + piColumn.ComputeValues((decimal)preparedValues.NpvniExpected); + sumColumn.PostCheck(flags); + cashflowMsfoColumn.PostCheck(additionalData, constants, requestCalculation.Flags); + vatColumn.PostCheck(); + sumWithVatColumn.PostCheck(); + creditColumn.PostCheck(preparedValues, sumColumn); + + var acceptSumColumn = new AcceptSumColumn(preparedValues.Nmper + 1); + acceptSumColumn.ComputeValues(preparedValues, sumColumn, vatColumn, sumWithVatColumn); + + var acceptKaskoColumn = new AcceptKaskoColumn(preparedValues.Nmper + 1); + acceptKaskoColumn.ComputeValues(preparedValues); + + var acceptOsagoColumn = new AcceptOsagoColumn(preparedValues.Nmper + 1); + acceptOsagoColumn.ComputeValues(preparedValues); + + var acceptInsuranceColumn = new AcceptInsuranceColumn(preparedValues.Nmper + 1); + acceptInsuranceColumn.ComputeValues(acceptKaskoColumn, acceptOsagoColumn); + + var deprecationLpColumn = new DeprecationLPColumn(preparedValues.Nmper + 1); + deprecationLpColumn.ComputeValues(preparedValues, acceptSumColumn); + + var deprecationLdColumn = new DeprecationLDColumn(maxColumnLength); + deprecationLdColumn.ComputeValues(preparedValues); + + var deprecationColumn = new DeprecationColumn(maxColumnLength); + deprecationColumn.ComputeValues(deprecationLpColumn, deprecationLdColumn); + + var ratExpensesColumn = new RatExpensesColumn(preparedValues.Nmper + 1); + ratExpensesColumn.ComputeValues(preparedValues); + + var transExprensesColumn = new TransExpensesColumn(preparedValues.Nmper + 1); + transExprensesColumn.ComputeValues(preparedValues); + + var nsibExpensesColumn = new NSIBExpensesColumn(preparedValues.Nmper + 1); + nsibExpensesColumn.ComputeValues(preparedValues); + + var tlmExpensesColumn = new TLMExpensesColumn(preparedValues.Nmper + 1); + tlmExpensesColumn.ComputeValues(preparedValues, preparedPayments); + + var gpsExpensesColumn = new GPSExpensesColumn(preparedValues.Nmper + 1); + gpsExpensesColumn.ComputeValues(preparedValues, preparedPayments); + + var registrExpensesColumn = new RegistrExpensesColumn(preparedValues.Nmper + 1); + registrExpensesColumn.ComputeValues(preparedValues); + + var insuranceBonusExpensesColumn = new InsuranceBonusExpensesColumn(preparedValues.Nmper + 1); + insuranceBonusExpensesColumn.ComputeValues(preparedValues, constants); + + var comissionBonusExpensesColumn = new ComissionBonusExpensesColumn(preparedValues.Nmper + 1); + comissionBonusExpensesColumn.ComputeValues(preparedValues); + + var expensesColumn = new ExpensesColumn(preparedValues.Nmper + 1); + expensesColumn.ComputeValues(agentComissionExpensesColumn, ratExpensesColumn, transExprensesColumn, + nsibExpensesColumn, tlmExpensesColumn, gpsExpensesColumn, registrExpensesColumn, + insuranceBonusExpensesColumn, comissionBonusExpensesColumn, npvBonusExpensesColumn, + subsidyExpensesColumn); + + var taxColumn = new TaxColumn(maxColumnLength); + taxColumn.ComputeValues(preparedValues, constants, sumColumn, acceptInsuranceColumn, deprecationColumn, + ratExpensesColumn, registrExpensesColumn, comissionBonusExpensesColumn, transExprensesColumn, + npvBonusExpensesColumn, agentComissionExpensesColumn, insuranceBonusExpensesColumn, + tlmExpensesColumn, gpsExpensesColumn, subsidyExpensesColumn); + + var cashflowColumn = new CashflowColumn(preparedValues.Nmper + 1, dateTempColumn); + cashflowColumn.ComputeValues(preparedValues, sumColumn, negativeCashflowColumn, subsidyExpensesColumn); + + var cashflowLeasingColumn = new CashflowLeasingColumn(preparedValues.Nmper + 1, dateTempColumn); + cashflowLeasingColumn.ComputeValues(preparedValues, sumColumn, negativeCashflowColumn, + nsibBruttoGrColumn, tlmGrColumn, gpsGrColumn, subsidyExpensesColumn); + + var cashflowNpvColumn = new CashflowNPVColumn(maxColumnLength); + cashflowNpvColumn.ComputeValues(preparedValues, sumColumn, npvBonusExpensesColumn, + agentComissionExpensesColumn, taxColumn, nsibExpensesColumn, negativeCashflowColumn, + ratExpensesColumn, transExprensesColumn, tlmExpensesColumn, gpsExpensesColumn, + subsidyExpensesColumn); + + var npvWeightColumn = new NPVWeightColumn(maxColumnLength); + npvWeightColumn.ComputeValues(preparedValues, dateTempColumn); + + var npvColumn = new NPVColumn(maxColumnLength, dateTempColumn); + npvColumn.ComputeValues(cashflowNpvColumn, npvWeightColumn); + + var irrGrColumn = new IRRGrColumn(preparedValues.Nmper + 1); + irrGrColumn.ComputeValues(dateTempColumn, cashflowMsfoColumn); + + var niColumn = new NIColumn(preparedValues.Nmper + 1); + niColumn.ComputeValues(preparedValues, cashflowMsfoColumn, irrGrColumn); + + var interestColumn = new InterestColumn(preparedValues.Nmper + 1); + interestColumn.ComputeValues(irrGrColumn, niColumn); + interestColumn.PostCheck(sumColumn); + + var cashflowNsibColumn = new CashflowNSIBColumn(preparedValues.Nmper + 1, dateTempColumn, + nsibBruttoGrColumn, nsibExpensesColumn); + + if (nsibBruttoGrColumn.Sum != 0) + cashflowNsibColumn.ComputeValues((decimal)cashflowLeasingColumn.IRR); + + var revenueColumn = new RevenueColumn(preparedValues.Nmper + 1); + revenueColumn.ComputeValues(nsibBruttoGrColumn, nsibExpensesColumn, cashflowNsibColumn); + + var sumCurrentColumn = new SumCurrentColumn(preparedValues.Nmper + 1); + sumCurrentColumn.ComputeValues(sumWithVatColumn); + + var sumCurrentNegativeColumn = new SumCurrentNegativeColumn(preparedValues.Nmper + 1); + sumCurrentNegativeColumn.ComputeValues(negativeCashflowColumn); + + var sumCurrentInterestColumn = new SumCurrentInterestColumn(preparedValues.Nmper + 1); + sumCurrentInterestColumn.ComputeValues(interestColumn); + + var sumCurrentTlmColumn = new SumCurrentTLMColumn(preparedValues.Nmper + 1); + sumCurrentTlmColumn.ComputeValues(tlmGrColumn); + + var sumRepaymentColumn = new SumRepaymentColumn(preparedValues.Nmper + 1); + sumRepaymentColumn.ComputeValues(constants, preparedValues, sumCurrentColumn, sumCurrentNegativeColumn, + sumCurrentInterestColumn, sumCurrentTlmColumn); + sumRepaymentColumn.PostCheck(); + + postValues.ComputePlanIRRMSFO(cashflowMsfoColumn); + + var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); + + var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn); + cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn); + + var cashflowNpvFinalColumn = new CashflowNPVFinalColumn(maxColumnLength); + cashflowNpvFinalColumn.ComputeValues(preparedValues, extraBonusSumColumn, cashflowNpvColumn); + + 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); + + var cashflowMsfoFinal2Column = new CashflowMSFOFinal2Column(preparedValues.Nmper + 1, dateTempColumn); + cashflowMsfoFinal2Column.ComputeValues(preparedValues, directorBonusSumColumn, cashflowMsfoFinalColumn); + + var cashflowNpvFinal2Column = new CashflowNPVFinal2Column(maxColumnLength); + cashflowNpvFinal2Column.ComputeValues(preparedValues, cashflowNpvFinalColumn, directorBonusSumColumn); + + var npvFinal2Column = new NPVFinal2Column(maxColumnLength, dateTempColumn); + npvFinal2Column.ComputeValues(cashflowNpvFinal2Column, npvWeightColumn); + + var sumVATCreditColumn = new SumVATCreditColumn(12 + 2); + sumVATCreditColumn.ComputeValues(preparedValues, vatColumn); + + var creditVATColumn = new CreditVATColumn(12 + 4); + creditVATColumn.ComputeValues(preparedValues, sumVATCreditColumn); + + postValues.ComputePriceUP(sumColumn); + postValues.ComputePriceUP_PR(); + postValues.ComputePriceUP_Year(); + postValues.ComputePriceUP_Year_PR(); + postValues.ComputeNPVNI(npvColumn); + postValues.ComputeBonusResult(npvBonusExpensesColumn); + postValues.ComputeContractEconomy(cashflowMsfoColumn, creditColumn, directorBonusSumColumn); + postValues.ComputeContractEconomyWithVAT(creditVATColumn); + + + return new ManagerResult + { + PostValues = postValues, + PreparedValues = preparedValues, + Columns = new + { + dateColumn, + dateTempColumn, + percentPaymentColumn, + kaskoNmperGrColumn, + finGAPNmperGrColumn, + tlmGrColumn, + gpsGrColumn, + sumColumn, + vatColumn, + sumWithVatColumn, + acceptSumColumn, + acceptKaskoColumn, + acceptOsagoColumn, + acceptInsuranceColumn, + deprecationLpColumn, + deprecationLdColumn, + deprecationColumn, + npvBonusExpensesColumn, + kaskoBonusGrSumColumn, + agentComissionExpensesColumn, + ratExpensesColumn, + transExprensesColumn, + nsibExpensesColumn, + tlmExpensesColumn, + gpsExpensesColumn, + registrExpensesColumn, + insuranceBonusExpensesColumn, + comissionBonusExpensesColumn, + expensesColumn, + evoKaskoNmperGrColumn, + negativeCashflowColumn, + nsibBruttoGrColumn, + taxColumn, + cashflowColumn, + cashflowLeasingColumn, + cashflowMsfoColumn, + cashflowNpvColumn, + npvWeightColumn, + npvColumn, + irrGrColumn, + niColumn, + interestColumn, + cashflowNsibColumn, + revenueColumn, + sumCurrentColumn, + sumCurrentNegativeColumn, + sumCurrentInterestColumn, + sumCurrentTlmColumn, + sumRepaymentColumn, + extraBonusSumColumn, + cashflowMsfoFinalColumn, + cashflowNpvFinalColumn, + npvFinalColumn, + directorBonusSumColumn, + cashflowMsfoFinal2Column, + cashflowNpvFinal2Column, + npvFinal2Column, + sumCreditColumn, + creditColumn, + sumVATCreditColumn, + creditVATColumn, + subsidyExpensesColumn, + vatRecoverableColumn, + creditPaymentColumn, + cashflowMsfoWithCfColumn, + piColumn + } + }; + } + catch (Exception ex) + { + return new ManagerResult + { + Errors = new List + { + ex.Message + } + }; + } + } +} \ 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 1352c66..c7ead1e 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs @@ -21,6 +21,7 @@ using SumColumn = EvoCalculator.Core.Calculation.v3.Columns.SumColumn; using SumCreditColumn = EvoCalculator.Core.Calculation.v3.Columns.SumCreditColumn; using TaxColumn = EvoCalculator.Core.Calculation.v2.Columns.TaxColumn; using TLM_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.TLM_GrColumn; +using ExtraBonusSumColumn = EvoCalculator.Core.Calculation.v3.Columns.ExtraBonusSumColumn; namespace EvoCalculator.Core.Calculation.v3.Managers.Calculation; @@ -122,8 +123,10 @@ public static partial class CalculateManager cashflowMsfoColumn.ComputeValues(); cashflowMsfoColumn.PostCheck(additionalData, constants, requestCalculation.Flags); - var vatColumn = new VATColumn(preparedValues.Nmper + 1); - vatColumn.ComputeValues(new Constants.Calculation(), sumColumn, preparedValues); + postValues.ComputePlanIRRMSFO(cashflowMsfoColumn); + + var vatColumn = new VATColumn(preparedValues.Nmper + 1, new Constants.Calculation()); + vatColumn.ComputeValues(sumColumn, preparedValues); vatColumn.PostCheck(); var acceptSumColumn = new AcceptSumColumn(preparedValues.Nmper + 1); @@ -280,7 +283,7 @@ public static partial class CalculateManager var creditVATColumn = new CreditVATColumn(12 + 4); creditVATColumn.ComputeValues(preparedValues, sumVATCreditColumn); - var vatRecoverableColumn = new VATRecoverableColumn(preparedValues.Nmper + 1, preparedValues); + var vatRecoverableColumn = new VATRecoverableColumn(64, preparedValues); vatRecoverableColumn.ComputeValues(vatColumn); var creditPaymentColumn = new CreditPaymentColumn(preparedValues.LoanRatePeriod + 4); @@ -291,9 +294,9 @@ public static partial class CalculateManager .Max()); cashflowMsfoWithCfColumn.ComputeValues(preparedValues, sumCreditColumn, cashflowMsfoColumn, creditPaymentColumn, vatRecoverableColumn); - - var piColumn = new PIColumn(61); - piColumn.ComputeValues(preparedValues, cashflowMsfoWithCfColumn, cashflowMsfoColumn); + + var piColumn = new PIColumnVT1(61, preparedValues); + piColumn.ComputeValues(cashflowMsfoColumn, cashflowMsfoWithCfColumn); postValues.ComputePriceUP(sumColumn); postValues.ComputePriceUP_PR(); diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs index a53cef4..e64e2b9 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs @@ -21,6 +21,7 @@ using SumColumn = EvoCalculator.Core.Calculation.v3.Columns.SumColumn; using SumCreditColumn = EvoCalculator.Core.Calculation.v3.Columns.SumCreditColumn; using TaxColumn = EvoCalculator.Core.Calculation.v2.Columns.TaxColumn; using TLM_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.TLM_GrColumn; +using ExtraBonusSumColumn = EvoCalculator.Core.Calculation.v3.Columns.ExtraBonusSumColumn; namespace EvoCalculator.Core.Calculation.v3.Managers.Calculation; @@ -116,8 +117,10 @@ public static partial class CalculateManager cashflowMsfoColumn.PostCheck(additionalData); sumColumn.PostCheck(flags); - var vatColumn = new VATColumn(preparedValues.Nmper + 1); - vatColumn.ComputeValues(new Constants.Calculation(), sumColumn, preparedValues); + postValues.ComputePlanIRRMSFO(cashflowMsfoColumn); + + var vatColumn = new VATColumn(preparedValues.Nmper + 1, new Constants.Calculation()); + vatColumn.ComputeValues(sumColumn, preparedValues); vatColumn.PostCheck(); var sumWithVatColumn = @@ -279,7 +282,7 @@ public static partial class CalculateManager var creditVATColumn = new CreditVATColumn(12 + 4); creditVATColumn.ComputeValues(preparedValues, sumVATCreditColumn); - var vatRecoverableColumn = new VATRecoverableColumn(preparedValues.Nmper + 1, preparedValues); + var vatRecoverableColumn = new VATRecoverableColumn(64, preparedValues); vatRecoverableColumn.ComputeValues(vatColumn); var creditPaymentColumn = new CreditPaymentColumn(preparedValues.LoanRatePeriod + 4); @@ -291,8 +294,8 @@ public static partial class CalculateManager cashflowMsfoWithCfColumn.ComputeValues(preparedValues, sumCreditColumn, cashflowMsfoColumn, creditPaymentColumn, vatRecoverableColumn); - var piColumn = new PIColumn(61); - piColumn.ComputeValues(preparedValues, cashflowMsfoWithCfColumn, cashflowMsfoColumn); + var piColumn = new PIColumnVT1(61, preparedValues); + piColumn.ComputeValues(cashflowMsfoColumn, cashflowMsfoWithCfColumn); postValues.ComputePriceUP(sumColumn); postValues.ComputePriceUP_PR(); diff --git a/EvoCalculator.Core.Calculation/v3/PostValues.cs b/EvoCalculator.Core.Calculation/v3/PostValues.cs index 4c92adf..0cad0fd 100644 --- a/EvoCalculator.Core.Calculation/v3/PostValues.cs +++ b/EvoCalculator.Core.Calculation/v3/PostValues.cs @@ -11,6 +11,7 @@ public class PostValues : v2.PostValues public decimal DirectorExtraBonus; public decimal RegionalDirectorBonus; public decimal RegionalDirectorExtraBonus; + public double PlanIRRMSFO; private readonly Constants.Calculation _constants; public PostValues(PreparedValues _preparedValues) : base(_preparedValues) @@ -27,7 +28,7 @@ public class PostValues : v2.PostValues _preparedValues.Registration + _preparedValues.TrackerCost + _preparedValues.TLMCost + _preparedValues.TransportTaxGr + _preparedValues.InsuranceFinGAPNmper) * - (decimal) _preparedValues.Leasing0K + + (decimal)_preparedValues.Leasing0K + _preparedValues.NsibBrutto; } @@ -46,20 +47,20 @@ public class PostValues : v2.PostValues } else { - DirectorBonus = this.BonusBase * (decimal) _preparedValues.DirectorBonus * - (decimal) _preparedValues.BonusCoefficient * - (decimal) _preparedValues.MarketRate * (decimal) _preparedValues.DistrictRate; + 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) + if (cashflowMSFOColumn.Nominal >= this.PlanIRRMSFO && _preparedValues.BonusCoefficient == 1.0) { DirectorExtraBonus = this.BonusBase * - (decimal) (cashflowMSFOColumn.Nominal / _preparedValues.IRR_MSFO_Plan - 1) * - (decimal) _preparedValues.DirectorExtraBonus * (decimal) _preparedValues.MarketRate * - (decimal) _preparedValues.DistrictRate; + (decimal)(cashflowMSFOColumn.Nominal / this.PlanIRRMSFO - 1) * + (decimal)_preparedValues.DirectorExtraBonus * (decimal)_preparedValues.MarketRate * + (decimal)_preparedValues.DistrictRate; if (DirectorExtraBonus < _constants.MinBonus) DirectorExtraBonus = 0; @@ -76,24 +77,31 @@ public class PostValues : v2.PostValues } else { - RegionalDirectorBonus = this.BonusBase * (decimal) _preparedValues.RegionalDirectorBonus * - (decimal) _preparedValues.MarketRate * (decimal) _preparedValues.DistrictRate; + 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) + if (cashflowMSFOColumn.Nominal >= this.PlanIRRMSFO && _preparedValues.BonusCoefficient == 1.0) { RegionalDirectorExtraBonus = this.BonusBase * - (decimal) (cashflowMSFOColumn.Nominal / _preparedValues.IRR_MSFO_Plan - 1) * - (decimal) _preparedValues.RegionalDirectorExtraBonus * - (decimal) _preparedValues.MarketRate * - (decimal) _preparedValues.DistrictRate; + (decimal)(cashflowMSFOColumn.Nominal / this.PlanIRRMSFO - 1) * + (decimal)_preparedValues.RegionalDirectorExtraBonus * + (decimal)_preparedValues.MarketRate * + (decimal)_preparedValues.DistrictRate; if (RegionalDirectorExtraBonus < _constants.MinBonus) RegionalDirectorExtraBonus = 0; } else RegionalDirectorExtraBonus = 0; } + + public void ComputePlanIRRMSFO(BaseColumnWithNominal cashflowMSFOColumn) + { + PlanIRRMSFO = _preparedValues.ChangePlanIRR + ? cashflowMSFOColumn.Nominal * _preparedValues.IRR_MSFO_Plan / _preparedValues.IrrExpected + : _preparedValues.IRR_MSFO_Plan; + } } \ 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 9d3062c..e24f9e9 100644 --- a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs +++ b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedValues.cs @@ -149,6 +149,7 @@ public class PreparedValues public decimal TLMCost { get; set; } public double IRR_MSFO_Plan { get; set; } + public bool ChangePlanIRR { get; set; } = false; public double ExtraBonus { get; set; } public double DirectorBonus { get; set; } public decimal DirectorBonusFix { get; set; } diff --git a/EvoCalculator.Core/Controllers/Calculation/v3/CalculationController.cs b/EvoCalculator.Core/Controllers/Calculation/v3/CalculationController.cs index bb7ad5d..893fc92 100644 --- a/EvoCalculator.Core/Controllers/Calculation/v3/CalculationController.cs +++ b/EvoCalculator.Core/Controllers/Calculation/v3/CalculationController.cs @@ -18,7 +18,8 @@ public class CalculationController : Controller { var result = requestCalculation.preparedValues.CalcType switch { - 100000001 => CalculateManager.CalculateByTotalExpected(requestCalculation), + 100_000_001 => CalculateManager.CalculateByTotalExpected(requestCalculation), + 100_000_099 => CalculateManager.CalculateByPI(requestCalculation), _ => CalculateManager.CalculateDefault(requestCalculation) };