diff --git a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml index 379e082..1606b2d 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml @@ -45,6 +45,7 @@ + @@ -52,14 +53,21 @@ + + + + + + + @@ -71,17 +79,21 @@ + + + + @@ -162,8 +174,13 @@ + + + + + @@ -171,7 +188,9 @@ + + @@ -183,16 +202,20 @@ + + + + diff --git a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml index 2331513..cfeb6f3 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml @@ -14,51 +14,29 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + @@ -288,7 +272,8 @@ - @@ -303,110 +288,110 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + @@ -415,26 +400,26 @@ - + - + - + - + - + - + @@ -465,40 +450,27 @@ 256 - - diff --git a/EvoCalculator.Core.Calculation/Columns/BaseColumnWithGoalSeek.cs b/EvoCalculator.Core.Calculation/Columns/BaseColumnWithGoalSeek.cs new file mode 100644 index 0000000..279deb3 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/BaseColumnWithGoalSeek.cs @@ -0,0 +1,15 @@ +using TridentGoalSeek; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public abstract class BaseColumnWithGoalSeek : BaseColumnWithXIRR, IGoalSeekAlgorithm + { + public BaseColumnWithGoalSeek(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + { + } + + public abstract decimal Calculate(decimal inputVariable); + protected abstract void FillValues(decimal x); + public abstract void ComputeValues(decimal requiredValue); + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowMSFOFinal2Column.cs b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOFinal2Column.cs new file mode 100644 index 0000000..f626cd0 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOFinal2Column.cs @@ -0,0 +1,20 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class CashflowMSFOFinal2Column : BaseColumnWithNominal + { + public CashflowMSFOFinal2Column(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + { + } + + public void ComputeValues(PreparedValues preparedValues, DirectorBonusSumColumn directorBonusSumColumn, + CashflowMSFOFinalColumn cashflowMsfoFinalColumn) + { + Values[0] = -preparedValues.AcquisitionExpenses; + Values[1] = cashflowMsfoFinalColumn.Values[1]; + for (var i = 2; i < Values.Length; i++) + Values[i] = cashflowMsfoFinalColumn.Values[i] + directorBonusSumColumn.Values[i]; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowMSFOFinalColumn.cs b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOFinalColumn.cs new file mode 100644 index 0000000..c0c3483 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOFinalColumn.cs @@ -0,0 +1,20 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class CashflowMSFOFinalColumn : BaseColumnWithNominal + { + public CashflowMSFOFinalColumn(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + { + } + + public void ComputeValues(PreparedValues preparedValues, CashflowMSFOColumn cashflowMsfoColumn, + ExtraBonusSumColumn extraBonusSumColumn) + { + Values[0] = -preparedValues.AcquisitionExpenses; + Values[1] = cashflowMsfoColumn.Values[1]; + for (var i = 2; i < Values.Length; i++) + Values[i] = cashflowMsfoColumn.Values[i] + extraBonusSumColumn.Values[i]; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowNPVFinal2Column.cs b/EvoCalculator.Core.Calculation/Columns/CashflowNPVFinal2Column.cs new file mode 100644 index 0000000..99705cd --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/CashflowNPVFinal2Column.cs @@ -0,0 +1,21 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class CashflowNPVFinal2Column : BaseColumn + { + public CashflowNPVFinal2Column(int count) : base(count) + { + } + + + public void ComputeValues(PreparedValues preparedValues, CashflowNPVFinalColumn cashflowNpvFinalColumn, + DirectorBonusSumColumn directorBonusSumColumn) + { + Values[0] = -preparedValues.AcquisitionExpenses; + Values[1] = cashflowNpvFinalColumn.Values[1]; + for (var i = 2; i < Values.Length; i++) + Values[i] = cashflowNpvFinalColumn.Values[i] + directorBonusSumColumn.Values[i]; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowNPVFinalColumn.cs b/EvoCalculator.Core.Calculation/Columns/CashflowNPVFinalColumn.cs new file mode 100644 index 0000000..fb0f8a0 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/CashflowNPVFinalColumn.cs @@ -0,0 +1,20 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class CashflowNPVFinalColumn : BaseColumn + { + public CashflowNPVFinalColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues, ExtraBonusSumColumn extraBonusSumColumn, + CashflowNPVColumn cashflowNpvColumn) + { + Values[0] = -preparedValues.AcquisitionExpenses; + Values[1] = cashflowNpvColumn.Values[1]; + for (var i = 2; i < Values.Length; i++) + Values[i] = extraBonusSumColumn.Values[i] + cashflowNpvColumn.Values[i]; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/DirectorBonusSumColumn.cs b/EvoCalculator.Core.Calculation/Columns/DirectorBonusSumColumn.cs new file mode 100644 index 0000000..8ecbdd5 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/DirectorBonusSumColumn.cs @@ -0,0 +1,19 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class DirectorBonusSumColumn : BaseColumnWithSum + { + public DirectorBonusSumColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues) + { + Values[2] = -preparedValues.BonusBase * (decimal) preparedValues.DirectorBonus * + (decimal) (1 + preparedValues.SalaryRate) * + (decimal) (1 + preparedValues.MarketRate + preparedValues.DistrictRate); + Values[0] = Sum; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/ExtraBonusSumColumn.cs b/EvoCalculator.Core.Calculation/Columns/ExtraBonusSumColumn.cs new file mode 100644 index 0000000..9f4e2a5 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/ExtraBonusSumColumn.cs @@ -0,0 +1,22 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class ExtraBonusSumColumn : BaseColumnWithSum + { + public ExtraBonusSumColumn(int count) : base(count) + { + } + + public void ComputeValues(PreparedValues preparedValues, CashflowMSFOColumn cashflowMsfoColumn) + { + Values[2] = cashflowMsfoColumn.Nominal >= preparedValues.IRR_MSFO_Plan + ? -1 * preparedValues.BonusBase * + (decimal) (cashflowMsfoColumn.Nominal / preparedValues.IRR_MSFO_Plan - 1) * + (decimal) preparedValues.ExtraBonus * (decimal) (1 + preparedValues.SalaryRate) * + (decimal) (1 + preparedValues.MarketRate + preparedValues.DistrictRate) + : 0; + Values[0] = Sum; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/NPVColumn.cs b/EvoCalculator.Core.Calculation/Columns/NPVColumn.cs index f6a5c20..8c49dc1 100644 --- a/EvoCalculator.Core.Calculation/Columns/NPVColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/NPVColumn.cs @@ -9,9 +9,7 @@ public void ComputeValues(CashflowNPVColumn cashflowNpvColumn, NPVWeightColumn npvWeightColumn) { for (var i = 0; i < Values.Length; i++) - { Values[i] = cashflowNpvColumn.Values[i] * (decimal) npvWeightColumn.Values[i]; - } } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/NPVFinal2Column.cs b/EvoCalculator.Core.Calculation/Columns/NPVFinal2Column.cs new file mode 100644 index 0000000..4623b14 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/NPVFinal2Column.cs @@ -0,0 +1,17 @@ +namespace EvoCalculator.Core.Calculation.Columns +{ + public class NPVFinal2Column : BaseColumnWithNominal + { + public NPVFinal2Column(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + { + } + + public void ComputeValues(CashflowNPVFinal2Column cashflowNpvFinal2Column, NPVWeightColumn npvWeightColumn) + { + for (var i = 0; i < Values.Length; i++) + { + Values[i] = cashflowNpvFinal2Column.Values[i] * (decimal) npvWeightColumn.Values[i]; + } + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/NPVFinalColumn.cs b/EvoCalculator.Core.Calculation/Columns/NPVFinalColumn.cs new file mode 100644 index 0000000..33267fd --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/NPVFinalColumn.cs @@ -0,0 +1,15 @@ +namespace EvoCalculator.Core.Calculation.Columns +{ + public class NPVFinalColumn : BaseColumnWithNominal + { + public NPVFinalColumn(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + { + } + + public void ComputeValues(CashflowNPVFinalColumn cashflowNpvFinalColumn, NPVWeightColumn npvWeightColumn) + { + for (var i = 0; i < Values.Length; i++) + Values[i] = cashflowNpvFinalColumn.Values[i] * (decimal) npvWeightColumn.Values[i]; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/NPVWeightColumn.cs b/EvoCalculator.Core.Calculation/Columns/NPVWeightColumn.cs index 0cd2279..d71b995 100644 --- a/EvoCalculator.Core.Calculation/Columns/NPVWeightColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/NPVWeightColumn.cs @@ -13,11 +13,9 @@ namespace EvoCalculator.Core.Calculation.Columns { Values[0] = 1; for (var i = 1; i < Values.Length; i++) - { Values[i] = Values[i - 1] / Math.Pow( 1 + preparedValues.LoanRate / 365, (dateTempColumn.Values[i] - dateTempColumn.Values[i - 1]).Days); - } } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/RevenueColumn.cs b/EvoCalculator.Core.Calculation/Columns/RevenueColumn.cs new file mode 100644 index 0000000..c496533 --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/RevenueColumn.cs @@ -0,0 +1,17 @@ +namespace EvoCalculator.Core.Calculation.Columns +{ + public class RevenueColumn : BaseColumn + { + public RevenueColumn(int count) : base(count) + { + } + + public void ComputeValues(NSIBBruttoGrColumn nsibBruttoGrColumn, NSIBExpensesColumn nsibExpensesColumn, + CashflowNSIBColumn cashflowNsibColumn) + { + Values[1] = nsibBruttoGrColumn.Values[1] - cashflowNsibColumn.Values[1]; + for (var i = 2; i < Values.Length; i++) + Values[i] = Values[1] * nsibExpensesColumn.Values[i] / nsibExpensesColumn.Values[1]; + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/SumColumn.cs b/EvoCalculator.Core.Calculation/Columns/SumColumn.cs index 5b107a7..0c15b72 100644 --- a/EvoCalculator.Core.Calculation/Columns/SumColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/SumColumn.cs @@ -4,7 +4,7 @@ using TridentGoalSeek; namespace EvoCalculator.Core.Calculation.Columns { - public class SumColumn : BaseColumnWithXIRR, IGoalSeekAlgorithm + public class SumColumn : BaseColumnWithGoalSeek { private readonly PercentPaymentColumn _percentPaymentColumn; private readonly PreparedValues _preparedValues; @@ -17,13 +17,13 @@ namespace EvoCalculator.Core.Calculation.Columns _percentPaymentColumn = percentPaymentColumn; } - public decimal Calculate(decimal inputVariable) + public override decimal Calculate(decimal inputVariable) { FillValues(inputVariable); return Convert.ToDecimal(IRR); } - private void FillValues(decimal x) + protected override void FillValues(decimal x) { Values[0] = -_preparedValues.BaseCost; Values[1] = _preparedValues.FirstPaymentSum; @@ -33,10 +33,10 @@ namespace EvoCalculator.Core.Calculation.Columns Values[^1] = _preparedValues.LastPaymentSum; } - public void ComputeValues(decimal requiredIRR) + public override void ComputeValues(decimal requiredValue) { var goalSeek = new GoalSeek(this); - goalSeek.SeekResult(requiredIRR, + goalSeek.SeekResult(requiredValue, new GoalSeekOptions( startingStabPoint: Convert.ToDecimal( (_preparedValues.BaseCost - _preparedValues.FirstPaymentSum) / diff --git a/EvoCalculator.Core.Calculation/Columns/SumCurrentColumn.cs b/EvoCalculator.Core.Calculation/Columns/SumCurrentColumn.cs index 02e588d..bddfc1c 100644 --- a/EvoCalculator.Core.Calculation/Columns/SumCurrentColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/SumCurrentColumn.cs @@ -10,10 +10,7 @@ namespace EvoCalculator.Core.Calculation.Columns public void ComputeValues(SumWithVATColumn sumWithVatColumn) { - for (var i = 1; i < Values.Length; i++) - { - Values[i] = sumWithVatColumn.Values.Skip(i).Sum(x => x); - } + for (var i = 1; i < Values.Length; i++) Values[i] = sumWithVatColumn.Values.Skip(i).Sum(x => x); } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/SumCurrentNegativeColumn.cs b/EvoCalculator.Core.Calculation/Columns/SumCurrentNegativeColumn.cs index 57ed362..71bc756 100644 --- a/EvoCalculator.Core.Calculation/Columns/SumCurrentNegativeColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/SumCurrentNegativeColumn.cs @@ -10,10 +10,7 @@ namespace EvoCalculator.Core.Calculation.Columns public void ComputeValues(NegativeCashflowColumn negativeCashflowColumn) { - for (var i = 1; i < Values.Length; i++) - { - Values[i] = negativeCashflowColumn.Values.Skip(i).Sum(x => x); - } + for (var i = 1; i < Values.Length; i++) Values[i] = negativeCashflowColumn.Values.Skip(i).Sum(x => x); } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs index 3e360be..f93f423 100644 --- a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs +++ b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs @@ -90,5 +90,8 @@ namespace EvoCalculator.Core.Models.Calculation.Models.Prepared public decimal BonusBase { get; set; } public decimal NpvBase { get; set; } public decimal TLMCost { get; set; } + public double IRR_MSFO_Plan { get; set; } + public double ExtraBonus { get; set; } + public double DirectorBonus { get; set; } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOFinal2.cs b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOFinal2.cs new file mode 100644 index 0000000..dc0b84f --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOFinal2.cs @@ -0,0 +1,199 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class CashflowMsfoFinal2Tests + { + [Fact] + public void CashflowMsfoFinal2Test1() + { + var preparedValues = new PreparedValues + { + Nmper = 25, + AcquisitionExpenses = 2507300 + }; + + var dateTempColumn = new DateTempColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + new DateTime(2018, 10, 31), + new DateTime(2018, 10, 31), + new DateTime(2018, 11, 30), + new DateTime(2018, 12, 31), + new DateTime(2019, 1, 31), + new DateTime(2019, 2, 28), + new DateTime(2019, 3, 31), + new DateTime(2019, 4, 30), + new DateTime(2019, 5, 31), + new DateTime(2019, 6, 30), + new DateTime(2019, 7, 31), + new DateTime(2019, 8, 31), + new DateTime(2019, 9, 30), + new DateTime(2019, 10, 31), + new DateTime(2019, 11, 30), + new DateTime(2019, 12, 31), + new DateTime(2020, 1, 31), + new DateTime(2020, 2, 29), + new DateTime(2020, 3, 31), + new DateTime(2020, 4, 30), + new DateTime(2020, 5, 31), + new DateTime(2020, 6, 30), + new DateTime(2020, 7, 31), + new DateTime(2020, 8, 31), + new DateTime(2020, 9, 30), + new DateTime(2020, 10, 31), + new DateTime(2020, 11, 30), + new DateTime(2020, 12, 31), + new DateTime(2021, 1, 31), + new DateTime(2021, 2, 28), + new DateTime(2021, 3, 31), + new DateTime(2021, 4, 30), + new DateTime(2021, 5, 31), + new DateTime(2021, 6, 30), + new DateTime(2021, 7, 31), + new DateTime(2021, 8, 31), + new DateTime(2021, 9, 30), + new DateTime(2021, 10, 31), + new DateTime(2021, 11, 30), + new DateTime(2021, 12, 31), + new DateTime(2022, 1, 31), + new DateTime(2022, 2, 28), + new DateTime(2022, 3, 31), + new DateTime(2022, 4, 30), + new DateTime(2022, 5, 31), + new DateTime(2022, 6, 30), + new DateTime(2022, 7, 31), + new DateTime(2022, 8, 31), + new DateTime(2022, 9, 30), + new DateTime(2022, 10, 31), + new DateTime(2022, 11, 30), + new DateTime(2022, 12, 31), + new DateTime(2023, 1, 31), + new DateTime(2023, 2, 28), + new DateTime(2023, 3, 31), + new DateTime(2023, 4, 30), + new DateTime(2023, 5, 31), + new DateTime(2023, 6, 30), + new DateTime(2023, 7, 31), + new DateTime(2023, 8, 31), + new DateTime(2023, 9, 30), + new DateTime(2023, 10, 31), + new DateTime(2023, 11, 30), + new DateTime(2023, 12, 31), + new DateTime(2024, 1, 31), + new DateTime(2024, 2, 29), + new DateTime(2024, 3, 31) + } + }; + + var directorBonusSumColumn = new DirectorBonusSumColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -7524.610925m, + 0, + -7524.610925m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }; + + var cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn) + { + Values = new[] + { + -2507300m, + 623323.69753125m, + -396728.986329981m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 127486.241319444m, + 70069.5746527778m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 112986.241319444m, + 112986.241319444m, + 21986.2413194444m + } + }; + + var cashflowMsfoFinal2Column = new CashflowMSFOFinal2Column(preparedValues.Nmper + 1, dateTempColumn); + cashflowMsfoFinal2Column.ComputeValues(preparedValues, directorBonusSumColumn, cashflowMsfoFinalColumn); + + var expected = new[] + { + -2507300m, + 623323.69753125m, + -404253.597254981m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 141986.241319444m, + 127486.241319444m, + 70069.5746527778m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 127486.241319444m, + 112986.241319444m, + 112986.241319444m, + 21986.2413194444m + }; + + + Assert.Equal(expected.Length, cashflowMsfoFinal2Column.Values.Length); + Assert.Equal(0.264075595140457, cashflowMsfoFinal2Column.IRR, new DoubleArrayComparer(0.01)); + Assert.Equal(0.236644224219182, cashflowMsfoFinal2Column.Nominal, new DoubleArrayComparer(0.01)); + Assert.Equal(expected, cashflowMsfoFinal2Column.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNPVFinal.cs b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNPVFinal.cs new file mode 100644 index 0000000..073b0d6 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNPVFinal.cs @@ -0,0 +1,123 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class CashflowNpvFinalTests + { + [Fact] + public void CashflowNpvFinalTest1() + { + var preparedValues = new PreparedValues + { + Nmper = 25, + AcquisitionExpenses = 2507300 + }; + + var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -7487.31397588584m, + 0, + -7487.31397588584m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }; + + var cashflowNpvColumn = new CashflowNPVColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -2507300m, + 576206.70740985m, + -265374.923416037m, + 117229.001963963m, + 122029.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 105540.661111001m, + 42337.4923988798m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 93306.8657125845m, + 93306.8657125845m, + 23600.0284642829m + } + }; + + var cashflowNpvFinalColumn = new CashflowNPVFinalColumn(preparedValues.Nmper + 1); + cashflowNpvFinalColumn.ComputeValues(preparedValues, extraBonusSumColumn, cashflowNpvColumn); + + + var expected = new[] + { + -2507300m, + 576206.70740985m, + -272862.237391923m, + 117229.001963963m, + 122029.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 117229.001963963m, + 105540.661111001m, + 42337.4923988798m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 104995.206565546m, + 93306.8657125845m, + 93306.8657125845m, + 23600.0284642829m + }; + + + Assert.Equal(expected.Length, cashflowNpvFinalColumn.Values.Length); + Assert.Equal(expected, cashflowNpvFinalColumn.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNPVFinal2.cs b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNPVFinal2.cs new file mode 100644 index 0000000..e06a69b --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNPVFinal2.cs @@ -0,0 +1,123 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class CashflowNpvFinal2Tests + { + [Fact] + public void CashflowNpvFinal2Test1() + { + var preparedValues = new PreparedValues + { + Nmper = 25, + AcquisitionExpenses = 2507300 + }; + + var cashflowNpvFinalColumn = new CashflowNPVFinalColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -2507300m, + 562200.08956372m, + -310589.328673099m, + 135135.417631327m, + 139935.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 121656.435211628m, + 58453.266499507m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 107631.998246475m, + 107631.998246475m, + 23039.7637504377m + } + }; + + var directorBonusSumColumn = new DirectorBonusSumColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -7524.610925m, + 0, + -7524.610925m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }; + + var cashflowNpvFinal2Column = new CashflowNPVFinal2Column(preparedValues.Nmper + 1); + cashflowNpvFinal2Column.ComputeValues(preparedValues, cashflowNpvFinalColumn, directorBonusSumColumn); + + + var expected = new[] + { + -2507300m, + 562200.08956372m, + -318113.939598099m, + 135135.417631327m, + 139935.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 121656.435211628m, + 58453.266499507m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 107631.998246475m, + 107631.998246475m, + 23039.7637504377m + }; + + + Assert.Equal(expected.Length, cashflowNpvFinal2Column.Values.Length); + Assert.Equal(expected, cashflowNpvFinal2Column.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNSIB.cs b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNSIB.cs new file mode 100644 index 0000000..9405b96 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowNSIB.cs @@ -0,0 +1,232 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class CashflowNsibTests + { + [Fact] + public void CashflowNsibTest1() + { + var preparedValues = new PreparedValues + { + Nmper = 25 + }; + + var dateTempColumn = new DateTempColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + new DateTime(2018, 10, 31), + new DateTime(2018, 10, 31), + new DateTime(2018, 11, 30), + new DateTime(2018, 12, 31), + new DateTime(2019, 1, 31), + new DateTime(2019, 2, 28), + new DateTime(2019, 3, 31), + new DateTime(2019, 4, 30), + new DateTime(2019, 5, 31), + new DateTime(2019, 6, 30), + new DateTime(2019, 7, 31), + new DateTime(2019, 8, 31), + new DateTime(2019, 9, 30), + new DateTime(2019, 10, 31), + new DateTime(2019, 11, 30), + new DateTime(2019, 12, 31), + new DateTime(2020, 1, 31), + new DateTime(2020, 2, 29), + new DateTime(2020, 3, 31), + new DateTime(2020, 4, 30), + new DateTime(2020, 5, 31), + new DateTime(2020, 6, 30), + new DateTime(2020, 7, 31), + new DateTime(2020, 8, 31), + new DateTime(2020, 9, 30), + new DateTime(2020, 10, 31), + new DateTime(2020, 11, 30), + new DateTime(2020, 12, 31), + new DateTime(2021, 1, 31), + new DateTime(2021, 2, 28), + new DateTime(2021, 3, 31), + new DateTime(2021, 4, 30), + new DateTime(2021, 5, 31), + new DateTime(2021, 6, 30), + new DateTime(2021, 7, 31), + new DateTime(2021, 8, 31), + new DateTime(2021, 9, 30), + new DateTime(2021, 10, 31), + new DateTime(2021, 11, 30), + new DateTime(2021, 12, 31), + new DateTime(2022, 1, 31), + new DateTime(2022, 2, 28), + new DateTime(2022, 3, 31), + new DateTime(2022, 4, 30), + new DateTime(2022, 5, 31), + new DateTime(2022, 6, 30), + new DateTime(2022, 7, 31), + new DateTime(2022, 8, 31), + new DateTime(2022, 9, 30), + new DateTime(2022, 10, 31), + new DateTime(2022, 11, 30), + new DateTime(2022, 12, 31), + new DateTime(2023, 1, 31), + new DateTime(2023, 2, 28), + new DateTime(2023, 3, 31), + new DateTime(2023, 4, 30), + new DateTime(2023, 5, 31), + new DateTime(2023, 6, 30), + new DateTime(2023, 7, 31), + new DateTime(2023, 8, 31), + new DateTime(2023, 9, 30), + new DateTime(2023, 10, 31), + new DateTime(2023, 11, 30), + new DateTime(2023, 12, 31), + new DateTime(2024, 1, 31), + new DateTime(2024, 2, 29), + new DateTime(2024, 3, 31) + } + }; + + var cashflowLeasingColumn = new CashflowLeasingColumn(preparedValues.Nmper + 1, dateTempColumn) + { + Values = new[] + { + -2507300m, + 625000m, + 117858.04449644m, + 119758.04449644m, + 119758.04449644m, + 119758.04449644m, + 119758.04449644m, + 119758.04449644m, + 119758.04449644m, + 119758.04449644m, + 119758.04449644m, + 119758.04449644m, + 107480.86417874m, + 50064.1975120737m, + 107480.86417874m, + 107480.86417874m, + 107480.86417874m, + 107480.86417874m, + 107480.86417874m, + 107480.86417874m, + 107480.86417874m, + 107480.86417874m, + 107480.86417874m, + 95203.6838610409m, + 95203.6838610409m, + 21986.2413194444m + } + }; + + var nsibExpensesColumn = new NSIBExpensesColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -4811.4375m, + -2309.49m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -2501.9475m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }; + + var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 26730.2083333333m, + 0, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m + } + }; + + var cashflowNsibColumn = new CashflowNSIBColumn(preparedValues.Nmper + 1, dateTempColumn, + nsibBruttoGrColumn, nsibExpensesColumn); + cashflowNsibColumn.ComputeValues((decimal) cashflowLeasingColumn.IRR); + + + var expected = new[] + { + 0, + -10899.0991979689m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + -10693.5987839108m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m + }; + + + Assert.Equal(expected.Length, cashflowNsibColumn.Values.Length); + Assert.Equal(0.379046887159348, cashflowNsibColumn.IRR, new DoubleArrayComparer()); + Assert.Equal(expected, cashflowNsibColumn.Values, new DecimalArrayComparer(1)); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/DirectorBonusSum.cs b/EvoCalculator.Core.Tests/Calculation/Columns/DirectorBonusSum.cs new file mode 100644 index 0000000..962e061 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/DirectorBonusSum.cs @@ -0,0 +1,61 @@ +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class DirectorBonusSumTests + { + [Fact] + public void DirectorBonusSumTest1() + { + var preparedValues = new PreparedValues + { + Nmper = 25, + BonusBase = 1873191.66666667m, + DirectorBonus = 0.003, + SalaryRate = 0.3, + MarketRate = 0.01, + DistrictRate = 0.02 + }; + + var directorBonusSumColumn = new DirectorBonusSumColumn(preparedValues.Nmper + 1); + directorBonusSumColumn.ComputeValues(preparedValues); + + + var expected = new[] + { + -7524.610925m, + 0, + -7524.610925m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + }; + + + Assert.Equal(expected.Length, directorBonusSumColumn.Values.Length); + Assert.Equal(expected, directorBonusSumColumn.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/ExtraBonusSum.cs b/EvoCalculator.Core.Tests/Calculation/Columns/ExtraBonusSum.cs new file mode 100644 index 0000000..2b15f42 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/ExtraBonusSum.cs @@ -0,0 +1,170 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class ExtraBonusSumTests + { + [Fact] + public void ExtraBonusSumTest1() + { + var preparedValues = new PreparedValues + { + Nmper = 25, + IRR_MSFO_Plan = 0.05, + BonusBase = 1873191.66666667m, + ExtraBonus = 0.00764256319811875, + SalaryRate = 0, + MarketRate = 0, + DistrictRate = 0 + }; + + var dateTempColumn = new DateTempColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + new DateTime(2018, 10, 31), + new DateTime(2018, 10, 31), + new DateTime(2018, 11, 30), + new DateTime(2018, 12, 31), + new DateTime(2019, 1, 31), + new DateTime(2019, 2, 28), + new DateTime(2019, 3, 31), + new DateTime(2019, 4, 30), + new DateTime(2019, 5, 31), + new DateTime(2019, 6, 30), + new DateTime(2019, 7, 31), + new DateTime(2019, 8, 31), + new DateTime(2019, 9, 30), + new DateTime(2019, 10, 31), + new DateTime(2019, 11, 30), + new DateTime(2019, 12, 31), + new DateTime(2020, 1, 31), + new DateTime(2020, 2, 29), + new DateTime(2020, 3, 31), + new DateTime(2020, 4, 30), + new DateTime(2020, 5, 31), + new DateTime(2020, 6, 30), + new DateTime(2020, 7, 31), + new DateTime(2020, 8, 31), + new DateTime(2020, 9, 30), + new DateTime(2020, 10, 31), + new DateTime(2020, 11, 30), + new DateTime(2020, 12, 31), + new DateTime(2021, 1, 31), + new DateTime(2021, 2, 28), + new DateTime(2021, 3, 31), + new DateTime(2021, 4, 30), + new DateTime(2021, 5, 31), + new DateTime(2021, 6, 30), + new DateTime(2021, 7, 31), + new DateTime(2021, 8, 31), + new DateTime(2021, 9, 30), + new DateTime(2021, 10, 31), + new DateTime(2021, 11, 30), + new DateTime(2021, 12, 31), + new DateTime(2022, 1, 31), + new DateTime(2022, 2, 28), + new DateTime(2022, 3, 31), + new DateTime(2022, 4, 30), + new DateTime(2022, 5, 31), + new DateTime(2022, 6, 30), + new DateTime(2022, 7, 31), + new DateTime(2022, 8, 31), + new DateTime(2022, 9, 30), + new DateTime(2022, 10, 31), + new DateTime(2022, 11, 30), + new DateTime(2022, 12, 31), + new DateTime(2023, 1, 31), + new DateTime(2023, 2, 28), + new DateTime(2023, 3, 31), + new DateTime(2023, 4, 30), + new DateTime(2023, 5, 31), + new DateTime(2023, 6, 30), + new DateTime(2023, 7, 31), + new DateTime(2023, 8, 31), + new DateTime(2023, 9, 30), + new DateTime(2023, 10, 31), + new DateTime(2023, 11, 30), + new DateTime(2023, 12, 31), + new DateTime(2024, 1, 31), + new DateTime(2024, 2, 29), + new DateTime(2024, 3, 31) + } + }; + + var cashflowMsfoColumn = new CashflowMSFOColumn(preparedValues.Nmper + 1, dateTempColumn) + { + Values = new[] + { + -2507300m, + 623323.69753125m, + -355830.906125263m, + 119763.500599737m, + 119763.500599737m, + 119763.500599737m, + 119763.500599737m, + 119763.500599737m, + 119763.500599737m, + 119763.500599737m, + 119763.500599737m, + 119763.500599737m, + 107485.774671708m, + 50069.1080050413m, + 107485.774671708m, + 107485.774671708m, + 107485.774671708m, + 107485.774671708m, + 107485.774671708m, + 107485.774671708m, + 107485.774671708m, + 107485.774671708m, + 107485.774671708m, + 95208.0487436787m, + 95208.0487436787m, + 21986.2413194444m + } + }; + + var extraBonusSumColumn = new ExtraBonusSumColumn(preparedValues.Nmper + 1); + extraBonusSumColumn.ComputeValues(preparedValues, cashflowMsfoColumn); + + + var expected = new[] + { + -7487.31397588584m, + 0, + -7487.31397588584m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + }; + + + Assert.Equal(expected.Length, extraBonusSumColumn.Values.Length); + Assert.Equal(expected, extraBonusSumColumn.Values, new DecimalArrayComparer(0.3)); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/NPVFinal.cs b/EvoCalculator.Core.Tests/Calculation/Columns/NPVFinal.cs new file mode 100644 index 0000000..402eea8 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/NPVFinal.cs @@ -0,0 +1,240 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class NpvFinalTests + { + [Fact] + public void NpvFinalTest1() + { + var preparedValues = new PreparedValues + { + Nmper = 25 + }; + + var dateTempColumn = new DateTempColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + new DateTime(2018, 10, 31), + new DateTime(2018, 10, 31), + new DateTime(2018, 11, 30), + new DateTime(2018, 12, 31), + new DateTime(2019, 1, 31), + new DateTime(2019, 2, 28), + new DateTime(2019, 3, 31), + new DateTime(2019, 4, 30), + new DateTime(2019, 5, 31), + new DateTime(2019, 6, 30), + new DateTime(2019, 7, 31), + new DateTime(2019, 8, 31), + new DateTime(2019, 9, 30), + new DateTime(2019, 10, 31), + new DateTime(2019, 11, 30), + new DateTime(2019, 12, 31), + new DateTime(2020, 1, 31), + new DateTime(2020, 2, 29), + new DateTime(2020, 3, 31), + new DateTime(2020, 4, 30), + new DateTime(2020, 5, 31), + new DateTime(2020, 6, 30), + new DateTime(2020, 7, 31), + new DateTime(2020, 8, 31), + new DateTime(2020, 9, 30), + new DateTime(2020, 10, 31), + new DateTime(2020, 11, 30), + new DateTime(2020, 12, 31), + new DateTime(2021, 1, 31), + new DateTime(2021, 2, 28), + new DateTime(2021, 3, 31), + new DateTime(2021, 4, 30), + new DateTime(2021, 5, 31), + new DateTime(2021, 6, 30), + new DateTime(2021, 7, 31), + new DateTime(2021, 8, 31), + new DateTime(2021, 9, 30), + new DateTime(2021, 10, 31), + new DateTime(2021, 11, 30), + new DateTime(2021, 12, 31), + new DateTime(2022, 1, 31), + new DateTime(2022, 2, 28), + new DateTime(2022, 3, 31), + new DateTime(2022, 4, 30), + new DateTime(2022, 5, 31), + new DateTime(2022, 6, 30), + new DateTime(2022, 7, 31), + new DateTime(2022, 8, 31), + new DateTime(2022, 9, 30), + new DateTime(2022, 10, 31), + new DateTime(2022, 11, 30), + new DateTime(2022, 12, 31), + new DateTime(2023, 1, 31), + new DateTime(2023, 2, 28), + new DateTime(2023, 3, 31), + new DateTime(2023, 4, 30), + new DateTime(2023, 5, 31), + new DateTime(2023, 6, 30), + new DateTime(2023, 7, 31), + new DateTime(2023, 8, 31), + new DateTime(2023, 9, 30), + new DateTime(2023, 10, 31), + new DateTime(2023, 11, 30), + new DateTime(2023, 12, 31), + new DateTime(2024, 1, 31), + new DateTime(2024, 2, 29), + new DateTime(2024, 3, 31) + } + }; + + var cashflowNpvFinalColumn = new CashflowNPVFinalColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -2507300m, + 562200.08956372m, + -310589.328673099m, + 135135.417631327m, + 139935.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 121656.435211628m, + 58453.266499507m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 107631.998246475m, + 107631.998246475m, + 23039.7637504377m + } + }; + + var npvWeightColumn = new NPVWeightColumn(67) + { + Values = new[] + { + 1, + 1, + 0.994263643057415, + 0.98837064137184, + 0.982512567513616, + 0.977251253020835, + 0.97145908378937, + 0.965886447729637, + 0.960161637711399, + 0.954653807834909, + 0.948995573685451, + 0.943370875895905, + 0.937959363822527, + 0.93240007766075, + 0.927051498001993, + 0.921556862772709, + 0.916094794252359, + 0.911014429114697, + 0.905614845610017, + 0.900419915603094, + 0.895083125791432, + 0.889948609488607, + 0.884673883119589, + 0.879430420059453, + 0.874385693263824, + 0.869203208316068, + 0.864217148457527, + 0.859094932485813, + 0.854003075893692, + 0.849429924456607, + 0.844395352377508, + 0.83955159923561, + 0.834575576000758, + 0.829788152601254, + 0.824869997325142, + 0.81998099196066, + 0.815277288304638, + 0.810445138936875, + 0.80579613633755, + 0.801020181767729, + 0.796272534285798, + 0.792008527530705, + 0.787314292133165, + 0.78279797632749, + 0.778158331876872, + 0.773694537927379, + 0.769108849565985, + 0.764550340584458, + 0.76016460693029, + 0.755659110484519, + 0.751324380099863, + 0.746871279688058, + 0.7424445728072, + 0.738468812577606, + 0.734091907128381, + 0.729880893920429, + 0.725554889074355, + 0.721392847249186, + 0.717117151064894, + 0.712866796936501, + 0.708777538536756, + 0.704576613300819, + 0.700534910353527, + 0.696382839183729, + 0.692255377344236, + 0.688416353143374, + 0.684336108675241 + } + }; + + var npvFinalColumn = new NPVFinalColumn(preparedValues.Nmper + 1, dateTempColumn); + npvFinalColumn.ComputeValues(cashflowNpvFinalColumn, npvWeightColumn); + + + var expected = new[] + { + -2507300m, + 562200.08956372m, + -308807.677421272m, + 133563.879396326m, + 137488.306463045m, + 132061.256207708m, + 131278.528999622m, + 130525.468498383m, + 129751.843905708m, + 129007.541015107m, + 128242.913180264m, + 127482.817295423m, + 114108.792576015m, + 54501.8302236648m, + 112276.116051067m, + 111610.655390045m, + 110949.13891508m, + 110333.850911115m, + 109679.902057675m, + 109050.738990044m, + 108404.395142344m, + 107782.548837663m, + 107143.721554365m, + 94654.8534297361m, + 94111.879404115m, + 20026.2365707247m + }; + + + Assert.Equal(expected.Length, npvFinalColumn.Values.Length); + Assert.Equal(0.13361788392067, npvFinalColumn.IRR, new DoubleArrayComparer()); + Assert.Equal(0.126071837819239, npvFinalColumn.Nominal, new DoubleArrayComparer()); + Assert.Equal(expected, npvFinalColumn.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/NPVFinal2.cs b/EvoCalculator.Core.Tests/Calculation/Columns/NPVFinal2.cs new file mode 100644 index 0000000..7ae3e1d --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/NPVFinal2.cs @@ -0,0 +1,241 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class NpvFinal2Tests + { + [Fact] + public void NpvFinal2Test1() + { + var preparedValues = new PreparedValues + { + Nmper = 25 + }; + + var dateTempColumn = new DateTempColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + new DateTime(2018, 10, 31), + new DateTime(2018, 10, 31), + new DateTime(2018, 11, 30), + new DateTime(2018, 12, 31), + new DateTime(2019, 1, 31), + new DateTime(2019, 2, 28), + new DateTime(2019, 3, 31), + new DateTime(2019, 4, 30), + new DateTime(2019, 5, 31), + new DateTime(2019, 6, 30), + new DateTime(2019, 7, 31), + new DateTime(2019, 8, 31), + new DateTime(2019, 9, 30), + new DateTime(2019, 10, 31), + new DateTime(2019, 11, 30), + new DateTime(2019, 12, 31), + new DateTime(2020, 1, 31), + new DateTime(2020, 2, 29), + new DateTime(2020, 3, 31), + new DateTime(2020, 4, 30), + new DateTime(2020, 5, 31), + new DateTime(2020, 6, 30), + new DateTime(2020, 7, 31), + new DateTime(2020, 8, 31), + new DateTime(2020, 9, 30), + new DateTime(2020, 10, 31), + new DateTime(2020, 11, 30), + new DateTime(2020, 12, 31), + new DateTime(2021, 1, 31), + new DateTime(2021, 2, 28), + new DateTime(2021, 3, 31), + new DateTime(2021, 4, 30), + new DateTime(2021, 5, 31), + new DateTime(2021, 6, 30), + new DateTime(2021, 7, 31), + new DateTime(2021, 8, 31), + new DateTime(2021, 9, 30), + new DateTime(2021, 10, 31), + new DateTime(2021, 11, 30), + new DateTime(2021, 12, 31), + new DateTime(2022, 1, 31), + new DateTime(2022, 2, 28), + new DateTime(2022, 3, 31), + new DateTime(2022, 4, 30), + new DateTime(2022, 5, 31), + new DateTime(2022, 6, 30), + new DateTime(2022, 7, 31), + new DateTime(2022, 8, 31), + new DateTime(2022, 9, 30), + new DateTime(2022, 10, 31), + new DateTime(2022, 11, 30), + new DateTime(2022, 12, 31), + new DateTime(2023, 1, 31), + new DateTime(2023, 2, 28), + new DateTime(2023, 3, 31), + new DateTime(2023, 4, 30), + new DateTime(2023, 5, 31), + new DateTime(2023, 6, 30), + new DateTime(2023, 7, 31), + new DateTime(2023, 8, 31), + new DateTime(2023, 9, 30), + new DateTime(2023, 10, 31), + new DateTime(2023, 11, 30), + new DateTime(2023, 12, 31), + new DateTime(2024, 1, 31), + new DateTime(2024, 2, 29), + new DateTime(2024, 3, 31) + } + }; + + var cashflowNpvFinal2Column = new CashflowNPVFinal2Column(preparedValues.Nmper + 1) + { + Values = new[] + { + -2507300m, + 562200.08956372m, + -318113.939598099m, + 135135.417631327m, + 139935.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 135135.417631327m, + 121656.435211628m, + 58453.266499507m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 121110.980666174m, + 107631.998246475m, + 107631.998246475m, + 23039.7637504377m + } + }; + + var npvWeightColumn = new NPVWeightColumn(67) + { + Values = new[] + { + 1, + 1, + 0.994263643057415, + 0.98837064137184, + 0.982512567513616, + 0.977251253020835, + 0.97145908378937, + 0.965886447729637, + 0.960161637711399, + 0.954653807834909, + 0.948995573685451, + 0.943370875895905, + 0.937959363822527, + 0.93240007766075, + 0.927051498001993, + 0.921556862772709, + 0.916094794252359, + 0.911014429114697, + 0.905614845610017, + 0.900419915603094, + 0.895083125791432, + 0.889948609488607, + 0.884673883119589, + 0.879430420059453, + 0.874385693263824, + 0.869203208316068, + 0.864217148457527, + 0.859094932485813, + 0.854003075893692, + 0.849429924456607, + 0.844395352377508, + 0.83955159923561, + 0.834575576000758, + 0.829788152601254, + 0.824869997325142, + 0.81998099196066, + 0.815277288304638, + 0.810445138936875, + 0.80579613633755, + 0.801020181767729, + 0.796272534285798, + 0.792008527530705, + 0.787314292133165, + 0.78279797632749, + 0.778158331876872, + 0.773694537927379, + 0.769108849565985, + 0.764550340584458, + 0.76016460693029, + 0.755659110484519, + 0.751324380099863, + 0.746871279688058, + 0.7424445728072, + 0.738468812577606, + 0.734091907128381, + 0.729880893920429, + 0.725554889074355, + 0.721392847249186, + 0.717117151064894, + 0.712866796936501, + 0.708777538536756, + 0.704576613300819, + 0.700534910353527, + 0.696382839183729, + 0.692255377344236, + 0.688416353143374, + 0.684336108675241 + } + }; + + + var npvFinal2Column = new NPVFinal2Column(preparedValues.Nmper + 1, dateTempColumn); + npvFinal2Column.ComputeValues(cashflowNpvFinal2Column, npvWeightColumn); + + + var expected = new[] + { + -2507300m, + 562200.08956372m, + -316289.124492152m, + 133563.879396326m, + 137488.306463045m, + 132061.256207708m, + 131278.528999622m, + 130525.468498383m, + 129751.843905708m, + 129007.541015107m, + 128242.913180264m, + 127482.817295423m, + 114108.792576015m, + 54501.8302236648m, + 112276.116051067m, + 111610.655390045m, + 110949.13891508m, + 110333.850911115m, + 109679.902057675m, + 109050.738990044m, + 108404.395142344m, + 107782.548837663m, + 107143.721554365m, + 94654.8534297361m, + 94111.879404115m, + 20026.2365707247m + }; + + + Assert.Equal(expected.Length, npvFinal2Column.Values.Length); + Assert.Equal(0.129696124792099, npvFinal2Column.IRR, new DoubleArrayComparer()); + Assert.Equal(0.122570429842705, npvFinal2Column.Nominal, new DoubleArrayComparer()); + Assert.Equal(expected, npvFinal2Column.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/Revenue.cs b/EvoCalculator.Core.Tests/Calculation/Columns/Revenue.cs new file mode 100644 index 0000000..83ffad6 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/Revenue.cs @@ -0,0 +1,232 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class RevenueTests + { + [Fact] + public void RevenueTest1() + { + var preparedValues = new PreparedValues + { + Nmper = 25 + }; + + + var dateTempColumn = new DateTempColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + new DateTime(2018, 10, 31), + new DateTime(2018, 10, 31), + new DateTime(2018, 11, 30), + new DateTime(2018, 12, 31), + new DateTime(2019, 1, 31), + new DateTime(2019, 2, 28), + new DateTime(2019, 3, 31), + new DateTime(2019, 4, 30), + new DateTime(2019, 5, 31), + new DateTime(2019, 6, 30), + new DateTime(2019, 7, 31), + new DateTime(2019, 8, 31), + new DateTime(2019, 9, 30), + new DateTime(2019, 10, 31), + new DateTime(2019, 11, 30), + new DateTime(2019, 12, 31), + new DateTime(2020, 1, 31), + new DateTime(2020, 2, 29), + new DateTime(2020, 3, 31), + new DateTime(2020, 4, 30), + new DateTime(2020, 5, 31), + new DateTime(2020, 6, 30), + new DateTime(2020, 7, 31), + new DateTime(2020, 8, 31), + new DateTime(2020, 9, 30), + new DateTime(2020, 10, 31), + new DateTime(2020, 11, 30), + new DateTime(2020, 12, 31), + new DateTime(2021, 1, 31), + new DateTime(2021, 2, 28), + new DateTime(2021, 3, 31), + new DateTime(2021, 4, 30), + new DateTime(2021, 5, 31), + new DateTime(2021, 6, 30), + new DateTime(2021, 7, 31), + new DateTime(2021, 8, 31), + new DateTime(2021, 9, 30), + new DateTime(2021, 10, 31), + new DateTime(2021, 11, 30), + new DateTime(2021, 12, 31), + new DateTime(2022, 1, 31), + new DateTime(2022, 2, 28), + new DateTime(2022, 3, 31), + new DateTime(2022, 4, 30), + new DateTime(2022, 5, 31), + new DateTime(2022, 6, 30), + new DateTime(2022, 7, 31), + new DateTime(2022, 8, 31), + new DateTime(2022, 9, 30), + new DateTime(2022, 10, 31), + new DateTime(2022, 11, 30), + new DateTime(2022, 12, 31), + new DateTime(2023, 1, 31), + new DateTime(2023, 2, 28), + new DateTime(2023, 3, 31), + new DateTime(2023, 4, 30), + new DateTime(2023, 5, 31), + new DateTime(2023, 6, 30), + new DateTime(2023, 7, 31), + new DateTime(2023, 8, 31), + new DateTime(2023, 9, 30), + new DateTime(2023, 10, 31), + new DateTime(2023, 11, 30), + new DateTime(2023, 12, 31), + new DateTime(2024, 1, 31), + new DateTime(2024, 2, 29), + new DateTime(2024, 3, 31) + } + }; + + var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 26730.2083333333m, + 0, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m + } + }; + + var nsibExpensesColumn = new NSIBExpensesColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -4811.4375m, + -2309.49m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -2501.9475m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + } + }; + + var cashflowNsibColumn = new CashflowNSIBColumn(preparedValues.Nmper + 1, dateTempColumn, + nsibBruttoGrColumn, nsibExpensesColumn) + { + Values = new[] + { + 0, + -10899.0991979689m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + -10693.5987839108m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m, + 1113.75868055556m + } + }; + + var revenueColumn = new RevenueColumn(preparedValues.Nmper + 1); + revenueColumn.ComputeValues(nsibBruttoGrColumn, nsibExpensesColumn, cashflowNsibColumn); + + + var expected = new[] + { + 0, + 10899.0991979689m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11807.3574644663m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + }; + + + Assert.Equal(expected.Length, revenueColumn.Values.Length); + Assert.Equal(expected, revenueColumn.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core/Controllers/v1/CalculationController.cs b/EvoCalculator.Core/Controllers/v1/CalculationController.cs index a04b9c7..1dd0e93 100644 --- a/EvoCalculator.Core/Controllers/v1/CalculationController.cs +++ b/EvoCalculator.Core/Controllers/v1/CalculationController.cs @@ -134,6 +134,7 @@ namespace EvoCalculator.Core.Controllers.V1 nsibExpensesColumn, tlmExpensesColumn, gpsExpensesColumn, registrExpensesColumn, insuranceBonusExpensesColumn, comissionBonusExpensesColumn, npvBonusExpensesColumn); + return new { dateColumn,