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 @@
+
+
+
+
+
-
-
-
-
-
-
@@ -45,6 +44,7 @@
+
@@ -55,16 +55,6 @@
@@ -181,7 +181,7 @@
-
+
1602593830686
@@ -211,7 +211,14 @@
1603456459093
-
+
+ 1603646824466
+
+
+
+ 1603646824466
+
+
@@ -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