From 6a170c3d54029d55c07b6fbab6388198de1c8490 Mon Sep 17 00:00:00 2001 From: Chika Date: Wed, 16 Dec 2020 16:57:53 +0300 Subject: [PATCH] calculate by nominal --- .../Columns/BaseColumnWithGoalSeek.cs | 2 +- .../Columns/CashflowMSFOColumn.cs | 86 +++++++++++++++---- .../Columns/SumColumn.cs | 29 +------ .../Controllers/v1/CalculationController.cs | 48 +++++------ 4 files changed, 98 insertions(+), 67 deletions(-) diff --git a/EvoCalculator.Core.Calculation/Columns/BaseColumnWithGoalSeek.cs b/EvoCalculator.Core.Calculation/Columns/BaseColumnWithGoalSeek.cs index 279deb3..590c3a8 100644 --- a/EvoCalculator.Core.Calculation/Columns/BaseColumnWithGoalSeek.cs +++ b/EvoCalculator.Core.Calculation/Columns/BaseColumnWithGoalSeek.cs @@ -2,7 +2,7 @@ namespace EvoCalculator.Core.Calculation.Columns { - public abstract class BaseColumnWithGoalSeek : BaseColumnWithXIRR, IGoalSeekAlgorithm + public abstract class BaseColumnWithGoalSeek : BaseColumnWithNominal, IGoalSeekAlgorithm { public BaseColumnWithGoalSeek(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) { diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowMSFOColumn.cs b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOColumn.cs index 82236dc..34616e4 100644 --- a/EvoCalculator.Core.Calculation/Columns/CashflowMSFOColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOColumn.cs @@ -1,13 +1,45 @@ using System; +using System.Linq; +using EvoCalculator.Core.Calculation.Post; using EvoCalculator.Core.Models.Calculation.Models; using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using TridentGoalSeek; namespace EvoCalculator.Core.Calculation.Columns { - public class CashflowMSFOColumn : BaseColumnWithNominal + public class CashflowMSFOColumn : BaseColumnWithGoalSeek { - public CashflowMSFOColumn(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + private readonly PostValues _postValues; + private readonly PreparedValues _preparedValues; + private readonly PercentPaymentColumn _percentPaymentColumn; + private SumColumn _sumColumn; + private readonly NegativeCashflowColumn _negativeCashflowColumn; + private readonly NSIBBruttoGrColumn _nsibBruttoGrColumn; + private readonly TLM_GrColumn _tlmGrColumn; + private readonly GPS_GrColumn _gpsGrColumn; + private readonly NPVBonusExpensesColumn _npvBonusExpensesColumn; + private readonly AgentComissionExpensesColumn _agentComissionExpensesColumn; + + public CashflowMSFOColumn(int count, DateTempColumn dateTempColumn, PostValues _postValues, + PreparedValues preparedValues, + PercentPaymentColumn _percentPaymentColumn, + ref SumColumn sumColumn, + NegativeCashflowColumn negativeCashflowColumn, + NSIBBruttoGrColumn nsibBruttoGrColumn, TLM_GrColumn tlmGrColumn, GPS_GrColumn gpsGrColumn, + NPVBonusExpensesColumn npvBonusExpensesColumn, + AgentComissionExpensesColumn agentComissionExpensesColumn) : base(count, + dateTempColumn) { + this._postValues = _postValues; + _preparedValues = preparedValues; + this._percentPaymentColumn = _percentPaymentColumn; + _sumColumn = sumColumn; + _negativeCashflowColumn = negativeCashflowColumn; + _nsibBruttoGrColumn = nsibBruttoGrColumn; + _tlmGrColumn = tlmGrColumn; + _gpsGrColumn = gpsGrColumn; + _npvBonusExpensesColumn = npvBonusExpensesColumn; + _agentComissionExpensesColumn = agentComissionExpensesColumn; } public void PostCheck(AdditionalData additionalData) @@ -30,21 +62,45 @@ namespace EvoCalculator.Core.Calculation.Columns } } - public void ComputeValues(PreparedValues preparedValues, SumColumn sumColumn, - NegativeCashflowColumn negativeCashflowColumn, - NSIBBruttoGrColumn nsibBruttoGrColumn, TLM_GrColumn tlmGrColumn, GPS_GrColumn gpsGrColumn, - NPVBonusExpensesColumn npvBonusExpensesColumn, AgentComissionExpensesColumn agentComissionExpensesColumn) + public override decimal Calculate(decimal inputVariable) { - Values[0] = -preparedValues.AcquisitionExpenses; - Values[1] = sumColumn.Values[1] + npvBonusExpensesColumn.Values[1] + agentComissionExpensesColumn.Values[1]; + FillValues(inputVariable); + return Convert.ToDecimal(Nominal); + } + + protected override void FillValues(decimal x) + { + _sumColumn.ComputeValues(x); + + Values[0] = -_preparedValues.AcquisitionExpenses; + Values[1] = _sumColumn.Values[1] + _npvBonusExpensesColumn.Values[1] + + _agentComissionExpensesColumn.Values[1]; for (var i = 2; i < Values.Length; i++) - Values[i] = sumColumn.Values[i] - + negativeCashflowColumn.Values[i] - - nsibBruttoGrColumn.Values[i] - - tlmGrColumn.Values[i] - - gpsGrColumn.Values[i] - + npvBonusExpensesColumn.Values[i] - + agentComissionExpensesColumn.Values[i]; + Values[i] = _sumColumn.Values[i] + + _negativeCashflowColumn.Values[i] + - _nsibBruttoGrColumn.Values[i] + - _tlmGrColumn.Values[i] + - _gpsGrColumn.Values[i] + + _npvBonusExpensesColumn.Values[i] + + _agentComissionExpensesColumn.Values[i]; + } + + public override 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.Value - _preparedValues.FirstPaymentSum) / NUMBER_OF_LARGE_PERCENTS + , maximumAttempts: 1000 + , initialTineSpacing: (_postValues.BaseCost.Value - _preparedValues.FirstPaymentSum) / _preparedValues.Nmper + // , focusPercentage: 50 + )); } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/SumColumn.cs b/EvoCalculator.Core.Calculation/Columns/SumColumn.cs index 4fb5b05..b4c1aba 100644 --- a/EvoCalculator.Core.Calculation/Columns/SumColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/SumColumn.cs @@ -2,11 +2,10 @@ using System.Linq; using EvoCalculator.Core.Calculation.Post; using EvoCalculator.Core.Models.Calculation.Models.Prepared; -using TridentGoalSeek; namespace EvoCalculator.Core.Calculation.Columns { - public class SumColumn : BaseColumnWithGoalSeek + public class SumColumn : BaseColumnWithXIRR { private readonly PercentPaymentColumn _percentPaymentColumn; private readonly PreparedValues _preparedValues; @@ -21,13 +20,7 @@ namespace EvoCalculator.Core.Calculation.Columns _postValues = postValues; } - public override decimal Calculate(decimal inputVariable) - { - FillValues(inputVariable); - return Convert.ToDecimal(IRR); - } - - protected override void FillValues(decimal x) + public void ComputeValues(decimal x) { Values[0] = -_postValues.BaseCost.Value; Values[1] = _preparedValues.FirstPaymentSum; @@ -47,23 +40,5 @@ namespace EvoCalculator.Core.Calculation.Columns "Первый платеж по графику более 50% от суммы лизинговых платежей. Необходимо уменьшить первый платеж"); } } - - public override 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.Value - _preparedValues.FirstPaymentSum) / NUMBER_OF_LARGE_PERCENTS - , maximumAttempts: 1000 - , initialTineSpacing: (_postValues.BaseCost.Value - _preparedValues.FirstPaymentSum) / _preparedValues.Nmper - // , focusPercentage: 50 - )); - } } } \ No newline at end of file diff --git a/EvoCalculator.Core/Controllers/v1/CalculationController.cs b/EvoCalculator.Core/Controllers/v1/CalculationController.cs index 24f6bf5..76c6a43 100644 --- a/EvoCalculator.Core/Controllers/v1/CalculationController.cs +++ b/EvoCalculator.Core/Controllers/v1/CalculationController.cs @@ -46,7 +46,7 @@ namespace EvoCalculator.Core.Controllers.V1 var maxColumnLength = preparedValues.Nmper > preparedValues.NmperDeprecation ? preparedValues.Nmper + 1 : preparedValues.NmperDeprecation + 2; - + try { var dateColumn = new DateColumn(preparedValues.Nmper + 1); @@ -74,14 +74,36 @@ namespace EvoCalculator.Core.Controllers.V1 gpsGrColumn.ComputeValues(preparedPayments, preparedValues); gpsGrColumn.PostCheck(); + var kaskoBonusGrSumColumn = new KaskoBonusGrSumColumn(preparedValues.Nmper + 1); + kaskoBonusGrSumColumn.ComputeValues(preparedValues, kaskoNmperGrColumn); + + postValues.BonusBase.ComputeValue(preparedValues, kaskoBonusGrSumColumn); + + var npvBonusExpensesColumn = new NPVBonusExpensesColumn(preparedValues.Nmper + 1); + npvBonusExpensesColumn.ComputeValues(preparedValues, postValues); + postValues.BaseCost.ComputeValue(preparedValues, kaskoNmperGrColumn, tlmGrColumn, gpsGrColumn); + var agentComissionExpensesColumn = new AgentComissionExpensesColumn(preparedValues.Nmper + 1); + agentComissionExpensesColumn.ComputeValues(preparedValues); + + var negativeCashflowColumn = new NegativeCashflowColumn(preparedValues.Nmper + 1); + negativeCashflowColumn.ComputeValues(kaskoNmperGrColumn); + + var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1); + nsibBruttoGrColumn.ComputeValues(preparedValues); + var sumColumn = new SumColumn( preparedValues.Nmper + 1 , dateTempColumn , preparedValues , percentPaymentColumn, postValues); - sumColumn.ComputeValues(Convert.ToDecimal(preparedValues.IrrExpected)); + + var cashflowMsfoColumn = new CashflowMSFOColumn(preparedValues.Nmper + 1, dateTempColumn, postValues, + preparedValues, percentPaymentColumn, ref sumColumn, negativeCashflowColumn, nsibBruttoGrColumn, + tlmGrColumn, gpsGrColumn, npvBonusExpensesColumn, agentComissionExpensesColumn); + cashflowMsfoColumn.ComputeValues(Convert.ToDecimal(preparedValues.IrrExpected)); + cashflowMsfoColumn.PostCheck(additionalData); sumColumn.PostCheck(); var vatColumn = new VATColumn(preparedValues.Nmper + 1); @@ -113,17 +135,6 @@ namespace EvoCalculator.Core.Controllers.V1 var deprecationColumn = new DeprecationColumn(maxColumnLength); deprecationColumn.ComputeValues(deprecationLpColumn, deprecationLdColumn); - var kaskoBonusGrSumColumn = new KaskoBonusGrSumColumn(preparedValues.Nmper + 1); - kaskoBonusGrSumColumn.ComputeValues(preparedValues, kaskoNmperGrColumn); - - postValues.BonusBase.ComputeValue(preparedValues, kaskoBonusGrSumColumn); - - var npvBonusExpensesColumn = new NPVBonusExpensesColumn(preparedValues.Nmper + 1); - npvBonusExpensesColumn.ComputeValues(preparedValues, postValues); - - var agentComissionExpensesColumn = new AgentComissionExpensesColumn(preparedValues.Nmper + 1); - agentComissionExpensesColumn.ComputeValues(preparedValues); - var ratExpensesColumn = new RatExpensesColumn(preparedValues.Nmper + 1); ratExpensesColumn.ComputeValues(preparedValues); @@ -153,12 +164,6 @@ namespace EvoCalculator.Core.Controllers.V1 nsibExpensesColumn, tlmExpensesColumn, gpsExpensesColumn, registrExpensesColumn, insuranceBonusExpensesColumn, comissionBonusExpensesColumn, npvBonusExpensesColumn); - var negativeCashflowColumn = new NegativeCashflowColumn(preparedValues.Nmper + 1); - negativeCashflowColumn.ComputeValues(kaskoNmperGrColumn); - - var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1); - nsibBruttoGrColumn.ComputeValues(preparedValues); - var taxColumn = new TaxColumn(maxColumnLength); taxColumn.ComputeValues(constants, sumColumn, acceptInsuranceColumn, deprecationColumn, ratExpensesColumn, @@ -173,11 +178,6 @@ namespace EvoCalculator.Core.Controllers.V1 nsibBruttoGrColumn, tlmGrColumn, gpsGrColumn); - var cashflowMsfoColumn = new CashflowMSFOColumn(preparedValues.Nmper + 1, dateTempColumn); - cashflowMsfoColumn.ComputeValues(preparedValues, sumColumn, negativeCashflowColumn, nsibBruttoGrColumn, - tlmGrColumn, gpsGrColumn, npvBonusExpensesColumn, agentComissionExpensesColumn); - cashflowMsfoColumn.PostCheck(additionalData); - var cashflowNpvColumn = new CashflowNPVColumn(maxColumnLength); cashflowNpvColumn.ComputeValues(preparedValues, sumColumn, npvBonusExpensesColumn, agentComissionExpensesColumn, taxColumn, nsibExpensesColumn, negativeCashflowColumn,