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.155; 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 }; } }