diff --git a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml
index 7728b3e..5cfc6f8 100644
--- a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml
+++ b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml
@@ -14,45 +14,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -138,10 +100,10 @@
-
+
@@ -224,7 +186,12 @@
-
+
+
+
+
+
+
1602593830686
@@ -275,7 +242,14 @@
1603799116058
-
+
+ 1603890043823
+
+
+
+ 1603890043823
+
+
@@ -305,7 +279,8 @@
-
+
+
@@ -324,90 +299,90 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
@@ -432,10 +407,10 @@
-
+
-
+
diff --git a/EvoCalculator.Core.Calculation/Columns/CashflowNSIBColumn.cs b/EvoCalculator.Core.Calculation/Columns/CashflowNSIBColumn.cs
new file mode 100644
index 0000000..090a217
--- /dev/null
+++ b/EvoCalculator.Core.Calculation/Columns/CashflowNSIBColumn.cs
@@ -0,0 +1,46 @@
+using System;
+using TridentGoalSeek;
+
+namespace EvoCalculator.Core.Calculation.Columns
+{
+ public class CashflowNSIBColumn : BaseColumnWithGoalSeek
+ {
+ private readonly NSIBBruttoGrColumn _NSIBBruttoGrColumn;
+ private readonly NSIBExpensesColumn _NSIBExpensesColumn;
+
+ public CashflowNSIBColumn(int count, DateTempColumn dateTempColumn,
+ NSIBBruttoGrColumn nsibBruttoGrColumn, NSIBExpensesColumn nsibExpensesColumn) : base(count, dateTempColumn)
+ {
+ _NSIBBruttoGrColumn = nsibBruttoGrColumn;
+ _NSIBExpensesColumn = nsibExpensesColumn;
+ }
+
+ public override decimal Calculate(decimal inputVariable)
+ {
+ FillValues(inputVariable);
+ return Convert.ToDecimal(IRR);
+ }
+
+ protected override void FillValues(decimal x)
+ {
+ Values[1] = _NSIBBruttoGrColumn.Values[1] - x;
+ for (var i = 2; i < Values.Length; i++)
+ Values[i] = _NSIBBruttoGrColumn.Values[i] -
+ x * _NSIBExpensesColumn.Values[i] / _NSIBExpensesColumn.Values[1];
+ }
+
+ public override void ComputeValues(decimal requiredValue)
+ {
+ var goalSeek = new GoalSeek(this);
+ goalSeek.SeekResult(requiredValue,
+ new GoalSeekOptions(
+ startingStabPoint: Convert.ToDecimal(_NSIBBruttoGrColumn.Values[0] / 2)
+ , tineExplorePercentage: 10
+ // , maximumAttempts: 10000
+ // , initialTineSpacing: 1
+ // , focusPercentage: 100
+ // , trimFinalInputValue: true
+ ));
+ }
+ }
+}
\ No newline at end of file
diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOFinal.cs b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOFinal.cs
new file mode 100644
index 0000000..151e019
--- /dev/null
+++ b/EvoCalculator.Core.Tests/Calculation/Columns/CashflowMSFOFinal.cs
@@ -0,0 +1,200 @@
+using System;
+using EvoCalculator.Core.Calculation.Columns;
+using EvoCalculator.Core.Models.Calculation.Models.Prepared;
+using Xunit;
+
+namespace EvoCalculator.Core.Tests.Calculation.Columns
+{
+ public class CashflowMsfoFinalTests
+ {
+ [Fact]
+ public void CashflowMsfoFinalTest1()
+ {
+ 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 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)
+ {
+ 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 cashflowMsfoFinalColumn = new CashflowMSFOFinalColumn(preparedValues.Nmper + 1, dateTempColumn);
+ cashflowMsfoFinalColumn.ComputeValues(preparedValues, cashflowMsfoColumn, extraBonusSumColumn);
+
+
+ var expected = new[]
+ {
+ -2507300m,
+ 623323.69753125m,
+ -363318.220101149m,
+ 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
+ };
+
+
+ Assert.Equal(expected.Length, cashflowMsfoFinalColumn.Values.Length);
+ Assert.Equal(0.0752256363630295, cashflowMsfoFinalColumn.IRR, new DoubleArrayComparer(0.01));
+ Assert.Equal(0.0727501710651923, cashflowMsfoFinalColumn.Nominal, new DoubleArrayComparer(0.01));
+ Assert.Equal(expected, cashflowMsfoFinalColumn.Values, new DecimalArrayComparer());
+ }
+ }
+}
\ No newline at end of file