diff --git a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml index c0b50c7..9c4c23a 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml @@ -40,6 +40,7 @@ + @@ -108,6 +109,7 @@ + diff --git a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml index 4bdecec..9a8a1c9 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml @@ -14,11 +14,12 @@ - - + + - + + - file://$PROJECT_DIR$/EvoCalculator.Core.Tests/Calculation/Suite/Columns/PercentPaymentTests.cs - 152 - + file://$PROJECT_DIR$/EvoCalculator.Core.Tests/Calculation/Suite/Columns/KaskoNmperGrTests.cs + 254 + - - - + + + + + \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/DateTempColumn.cs b/EvoCalculator.Core.Calculation/Columns/DateTempColumn.cs index e67ef78..4c1a36a 100644 --- a/EvoCalculator.Core.Calculation/Columns/DateTempColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/DateTempColumn.cs @@ -8,6 +8,7 @@ namespace EvoCalculator.Core.Calculation.Columns { public DateTime[] Values { get; set; } + //TODO: extract 67 public DateTempColumn(int count = 67) { Values = new DateTime[count]; diff --git a/EvoCalculator.Core.Calculation/Columns/KaskoNmperGrColumn.cs b/EvoCalculator.Core.Calculation/Columns/KaskoNmperGrColumn.cs new file mode 100644 index 0000000..83c98be --- /dev/null +++ b/EvoCalculator.Core.Calculation/Columns/KaskoNmperGrColumn.cs @@ -0,0 +1,56 @@ +using System; +using EvoCalculator.Core.Calculation.FinanceFormulas; +using EvoCalculator.Core.Models.Calculation.Interfaces; +using EvoCalculator.Core.Models.Calculation.Models; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; + +namespace EvoCalculator.Core.Calculation.Columns +{ + public class KaskoNmperGrColumn : IColumn + { + public double[] Values { get; set; } + + public KaskoNmperGrColumn(int count) + { + Values = new double[count]; + } + + public void ComputeValues(PreparedValues preparedValues, IColumn dateTempColumn) + { + for (var i = 0; i < Values.Length; i++) + { + Values[i] = 0; + } + + for (var i = 1; i < Values.Length; i += 12) + { + if (i <= preparedValues.NmperInsurance) + { + if (preparedValues.NmperInsurance - i < 16 - 1) + { + Values[i] = preparedValues.InsuranceKasko / 12 * (preparedValues.NmperInsurance - i + 1); + } + else + { + Values[i] = preparedValues.InsuranceKasko; + } + } + } + + + Flow[] flows = new Flow[Values.Length - 1]; + for (var i = 1; i < Values.Length; i++) + { + flows[i - 1] = new Flow() + { + Date = dateTempColumn.Values[i].Date, + Value = Values[i] + }; + } + + + var XNPV = new XNPV(flows, preparedValues.IrrExpected); + Values[0] = -XNPV.GetResult(); + } + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Models/Calculation/Interfaces/IColumn.cs b/EvoCalculator.Core.Models/Calculation/Interfaces/IColumn.cs index 7247b8e..52b4c04 100644 --- a/EvoCalculator.Core.Models/Calculation/Interfaces/IColumn.cs +++ b/EvoCalculator.Core.Models/Calculation/Interfaces/IColumn.cs @@ -5,10 +5,8 @@ namespace EvoCalculator.Core.Models.Calculation.Interfaces public interface IColumn { public T[] Values { get; set; } - - - public void ComputeValues(PreparedValues preparedValues, PreparedPayments preparedPayments, - Constants.Calculation constants, - params IColumn[] columns); + // public void ComputeValues(PreparedValues preparedValues, PreparedPayments preparedPayments, + // Constants.Calculation constants, + // params IColumn[] columns); } } \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Suite/Columns/KaskoNmperGrTests.cs b/EvoCalculator.Core.Tests/Calculation/Suite/Columns/KaskoNmperGrTests.cs new file mode 100644 index 0000000..066da1f --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/Suite/Columns/KaskoNmperGrTests.cs @@ -0,0 +1,389 @@ +using System; +using EvoCalculator.Core.Calculation.Columns; +using EvoCalculator.Core.Models.Calculation.Models.Prepared; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation.Suite.Columns +{ + public class KaskoNmperGrTests + { + [Fact] + public void KaskoNmperGrTest1() + { + var preparedValues = + new PreparedValues() + { + InsuranceKasko = 53000, + NmperInsurance = 17, + IrrExpected = 0.22, + Nmper = 30 + }; + + + var dateTempColumn = new DateTempColumn() + { + Values = new[] + { + new DateTime(2018, 10, 31), + new DateTime(2018, 10, 31), + new DateTime(2018, 12, 11), + new DateTime(2019, 1, 11), + new DateTime(2019, 2, 11), + new DateTime(2019, 3, 11), + new DateTime(2019, 4, 11), + new DateTime(2019, 5, 11), + new DateTime(2019, 6, 11), + new DateTime(2019, 7, 11), + new DateTime(2019, 8, 11), + new DateTime(2019, 9, 11), + new DateTime(2019, 10, 11), + new DateTime(2019, 11, 11), + new DateTime(2019, 12, 11), + new DateTime(2020, 1, 11), + new DateTime(2020, 2, 11), + new DateTime(2020, 3, 11), + new DateTime(2020, 4, 11), + new DateTime(2020, 5, 11), + new DateTime(2020, 6, 11), + new DateTime(2020, 7, 11), + new DateTime(2020, 8, 11), + new DateTime(2020, 9, 11), + new DateTime(2020, 10, 11), + new DateTime(2020, 11, 11), + new DateTime(2020, 12, 11), + new DateTime(2021, 1, 11), + new DateTime(2021, 2, 11), + new DateTime(2021, 3, 11), + new DateTime(2021, 4, 11), + new DateTime(2021, 5, 11), + new DateTime(2021, 6, 11), + new DateTime(2021, 7, 11), + new DateTime(2021, 8, 11), + new DateTime(2021, 9, 11), + new DateTime(2021, 10, 11), + new DateTime(2021, 11, 11), + new DateTime(2021, 12, 11), + new DateTime(2022, 1, 11), + new DateTime(2022, 2, 11), + new DateTime(2022, 3, 11), + new DateTime(2022, 4, 11), + new DateTime(2022, 5, 11), + new DateTime(2022, 6, 11), + new DateTime(2022, 7, 11), + new DateTime(2022, 8, 11), + new DateTime(2022, 9, 11), + new DateTime(2022, 10, 11), + new DateTime(2022, 11, 11), + new DateTime(2022, 12, 11), + new DateTime(2023, 1, 11), + new DateTime(2023, 2, 11), + new DateTime(2023, 3, 11), + new DateTime(2023, 4, 11), + new DateTime(2023, 5, 11), + new DateTime(2023, 6, 11), + new DateTime(2023, 7, 11), + new DateTime(2023, 8, 11), + new DateTime(2023, 9, 11), + new DateTime(2023, 10, 11), + new DateTime(2023, 11, 11), + new DateTime(2023, 12, 11), + new DateTime(2024, 1, 11), + new DateTime(2024, 2, 11), + new DateTime(2024, 3, 11), + new DateTime(2024, 4, 11), + } + }; + + + var kaskoNmperGrColumn = new KaskoNmperGrColumn(preparedValues.Nmper + 1); + kaskoNmperGrColumn.ComputeValues(preparedValues, dateTempColumn); + + + var expected = new[] + { + -70992.94167536501, + 53000.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 22083.333333333336, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00 + }; + + var res = kaskoNmperGrColumn.Values; + Assert.Equal(expected, res); + } + + [Fact] + public void KaskoNmperGrTest2() + { + var preparedValues = + new PreparedValues() + { + InsuranceKasko = 53000, + NmperInsurance = 16, + IrrExpected = 0.22, + Nmper = 16 + }; + + + var dateTempColumn = new DateTempColumn() + { + 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 kaskoNmperGrColumn = new KaskoNmperGrColumn(preparedValues.Nmper + 1); + kaskoNmperGrColumn.ComputeValues(preparedValues, dateTempColumn); + + + var expected = new[] + { + -67480.874316939895, + 53000.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 17666.666666666668, + 0.00, + 0.00, + 0.00, + }; + + var res = kaskoNmperGrColumn.Values; + Assert.Equal(expected, res); + } + + [Fact] + public void KaskoNmperGrTest3() + { + var preparedValues = + new PreparedValues() + { + InsuranceKasko = 53000, + NmperInsurance = 30, + IrrExpected = 0.22, + Nmper = 30 + }; + + + var dateTempColumn = new DateTempColumn() + { + 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 kaskoNmperGrColumn = new KaskoNmperGrColumn(preparedValues.Nmper + 1); + kaskoNmperGrColumn.ComputeValues(preparedValues, dateTempColumn); + + + var expected = new[] + { + -114237.27950469786, + 53000.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 53000.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + 26500.00, + 0.00, + 0.00, + 0.00, + 0.00, + 0.00, + }; + + var res = kaskoNmperGrColumn.Values; + Assert.Equal(expected, res); + } + } +} \ No newline at end of file