calculate by nominal

This commit is contained in:
Chika 2020-12-16 16:57:53 +03:00
parent b7fb603202
commit 6a170c3d54
4 changed files with 98 additions and 67 deletions

View File

@ -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)
{

View File

@ -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
));
}
}
}

View File

@ -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
));
}
}
}

View File

@ -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,