diff --git a/EvoCalculator.Core.PostCalculation/v1/Columns/Current/SumColumn.cs b/EvoCalculator.Core.PostCalculation/v1/Columns/Current/SumColumn.cs index a3e3545..fd64d46 100644 --- a/EvoCalculator.Core.PostCalculation/v1/Columns/Current/SumColumn.cs +++ b/EvoCalculator.Core.PostCalculation/v1/Columns/Current/SumColumn.cs @@ -8,7 +8,7 @@ using EvoCalculator.Core.Tools.Array; namespace EvoCalculator.Core.PostCalculation.v1.Columns.Current; -public class SumColumn : BaseColumnWithXIRR +public class SumColumn : BaseColumnWithNominal { private BaseColumn _dateTempColumn; diff --git a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumColumn/SumColumnVT3.cs b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumColumn/SumColumnVT3.cs index 202a78f..9ae5c74 100644 --- a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumColumn/SumColumnVT3.cs +++ b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumColumn/SumColumnVT3.cs @@ -35,10 +35,10 @@ public class SumColumnVT3 : BaseSumColumn else if (i == _preparedValues.EditPaymentNumber) { if (_preparedValues.ChangeRepayment && _preparedValues.Repayment > 0) - Values[i] = techNextSumRepaymentColumn.GetValue(i) / (decimal) (1 + _constants.VatValue); + Values[i] = techNextSumRepaymentColumn.GetValue(i) / (decimal)(1 + _constants.VatValue); else - Values[i] = _preparedValues.SumRepayment / - (decimal) (1 + _constants.VatValue); + Values[i] = Math.Round(_preparedValues.SumRepayment / + (decimal)(1 + _constants.VatValue), 2); if (_preparedValues.LastPaymentFix) // вычитает последний платеж из того что посчитали выше diff --git a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumWithVATColumn/BaseSumWithVATColumn.cs b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumWithVATColumn/BaseSumWithVATColumn.cs index d708fe9..9fdcca8 100644 --- a/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumWithVATColumn/BaseSumWithVATColumn.cs +++ b/EvoCalculator.Core.PostCalculation/v1/Columns/Next/SumWithVATColumn/BaseSumWithVATColumn.cs @@ -28,7 +28,7 @@ public class BaseSumWithVATColumn : BaseColumnWithSum protected void FillValues() { Values[1] = _currentTablePayments[0].SumWithVATPayment + - _preparedValues.SubsidySum * (decimal) (1 + _constants.VatValue); + _preparedValues.SubsidySum * (decimal)(1 + _constants.VatValue); for (var i = 2; i < Values.Length; i++) if (i < _preparedValues.EditPaymentNumber) @@ -38,6 +38,24 @@ public class BaseSumWithVATColumn : BaseColumnWithSum Values[0] = Sum; } + + /** + * Приведение копеек под сумму досрочки в графике ДЛ + */ + public void FixValues() + { + if (_preparedValues.LastPaymentFix == false) + { + var difference = _preparedValues.SumRepayment - Values[_preparedValues.EditPaymentNumber]; + if (difference != 0.0m) + { + _nextVatColumnVt1.Values[_preparedValues.EditPaymentNumber] += difference; + Values[_preparedValues.EditPaymentNumber] = + _nextSumColumn.Values[_preparedValues.EditPaymentNumber] + + _nextVatColumnVt1.Values[_preparedValues.EditPaymentNumber]; + } + } + } public void PostCheck() { diff --git a/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/BaseSumIRRColumn.cs b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/BaseSumIRRColumn.cs new file mode 100644 index 0000000..c0dd08b --- /dev/null +++ b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/BaseSumIRRColumn.cs @@ -0,0 +1,11 @@ +using System; +using EvoCalculator.Core.Base.Columns; + +namespace EvoCalculator.Core.PostCalculation.v2.Columns.Next; + +public class BaseSumIRRColumn : BaseColumnWithNominal +{ + protected BaseSumIRRColumn(int count, BaseColumn dateTempColumn) : base(count, dateTempColumn) + { + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn.cs b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/SumIRRColumnVT1.cs similarity index 96% rename from EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn.cs rename to EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/SumIRRColumnVT1.cs index a95297f..025341f 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/SumIRRColumnVT1.cs @@ -10,7 +10,7 @@ using TridentGoalSeek; namespace EvoCalculator.Core.PostCalculation.v2.Columns.Next { - public class SumIRRColumn : BaseColumnWithXIRR, IGoalSeekAlgorithm + public class SumIRRColumnVT1 : BaseSumIRRColumn, IGoalSeekAlgorithm { protected readonly NextValues _nextValues; protected readonly PreparedValues _preparedValues; @@ -20,7 +20,7 @@ namespace EvoCalculator.Core.PostCalculation.v2.Columns.Next protected readonly BaseColumn _currentDateTempColumn; protected readonly TableInsuranceRow[] _nextTableInsurance; - public SumIRRColumn(int count, BaseColumn dateTempColumn, BaseColumn currentDateTempColumn, + public SumIRRColumnVT1(int count, BaseColumn dateTempColumn, BaseColumn currentDateTempColumn, PreparedValues preparedValues, NextValues nextValues, TablePaymentsRow[] currentTablePayments, TableInsuranceRow[] nextTableInsurance, BaseSumColumn sumColumn diff --git a/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/SumIRRColumnVT2.cs b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/SumIRRColumnVT2.cs new file mode 100644 index 0000000..7de70ce --- /dev/null +++ b/EvoCalculator.Core.PostCalculation/v2/Columns/Next/SumIRRColumn/SumIRRColumnVT2.cs @@ -0,0 +1,145 @@ +using System; +using System.Linq; +using EvoCalculator.Core.Base.Columns; +using EvoCalculator.Core.Models.PostCalculation.Models.Prepared; +using EvoCalculator.Core.Models.PostCalculation.Models.Prepared.PreparedTables; +using EvoCalculator.Core.PostCalculation.v1; +using EvoCalculator.Core.PostCalculation.v1.Columns.Current; +using EvoCalculator.Core.PostCalculation.v1.Columns.Next; +using EvoCalculator.Core.Tools.Array; +using TridentGoalSeek; +using DateTempColumn = EvoCalculator.Core.PostCalculation.v1.Columns.Next.DateTempColumn; + +namespace EvoCalculator.Core.PostCalculation.v2.Columns.Next +{ + public class SumIRRColumnVT2 : BaseSumIRRColumn, IGoalSeekAlgorithm + { + protected readonly NextValues _nextValues; + protected readonly PreparedValues _preparedValues; + protected readonly BaseSumColumn _sumColumn; + protected readonly TablePaymentsRow[] _currentTablePayments; + protected readonly BaseColumn _dateTempColumn; + protected readonly BaseColumn _currentDateTempColumn; + protected readonly TableInsuranceRow[] _nextTableInsurance; + protected readonly BaseColumnWithNominal _currentSumColumn; + + public SumIRRColumnVT2(int count, BaseColumn dateTempColumn, + BaseColumn currentDateTempColumn, + PreparedValues preparedValues, + NextValues nextValues, TablePaymentsRow[] currentTablePayments, + TableInsuranceRow[] nextTableInsurance, BaseSumColumn sumColumn, SumColumn currentSumColumn) : base(count, + dateTempColumn) + { + _dateTempColumn = dateTempColumn; + _preparedValues = preparedValues; + _nextValues = nextValues; + _currentTablePayments = currentTablePayments; + _nextTableInsurance = nextTableInsurance; + _sumColumn = sumColumn; + _currentDateTempColumn = currentDateTempColumn; + _currentSumColumn = currentSumColumn; + } + + private void FillValues() + { + var costInsurances = Array.Empty(); + + if (_nextTableInsurance != null) + { + costInsurances = _nextTableInsurance + .Where(ins => + ins.PeriodNumberInsurance > 1 + && (ins.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO") + ) + .OrderBy(x => x.TypeRiskInsurance) + .Select(x => -(x.CostInsurance + x.InsuranceBonusLoss)) + .ToArray(); + } + + + var dateStartPeriodInsurances = Array.Empty(); + + if (_nextTableInsurance != null) + { + dateStartPeriodInsurances = _nextTableInsurance + .Where(ins => + ins.PeriodNumberInsurance > 1 + && (ins.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO") + ) + .OrderBy(x => x.TypeRiskInsurance) + .Select(x => x.DateStartPeriodInsurance) + .ToArray(); + } + + var lastDateTempValue = _dateTempColumn.Values.Last(); + var lastCurrentDateTempValue = _currentDateTempColumn.Values.Last(); + var evoKasko = _nextTableInsurance.FirstOrDefault(x => x.TypeRiskInsurance == "EvoKASKO"); + var evoKaskoSum = 0m; + var evoKaskoDate = DateTime.MinValue; + + if (evoKasko != null && + new DateTime(lastDateTempValue.Year, lastDateTempValue.Month, 1) > + new DateTime(lastCurrentDateTempValue.Year, lastCurrentDateTempValue.Month, 1)) + { + evoKaskoSum = -((evoKasko.CostInsurance + evoKasko.InsuranceBonusLoss) / 12) * + ((lastDateTempValue.Year - lastCurrentDateTempValue.Year) * 12 + + lastDateTempValue.Month - lastCurrentDateTempValue.Month); + Values = Values.Append(evoKaskoSum).ToArray(); + evoKaskoDate = _currentDateTempColumn.Values.Last().AddDays(1); + Dates = Dates.Append(evoKaskoDate).ToArray(); + } + + + var xnpvValues = Array.Concat( + new[] { 0m, }, + _sumColumn.GetValues(_preparedValues.EditPaymentNumber), + costInsurances, + new[] { evoKaskoSum } + ); + + var xnpvDates = Array.Concat( + new[] { _dateTempColumn.GetValue(_preparedValues.EditPaymentNumber - 1) }, + _dateTempColumn.GetValues(_preparedValues.EditPaymentNumber), + dateStartPeriodInsurances, + new[] { evoKaskoDate } + ); + var xnpvColumn = + new BaseColumnWithXNPV(0, new DateTempColumn(0) { Values = xnpvDates }, _currentSumColumn.IRR) + { + Values = xnpvValues + }; + + Values = Array.Concat( + new[] { -xnpvColumn.XNPV }, + _sumColumn.Values.Skip(_preparedValues.EditPaymentNumber), + costInsurances, + new[] { evoKaskoSum } + ); + + Dates = xnpvDates; + } + + public decimal Calculate(decimal inputVariable) + { + _sumColumn.ComputeValues(inputVariable); + FillValues(); + return (decimal)IRR; + } + + public void ComputeValues(decimal requiredValue) + { + var goalSeek = new GoalSeek(this); + + // Чтобы IRR не получился меньше заданного + goalSeek.SeekResult(requiredValue + 0.00001m, + new GoalSeekOptions( + startingStabPoint: + (_nextValues.BaseCost - _currentTablePayments[0].SumPayment) / + (_preparedValues.Nmper.Next - 1), + maximumAttempts: 1000, + initialTineSpacing: 100 + // , focusPercentage: 50 + )); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRAndSum.cs b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRAndSum.cs index 3669330..0426054 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRAndSum.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRAndSum.cs @@ -83,7 +83,7 @@ public static partial class CalculateManager var techNextSumColumn = new SumColumnVT2(preparedValues.Nmper.Next + 1, techNextDateTempColumn, preparedValues, nextValues, currentTablePayments, nextTablePayments); - var techSumIRRColumn = new SumIRRColumn(0, techNextDateTempColumn, currentDateTempColumn, preparedValues, + var techSumIRRColumn = new SumIRRColumnVT1(0, techNextDateTempColumn, currentDateTempColumn, preparedValues, nextValues, currentTablePayments, nextTableInsurance, techNextSumColumn); diff --git a/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRNoLimit.cs b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRNoLimit.cs index 13de695..db74aad 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRNoLimit.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateByIRRNoLimit.cs @@ -85,7 +85,7 @@ public static partial class CalculateManager var nextSumColumn = new SumColumnVT2(preparedValues.Nmper.Next + 1, nextDateTempColumn, preparedValues, nextValues, currentTablePayments, nextTablePayments); - var sumIRRColumn = new SumIRRColumn(0, nextDateTempColumn, currentDateColumn, preparedValues, nextValues, + var sumIRRColumn = new SumIRRColumnVT1(0, nextDateTempColumn, currentDateColumn, preparedValues, nextValues, currentTablePayments, nextTableInsurance, nextSumColumn); sumIRRColumn.ComputeValues((decimal)currentSumColumn.IRR + preparedValues.IRRDelta); diff --git a/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateDefault.cs b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateDefault.cs index 7200a8f..363e08c 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateDefault.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateDefault.cs @@ -85,7 +85,7 @@ public static partial class CalculateManager var nextSumColumn = new SumColumnVT2(preparedValues.Nmper.Next + 1, nextDateTempColumn, preparedValues, nextValues, currentTablePayments, nextTablePayments); - var sumIRRColumn = new SumIRRColumn(0, nextDateTempColumn, currentDateColumn, preparedValues, nextValues, + var sumIRRColumn = new SumIRRColumnVT1(0, nextDateTempColumn, currentDateColumn, preparedValues, nextValues, currentTablePayments, nextTableInsurance, nextSumColumn); sumIRRColumn.ComputeValues((decimal)currentSumColumn.IRR + preparedValues.IRRDelta); diff --git a/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateWIthChangeIRR.cs b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateWIthChangeIRR.cs new file mode 100644 index 0000000..dea5211 --- /dev/null +++ b/EvoCalculator.Core.PostCalculation/v2/Managers/CalculateWIthChangeIRR.cs @@ -0,0 +1,263 @@ +using System.Linq; +using EvoCalculator.Core.Models.PostCalculation.Models.Manager; +using EvoCalculator.Core.Models.PostCalculation.Models.Request; +using EvoCalculator.Core.PostCalculation.Tools; +using EvoCalculator.Core.PostCalculation.v1; +using EvoCalculator.Core.PostCalculation.v1.Columns.Current; +using EvoCalculator.Core.PostCalculation.v1.Columns.Next; +using EvoCalculator.Core.PostCalculation.v1.Managers.lib.Helper; +using EvoCalculator.Core.PostCalculation.v2.Columns.Next; +using DateTempColumn = EvoCalculator.Core.PostCalculation.v1.Columns.Current.DateTempColumn; +using SumRepaymentColumnVT1 = EvoCalculator.Core.PostCalculation.v2.Columns.Next.SumRepaymentColumnVT1; + +namespace EvoCalculator.Core.PostCalculation.v2.Managers; + +public static partial class CalculateManager +{ + public static ManagerResult CalculateWithChangeIRR(RequestCalculation requestCalculation) + { + new Validation().ValidateRequest(requestCalculation); + var constants = new Constants.Calculation(); + var preparedValues = requestCalculation.PreparedValues; + + var currentTablePayments = requestCalculation.TablePayments.Current; + var nextTablePayments = requestCalculation.TablePayments.Next; + + var currentTableInsurance = requestCalculation?.TableInsurance?.Current; + var nextTableInsurance = requestCalculation?.TableInsurance?.Next; + + var currentTableTLMTracker = requestCalculation?.TableTLMTracker?.Current; + var nextTableTLMTracker = requestCalculation?.TableTLMTracker?.Next; + + + /* + * CURRENT + */ + var currentDateColumn = new DateColumn(preparedValues.Nmper.Current + 1); + currentDateColumn.ComputeValues(currentTablePayments); + + var currentDateTempColumn = + new DateTempColumn(preparedValues.Nmper.Current + 1); + currentDateTempColumn.ComputeValues(preparedValues, currentDateColumn); + + var currentSumColumn = new SumColumn(preparedValues.Nmper.Current + 1, currentDateTempColumn); + currentSumColumn.ComputeValues(preparedValues, currentTablePayments, currentTableInsurance); + /* + * CURRENT + */ + + + /* + * NEXT + */ + var nextDateColumn = new DateColumnVT1(preparedValues.Nmper.Next + 1); + nextDateColumn.ComputeValues(preparedValues, currentTablePayments); + + var nextDateTempColumn = new v1.Columns.Next.DateTempColumn(preparedValues.Nmper.Next + 1); + nextDateTempColumn.ComputeValues(preparedValues, nextDateColumn); + + + TLMDateColumn nextTlmDateColumn = null; + TLMCostColumn nextTlmCostColumn = null; + TLMGrColumn nextTlmGrColumn = null; + + var tlmData = new Helper().GetTLMData(preparedValues + , currentTableTLMTracker, nextTableTLMTracker + , nextDateColumn); + + if (tlmData != null) + { + nextTlmDateColumn = new TLMDateColumn(tlmData.Duration + 1); + nextTlmDateColumn.ComputeValues(tlmData); + nextTlmCostColumn = new TLMCostColumn(tlmData.Duration + 1, nextTlmDateColumn.Values); + nextTlmCostColumn.ComputeValues(preparedValues, requestCalculation.TableTLMTracker); + nextTlmCostColumn.PostCheck(); + nextTlmGrColumn = new TLMGrColumn(preparedValues.Nmper.Next + 1); + nextTlmGrColumn.ComputeValues(nextDateColumn, nextTlmDateColumn, nextTlmCostColumn); + nextTlmGrColumn.PostCheck(); + } + + + var nextValues = new NextValues(preparedValues); + nextValues.ComputeBaseCost(nextTableInsurance, nextTlmGrColumn, + currentTablePayments); + + + var nextSumColumn = new SumColumnVT2(preparedValues.Nmper.Next + 1, nextDateTempColumn, + preparedValues, nextValues, currentTablePayments, nextTablePayments); + + var sumIRRColumn = new SumIRRColumnVT2(0, nextDateTempColumn, currentDateColumn, preparedValues, nextValues, + currentTablePayments, + nextTableInsurance, nextSumColumn, currentSumColumn); + sumIRRColumn.ComputeValues((decimal)currentSumColumn.Nominal + preparedValues.IRRDelta); + nextSumColumn.PostCheck(); + nextSumColumn.RoundValues(); + + var nextNSIBBruttoGrColumn = new NSIBBruttoGrColumnVT1(preparedValues.Nmper.Next + 1, preparedValues, + currentTablePayments, nextSumColumn); + var nsibRequiredValue = currentTablePayments + .Where((x, i) => i >= preparedValues.EditPaymentNumber - 1) + .Sum(x => x.NSIBBruttoPayment); + nextNSIBBruttoGrColumn.ComputeValues(nsibRequiredValue); + + var nextSubsidyExpensesColumn = new SubsidyExpensesColumn(preparedValues.Nmper.Next + 1); + nextSubsidyExpensesColumn.ComputeValues(preparedValues); + + nextValues.ComputeAcquisitionExpenses(nextTableInsurance); + + + var nextCashflowMSFOColumn = new CashflowMSFOColumn(); + nextCashflowMSFOColumn.ComputeValues(nextValues, preparedValues, nextSumColumn, nextTlmCostColumn, + nextSubsidyExpensesColumn, nextNSIBBruttoGrColumn, nextTableInsurance, nextDateTempColumn, + nextTlmDateColumn, currentDateTempColumn); + + var nextVATColumn = new VATColumnVT1(preparedValues.Nmper.Next + 1); + nextVATColumn.ComputeValues(preparedValues, nextSumColumn, currentTablePayments, constants); + + var nextSumWithVATColumn = new SumWithVATColumnVT1(preparedValues.Nmper.Next + 1, preparedValues, + nextSumColumn, currentTablePayments, nextVATColumn, constants); + nextSumWithVATColumn.ComputeValues(); + nextVATColumn.PostCheck(); + nextSumWithVATColumn.PostCheck(); + + var nextCashflowMSFOForNIColumn = new CashflowMSFOForNIColumn(); + nextCashflowMSFOForNIColumn.ComputeValues(preparedValues, nextValues, nextDateTempColumn, + nextCashflowMSFOColumn); + nextCashflowMSFOColumn.PostCheck(); + + var nextIRRGrColumn = new IRRGrColumn(nextCashflowMSFOForNIColumn.Values.Length); + nextIRRGrColumn.ComputeValues(nextCashflowMSFOForNIColumn, nextCashflowMSFOColumn); + + var nextNIColumn = new NIColumn(nextCashflowMSFOForNIColumn.Values.Length); + nextNIColumn.ComputeValues(nextCashflowMSFOForNIColumn, nextIRRGrColumn); + + var nextInterestColumn = new InterestColumn(nextCashflowMSFOForNIColumn.Values.Length); + nextInterestColumn.ComputeValues(nextNIColumn, nextIRRGrColumn); + nextInterestColumn.PostCheck(nextSumColumn, nextDateColumn, nextCashflowMSFOColumn.Dates); + + var nextSumCurrentColumn = new SumCurrentColumn(preparedValues.Nmper.Next + 1); + nextSumCurrentColumn.ComputeValues(nextSumWithVATColumn); + + var nextSumCurrentNegativeColumn = new SumCurrentNegativeColumn(preparedValues.Nmper.Next + 1); + nextSumCurrentNegativeColumn.ComputeValues(nextDateTempColumn, nextTableInsurance, currentDateTempColumn); + + var nextSumCurrentInterestColumn = + new SumCurrentInterestColumn(nextCashflowMSFOForNIColumn.Values.Length); + nextSumCurrentInterestColumn.ComputeValues(nextInterestColumn); + + var nextSumCurrentTLMColumn = new SumCurrentTLMColumn(preparedValues.Nmper.Next + 1); + nextSumCurrentTLMColumn.ComputeValues(nextTlmGrColumn); + + nextValues.Nmper = preparedValues.Nmper.Next; + + var nextSumRepaymentColumn = new SumRepaymentColumnVT1(); + nextSumRepaymentColumn.ComputeValues(preparedValues, currentTablePayments, nextSumCurrentNegativeColumn, + nextSumCurrentColumn, nextSumCurrentTLMColumn, nextSumCurrentInterestColumn, nextSumWithVATColumn, + nextDateTempColumn, nextCashflowMSFOForNIColumn, constants, nextValues); + nextSumRepaymentColumn.PostCheck(); + + var nextCashflowMSFOFinalColumn = new CashflowMSFOFinalColumn(); + nextCashflowMSFOFinalColumn.ComputeValues(nextCashflowMSFOColumn, nextDateTempColumn, preparedValues); + + var nextCashflowMSFOFinal2Column = new CashflowMSFOFinal2Column(); + nextCashflowMSFOFinal2Column.ComputeValues(nextCashflowMSFOFinalColumn, nextDateTempColumn, + preparedValues); + + var nextSumCreditColumn = new SumCreditColumnVT1(preparedValues.LoanRatePeriod + 2); + nextSumCreditColumn.ComputeValues(preparedValues, nextSumWithVATColumn); + + var nextCreditColumn = new CreditColumn(preparedValues.LoanRatePeriod + 4); + nextCreditColumn.ComputeValues(preparedValues, nextSumCreditColumn); + + var nextSumVATCreditColumn = new SumVATCreditColumn(12 + 2); + nextSumVATCreditColumn.ComputeValues(preparedValues, nextVATColumn); + + var nextCreditVATColumn = new CreditVATColumn(12 + 4); + nextCreditVATColumn.ComputeValues(preparedValues, nextSumVATCreditColumn); + + + var nextRevenueColumn = new RevenueColumnVT1(nextValues.Nmper + 1); + nextRevenueColumn.ComputeValues(preparedValues, currentTablePayments, nextValues); + + var nextNSIBExpensesColumn = new NSIBExpensesColumnVT1(nextValues.Nmper + 1); + nextNSIBExpensesColumn.ComputeValues(preparedValues, currentTablePayments, nextValues); + + var nextCashflowNSIBColumn = new CashflowNSIBColumn(nextValues.Nmper + 1); + nextCashflowNSIBColumn.ComputeValues(nextNSIBBruttoGrColumn, nextRevenueColumn); + + var nextCreditPaymentColumn = new CreditPaymentColumn(preparedValues.LoanRatePeriod + 4); + nextCreditPaymentColumn.ComputeValues(preparedValues, nextSumCreditColumn, nextCreditColumn); + + var nextVATRecoverableColumn = new VATRecoverableColumn(64, preparedValues); + nextVATRecoverableColumn.ComputeValues(nextVATColumn); + + nextValues.ComputeAcquisitionExpensesWithVAT(nextTableInsurance); + + var nextCashflowMSFOWithCFColumn = new CashflowMSFOWithCFColumn(0, preparedValues, nextCashflowMSFOFinal2Column, + nextCreditPaymentColumn, nextValues, nextSumCreditColumn, nextVATRecoverableColumn, nextDateTempColumn); + nextCashflowMSFOWithCFColumn.ComputeValues(); + + var nextPiColumn = new PIColumn(61, nextCashflowMSFOFinal2Column, nextCashflowMSFOWithCFColumn, preparedValues); + nextPiColumn.ComputeValues(); + + + nextValues.ComputeNiAtInception(currentTablePayments); + nextValues.ComputeNiAtInceptionMSFO(); + /* + * NEXT + */ + + var postValues = new v2.PostValues(preparedValues); + postValues.ComputeContractEconomy(nextCashflowMSFOColumn, nextCreditColumn); + postValues.ComputeContractEconomyWithVAT(nextCreditVATColumn); + + + return new ManagerResult + { + PostValues = postValues, + NextValues = nextValues, + PreparedValues = preparedValues, + Columns = new + { + currentDateColumn, + currentDateTemp = currentDateTempColumn, + currentSumColumn, + + nextDateColumn, + nextDateTempColumn, + nextTlmDateColumn, + nextTlmCostColumn, + nextTlmGrColumn, + nextSumColumn, + sumIRRColumn, + nextNSIBBruttoGrColumn, + nextSubsidyExpensesColumn, + nextCashflowMSFOColumn, + nextVATColumn, + nextSumWithVATColumn, + nextCashflowMSFOForNIColumn, + nextIRRGrColumn, + nextNIColumn, + nextInterestColumn, + nextSumCurrentColumn, + nextSumCurrentNegativeColumn, + nextSumCurrentInterestColumn, + nextSumCurrentTLMColumn, + nextSumRepaymentColumn, + nextCashflowMSFOFinalColumn, + nextCashflowMSFOFinal2Column, + nextSumCreditColumn, + nextCreditColumn, + nextSumVATCreditColumn, + nextCreditVATColumn, + nextNSIBExpensesColumn, + nextCashflowNSIBColumn, + nextRevenueColumn, + nextCreditPaymentColumn, + nextVATRecoverableColumn, + nextCashflowMSFOWithCFColumn, + nextPiColumn, + } + }; + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.PostCalculation/v2/Managers/EarlyRedemption.cs b/EvoCalculator.Core.PostCalculation/v2/Managers/EarlyRedemption.cs index 699d35d..644cdb3 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Managers/EarlyRedemption.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Managers/EarlyRedemption.cs @@ -193,6 +193,7 @@ public static partial class CalculateManager var nextSumWithVATColumn = new SumWithVATColumnVT1(preparedValues.Nmper.Next + 1, preparedValues, nextSumColumn, currentTablePayments, nextVATColumn, constants); nextSumWithVATColumn.ComputeValues(); + nextSumWithVATColumn.FixValues(); nextVATColumn.PostCheck(); nextSumWithVATColumn.PostCheck(); diff --git a/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithChangingTheTerm.cs b/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithChangingTheTerm.cs index 8ad4156..6556dc5 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithChangingTheTerm.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithChangingTheTerm.cs @@ -81,9 +81,15 @@ public static partial class CalculateManager currentTablePayments); - var techNextSumColumn = new SumColumnVT1(preparedValues.Nmper.Next + 1, techNextDateTempColumn, + var techNextSumColumn = new SumColumnVT2(preparedValues.Nmper.Next + 1, techNextDateTempColumn, preparedValues, nextValues, currentTablePayments, nextTablePayments); - techNextSumColumn.ComputeValues((decimal)currentSumColumn.IRR); + + var techSumIRRColumn = new SumIRRColumnVT1(0, techNextDateTempColumn, currentDateColumn, preparedValues, nextValues, + currentTablePayments, + nextTableInsurance, techNextSumColumn); + techSumIRRColumn.ComputeValues((decimal)currentSumColumn.IRR + preparedValues.IRRDelta); + techNextSumColumn.PostCheck(); + techNextSumColumn.RoundValues(); var techNextVATColumn = new VATColumnVT1(preparedValues.Nmper.Next + 1); techNextVATColumn.ComputeValues(preparedValues, techNextSumColumn, currentTablePayments, constants); @@ -269,6 +275,7 @@ public static partial class CalculateManager techNextTlmCostColumn, techNextTlmGrColumn, techNextSumColumn, + techSumIRRColumn, techNextVATColumn, techNextSumWithVATColumn, diff --git a/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithoutChangingTheTerm.cs b/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithoutChangingTheTerm.cs index e0b80e3..9e207e1 100644 --- a/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithoutChangingTheTerm.cs +++ b/EvoCalculator.Core.PostCalculation/v2/Managers/PERWithoutChangingTheTerm.cs @@ -82,9 +82,15 @@ public static partial class CalculateManager currentTablePayments); - var techNextSumColumn = new SumColumnVT1(preparedValues.Nmper.Next + 1, nextDateTempColumn, + var techNextSumColumn = new SumColumnVT2(preparedValues.Nmper.Next + 1, nextDateTempColumn, preparedValues, nextValues, currentTablePayments, nextTablePayments); - techNextSumColumn.ComputeValues((decimal)currentSumColumn.IRR); + + var techSumIRRColumn = new SumIRRColumnVT1(0, nextDateTempColumn, currentDateColumn, preparedValues, nextValues, + currentTablePayments, + nextTableInsurance, techNextSumColumn); + techSumIRRColumn.ComputeValues((decimal)currentSumColumn.IRR + preparedValues.IRRDelta); + techNextSumColumn.PostCheck(); + techNextSumColumn.RoundValues(); var techNextVATColumn = new VATColumnVT1(preparedValues.Nmper.Next + 1); techNextVATColumn.ComputeValues(preparedValues, techNextSumColumn, currentTablePayments, constants); @@ -234,6 +240,7 @@ public static partial class CalculateManager nextTlmCostColumn, nextTlmGrColumn, techNextSumColumn, + techSumIRRColumn, techNextVATColumn, techNextSumWithVATColumn, nextSumColumn, diff --git a/EvoCalculator.Core/Controllers/PostCalculation/v2/PostCalculationController.cs b/EvoCalculator.Core/Controllers/PostCalculation/v2/PostCalculationController.cs index 30c29df..b30197c 100644 --- a/EvoCalculator.Core/Controllers/PostCalculation/v2/PostCalculationController.cs +++ b/EvoCalculator.Core/Controllers/PostCalculation/v2/PostCalculationController.cs @@ -23,6 +23,7 @@ public class PostCalculationController : Controller 100000006 => CalculateManager.CalculateByIRRAndSum(requestCalculation), 100000007 => CalculateManager.Suspension(requestCalculation), 100000008 => CalculateManager.ChangingLastPayment(requestCalculation), + 100000009 => CalculateManager.CalculateWithChangeIRR(requestCalculation), 100000000 when requestCalculation.Flags.DISABLE_CHECKS_RESULTS => CalculateManager.CalculateByIRRNoLimit(requestCalculation), _ => CalculateManager.CalculateDefault(requestCalculation)