merge release/basic-calculation
This commit is contained in:
parent
663a17a048
commit
135fcc8ff9
51
EvoCalculator.Core.Calculation/BaseCalculation.cs
Normal file
51
EvoCalculator.Core.Calculation/BaseCalculation.cs
Normal 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
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
73
EvoCalculator.Core.Tests/Calculation/BaseCalculationTests.cs
Normal file
73
EvoCalculator.Core.Tests/Calculation/BaseCalculationTests.cs
Normal 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());
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user