merge release/basic-calculation

This commit is contained in:
Chika 2022-09-30 12:23:31 +03:00
parent 663a17a048
commit 135fcc8ff9
5 changed files with 154 additions and 0 deletions

View File

@ -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<decimal>.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
};
}
}

View File

@ -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; }
}

View File

@ -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; }
}

View File

@ -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());
}
}

View File

@ -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<ResponseBaseCalculation> BaseCalculate(
[FromBody] RequestBaseCalculation requestBaseCalculation)
{
var result = new BaseCalculation().Calculate(requestBaseCalculation);
return result;
}
}