From 66cc33b899c8a23f40c67e3112e0ecaf18c2a71e Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Tue, 30 Jul 2024 13:29:47 +0300 Subject: [PATCH] add getInsuranceCondition function --- apps/web/process/elt/lib/response.ts | 171 ++++++++++++++++----------- 1 file changed, 99 insertions(+), 72 deletions(-) diff --git a/apps/web/process/elt/lib/response.ts b/apps/web/process/elt/lib/response.ts index 63d0c40..c64b302 100644 --- a/apps/web/process/elt/lib/response.ts +++ b/apps/web/process/elt/lib/response.ts @@ -148,6 +148,95 @@ export async function convertEltKaskoResponse(input: ConvertEltKaskoResponseInpu error = 'Расчет возможен только через отдел страхования ЛК'; } + 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: 'kasko' }); + + 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; + requestId = defaultRow.requestId; + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + totalFranchise = 0; + break; + } + + // "проверка на мин.тариф" + case 100_000_001: { + const newSum = round((sum / cost) * 100, 2); + if (newSum < rule_evo_discount) { + sum = 0; + requestId = defaultRow.requestId; + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + totalFranchise = 0; + } + break; + } + + // "скидка за счет КВ" + case 100_000_002: { + sum = (((sum / cost) * 100 - rule_evo_discount) / 100) * cost; + requestId = defaultRow.requestId; + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + totalFranchise = 0; + break; + } + + // "акционный тариф" + case 100_000_003: { + sum = (rule_evo_discount / 100) * cost; + requestId = defaultRow.requestId; + skCalcId = defaultRow.skCalcId; + if (selectedRule.evo_message) error = selectedRule.evo_message; + totalFranchise = 0; + break; + } + } + } + + return { + ...row, + insuranceCondition, + message: error || message, + numCalc: '0', + requestId, + skCalcId, + status: error ? 'error' : null, + sum, + totalFranchise, + }; +} + +type GetInsuranceConditionParams = { + cost: number; + riskType: 'osago' | 'kasko'; +}; + +async function getInsuranceCondition( + input: ConvertEltKaskoResponseInput, + { cost, riskType }: GetInsuranceConditionParams +) { + const { context, row } = input; + const { apolloClient, store } = context; + + const { $calculation } = store; + const leasingPeriod = $calculation.element('tbxLeasingPeriod').getValue(); + + const currentDate = getCurrentDateString(); + const leaseObjectCategory = $calculation.element('selectLeaseObjectCategory').getValue(); const leaseObjectYear = $calculation.element('tbxLeaseObjectYear').getValue(); const leaseObjectMotorPower = $calculation.element('tbxLeaseObjectMotorPower').getValue(); @@ -159,11 +248,6 @@ export async function convertEltKaskoResponse(input: ConvertEltKaskoResponseInpu const legalClientRegion = $calculation.element('selectLegalClientRegion').getValue(); const dealerPerson = $calculation.element('selectDealerPerson').getValue(); const cbxLeaseObjectUsed = $calculation.element('cbxLeaseObjectUsed').getValue(); - const cost = - $calculation.$values.getValue('plPriceRub') - - $calculation.$values.getValue('discountRub') - - $calculation.$values.getValue('importProgramSum') + - $calculation.$values.getValue('addEquipmentPrice'); let lead: CRMTypes.GetLeadQuery['lead'] = null; const leadid = $calculation.element('selectLead').getValue(); @@ -176,8 +260,6 @@ export async function convertEltKaskoResponse(input: ConvertEltKaskoResponseInpu } const insuranceOPF = lead?.evo_inn?.length === 12 ? 100_000_001 : 100_000_000; - const currentDate = getCurrentDateString(); - const { data: { evo_insurance_ruleses }, } = await apolloClient.query({ @@ -187,11 +269,18 @@ export async function convertEltKaskoResponse(input: ConvertEltKaskoResponseInpu }, }); + const { + data: { account: insuranceCompany }, + } = await apolloClient.query({ + query: CRMTypes.GetInsuranceCompanyDocument, + variables: { accountId: row.key }, + }); + const filteredRules = evo_insurance_ruleses?.filter( (rule) => rule && rule.evo_insurer_accountid === insuranceCompany?.accountid && - rule.evo_risk === 100_000_000 && + (riskType === 'kasko' ? rule.evo_risk === 100_000_000 : rule.evo_risk === 100_000_003) && leaseObjectCategory && rule.evo_category?.includes(leaseObjectCategory) && rule.evo_min_period !== null && @@ -258,71 +347,9 @@ export async function convertEltKaskoResponse(input: ConvertEltKaskoResponseInpu | NonNullable[number] | undefined; const priorities = [100_000_000, 100_000_003, 100_000_001, 100_000_002]; - const selectedRule = priorities.reduce( + + return priorities.reduce( (found, priority) => found || sortedRules.find((rule) => rule?.evo_rules_type === priority), null as Rule ); - - 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; - requestId = defaultRow.requestId; - skCalcId = defaultRow.skCalcId; - if (selectedRule.evo_message) error = selectedRule.evo_message; - totalFranchise = 0; - break; - } - - // "проверка на мин.тариф" - case 100_000_001: { - const newSum = round((sum / cost) * 100, 2); - if (newSum < rule_evo_discount) { - sum = 0; - requestId = defaultRow.requestId; - skCalcId = defaultRow.skCalcId; - if (selectedRule.evo_message) error = selectedRule.evo_message; - totalFranchise = 0; - } - break; - } - - // "скидка за счет КВ" - case 100_000_002: { - sum = (((sum / cost) * 100 - rule_evo_discount) / 100) * cost; - requestId = defaultRow.requestId; - skCalcId = defaultRow.skCalcId; - if (selectedRule.evo_message) error = selectedRule.evo_message; - totalFranchise = 0; - break; - } - - // "акционный тариф" - case 100_000_003: { - sum = (rule_evo_discount / 100) * cost; - requestId = defaultRow.requestId; - skCalcId = defaultRow.skCalcId; - if (selectedRule.evo_message) error = selectedRule.evo_message; - totalFranchise = 0; - break; - } - } - } - - return { - ...row, - insuranceCondition, - message: error || message, - numCalc: '0', - requestId, - skCalcId, - status: error ? 'error' : null, - sum, - totalFranchise, - }; }