From ecadf1069948fe2ebad525a54d224e846955ef05 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Mon, 4 Mar 2024 14:26:21 +0300 Subject: [PATCH] merge branch release/dyn-3987_early-redemption-sums --- .../v3/Columns/PIColumn/PIColumnVT2.cs | 4 +- .../v3/Columns/SumRepaymentColumn.cs | 123 ++++++++++++++++-- .../v3/Columns/_SumColumnForPI.cs | 50 +++++++ .../v3/Managers/Calculation/CalculateByPI.cs | 9 +- .../Calculation/CalculateByTotalExpected.cs | 17 ++- .../Managers/Calculation/CalculateDefault.cs | 14 +- .../v3/Managers/Calculation/_CalculatePI.cs | 113 ++++++++++++++++ .../Interpolation.cs | 58 +++++++++ .../SumRepaymentColumnVT1.cs | 49 +++---- 9 files changed, 390 insertions(+), 47 deletions(-) create mode 100644 EvoCalculator.Core.Calculation/v3/Columns/_SumColumnForPI.cs create mode 100644 EvoCalculator.Core.Calculation/v3/Managers/Calculation/_CalculatePI.cs create mode 100644 EvoCalculator.Core.FinanceFormulas/Interpolation.cs diff --git a/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs index 4519777..85115c1 100644 --- a/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs +++ b/EvoCalculator.Core.Calculation/v3/Columns/PIColumn/PIColumnVT2.cs @@ -12,7 +12,7 @@ namespace EvoCalculator.Core.Calculation.v3.Columns; public class PIColumnVT2 : BasePIColumn, IColumnWithGoalSeek { private readonly PercentPaymentColumn _percentPaymentColumn; - protected SumColumn _sumColumn; + protected v2.Columns.SumColumn _sumColumn; private CashflowMSFOFinal2Column _cashflowMsfoFinal2Column; private readonly PostValues _postValues; private SumCreditColumn _sumCreditColumn; @@ -26,7 +26,7 @@ public class PIColumnVT2 : BasePIColumn, IColumnWithGoalSeek public PIColumnVT2(int count, PreparedValues preparedValues, CashflowMSFOWithCFColumn cashflowMsfoWithCfColumn, CashflowMSFOFinal2Column cashflowMsfoFinal2Column, PercentPaymentColumn percentPaymentColumn, PostValues postValues, - SumColumn sumColumn, SumCreditColumn sumCreditColumn, CreditPaymentColumn creditPaymentColumn, + v2.Columns.SumColumn sumColumn, SumCreditColumn sumCreditColumn, CreditPaymentColumn creditPaymentColumn, VATRecoverableColumn vatRecoverableColumn, VATColumn vatColumn, SumWithVATColumnVT1 sumWithVatColumn, CreditColumn creditColumn) : base( count, diff --git a/EvoCalculator.Core.Calculation/v3/Columns/SumRepaymentColumn.cs b/EvoCalculator.Core.Calculation/v3/Columns/SumRepaymentColumn.cs index 71aeb11..0ce3e48 100644 --- a/EvoCalculator.Core.Calculation/v3/Columns/SumRepaymentColumn.cs +++ b/EvoCalculator.Core.Calculation/v3/Columns/SumRepaymentColumn.cs @@ -1,15 +1,81 @@ using System; +using System.Linq; using EvoCalculator.Core.Base.Columns; using EvoCalculator.Core.Calculation.v1.Columns; -using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using EvoCalculator.Core.Calculation.v2.Columns; +using EvoCalculator.Core.Calculation.v3.Managers.Calculation; +using EvoCalculator.Core.FinanceFormulas; +using EvoCalculator.Core.Models.Calculation.Models.Request; using EvoCalculator.Core.Tools.Check; +using GPS_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.GPS_GrColumn; +using NPVBonusExpensesColumn = EvoCalculator.Core.Calculation.v2.Columns.NPVBonusExpensesColumn; +using TLM_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.TLM_GrColumn; namespace EvoCalculator.Core.Calculation.v3.Columns; public class SumRepaymentColumn : BaseColumn { - public SumRepaymentColumn(int count) : base(count) + private RequestCalculation _requestCalculation; + private v3.PostValues _postValues; + private Constants.Calculation _calculation; + private BaseColumn _sumColumnOriginal; + private BaseColumn _piColumnOriginal; + + private DateTempColumn dateTempColumnCut; + private TLM_GrColumn tlmGrColumnCut; + private PercentPaymentColumn percentPaymentColumnCut; + private GPS_GrColumn gpsGrColumnCut; + private NPVBonusExpensesColumn npvBonusExpensesColumnCut; + private AgentComissionExpensesColumn agentComissionExpensesColumnCut; + private NegativeCashflowColumn negativeCashflowColumnCut; + private NSIBBruttoGrColumn nsibBruttoGrColumnCut; + private SubsidyExpensesColumn subsidyExpensesColumnCut; + private ExtraBonusSumColumn extraBonusSumColumnCut; + private DirectorBonusSumColumn directorBonusSumColumnCut; + private SumCurrentColumn sumCurrentColumnCut; + private SumCurrentNegativeColumn sumCurrentNegativeColumnCut; + private SumCurrentTLMColumn sumCurrentTlmColumnCut; + private SumCurrentInterestColumn sumCurrentInterestColumnCut; + public CalculatePiResult _calculatePiResult { get; set; } + + + public decimal PI { get; set; } + public decimal[] OldValues { get; set; } + public decimal[] NewValues { get; set; } + + public SumRepaymentColumn(int count, PostValues postValues, RequestCalculation requestCalculation, + Constants.Calculation calculation, + BaseColumn sumColumnOriginal, BaseColumn piColumnOriginal, DateTempColumn dateTempColumnCut, + TLM_GrColumn tlmGrColumnCut, PercentPaymentColumn percentPaymentColumnCut, GPS_GrColumn gpsGrColumnCut, + NPVBonusExpensesColumn npvBonusExpensesColumnCut, AgentComissionExpensesColumn agentComissionExpensesColumnCut, + NegativeCashflowColumn negativeCashflowColumnCut, NSIBBruttoGrColumn nsibBruttoGrColumnCut, + SubsidyExpensesColumn subsidyExpensesColumnCut, ExtraBonusSumColumn extraBonusSumColumnCut, + DirectorBonusSumColumn directorBonusSumColumnCut, SumCurrentColumn sumCurrentColumnCut, + SumCurrentNegativeColumn sumCurrentNegativeColumnCut, SumCurrentTLMColumn sumCurrentTlmColumnCut, + SumCurrentInterestColumn sumCurrentInterestColumnCut) : base(count) { + _postValues = postValues; + _requestCalculation = requestCalculation; + _calculation = calculation; + _sumColumnOriginal = sumColumnOriginal; + _piColumnOriginal = piColumnOriginal; + this.dateTempColumnCut = dateTempColumnCut; + this.tlmGrColumnCut = tlmGrColumnCut; + this.percentPaymentColumnCut = percentPaymentColumnCut; + this.gpsGrColumnCut = gpsGrColumnCut; + this.npvBonusExpensesColumnCut = npvBonusExpensesColumnCut; + this.agentComissionExpensesColumnCut = agentComissionExpensesColumnCut; + this.negativeCashflowColumnCut = negativeCashflowColumnCut; + this.nsibBruttoGrColumnCut = nsibBruttoGrColumnCut; + this.subsidyExpensesColumnCut = subsidyExpensesColumnCut; + this.extraBonusSumColumnCut = extraBonusSumColumnCut; + this.directorBonusSumColumnCut = directorBonusSumColumnCut; + this.sumCurrentColumnCut = sumCurrentColumnCut; + this.sumCurrentNegativeColumnCut = sumCurrentNegativeColumnCut; + this.sumCurrentTlmColumnCut = sumCurrentTlmColumnCut; + this.sumCurrentInterestColumnCut = sumCurrentInterestColumnCut; + OldValues = new decimal[count]; + NewValues = new decimal[count]; } public void PostCheck() @@ -17,20 +83,57 @@ public class SumRepaymentColumn : BaseColumn new CheckTools().CheckColumnForLessThanZeroValue(Values); } - public void ComputeValues(Constants.Calculation calculation, PreparedValues preparedValues, - SumCurrentColumn sumCurrentColumn, SumCurrentNegativeColumn sumCurrentNegativeColumn, + + public void ComputeValues(SumCurrentColumn sumCurrentColumn, SumCurrentNegativeColumn sumCurrentNegativeColumn, SumCurrentInterestColumn sumCurrentInterestColumn, SumCurrentTLMColumn sumCurrentTlmColumn) { for (var i = 7; i < Values.Length; i++) - if (preparedValues.DogDate >= new DateTime(2023, 08, 01) - && preparedValues.Nmper >= 40 + if (_requestCalculation.preparedValues.DogDate >= new DateTime(2023, 08, 01) + && _requestCalculation.preparedValues.Nmper >= 40 && i <= 24) Values[i] = sumCurrentColumn.Values[i] + sumCurrentNegativeColumn.Values[i] - - sumCurrentTlmColumn.Values[i] * (1 + (decimal)calculation.VatValue); + sumCurrentTlmColumn.Values[i] * (1 + (decimal)_calculation.VatValue); else Values[i] = sumCurrentColumn.Values[i] + sumCurrentNegativeColumn.Values[i] - - sumCurrentTlmColumn.Values[i] * (1 + (decimal)calculation.VatValue) - - sumCurrentInterestColumn.Values[i] * (1 + (decimal)calculation.VatValue) * - (decimal)preparedValues.Repayment; + sumCurrentTlmColumn.Values[i] * (1 + (decimal)_calculation.VatValue) - + sumCurrentInterestColumn.Values[i] * (1 + (decimal)_calculation.VatValue) * + (decimal)_requestCalculation.preparedValues.Repayment; + + for (var i = 0; i < Values.Length; i++) + { + OldValues[i] = Values[i]; + } + + + if (_requestCalculation.preparedValues.TypeRepayment == 100_000_000) + { + _calculatePiResult = new _CalculatePI().Calculate(_requestCalculation, _postValues, 7, + dateTempColumnCut, + _sumColumnOriginal, + tlmGrColumnCut, percentPaymentColumnCut, gpsGrColumnCut, npvBonusExpensesColumnCut, + agentComissionExpensesColumnCut, negativeCashflowColumnCut, nsibBruttoGrColumnCut, + subsidyExpensesColumnCut, + extraBonusSumColumnCut, directorBonusSumColumnCut, sumCurrentColumnCut, sumCurrentNegativeColumnCut, + sumCurrentTlmColumnCut, sumCurrentInterestColumnCut); + + PI = _calculatePiResult.piColumn.GetValue(0); + + + var interpolation = new Interpolation(PI); + + for (var i = 7; i < Values.Length; i++) + NewValues[i] = sumCurrentColumn.Values[i] + sumCurrentNegativeColumn.Values[i] - + sumCurrentTlmColumn.Values[i] * (1 + (decimal)_calculation.VatValue) - + sumCurrentInterestColumn.Values[i] * (1 + (decimal)_calculation.VatValue) * + (interpolation.Interpolate(i) / 100); + + + for (var i = 0; i < Values.Length; i++) + { + Values[i] = Math.Min(OldValues[i], NewValues[i]); + } + + Values = Values.Select(x => x < 0 ? 0 : x).ToArray(); + } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Columns/_SumColumnForPI.cs b/EvoCalculator.Core.Calculation/v3/Columns/_SumColumnForPI.cs new file mode 100644 index 0000000..4b139a2 --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Columns/_SumColumnForPI.cs @@ -0,0 +1,50 @@ +using System; +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Calculation.v1.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.v3.Columns; + +public class _SumColumnForPI : SumColumn +{ + private int Nmper; + private Constants.Calculation _calculation; + private BaseColumn _sumColumnOriginal; + private BaseColumn _sumCurrentColumn; + private BaseColumn _sumCurrentNegativeColumn; + private BaseColumn _sumCurrentTlmColumn; + private BaseColumn _sumCurrentInterestColumn; + + + public _SumColumnForPI(int count, BaseColumn dateTempColumn, PreparedValues preparedValues, + PercentPaymentColumn percentPaymentColumn, v1.PostValues postValues, BaseColumn nsibBruttoGrColumn, + PreparedPayments preparedPayments, Constants.Calculation calculation, BaseColumn sumColumnOriginal, + BaseColumn sumCurrentColumn, BaseColumn sumCurrentNegativeColumn, + BaseColumn sumCurrentTlmColumn, BaseColumn sumCurrentInterestColumn) : base(count, + dateTempColumn, preparedValues, percentPaymentColumn, postValues, nsibBruttoGrColumn, preparedPayments) + { + Nmper = count; + _calculation = calculation; + _sumColumnOriginal = sumColumnOriginal; + _sumCurrentColumn = sumCurrentColumn; + _sumCurrentNegativeColumn = sumCurrentNegativeColumn; + _sumCurrentTlmColumn = sumCurrentTlmColumn; + _sumCurrentInterestColumn = sumCurrentInterestColumn; + } + + public void ComputeValues() + { + Values[0] = -_postValues.BaseCost - _preparedValues.FuelCardSum; + Values[1] = _preparedValues.FirstPaymentSum; + + for (var i = 2; i < Nmper; i++) + Values[i] = _sumColumnOriginal.GetValue(i); + + var constants = new Constants.Calculation(); + + Values[^1] = (_sumCurrentColumn.Values[Nmper - 1] + _sumCurrentNegativeColumn.Values[Nmper - 1] - + _sumCurrentTlmColumn.Values[Nmper - 1] * (1 + (decimal)_calculation.VatValue) - + _sumCurrentInterestColumn.Values[Nmper - 1] * (1 + (decimal)_calculation.VatValue) * + 0.63m) / (1 + (decimal)constants.VatValue); + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs index bb0c6ad..9abf3df 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByPI.cs @@ -263,8 +263,13 @@ public static partial class CalculateManager var sumCurrentTlmColumn = new SumCurrentTLMColumn(preparedValues.Nmper + 1); sumCurrentTlmColumn.ComputeValues(tlmGrColumn); - var sumRepaymentColumn = new SumRepaymentColumn(preparedValues.Nmper + 1); - sumRepaymentColumn.ComputeValues(constants, preparedValues, sumCurrentColumn, sumCurrentNegativeColumn, + var sumRepaymentColumn = + new SumRepaymentColumn(preparedValues.Nmper + 1, postValues, requestCalculation, constants, sumColumn, piColumn, + dateTempColumn, tlmGrColumn, percentPaymentColumn, gpsGrColumn, npvBonusExpensesColumn, + agentComissionExpensesColumn, negativeCashflowColumn, nsibBruttoGrColumn, subsidyExpensesColumn, + extraBonusSumColumn, directorBonusSumColumn, sumCurrentColumn, sumCurrentNegativeColumn, + sumCurrentTlmColumn, sumCurrentInterestColumn); + sumRepaymentColumn.ComputeValues(sumCurrentColumn, sumCurrentNegativeColumn, sumCurrentInterestColumn, sumCurrentTlmColumn); sumRepaymentColumn.PostCheck(); diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs index 4d2317c..6f2fe0b 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateByTotalExpected.cs @@ -35,7 +35,7 @@ public static partial class CalculateManager var flags = requestCalculation.Flags; new Validation().ValidateRequest(requestCalculation); - + var constants = new Constants.Calculation(); @@ -235,11 +235,6 @@ public static partial class CalculateManager 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(); - var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); @@ -298,6 +293,16 @@ public static partial class CalculateManager var piColumn = new PIColumnVT1(61, preparedValues); piColumn.ComputeValues(cashflowMsfoFinal2Column, cashflowMsfoWithCfColumn); + var sumRepaymentColumn = + new SumRepaymentColumn(preparedValues.Nmper + 1, postValues, requestCalculation, constants, sumColumn, piColumn, + dateTempColumn, tlmGrColumn, percentPaymentColumn, gpsGrColumn, npvBonusExpensesColumn, + agentComissionExpensesColumn, negativeCashflowColumn, nsibBruttoGrColumn, subsidyExpensesColumn, + extraBonusSumColumn, directorBonusSumColumn, sumCurrentColumn, sumCurrentNegativeColumn, + sumCurrentTlmColumn, sumCurrentInterestColumn); + sumRepaymentColumn.ComputeValues(sumCurrentColumn, sumCurrentNegativeColumn, + sumCurrentInterestColumn, sumCurrentTlmColumn); + sumRepaymentColumn.PostCheck(); + postValues.ComputePriceUP(sumColumn); postValues.ComputePriceUP_PR(); postValues.ComputePriceUP_Year(); diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs index c91d79f..e4b4879 100644 --- a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/CalculateDefault.cs @@ -234,10 +234,6 @@ public static partial class CalculateManager 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(); var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn, postValues, constants); @@ -297,6 +293,16 @@ public static partial class CalculateManager var piColumn = new PIColumnVT1(61, preparedValues); piColumn.ComputeValues(cashflowMsfoFinal2Column, cashflowMsfoWithCfColumn); + var sumRepaymentColumn = + new SumRepaymentColumn(preparedValues.Nmper + 1, postValues, requestCalculation, constants, sumColumn, piColumn, + dateTempColumn, tlmGrColumn, percentPaymentColumn, gpsGrColumn, npvBonusExpensesColumn, + agentComissionExpensesColumn, negativeCashflowColumn, nsibBruttoGrColumn, subsidyExpensesColumn, + extraBonusSumColumn, directorBonusSumColumn, sumCurrentColumn, sumCurrentNegativeColumn, + sumCurrentTlmColumn,sumCurrentInterestColumn); + sumRepaymentColumn.ComputeValues(sumCurrentColumn, sumCurrentNegativeColumn, + sumCurrentInterestColumn, sumCurrentTlmColumn); + sumRepaymentColumn.PostCheck(); + postValues.ComputePriceUP(sumColumn); postValues.ComputePriceUP_PR(); postValues.ComputePriceUP_Year(); diff --git a/EvoCalculator.Core.Calculation/v3/Managers/Calculation/_CalculatePI.cs b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/_CalculatePI.cs new file mode 100644 index 0000000..241e0db --- /dev/null +++ b/EvoCalculator.Core.Calculation/v3/Managers/Calculation/_CalculatePI.cs @@ -0,0 +1,113 @@ +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Calculation.v1.Columns; +using EvoCalculator.Core.Calculation.v2.Columns; +using EvoCalculator.Core.Calculation.v3.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Request; +using CashflowMSFOColumnVT2 = EvoCalculator.Core.Calculation.v2.Columns.CashflowMSFOColumnVT2; +using DirectorBonusSumColumn = EvoCalculator.Core.Calculation.v3.Columns.DirectorBonusSumColumn; +using GPS_GrColumn = EvoCalculator.Core.Calculation.v2.Columns.GPS_GrColumn; +using NegativeCashflowColumn = EvoCalculator.Core.Calculation.v3.Columns.NegativeCashflowColumn; +using NPVBonusExpensesColumn = EvoCalculator.Core.Calculation.v2.Columns.NPVBonusExpensesColumn; +using SumCreditColumn = EvoCalculator.Core.Calculation.v3.Columns.SumCreditColumn; +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 class CalculatePiResult +{ + public PIColumnVT1 piColumn { get; set; } + public _SumColumnForPI sumColumnForPI { get; set; } +} + +public class _CalculatePI +{ + public CalculatePiResult Calculate(RequestCalculation requestCalculation + , PostValues postValues + , int Nmper + , DateTempColumn dateTempColumnCut + , BaseColumn sumColumnOriginal + , TLM_GrColumn tlmGrColumnCut + , PercentPaymentColumn percentPaymentColumnCut + , GPS_GrColumn gpsGrColumnCut + , NPVBonusExpensesColumn npvBonusExpensesColumnCut + , AgentComissionExpensesColumn agentComissionExpensesColumnCut + , NegativeCashflowColumn negativeCashflowColumnCut + , NSIBBruttoGrColumn nsibBruttoGrColumnCut + , SubsidyExpensesColumn subsidyExpensesColumnCut + , ExtraBonusSumColumn extraBonusSumColumnCut + , DirectorBonusSumColumn directorBonusSumColumnCut + , SumCurrentColumn sumCurrentColumnCut + , SumCurrentNegativeColumn sumCurrentNegativeColumnCut + , SumCurrentTLMColumn sumCurrentTlmColumnCut + , SumCurrentInterestColumn sumCurrentInterestColumnCut) + { + var preparedValues = requestCalculation.preparedValues; + var preparedPayments = requestCalculation.preparedPayments; + + var constants = new Constants.Calculation(); + + + var sumColumnForPI = new _SumColumnForPI( + Nmper + 1 + , dateTempColumnCut + , preparedValues + , percentPaymentColumnCut + , postValues + , nsibBruttoGrColumnCut + , preparedPayments + , constants + , sumColumnOriginal + , sumCurrentColumnCut + , sumCurrentNegativeColumnCut + , sumCurrentTlmColumnCut + , sumCurrentInterestColumnCut + ); + sumColumnForPI.ComputeValues(); + + var cashflowMsfoColumn = new CashflowMSFOColumnVT2(Nmper + 1, dateTempColumnCut, postValues, + preparedValues, percentPaymentColumnCut, sumColumnForPI, negativeCashflowColumnCut, nsibBruttoGrColumnCut, + tlmGrColumnCut, gpsGrColumnCut, npvBonusExpensesColumnCut, agentComissionExpensesColumnCut, + subsidyExpensesColumnCut); + cashflowMsfoColumn.ComputeValues(); + + var vatColumn = new VATColumn(Nmper + 1, new Constants.Calculation()); + vatColumn.ComputeValues(sumColumnForPI, preparedValues); + + var sumWithVatColumn = + new SumWithVATColumnVT1(Nmper + 1, sumColumnForPI, preparedValues, constants); + sumWithVatColumn.ComputeValues(); + + var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(Nmper + 1, dateTempColumnCut); + cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumnCut); + + var cashflowMsfoFinal2Column = new CashflowMSFOFinal2Column(Nmper + 1, dateTempColumnCut, + preparedValues, directorBonusSumColumnCut, cashflowMsfoFinalColumn); + cashflowMsfoFinal2Column.ComputeValues(); + + var sumCreditColumn = new SumCreditColumn(Nmper + 1); + sumCreditColumn.ComputeValues(preparedValues, sumWithVatColumn); + + var creditColumn = new CreditColumn(Nmper + 4); + creditColumn.ComputeValues(preparedValues, sumCreditColumn); + + var vatRecoverableColumn = new VATRecoverableColumn(64, preparedValues); + vatRecoverableColumn.ComputeValues(vatColumn); + + var creditPaymentColumn = new CreditPaymentColumn(Nmper + 4); + creditPaymentColumn.ComputeValues(preparedValues, sumCreditColumn, creditColumn); + + var cashflowMsfoWithCfColumn = new CashflowMSFOWithCFColumn(Nmper + 4); + cashflowMsfoWithCfColumn.ComputeValues(preparedValues, sumCreditColumn, cashflowMsfoFinal2Column, + creditPaymentColumn, vatRecoverableColumn); + + var piColumn = new PIColumnVT1(61, preparedValues); + piColumn.ComputeValues(cashflowMsfoFinal2Column, cashflowMsfoWithCfColumn); + + return new CalculatePiResult + { + piColumn = piColumn, + sumColumnForPI = sumColumnForPI + }; + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.FinanceFormulas/Interpolation.cs b/EvoCalculator.Core.FinanceFormulas/Interpolation.cs new file mode 100644 index 0000000..bb59faa --- /dev/null +++ b/EvoCalculator.Core.FinanceFormulas/Interpolation.cs @@ -0,0 +1,58 @@ +namespace EvoCalculator.Core.FinanceFormulas; + +public class Interpolation +{ + private int[] values1 = { 7, 13, 24, 36, 48, 60 }; + private int[] percentages1 = { 65, 56, 45, 35, 31, 0 }; + private int[] percentages2 = { 45, 37, 32, 26, 11, 0 }; + private int[] percentages3 = { 35, 30, 27, 24, 10, 0 }; + + private int[] values; + private int[] percentages; + + public Interpolation(decimal PI) + { + switch (PI) + { + case >= 0.06m: + values = values1; + percentages = percentages1; + break; + case >= 0.03m and < 0.06m: + values = values1; + percentages = percentages2; + break; + default: + values = values1; + percentages = percentages3; + break; + } + } + + public decimal Interpolate(decimal targetValue) + { + var lowerValue = values[0]; + var lowerPercentage = percentages[0]; + var higherValue = values[0]; + var higherPercentage = percentages[0]; + + for (var i = 1; i < values.Length; i++) + { + if (values1[i] <= targetValue) + { + lowerValue = values[i]; + lowerPercentage = percentages[i]; + } + else + { + higherValue = values[i]; + higherPercentage = percentages[i]; + break; + } + } + + var percentage = lowerPercentage + (higherPercentage - lowerPercentage) * (targetValue - lowerValue) / + (higherValue - lowerValue); + return percentage; + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumRepaymentColumn/SumRepaymentColumnVT1.cs b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumRepaymentColumn/SumRepaymentColumnVT1.cs index 3ea5843..4156567 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumRepaymentColumn/SumRepaymentColumnVT1.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumRepaymentColumn/SumRepaymentColumnVT1.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.FinanceFormulas; using EvoCalculator.Core.Models.PostCalculation.Models.Prepared; using EvoCalculator.Core.Models.PostCalculation.Models.Prepared.PreparedTables; using EvoCalculator.Core.PostCalculation.v1; @@ -31,6 +32,7 @@ public class SumRepaymentColumnVT1 : BaseSumRepaymentColumn .Take(preparedValues.EditPaymentNumber - 2) .Select(x => x.RepaymentPayment); + var interpolation = new Interpolation((decimal)preparedValues.PI); var secondPart = GroupColumns.SumToMainGroup( new SumRules() @@ -39,36 +41,37 @@ public class SumRepaymentColumnVT1 : BaseSumRepaymentColumn , GroupColumns.Create(nextDateTempColumn.GetValues(1), nextSumCurrentColumn.GetValues(1)) , GroupColumns.Create(nextDateTempColumn.GetValues(1), nextSumCurrentNegativeColumn.GetValues(1).Select(x => -x).ToArray()) - , GroupColumns.Create(nextDateTempColumn.GetValues(1), - nextSumCurrentTlmColumn.GetValues(1) - .Select(x => -x * (1 + (decimal)constants.VatValue))) + , GroupColumns.Create(nextDateTempColumn.GetValues(1), nextSumCurrentTlmColumn.GetValues(1) + .Select(x => -x * (1 + (decimal)constants.VatValue))) , GroupColumns.Create(nextCashflowMsfoForNiColumn.Dates.Skip(1), nextSumCurrentInterestColumn .GetValues(1) - .Select(x => -x * (1 + (decimal)constants.VatValue) * (decimal)preparedValues.Repayment)) + .Select((x, i) => -x * (1 + (decimal)constants.VatValue) + * (preparedValues.TypeRepayment == 100_000_000 + ? interpolation.Interpolate(i) / 100 + : (decimal)preparedValues.Repayment))) ); - - if (preparedValues.DogDate >= new DateTime(2023, 08, 01) - && nextValues.Nmper >= 40) - { - var secondPartWithoutDiscount = GroupColumns.SumToMainGroup( - new SumRules() - , GroupColumns.Create(nextDateTempColumn.GetValues(1), - ArraySegment.Empty) - , GroupColumns.Create(nextDateTempColumn.GetValues(1), nextSumCurrentColumn.GetValues(1)) - , GroupColumns.Create(nextDateTempColumn.GetValues(1), - nextSumCurrentNegativeColumn.GetValues(1).Select(x => -x).ToArray()) - , GroupColumns.Create(nextDateTempColumn.GetValues(1), - nextSumCurrentTlmColumn.GetValues(1) + if (preparedValues.TypeRepayment != 100_000_000) + if (preparedValues.DogDate >= new DateTime(2023, 08, 01) + && nextValues.Nmper >= 40) + { + var secondPartWithoutDiscount = GroupColumns.SumToMainGroup( + new SumRules() + , GroupColumns.Create(nextDateTempColumn.GetValues(1), + ArraySegment.Empty) + , GroupColumns.Create(nextDateTempColumn.GetValues(1), nextSumCurrentColumn.GetValues(1)) + , GroupColumns.Create(nextDateTempColumn.GetValues(1), + nextSumCurrentNegativeColumn.GetValues(1).Select(x => -x).ToArray()) + , GroupColumns.Create(nextDateTempColumn.GetValues(1), nextSumCurrentTlmColumn.GetValues(1) .Select(x => -x * (1 + (decimal)constants.VatValue))) - ); + ); - // поправочка на то, что у GroupColumns нет "нулевого" значения - const int THRESHOLD = 1; + // поправочка на то, что у GroupColumns нет "нулевого" значения + const int THRESHOLD = 1; - for (var i = 7 - THRESHOLD; i <= 24 - THRESHOLD; i++) - secondPart[i] = secondPartWithoutDiscount[i]; - } + for (var i = 7 - THRESHOLD; i <= 24 - THRESHOLD; i++) + secondPart[i] = secondPartWithoutDiscount[i]; + } Values = Array.Concat(