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 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.Manager;
|
||||||
using EvoCalculator.Core.Models.Calculation.Models.Request;
|
using EvoCalculator.Core.Models.Calculation.Models.Request;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@ -31,4 +34,13 @@ public class CalculationController : Controller
|
|||||||
|
|
||||||
return calculateMethod(requestCalculation);
|
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