116 lines
4.6 KiB
TypeScript

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