using System.Linq; using EvoCalculator.Core.Base.Columns; using EvoCalculator.Core.Models.PostCalculation.Models.Prepared; using EvoCalculator.Core.Models.PostCalculation.Models.Prepared.PreparedTables; using EvoCalculator.Core.Tools.Errors; namespace EvoCalculator.Core.PostCalculation.v1; public class NextValues { public decimal AcquisitionExpenses { get; set; } public decimal AcquisitionExpensesWithVAT { get; set; } public decimal BaseCost { get; set; } public decimal NiAtInception { get; set; } public decimal NiAtInceptionMSFO { get; set; } public int Nmper { get; set; } public decimal SumTotal { get; set; } protected PreparedValues preparedValues; private Constants.Calculation _constants; public NextValues(PreparedValues preparedValues) { this.preparedValues = preparedValues; _constants = new Constants.Calculation(); } public void ComputeAcquisitionExpenses(TableInsuranceRow[]? nextTableInsurance) { var tracker = 0m; if (preparedValues.ChangeTracker == false) tracker = preparedValues.TrackerCost.Current; else if (preparedValues.TypeChangeTracker == 100000000) tracker = preparedValues.TrackerCost.Current + preparedValues.TrackerCost.Next; else tracker = preparedValues.TrackerCostRemove + preparedValues.TrackerCost.Next; var tlm = 0m; if (preparedValues.ChangeTLM == false) tlm = preparedValues.TLMCost.Current; else if (preparedValues.TypeChangeTLM == 100000000) tlm = preparedValues.TLMCost.Current + preparedValues.TLMCost.Next; else tlm = preparedValues.TLMCostRemove + preparedValues.TLMCost.Next; var baseRegistration = 0m; if (preparedValues.BaseRegistration.Next == 0) baseRegistration = preparedValues.BaseRegistration.Current; else if (preparedValues.TypeChangeRegistration == 100000000) baseRegistration = preparedValues.BaseRegistration.Next; else baseRegistration = preparedValues.BaseRegistration.Current + preparedValues.BaseRegistration.Next; var nextCostInsurance = 0m; if (nextTableInsurance != null) nextCostInsurance = nextTableInsurance .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO" && x.PeriodNumberInsurance == 1) .Sum(x => x.CostInsurance + x.InsuranceBonusLoss); AcquisitionExpenses = preparedValues.PlPrice.Next + nextCostInsurance - preparedValues.ComissionRub - preparedValues.Discount.Next + tracker + tlm + preparedValues.TechnicalCardSum + baseRegistration + preparedValues.TransportTaxGr.Next switch { > 0 => preparedValues.TransportTaxGr.Next, _ => preparedValues.TransportTaxGr.Current } + preparedValues.InceptDelta + preparedValues.FuelCardSum; if (AcquisitionExpenses <= 0) throw new AppException( "Невозможно осуществить расчет графика, при заданных параметрах получаются отрицательные значения nextValues. Измените параметры для расчета."); } public void ComputeAcquisitionExpensesWithVAT(TableInsuranceRow[]? nextTableInsurance) { var tracker = 0m; if (preparedValues.ChangeTracker == false) tracker = preparedValues.TrackerCost.Current; else if (preparedValues.TypeChangeTracker == 100000000) tracker = preparedValues.TrackerCost.Current + preparedValues.TrackerCost.Next; else tracker = preparedValues.TrackerCostRemove + preparedValues.TrackerCost.Next; var tlm = 0m; if (preparedValues.ChangeTLM == false) tlm = preparedValues.TLMCost.Current; else if (preparedValues.TypeChangeTLM == 100000000) tlm = preparedValues.TLMCost.Current + preparedValues.TLMCost.Next; else tlm = preparedValues.TLMCostRemove + preparedValues.TLMCost.Next; var baseRegistration = 0m; if (preparedValues.BaseRegistration.Next == 0) baseRegistration = preparedValues.BaseRegistration.Current; else if (preparedValues.TypeChangeRegistration == 100000000) baseRegistration = preparedValues.BaseRegistration.Next; else baseRegistration = preparedValues.BaseRegistration.Current + preparedValues.BaseRegistration.Next; var nextCostInsurance = 0m; if (nextTableInsurance != null) nextCostInsurance = nextTableInsurance .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP" or "EvoKASKO" && x.PeriodNumberInsurance == 1) .Sum(x => x.CostInsurance + x.InsuranceBonusLoss); AcquisitionExpensesWithVAT = preparedValues.PlPriceWithVAT + nextCostInsurance - preparedValues.ComissionRub * (decimal)(1 + _constants.VatValue) - preparedValues.Discount.Next * (decimal)(1 + _constants.VatValue) + tracker * (decimal)(1 + _constants.VatValue) + tlm * (decimal)(1 + _constants.VatValue) + preparedValues.TechnicalCardSum * (decimal)(1 + _constants.VatValue) + baseRegistration * (decimal)(1 + _constants.VatValue) + preparedValues.TransportTaxGr.Next switch { > 0 => preparedValues.TransportTaxGr.Next, _ => preparedValues.TransportTaxGr.Current } + preparedValues.InceptDelta * (decimal)(1 + _constants.VatValue) + preparedValues.FuelCardSum * (decimal)(1 + _constants.VatValue); } public void ComputeBaseCost(TableInsuranceRow[]? nextTableInsurance, BaseColumn? nextTLMGrColumn, TablePaymentsRow[] currentTablePayments) { var registration = 0m; if (preparedValues.Registration.Next == 0) registration = preparedValues.Registration.Current; else if (preparedValues.TypeChangeRegistration == 100000000) registration = preparedValues.Registration.Next; else registration = preparedValues.Registration.Current + preparedValues.Registration.Next; var tracker = 0m; if (preparedValues.ChangeTracker == false) tracker = preparedValues.TrackerCost.Current; else if (preparedValues.TypeChangeTracker == 100000000) tracker = preparedValues.TrackerCost.Current + preparedValues.TrackerCost.Next; else tracker = preparedValues.TrackerCostRemove + preparedValues.TrackerCost.Next; var tlm = 0m; if (preparedValues.ChangeTLM == false) tlm = preparedValues.TLMCost.Current; else if (preparedValues.TypeChangeTLM == 100000000) tlm = preparedValues.TLMCost.Current + preparedValues.TLMCost.Next; else tlm = preparedValues.TLMCostRemove + preparedValues.TLMCost.Next; var nextTlmGrValue = 0m; if (nextTLMGrColumn != null) nextTlmGrValue = nextTLMGrColumn.GetValue(0); var nextCostInsurance = 0m; if (nextTableInsurance != null) nextCostInsurance = nextTableInsurance .Where(x => x.TypeRiskInsurance is "KASKO" or "OSAGO" or "GAP") .Sum(x => x.CostInsurance); BaseCost = (preparedValues.PlPrice.Next + nextCostInsurance + preparedValues.TechnicalCardSum + registration + preparedValues.TransportTaxGr.Next switch { > 0 => preparedValues.TransportTaxGr.Next, _ => preparedValues.TransportTaxGr.Current } + tracker + tlm + nextTlmGrValue) * preparedValues.Leasing0K + currentTablePayments.Sum(x => x.NSIBBruttoPayment) + preparedValues.InceptDelta; // PostCheck if (BaseCost <= 0) throw new AppException( "Невозможно осуществить расчет графика, при заданных параметрах получаются отрицательные значения nextValues. Измените параметры для расчета."); } public void ComputeNiAtInception(TablePaymentsRow[] currentTablePayments) { NiAtInception = AcquisitionExpenses - currentTablePayments[0].SumPayment; } public void ComputeNiAtInceptionMSFO() { NiAtInceptionMSFO = NiAtInception + preparedValues.BonusManagerLeasing + preparedValues.BonusManagerProducts + preparedValues.BonusManagerLeasingExtra + preparedValues.AgentFLSum + preparedValues.AgentULSum; } public void ComputeNmper(TablePaymentsRow[] nextTablePayments, TablePaymentsRow[] currentTablePayments) { var targetNextPaymentsRow = nextTablePayments.Last(); var n = targetNextPaymentsRow.NumberPayment; var targetPaymentSum = targetNextPaymentsRow.SumPayment; var i = 0; while (targetPaymentSum >= currentTablePayments[i + n].SumPayment) { targetPaymentSum -= currentTablePayments[i + n].SumPayment; i++; } if (i == 0) throw new AppException( "Невозможно осуществить расчет ЧДП с изменением срока. Необходимо увеличить сумму ЧДП"); Nmper = preparedValues.Nmper.Current - i + 1; // PostCheck if (Nmper < 13 && preparedValues.BalanceHolder.Next == 100000001) throw new AppException( "По итогам расчета срок лизинга получается меньше 13, при балансе ЛД это запрещено. Измените параметры для расчета"); } public void ComputeSumTotal(BaseColumn nextSumWithVATColumn) { SumTotal = preparedValues.TotalExpected - (preparedValues.TotalExpected - nextSumWithVATColumn.GetValue(0)) * (decimal)preparedValues.Repayment; } }