using System; using System.Globalization; 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 { private double IRR = 0; private Constants.Calculation constants = new(); public BaseCalculation() { var envCalculationIRR = Environment.GetEnvironmentVariable("CALCULATION_IRR"); IRR = float.Parse(envCalculationIRR, CultureInfo.InvariantCulture); } 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 vat_reimbursement = leaseContractSum * (decimal)(constants.VatValue / 1.2); var tax_savings = leaseContractSum * (decimal)(0.25 / 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 = tax_savings, vat_reimbursement = vat_reimbursement, schedule = schedule }; } }