From 5954a64941d183921436506b6babbe146b454a43 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Tue, 30 Jul 2024 13:54:15 +0300 Subject: [PATCH] osago: use getInsuranceCondition --- apps/web/process/elt/lib/response.ts | 90 ++++++++++++++++++++++++---- apps/web/server/routers/elt/osago.ts | 3 +- 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/apps/web/process/elt/lib/response.ts b/apps/web/process/elt/lib/response.ts index c64b302..873a7a9 100644 --- a/apps/web/process/elt/lib/response.ts +++ b/apps/web/process/elt/lib/response.ts @@ -12,10 +12,26 @@ import dayjs from 'dayjs'; import { sort } from 'radash'; import { round } from 'tools'; -export function convertEltOsagoResponse(response: ELT.ResponseEltOsago, row: Row): Row { - const { message, numCalc, premiumSum = 0, skCalcId } = response; - let { error } = response; - if (premiumSum > MAX_INSURANCE) { +type BaseConvertResponseInput = { + context: Pick; + row: Row; +}; + +type ConvertEltOsagoResponseInput = BaseConvertResponseInput & { + response: ELT.ResponseEltOsago; +}; + +export async function convertEltOsagoResponse(input: ConvertEltOsagoResponseInput): Promise { + const { context, response, row } = input; + const { store } = context; + + const { message, premiumSum = 0 } = response; + let { numCalc, skCalcId, error } = response; + let sum = premiumSum; + + const { $calculation } = store; + + if (sum > MAX_INSURANCE) { error ||= `Сумма по страховке превышает максимально допустимое значение по стоимости ОСАГО: ${Intl.NumberFormat( 'ru', { @@ -24,7 +40,7 @@ export function convertEltOsagoResponse(response: ELT.ResponseEltOsago, row: Row } ).format(MAX_INSURANCE)}`; } - if (premiumSum < MIN_INSURANCE) { + if (sum < MIN_INSURANCE) { error ||= `Сумма по страховке не должна быть меньше допустимого значения по стоимости ОСАГО: ${Intl.NumberFormat( 'ru', { @@ -34,13 +50,69 @@ export function convertEltOsagoResponse(response: ELT.ResponseEltOsago, row: Row ).format(MIN_INSURANCE)}`; } + const cost = + $calculation.$values.getValue('plPriceRub') - + $calculation.$values.getValue('discountRub') - + $calculation.$values.getValue('importProgramSum') + + $calculation.$values.getValue('addEquipmentPrice'); + + const selectedRule = await getInsuranceCondition(input, { cost, riskType: 'osago' }); + + const insuranceCondition = selectedRule?.evo_id ?? null; + + if (selectedRule) { + const rule_evo_discount = selectedRule.evo_discount ?? 0; + + switch (selectedRule.evo_rules_type) { + // "не выводить результат расчета" + case 100_000_000: { + sum = 0; + numCalc = Number.parseInt(defaultRow.numCalc, 2); + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + break; + } + + // "проверка на мин.тариф" + case 100_000_001: { + const newSum = round((sum / cost) * 100, 2); + if (newSum < rule_evo_discount) { + sum = 0; + numCalc = Number.parseInt(defaultRow.numCalc, 2); + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + } + break; + } + + // "скидка за счет КВ" + case 100_000_002: { + sum = (((sum / cost) * 100 - rule_evo_discount) / 100) * cost; + numCalc = Number.parseInt(defaultRow.numCalc, 2); + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + break; + } + + // "акционный тариф" + case 100_000_003: { + sum = (rule_evo_discount / 100) * cost; + numCalc = Number.parseInt(defaultRow.numCalc, 2); + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + break; + } + } + } + return { ...row, + insuranceCondition, message: error || message, numCalc: `${numCalc}`, skCalcId, status: error ? 'error' : null, - sum: premiumSum, + sum, }; } @@ -80,10 +152,8 @@ export function convertOwnOsagoResult(result: ResponseOwnOsago | undefined, row: }; } -type ConvertEltKaskoResponseInput = { - context: Pick; +type ConvertEltKaskoResponseInput = BaseConvertResponseInput & { response: ELT.ResponseEltKasko; - row: Row; }; export async function convertEltKaskoResponse(input: ConvertEltKaskoResponseInput): Promise { @@ -226,7 +296,7 @@ type GetInsuranceConditionParams = { }; async function getInsuranceCondition( - input: ConvertEltKaskoResponseInput, + input: BaseConvertResponseInput, { cost, riskType }: GetInsuranceConditionParams ) { const { context, row } = input; diff --git a/apps/web/server/routers/elt/osago.ts b/apps/web/server/routers/elt/osago.ts index 04c804c..31a82e2 100644 --- a/apps/web/server/routers/elt/osago.ts +++ b/apps/web/server/routers/elt/osago.ts @@ -19,6 +19,7 @@ export const eltOsagoRouter = router({ const store = new RootStore(); store.$calculation.$values.hydrate(input.calculation.values); + const context = { apolloClient, store }; const { init: initElt } = await eltHelper({ apolloClient, store }); const { osago: initRows } = await initElt(); @@ -31,7 +32,7 @@ export const eltOsagoRouter = router({ return makeEltOsagoRequest({ apolloClient, store }, row).then((request) => getEltOsago(request) - .then((response) => convertEltOsagoResponse(response, row)) + .then((response) => convertEltOsagoResponse({ context, response, row })) .catch((error) => ({ ...row, message: error.message, status: 'error' })) ); });