osago: use getInsuranceCondition

This commit is contained in:
vchikalkin 2024-07-30 13:54:15 +03:00
parent 66cc33b899
commit 5954a64941
2 changed files with 82 additions and 11 deletions

View File

@ -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<ProcessContext, 'apolloClient' | 'store'>;
row: Row;
};
type ConvertEltOsagoResponseInput = BaseConvertResponseInput & {
response: ELT.ResponseEltOsago;
};
export async function convertEltOsagoResponse(input: ConvertEltOsagoResponseInput): Promise<Row> {
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<ProcessContext, 'apolloClient' | 'store'>;
type ConvertEltKaskoResponseInput = BaseConvertResponseInput & {
response: ELT.ResponseEltKasko;
row: Row;
};
export async function convertEltKaskoResponse(input: ConvertEltKaskoResponseInput): Promise<Row> {
@ -226,7 +296,7 @@ type GetInsuranceConditionParams = {
};
async function getInsuranceCondition(
input: ConvertEltKaskoResponseInput,
input: BaseConvertResponseInput,
{ cost, riskType }: GetInsuranceConditionParams
) {
const { context, row } = input;

View File

@ -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' }))
);
});