2023-03-28 09:33:17 +03:00

96 lines
3.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) => ({
key: String(i + 1),
ndsCompensation: columns.vatColumn.values[i + 1],
num: i + 1,
paymentSum: columns.sumWithVatColumn.values[i + 1],
redemptionAmount: columns.sumRepaymentColumn.values[i + 1],
})
);
const resultValues: OutputData['resultValues'] = {
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)
),
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 * 100,
resultIRRGraphPerc: columns.sumColumn.irr * 100,
resultIRRNominalPerc: columns.cashflowMsfoColumn.nominal * 100,
resultInsKasko: preparedValues.insuranceKasko,
resultInsOsago: preparedValues.insuranceOsago,
resultLastPayment: preparedValues.lastPaymentSum * (1 + VAT),
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 * 100,
resultTerm: preparedValues.nmper,
resultTotalGraphwithNDS: columns.sumWithVatColumn.values[0] - inputValues.subsidySum,
};
const values: OutputData['values'] = {
IRR_Perc: columns?.cashflowMsfoColumn?.nominal * 100,
lastPaymentRub: last(columns?.sumWithVatColumn?.values) || 0,
totalPayments: columns?.sumWithVatColumn?.values[0] - inputValues.subsidySum,
};
return { resultPayments, resultValues, values };
}