From 135fcc8ff9d7a77e02061d7fa9f03b6414dc39b9 Mon Sep 17 00:00:00 2001 From: Chika Date: Fri, 30 Sep 2022 12:23:31 +0300 Subject: [PATCH] merge release/basic-calculation --- .../BaseCalculation.cs | 51 +++++++++++++ .../Models/Request/RequestBaseCalculation.cs | 9 +++ .../Response/ResponseBaseCalculation.cs | 9 +++ .../Calculation/BaseCalculationTests.cs | 73 +++++++++++++++++++ .../Calculation/CalculationController.cs | 12 +++ 5 files changed, 154 insertions(+) create mode 100644 EvoCalculator.Core.Calculation/BaseCalculation.cs create mode 100644 EvoCalculator.Core.Models/BaseCalculation/Models/Request/RequestBaseCalculation.cs create mode 100644 EvoCalculator.Core.Models/BaseCalculation/Models/Response/ResponseBaseCalculation.cs create mode 100644 EvoCalculator.Core.Tests/Calculation/BaseCalculationTests.cs diff --git a/EvoCalculator.Core.Calculation/BaseCalculation.cs b/EvoCalculator.Core.Calculation/BaseCalculation.cs new file mode 100644 index 0000000..3eded4a --- /dev/null +++ b/EvoCalculator.Core.Calculation/BaseCalculation.cs @@ -0,0 +1,51 @@ +using System; +using System.Linq; +using EvoCalculator.Core.Models.BaseCalculation.Models.Request; +using EvoCalculator.Core.Models.BaseCalculation.Models.Response; +using EvoCalculator.Core.Tools.Array; + +namespace EvoCalculator.Core.Calculation; + +public class BaseCalculation +{ + const double IRR = 0.17; + private Constants.Calculation constants; + + public BaseCalculation() + { + this.constants = new Constants.Calculation(); + } + + public ResponseBaseCalculation Calculate(RequestBaseCalculation requestBaseCalculation) + { + var initialPaymentSum = + requestBaseCalculation.car_price * (decimal) (requestBaseCalculation.initial_payment / 100); + var redemptionPaymentSum = requestBaseCalculation.car_price * + (decimal) (requestBaseCalculation.redemption_payment / 100); + + var IRRperMonth = Math.Pow(1 + IRR / 12, requestBaseCalculation.lease_period - 2); + var monthlyPayment = (IRR / 12) * + (double) ((requestBaseCalculation.car_price - initialPaymentSum) * + (decimal) IRRperMonth - redemptionPaymentSum) / (IRRperMonth - 1); + + var leaseContractSum = (requestBaseCalculation.lease_period - 2) * (decimal) monthlyPayment + + initialPaymentSum + + redemptionPaymentSum; + var taxSavings = leaseContractSum * (decimal) (constants.VatValue / 1.2); + + var schedule = Array.Concat( + new decimal[] {initialPaymentSum} + , Enumerable.Repeat((decimal) monthlyPayment, requestBaseCalculation.lease_period - 2).ToArray() + , new decimal[] {redemptionPaymentSum} + ); + + + return new ResponseBaseCalculation() + { + monthly_payment = (decimal) monthlyPayment, + tax_savings = taxSavings, + vat_reimbursement = taxSavings, + schedule = schedule + }; + } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Models/BaseCalculation/Models/Request/RequestBaseCalculation.cs b/EvoCalculator.Core.Models/BaseCalculation/Models/Request/RequestBaseCalculation.cs new file mode 100644 index 0000000..9e3f48b --- /dev/null +++ b/EvoCalculator.Core.Models/BaseCalculation/Models/Request/RequestBaseCalculation.cs @@ -0,0 +1,9 @@ +namespace EvoCalculator.Core.Models.BaseCalculation.Models.Request; + +public class RequestBaseCalculation +{ + public decimal car_price { get; set; } + public double initial_payment { get; set; } + public int lease_period { get; set; } + public double redemption_payment { get; set; } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Models/BaseCalculation/Models/Response/ResponseBaseCalculation.cs b/EvoCalculator.Core.Models/BaseCalculation/Models/Response/ResponseBaseCalculation.cs new file mode 100644 index 0000000..111bfe5 --- /dev/null +++ b/EvoCalculator.Core.Models/BaseCalculation/Models/Response/ResponseBaseCalculation.cs @@ -0,0 +1,9 @@ +namespace EvoCalculator.Core.Models.BaseCalculation.Models.Response; + +public class ResponseBaseCalculation +{ + public decimal tax_savings { get; set; } + public decimal vat_reimbursement { get; set; } + public decimal monthly_payment { get; set; } + public decimal[] schedule { get; set; } +} \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/BaseCalculationTests.cs b/EvoCalculator.Core.Tests/Calculation/BaseCalculationTests.cs new file mode 100644 index 0000000..67ca704 --- /dev/null +++ b/EvoCalculator.Core.Tests/Calculation/BaseCalculationTests.cs @@ -0,0 +1,73 @@ +using EvoCalculator.Core.Calculation; +using EvoCalculator.Core.Models.BaseCalculation.Models.Request; +using EvoCalculator.Core.Models.BaseCalculation.Models.Response; +using Xunit; + +namespace EvoCalculator.Core.Tests.Calculation; + +public class BaseCalculationTests +{ + [Fact] + public void Test1() + { + var requestCalculation = new RequestBaseCalculation() + { + car_price = 4000000, + initial_payment = 30.0, + lease_period = 36, + redemption_payment = 1.0, + }; + + var result = new BaseCalculation().Calculate(requestCalculation); + + var expected = new ResponseBaseCalculation() + { + tax_savings = 792709.351m, + vat_reimbursement = 792709.351m, + monthly_payment = 103419.297m, + schedule = new[] + { + 1200000.0m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 103419.297289495m, + 40000.00m + } + }; + + Assert.Equal(expected.tax_savings, result.tax_savings, new DecimalArrayComparer()); + Assert.Equal(expected.monthly_payment, result.monthly_payment, new DecimalArrayComparer()); + Assert.Equal(expected.schedule[0], result.schedule[0], new DecimalArrayComparer()); + } +} \ No newline at end of file diff --git a/EvoCalculator.Core/Controllers/Calculation/CalculationController.cs b/EvoCalculator.Core/Controllers/Calculation/CalculationController.cs index 0ce54c0..7a6d3d8 100644 --- a/EvoCalculator.Core/Controllers/Calculation/CalculationController.cs +++ b/EvoCalculator.Core/Controllers/Calculation/CalculationController.cs @@ -1,4 +1,7 @@ using System; +using EvoCalculator.Core.Calculation; +using EvoCalculator.Core.Models.BaseCalculation.Models.Request; +using EvoCalculator.Core.Models.BaseCalculation.Models.Response; using EvoCalculator.Core.Models.Calculation.Models.Manager; using EvoCalculator.Core.Models.Calculation.Models.Request; using Microsoft.AspNetCore.Mvc; @@ -31,4 +34,13 @@ public class CalculationController : Controller return calculateMethod(requestCalculation); } + + [HttpPost] + [Route("base-calculate")] + public ActionResult BaseCalculate( + [FromBody] RequestBaseCalculation requestBaseCalculation) + { + var result = new BaseCalculation().Calculate(requestBaseCalculation); + return result; + } } \ No newline at end of file