diff --git a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml
index c7fb440..27881e5 100644
--- a/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml
+++ b/.idea/.idea.EvoCalculator.Core/.idea/contentModel.xml
@@ -37,6 +37,9 @@
+
+
+
@@ -50,14 +53,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -83,6 +103,9 @@
+
+
+
diff --git a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml
index 84d55be..6a95d65 100644
--- a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml
+++ b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml
@@ -13,13 +13,19 @@
-
+
+
+
+
+
+
+
-
-
+
+
@@ -30,8 +36,11 @@
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -117,8 +142,17 @@
1602504351800
-
+
+
+
+ 1602593830686
+
+
+
+ 1602593830686
+
+
@@ -141,6 +175,8 @@
+
+
@@ -151,94 +187,98 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
+
+
+
+
@@ -247,25 +287,25 @@
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
\ No newline at end of file
diff --git a/EvoCalculator.Core.Calculation/Columns/DateColumn.cs b/EvoCalculator.Core.Calculation/Columns/DateColumn.cs
new file mode 100644
index 0000000..679b990
--- /dev/null
+++ b/EvoCalculator.Core.Calculation/Columns/DateColumn.cs
@@ -0,0 +1,41 @@
+using System;
+using EvoCalculator.Core.Models.Calculation.Interfaces;
+using EvoCalculator.Core.Models.Calculation.Models.Prepared;
+
+namespace EvoCalculator.Core.Calculation.Columns
+{
+ public class DateColumn : IColumn
+ {
+ public DateTime[] Values { get; set; }
+
+ public DateColumn(int count)
+ {
+ Values = new DateTime[count];
+ }
+
+ public void ComputeValues(PreparedValues preparedValues,
+ PreparedPayments preparedPayments,
+ Constants.Calculation constants,
+ params IColumn[] columns)
+ {
+ Values[0] = preparedValues.DogDate;
+ Values[1] = Values[0];
+
+ Values[2] = preparedValues.DeliveryTime switch
+ {
+ 100000000 => preparedValues.PaymentDateNew == null
+ ? Values[1].AddMonths(1)
+ : preparedValues.PaymentDateNew ?? DateTime.MinValue,
+ 100000001 => preparedValues.PaymentDateNew == null
+ ? Values[1].AddDays(constants.DeliveryDays)
+ : preparedValues.PaymentDateNew ?? DateTime.MinValue,
+ _ => Values[2]
+ };
+
+ for (var i = 3; i < preparedValues.Nmper + 1; i++)
+ {
+ Values[i] = Values[i - 1].AddMonths(1);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/EvoCalculator.Core.Calculation/FinanceFormulas/XIRR.cs b/EvoCalculator.Core.Calculation/FinanceFormulas/XIRR.cs
index d5d40c6..b6019b9 100644
--- a/EvoCalculator.Core.Calculation/FinanceFormulas/XIRR.cs
+++ b/EvoCalculator.Core.Calculation/FinanceFormulas/XIRR.cs
@@ -6,8 +6,8 @@ namespace EvoCalculator.Core.Calculation.FinanceFormulas
{
public class XIRR : IFinanceFormula
{
- private Flow[] _flows;
- private double _guess = 0.1;
+ private readonly Flow[] _flows;
+ private readonly double _guess = 0.1;
public XIRR(Flow[] flows)
{
diff --git a/EvoCalculator.Core.Calculation/FinanceFormulas/XNPV.cs b/EvoCalculator.Core.Calculation/FinanceFormulas/XNPV.cs
index f537991..05138d1 100644
--- a/EvoCalculator.Core.Calculation/FinanceFormulas/XNPV.cs
+++ b/EvoCalculator.Core.Calculation/FinanceFormulas/XNPV.cs
@@ -7,8 +7,8 @@ namespace EvoCalculator.Core.Calculation.FinanceFormulas
{
public class XNPV : IFinanceFormula
{
- private Flow[] _flows;
- private double _rate;
+ private readonly Flow[] _flows;
+ private readonly double _rate;
public XNPV(Flow[] flows, double rate)
{
diff --git a/EvoCalculator.Core.Constants/Calculation.cs b/EvoCalculator.Core.Constants/Calculation.cs
new file mode 100644
index 0000000..da6818b
--- /dev/null
+++ b/EvoCalculator.Core.Constants/Calculation.cs
@@ -0,0 +1,10 @@
+namespace EvoCalculator.Core.Constants
+{
+ public class Calculation
+ {
+ // TODO: create constants service
+ public int DeliveryDays = 210;
+ public double IncomeTaxValue = 0.2;
+ public double VatValue = 0.2;
+ }
+}
\ No newline at end of file
diff --git a/EvoCalculator.Core.Constants/EvoCalculator.Core.Constants.csproj b/EvoCalculator.Core.Constants/EvoCalculator.Core.Constants.csproj
new file mode 100644
index 0000000..f28989b
--- /dev/null
+++ b/EvoCalculator.Core.Constants/EvoCalculator.Core.Constants.csproj
@@ -0,0 +1,8 @@
+
+
+
+ netcoreapp3.1
+ Constants
+
+
+
diff --git a/EvoCalculator.Core.Models/Calculation/Interfaces/IColumn.cs b/EvoCalculator.Core.Models/Calculation/Interfaces/IColumn.cs
new file mode 100644
index 0000000..7247b8e
--- /dev/null
+++ b/EvoCalculator.Core.Models/Calculation/Interfaces/IColumn.cs
@@ -0,0 +1,14 @@
+using EvoCalculator.Core.Models.Calculation.Models.Prepared;
+
+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);
+ }
+}
\ 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
new file mode 100644
index 0000000..8b6aeb6
--- /dev/null
+++ b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedParams.cs
@@ -0,0 +1,93 @@
+using System;
+
+namespace EvoCalculator.Core.Models.Calculation.Models.Prepared
+{
+ public class PreparedValues
+ {
+ public DateTime CalcDate { get; set; }
+ public int CalcType { get; set; }
+ public double IrrExpected { get; set; }
+ public double NpvniExpected { get; set; }
+ public double TotalExpected { get; set; }
+ public double Leasing0K { get; set; }
+ public double LoanRate { get; set; }
+ public int BalanceHolder { get; set; }
+ public DateTime DogDate { get; set; }
+ public DateTime? PaymentDateNew { get; set; }
+ public int DeliveryTime { get; set; }
+ public string Cityc { get; set; }
+ public int Nmper { get; set; }
+ public double FirstPayment { get; set; }
+ public double FirstPaymentSum { get; set; }
+ public double FirstPaymentAbs { get; set; }
+ public double FirstPaymentNdsAbs { get; set; }
+ public double FirstPaymentWithNdsAbs { get; set; }
+ public double LastPayment { get; set; }
+ public double LastPaymentSum { get; set; }
+ public int ScheduleOfPayments { get; set; }
+ public double ComissionRub { get; set; }
+ public double PlPrice { get; set; }
+ public double Discount { get; set; }
+ public double AcceptSum { get; set; }
+ public string PlTypeId { get; set; }
+ public string BrandId { get; set; }
+ public string ModelId { get; set; }
+ public string ConfigurationId { get; set; }
+ public int PlYear { get; set; }
+ public double CarCapacity { get; set; }
+ public double MotorVolume { get; set; }
+ public int PlEngineType { get; set; }
+ public double CarCarrying { get; set; }
+ public int CarSeats { get; set; }
+ public double Bonus { get; set; }
+ public double BonusFix { get; set; }
+ public double MarketRate { get; set; }
+ public double DistrictRate { get; set; }
+ public double SalaryRate { get; set; }
+ public double BonusRatPr { get; set; }
+ public double BonusNsPr { get; set; }
+ public double BonusNsibPr { get; set; }
+ public double Rats { get; set; }
+ public double BaseRatCost { get; set; }
+ public double RetroBonus { get; set; }
+ public double Registration { get; set; }
+ public double BaseRegistration { get; set; }
+ public double TransTax { get; set; }
+ public bool TransIncludeGr { get; set; }
+ public double TrackerCost { get; set; }
+ public double InsuranceKasko { get; set; }
+ public int NmperInsurance { get; set; }
+ public double InsuranceOsago { get; set; }
+ public double Insurance { get; set; }
+ public double InsuranceKaskoNmper { get; set; }
+ public double InsuranceContract { get; set; }
+ public double InsuranceBonus { get; set; }
+ public double NsibBruttoPr { get; set; }
+ public double NsibNettoPr { get; set; }
+ public double NsibBase { get; set; }
+ public double Repayment { get; set; }
+ public double TransportTaxGrYear { get; set; }
+ public double TransportTaxGr { get; set; }
+ public double NsibBrutto { get; set; }
+ public double NsibNetto { get; set; }
+ public double NmperDeprecation { get; set; }
+ public double DeprecationTime { get; set; }
+ public double RatBonus { get; set; }
+ public double NsBonus { get; set; }
+ public double NsibBonus { get; set; }
+ public double NiAtInception { get; set; }
+ public double AgentsSum { get; set; }
+ public double DoubleAgentsSum { get; set; }
+ public double DeliverySum { get; set; }
+ public double BrokerSum { get; set; }
+ public double BrokerOfDeliverySum { get; set; }
+ public double FinancialDeptOfDeliverySum { get; set; }
+ public double ImporterSum { get; set; }
+ public double CalculationCost { get; set; }
+ public double PriceUpTotal { get; set; }
+ public double BaseCost { get; set; }
+ public double AcquisitionExpenses { get; set; }
+ public double BonusBase { get; set; }
+ public double NpvBase { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedPayments.cs b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedPayments.cs
new file mode 100644
index 0000000..a5c09e1
--- /dev/null
+++ b/EvoCalculator.Core.Models/Calculation/Models/Prepared/PreparedPayments.cs
@@ -0,0 +1,18 @@
+namespace EvoCalculator.Core.Models.Calculation.Models.Prepared
+{
+ public abstract class PaymentRow
+ {
+ public int NumberPayment { get; set; }
+ public double PercentPayment { get; set; }
+ public double SumPayment { get; set; }
+ public double GpsBasePayment { get; set; }
+ public double GpsCostPayment { get; set; }
+ public double TlmBasePayment { get; set; }
+ public double TlmCostPayment { get; set; }
+ }
+
+ public class PreparedPayments
+ {
+ public PaymentRow[] Rows { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/EvoCalculator.Core.Models/EvoCalculator.Core.Models.csproj b/EvoCalculator.Core.Models/EvoCalculator.Core.Models.csproj
index e4a5e90..bf72b0e 100644
--- a/EvoCalculator.Core.Models/EvoCalculator.Core.Models.csproj
+++ b/EvoCalculator.Core.Models/EvoCalculator.Core.Models.csproj
@@ -9,4 +9,8 @@
+
+
+
+
diff --git a/EvoCalculator.Core.Tests/Calculation/Suite/Columns/DateColumnTests.cs b/EvoCalculator.Core.Tests/Calculation/Suite/Columns/DateColumnTests.cs
new file mode 100644
index 0000000..e98c2ec
--- /dev/null
+++ b/EvoCalculator.Core.Tests/Calculation/Suite/Columns/DateColumnTests.cs
@@ -0,0 +1,235 @@
+using System;
+using EvoCalculator.Core.Calculation.Columns;
+using EvoCalculator.Core.Models.Calculation.Models.Prepared;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace EvoCalculator.Core.Tests.Calculation.Suite.Columns
+{
+ public class DateColumnTests
+ {
+ private readonly ITestOutputHelper output;
+
+ public DateColumnTests(ITestOutputHelper output)
+ {
+ this.output = output;
+ }
+
+
+ [Fact]
+ public void DateColumnTest1()
+ {
+ var preparedValues =
+ new PreparedValues()
+ {
+ DogDate = new DateTime(2018, 10, 28),
+ DeliveryTime = 100000000,
+ PaymentDateNew = null,
+ Nmper = 30
+ };
+
+ var dateColumn = new DateColumn(preparedValues.Nmper + 1);
+ dateColumn.ComputeValues(preparedValues, null, new Constants.Calculation(), null);
+
+ var expected = new DateTime[]
+ {
+ new DateTime(2018, 10, 28),
+ new DateTime(2018, 10, 28),
+ new DateTime(2018, 11, 28),
+ new DateTime(2018, 12, 28),
+ new DateTime(2019, 01, 28),
+ new DateTime(2019, 02, 28),
+ new DateTime(2019, 03, 28),
+ new DateTime(2019, 04, 28),
+ new DateTime(2019, 05, 28),
+ new DateTime(2019, 06, 28),
+ new DateTime(2019, 07, 28),
+ new DateTime(2019, 08, 28),
+ new DateTime(2019, 09, 28),
+ new DateTime(2019, 10, 28),
+ new DateTime(2019, 11, 28),
+ new DateTime(2019, 12, 28),
+ new DateTime(2020, 01, 28),
+ new DateTime(2020, 02, 28),
+ new DateTime(2020, 03, 28),
+ new DateTime(2020, 04, 28),
+ new DateTime(2020, 05, 28),
+ new DateTime(2020, 06, 28),
+ new DateTime(2020, 07, 28),
+ new DateTime(2020, 08, 28),
+ new DateTime(2020, 09, 28),
+ new DateTime(2020, 10, 28),
+ new DateTime(2020, 11, 28),
+ new DateTime(2020, 12, 28),
+ new DateTime(2021, 01, 28),
+ new DateTime(2021, 02, 28),
+ new DateTime(2021, 03, 28),
+ };
+
+ var res = dateColumn.Values;
+ Assert.Equal(expected, res);
+ }
+
+ [Fact]
+ public void DateColumnTest2()
+ {
+ var preparedValues =
+ new PreparedValues()
+ {
+ DogDate = new DateTime(2018, 10, 28),
+ DeliveryTime = 100000000,
+ PaymentDateNew = new DateTime(2018, 11, 13),
+ Nmper = 30
+ };
+
+ var dateColumn = new DateColumn(preparedValues.Nmper + 1);
+ dateColumn.ComputeValues(preparedValues, null, new Constants.Calculation(), null);
+
+ var expected = new DateTime[]
+ {
+ new DateTime(2018, 10, 28),
+ new DateTime(2018, 10, 28),
+ new DateTime(2018, 11, 13),
+ new DateTime(2018, 12, 13),
+ new DateTime(2019, 01, 13),
+ new DateTime(2019, 02, 13),
+ new DateTime(2019, 03, 13),
+ new DateTime(2019, 04, 13),
+ new DateTime(2019, 05, 13),
+ new DateTime(2019, 06, 13),
+ new DateTime(2019, 07, 13),
+ new DateTime(2019, 08, 13),
+ new DateTime(2019, 09, 13),
+ new DateTime(2019, 10, 13),
+ new DateTime(2019, 11, 13),
+ new DateTime(2019, 12, 13),
+ new DateTime(2020, 01, 13),
+ new DateTime(2020, 02, 13),
+ new DateTime(2020, 03, 13),
+ new DateTime(2020, 04, 13),
+ new DateTime(2020, 05, 13),
+ new DateTime(2020, 06, 13),
+ new DateTime(2020, 07, 13),
+ new DateTime(2020, 08, 13),
+ new DateTime(2020, 09, 13),
+ new DateTime(2020, 10, 13),
+ new DateTime(2020, 11, 13),
+ new DateTime(2020, 12, 13),
+ new DateTime(2021, 01, 13),
+ new DateTime(2021, 02, 13),
+ new DateTime(2021, 03, 13),
+ };
+
+ var res = dateColumn.Values;
+ Assert.Equal(expected, res);
+ }
+
+ [Fact]
+ public void DateColumnTest3()
+ {
+ var preparedValues =
+ new PreparedValues()
+ {
+ DogDate = new DateTime(2018, 10, 28),
+ DeliveryTime = 100000001,
+ PaymentDateNew = null,
+ Nmper = 30
+ };
+
+ var dateColumn = new DateColumn(preparedValues.Nmper + 1);
+ dateColumn.ComputeValues(preparedValues, null, new Constants.Calculation(), null);
+
+ var expected = new DateTime[]
+ {
+ new DateTime(2018, 10, 28),
+ new DateTime(2018, 10, 28),
+ new DateTime(2019, 5, 26),
+ new DateTime(2019, 6, 26),
+ new DateTime(2019, 7, 26),
+ new DateTime(2019, 8, 26),
+ new DateTime(2019, 9, 26),
+ new DateTime(2019, 10, 26),
+ new DateTime(2019, 11, 26),
+ new DateTime(2019, 12, 26),
+ new DateTime(2020, 1, 26),
+ new DateTime(2020, 2, 26),
+ new DateTime(2020, 3, 26),
+ new DateTime(2020, 4, 26),
+ new DateTime(2020, 5, 26),
+ new DateTime(2020, 6, 26),
+ new DateTime(2020, 7, 26),
+ new DateTime(2020, 8, 26),
+ new DateTime(2020, 9, 26),
+ new DateTime(2020, 10, 26),
+ new DateTime(2020, 11, 26),
+ new DateTime(2020, 12, 26),
+ new DateTime(2021, 1, 26),
+ new DateTime(2021, 2, 26),
+ new DateTime(2021, 3, 26),
+ new DateTime(2021, 4, 26),
+ new DateTime(2021, 5, 26),
+ new DateTime(2021, 6, 26),
+ new DateTime(2021, 7, 26),
+ new DateTime(2021, 8, 26),
+ new DateTime(2021, 9, 26),
+ };
+
+ var res = dateColumn.Values;
+ Assert.Equal(expected, res);
+ }
+
+ [Fact]
+ public void DateColumnTest4()
+ {
+ var preparedValues =
+ new PreparedValues()
+ {
+ DogDate = new DateTime(2018, 10, 31),
+ DeliveryTime = 100000000,
+ PaymentDateNew = null,
+ Nmper = 30
+ };
+
+ var dateColumn = new DateColumn(preparedValues.Nmper + 1);
+ dateColumn.ComputeValues(preparedValues, null, new Constants.Calculation(), null);
+
+ var expected = new DateTime[]
+ {
+ new DateTime(2018, 10, 31),
+ new DateTime(2018, 10, 31),
+ new DateTime(2018, 11, 30),
+ new DateTime(2018, 12, 31),
+ new DateTime(2019, 01, 31),
+ new DateTime(2019, 02, 28),
+ new DateTime(2019, 03, 31),
+ new DateTime(2019, 04, 30),
+ new DateTime(2019, 05, 31),
+ new DateTime(2019, 06, 30),
+ new DateTime(2019, 07, 31),
+ new DateTime(2019, 08, 31),
+ new DateTime(2019, 09, 30),
+ new DateTime(2019, 10, 31),
+ new DateTime(2019, 11, 30),
+ new DateTime(2019, 12, 31),
+ new DateTime(2020, 01, 31),
+ new DateTime(2020, 02, 29),
+ new DateTime(2020, 03, 31),
+ new DateTime(2020, 04, 30),
+ new DateTime(2020, 05, 31),
+ new DateTime(2020, 06, 30),
+ new DateTime(2020, 07, 31),
+ new DateTime(2020, 08, 31),
+ new DateTime(2020, 09, 30),
+ new DateTime(2020, 10, 31),
+ new DateTime(2020, 11, 30),
+ new DateTime(2020, 12, 31),
+ new DateTime(2021, 01, 31),
+ new DateTime(2021, 02, 28),
+ new DateTime(2021, 03, 28),
+ };
+
+ var res = dateColumn.Values;
+ Assert.Equal(expected, res);
+ }
+ }
+}
\ No newline at end of file
diff --git a/EvoCalculator.Core.sln b/EvoCalculator.Core.sln
index 907c2c6..70828bb 100644
--- a/EvoCalculator.Core.sln
+++ b/EvoCalculator.Core.sln
@@ -8,6 +8,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EvoCalculator.Core.Tests",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EvoCalculator.Core.Models", "EvoCalculator.Core.Models\EvoCalculator.Core.Models.csproj", "{768ED2B0-5BCE-484F-873B-ADF4DC22687F}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EvoCalculator.Core.Constants", "EvoCalculator.Core.Constants\EvoCalculator.Core.Constants.csproj", "{A2774317-9EC4-425C-B63F-C5255BE2E5E2}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -30,5 +32,9 @@ Global
{768ED2B0-5BCE-484F-873B-ADF4DC22687F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{768ED2B0-5BCE-484F-873B-ADF4DC22687F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{768ED2B0-5BCE-484F-873B-ADF4DC22687F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A2774317-9EC4-425C-B63F-C5255BE2E5E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A2774317-9EC4-425C-B63F-C5255BE2E5E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A2774317-9EC4-425C-B63F-C5255BE2E5E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A2774317-9EC4-425C-B63F-C5255BE2E5E2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal