96 lines
3.6 KiB
TypeScript
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 };
|
|
}
|