diff --git a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml index d8347fc..8762407 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml @@ -49,6 +49,8 @@ + + @@ -148,6 +150,8 @@ + + diff --git a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml index 307a2b9..61aae1a 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml @@ -14,13 +14,12 @@ + + + + + - - - - - - @@ -238,7 +245,8 @@ - @@ -377,10 +385,10 @@ - + - + diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowLeasingColumn.cs b/EvoCalculator.Core.Calculation/Columns/CashflowLeasingColumn.cs new file mode 100644 index 0000000..47f201b --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/CashflowLeasingColumn.cs @@ -0,0 +1,27 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class CashflowLeasingColumn : BaseColumnWithXIRR + { + public CashflowLeasingColumn(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + { + } + + public void ComputeValues(PreparedValues preparedValues, SumColumn sumColumn, + NegativeCashflowColumn negativeCashflowColumn, + NSIBBruttoGrColumn nsibBruttoGrColumn, TLM_GrColumn tlmGrColumn, GPS_GrColumn gpsGrColumn) + { + Values[0] = -preparedValues.AcquisitionExpenses; + Values[1] = sumColumn.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]; + } + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowMSFOColumn.cs b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOColumn.cs new file mode 100644 index 0000000..6ed441b --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/CashflowMSFOColumn.cs @@ -0,0 +1,30 @@ +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class CashflowMSFOColumn : BaseColumnWithXIRR + { + public CashflowMSFOColumn(int count, DateTempColumn dateTempColumn) : base(count, dateTempColumn) + { + } + + public void ComputeValues(PreparedValues preparedValues, SumColumn sumColumn, + NegativeCashflowColumn negativeCashflowColumn, + NSIBBruttoGrColumn nsibBruttoGrColumn, TLM_GrColumn tlmGrColumn, GPS_GrColumn gpsGrColumn, + NPVBonusExpensesColumn npvBonusExpensesColumn, AgentComissionExpensesColumn agentComissionExpensesColumn) + { + 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]; + } + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/CashflowLeasingTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowLeasingTests.cs new file mode 100644 index 0000000..b4dd733 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowLeasingTests.cs @@ -0,0 +1,302 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class CashflowLeasingTests + { + [Fact] + public void CashflowLeasingTest1() + { + var preparedValues = new PreparedValues() + { + Nmper = 25, + AcquisitionExpenses = 2507300 + }; + + var dateTempColumn = new DateTempColumn(67) + { + 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 sumColumn = new SumColumn(preparedValues.Nmper + 1, dateTempColumn, preparedValues, null) + { + Values = new[] + { + -2542903.66268442m, + 625000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 96000, + 96000, + 25000, + } + }; + + var negativeCashFlowColumn = new NegativeCashflowColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -110416.666666667m, + -53000, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -57416.6666666667m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + } + }; + + var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 26730.2083333333m, + 0.00m, + 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 tlmGrColumn = new TLM_GrColumn(preparedValues.Nmper + 1, dateTempColumn, 0) + { + Values = new[] + { + -18562.8003994563m, + 0.00m, + 1800m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + } + }; + + + var gpsGrColumn = new GPS_GrColumn(preparedValues.Nmper + 1, dateTempColumn, 0) + { + Values = new[] + { + -20625.3337771737m, + 0.00m, + 2000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + } + }; + + + var cashflowLeasingColumn = new CashflowLeasingColumn(preparedValues.Nmper + 1, dateTempColumn); + cashflowLeasingColumn.ComputeValues(preparedValues, sumColumn, negativeCashFlowColumn, nsibBruttoGrColumn, + tlmGrColumn, + gpsGrColumn); + + + var expected = new[] + { + -2507300m, + 625000m, + 115086.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 104986.241319444m, + 47569.5746527778m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 92986.2413194444m, + 92986.2413194444m, + 21986.2413194444m, + }; + + + Assert.Equal(expected.Length, cashflowLeasingColumn.Values.Length); + Assert.Equal(0.342274123430252, cashflowLeasingColumn.IRR, new DoubleArrayComparer(0.01)); + Assert.Equal(expected, cashflowLeasingColumn.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOTests.cs b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOTests.cs new file mode 100644 index 0000000..f3130de --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOTests.cs @@ -0,0 +1,371 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Columns +{ + public class CashflowMSFOTests + { + [Fact] + public void CashflowMSFOTest1() + { + var preparedValues = new PreparedValues() + { + Nmper = 25, + AcquisitionExpenses = 2507300 + }; + + var dateTempColumn = new DateTempColumn(67) + { + 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 sumColumn = new SumColumn(preparedValues.Nmper + 1, dateTempColumn, preparedValues, null) + { + Values = new[] + { + -2542903.66268442m, + 625000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 120000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 108000, + 96000, + 96000, + 25000, + } + }; + + var negativeCashFlowColumn = new NegativeCashflowColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -110416.666666667m, + -53000, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + -57416.6666666667m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + } + }; + + var nsibBruttoGrColumn = new NSIBBruttoGrColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 26730.2083333333m, + 0.00m, + 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 tlmGrColumn = new TLM_GrColumn(preparedValues.Nmper + 1, dateTempColumn, 0) + { + Values = new[] + { + -18562.8003994563m, + 0.00m, + 1800m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + 900m, + } + }; + + + var gpsGrColumn = new GPS_GrColumn(preparedValues.Nmper + 1, dateTempColumn, 0) + { + Values = new[] + { + -20625.3337771737m, + 0.00m, + 2000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + 1000m, + } + }; + + var npvBonusExpensesColumn = new NPVBonusExpensesColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -29266.5425270833m, + -1676.30246875m, + -27590.2400583333m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + } + }; + + var agentComissionExpensesColumn = new AgentComissionExpensesColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + -446104.166666667m, + 0, + -446104.166666667m, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + } + }; + + + var cashflowMsfoColumn = new CashflowMSFOColumn(preparedValues.Nmper + 1, dateTempColumn); + cashflowMsfoColumn.ComputeValues(preparedValues, sumColumn, negativeCashFlowColumn, nsibBruttoGrColumn, + tlmGrColumn, + gpsGrColumn, + npvBonusExpensesColumn, + agentComissionExpensesColumn + ); + + + var expected = new[] + { + -2507300m, + 623323.69753125m, + -358608.165405556m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 116986.241319444m, + 104986.241319444m, + 47569.5746527778m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 104986.241319444m, + 92986.2413194444m, + 92986.2413194444m, + 21986.2413194444m, + }; + + + Assert.Equal(expected.Length, cashflowMsfoColumn.Values.Length); + Assert.Equal(0.0517445296049118, cashflowMsfoColumn.IRR, new DoubleArrayComparer(0.01)); + Assert.Equal(expected, cashflowMsfoColumn.Values, new DecimalArrayComparer()); + } + } +} \ No newline at end of file