import type { CalculateInput, OutputData } from '../types'; import type { RequestCalculate, ResponseCalculate } from '@/api/core/types'; import { ESN, NDFL, VAT } from '@/constants/values'; import { last } from 'radash'; type Input = { calculateInput: CalculateInput; requestCalculate: RequestCalculate; responseCalculate: ResponseCalculate; }; export function transformCalculateResults({ responseCalculate, calculateInput, }: Input): OutputData { const { values: inputValues } = calculateInput; const { postValues, columns, preparedValues } = responseCalculate; const resultPayments: OutputData['resultPayments'] = Array.from( { length: preparedValues.nmper, }, (_, i) => ({ _cashflowMsfoColumn: columns?.cashflowMsfoColumn.values[i + 1] || 0, _cashflowMsfoWithCfColumn: columns?.cashflowMsfoWithCfColumn.values[i + 1] || 0, _creditPaymentColumn: columns?.creditPaymentColumn.values[i + 1] || 0, _interestColumn: columns?.interestColumn.values[i + 1] || 0, _piColumn: columns?.piColumn.values[i + 1] || 0, key: String(i + 1), ndsCompensation: columns?.vatColumn.values[i + 1] || 0, num: i + 1, paymentSum: columns?.sumWithVatColumn.values[i + 1] || 0, redemptionAmount: columns?.sumRepaymentColumn.values[i + 1] || 0, }) ); const { subsidySum } = inputValues; resultPayments[0].paymentSum -= subsidySum; resultPayments[0].ndsCompensation -= subsidySum - subsidySum / (1 + VAT); const resultValues: OutputData['resultValues'] = { _resultContractEconomy: postValues.contractEconomy, _resultContractEconomyWithVAT: postValues.contractEconomyWithVAT, _resultPi: columns?.piColumn.values[0], _resultSumCredit: columns?.sumCreditColumn.values[1], _resultSumCreditPayment: columns?.creditPaymentColumn.values[0], _resultVatRecoverable: columns?.vatRecoverableColumn.values[0], resultAB_FL: ((preparedValues.agentsSum + preparedValues.doubleAgentsSum) / ESN) * (1 - NDFL), resultAB_UL: (preparedValues.deliverySum + preparedValues.brokerSum + preparedValues.brokerOfDeliverySum + preparedValues.financialDeptOfDeliverySum) * (1 + VAT), resultBonusDopProd: Math.abs( ((columns?.npvBonusExpensesColumn?.values[1] / (1 + preparedValues?.salaryRate)) * (1 - NDFL)) / preparedValues.marketRate / preparedValues.districtRate ), resultBonusMPL: Math.abs( (columns?.npvBonusExpensesColumn.values[2] / (1 + preparedValues.salaryRate)) * (1 - NDFL) ), resultBonusSafeFinance: preparedValues?.bonusFinGAP * (1 - NDFL), resultDopMPLLeasing: Math.abs( (columns?.extraBonusSumColumn.values[2] / (1 + preparedValues.salaryRate)) * (1 - NDFL) ), resultDopProdSum: preparedValues.rats + preparedValues.registration + preparedValues.trackerCost + preparedValues.tlmCost + preparedValues.nsibBrutto + preparedValues.insuranceFinGAPNmper, resultFirstPayment: preparedValues.firstPaymentSum * (1 + VAT) - inputValues.subsidySum, resultFirstPaymentRiskPolicy: preparedValues?.firstPayment, resultIRRGraphPerc: columns?.sumColumn.irr, resultIRRNominalPerc: columns?.cashflowMsfoColumn.nominal, resultInsKasko: preparedValues.insuranceKasko, resultInsOsago: preparedValues.insuranceOsago, resultLastPayment: last(columns?.sumWithVatColumn?.values) || 0, resultParticipationAmount: preparedValues.niAtInception + (preparedValues.ratBonus + preparedValues.nsBonus + preparedValues.nsibBonus) * preparedValues.marketRate * preparedValues.districtRate + Math.abs(columns?.npvBonusExpensesColumn.values[0]) + Math.abs( columns?.extraBonusSumColumn.values[0] + preparedValues.importerSum + preparedValues.agentsSum + preparedValues.deliverySum + preparedValues.brokerSum + preparedValues.brokerOfDeliverySum + preparedValues.financialDeptOfDeliverySum ), resultPlPrice: preparedValues.plPriceWithVAT - inputValues.supplierDiscountRub - inputValues.importProgramSum, resultPriceUpPr: postValues.priceUP_Year_PR, resultTerm: preparedValues.nmper, resultTotalGraphwithNDS: columns?.sumWithVatColumn.values[0] - inputValues.subsidySum, }; const values: OutputData['values'] = { IRR_Perc: columns?.cashflowMsfoColumn?.nominal * 100, downloadKp: null, lastPaymentRub: last(columns?.sumWithVatColumn?.values) || 0, pi: columns?.piColumn.values[0] * 100, totalPayments: columns?.sumWithVatColumn?.values[0] - inputValues.subsidySum, }; return { resultPayments, resultValues, values }; }