141 lines
4.8 KiB
TypeScript

/* eslint-disable sonarjs/cognitive-complexity */
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import helper from '../fingap/lib/helper';
import type { GetQuoteInputData, GetQuoteProcessData } from '../load-kp/types';
import initializeApollo from '@/apollo/client';
import defaultValues from '@/config/default-values';
import * as insuranceTable from '@/config/tables/insurance-table';
import * as CRMTypes from '@/graphql/crm.types';
import { getKPData as getKPDataFingap } from '@/process/fingap/get-kp-data';
import { getKPData as getKPDataPayments } from '@/process/payments/get-kp-data';
import { getKPData as getKPDataPrice } from '@/process/price/get-kp-data';
import { createCurrencyUtility } from '@/utils/currency';
import { gql } from '@apollo/client';
import { QueryClient } from '@tanstack/react-query';
import { sum } from 'radash';
const { DEFAULT_FINGAP_ROW, DEFAULT_KASKO_ROW, DEFAULT_OSAGO_ROW } = insuranceTable;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const QUERY_GET_QUOTE_INSURANCE_DATA = gql`
query GetQuoteInsuranceData($quoteId: Uuid!) {
quote(quoteId: $quoteId) {
evo_osago_accountid
evo_osago_payer
evo_osago_price
evo_kasko_accountid
evo_kasko_payer
evo_kasko_price
evo_insurance_period
evo_fingap_accountid
evo_fingap_payer
evo_fingap_period
evo_fingap_price
evo_gps_brandid
evo_gps_modelid
evo_insurance_decentral
evo_franchise
evo_unlimit_drivers
evo_age_drivers
evo_exp_drivers
}
}
`;
export async function getKPData({ values }: GetQuoteInputData): Promise<GetQuoteProcessData> {
const { quote: quoteId } = values;
const apolloClient = initializeApollo();
const queryClient = new QueryClient();
const { getFingapRisks } = helper({ apolloClient, queryClient });
const {
data: { quote },
} = await apolloClient.query({
query: CRMTypes.GetQuoteInsuranceDataDocument,
variables: {
quoteId,
},
});
const kpDataPrice = await getKPDataPrice({ values });
const kpDataPayments = await getKPDataPayments({ values });
const kpDataFingap = await getKPDataFingap({ values });
const leaseObjectPrice = kpDataPrice.values?.leaseObjectPrice ?? defaultValues.leaseObjectPrice;
const firstPaymentRub = kpDataPrice.values?.firstPaymentRub ?? defaultValues.firstPaymentRub;
const supplierCurrency = kpDataPrice.values?.supplierCurrency ?? defaultValues.supplierCurrency;
const supplierDiscountRub =
kpDataPrice.values?.supplierDiscountRub ?? defaultValues.supplierDiscountRub;
const leasingPeriod = kpDataPayments.values?.leasingPeriod ?? defaultValues.leasingPeriod;
const { RUB } = createCurrencyUtility({ apolloClient });
let plPriceRub = 0;
if (supplierCurrency && leaseObjectPrice) {
plPriceRub = await RUB({
currencyid: supplierCurrency,
value: leaseObjectPrice,
});
}
let discountRub = 0;
if (supplierCurrency && supplierDiscountRub) {
discountRub = await RUB({
currencyid: supplierCurrency,
value: supplierDiscountRub,
});
}
const risks = await getFingapRisks(
{
discountRub,
firstPaymentRub,
leasingPeriod,
plPriceRub,
},
{ fingap: { insuranceCompany: quote?.evo_fingap_accountid ?? null } },
{ values: kpDataPayments.payments?.values ?? [] }
);
const fingapInsCost = sum(
risks.filter((x) => kpDataFingap.fingap?.keys.includes(x.key)),
(risk) => risk.premium
);
return {
insurance: {
values: {
fingap: Object.assign(DEFAULT_FINGAP_ROW, {
insCost: fingapInsCost ?? DEFAULT_FINGAP_ROW.insCost,
insTerm: quote?.evo_fingap_period,
insuranceCompany: quote?.evo_fingap_accountid,
insured: quote?.evo_fingap_payer,
}),
kasko: Object.assign(DEFAULT_KASKO_ROW, {
insCost: quote?.evo_kasko_price ?? DEFAULT_KASKO_ROW.insCost,
insTerm: quote?.evo_insurance_period,
insuranceCompany: quote?.evo_kasko_accountid,
insured: quote?.evo_kasko_payer,
}),
osago: Object.assign(DEFAULT_OSAGO_ROW, {
insCost: quote?.evo_osago_price ?? DEFAULT_OSAGO_ROW.insCost,
insTerm: quote?.evo_insurance_period,
insuranceCompany: quote?.evo_osago_accountid,
insured: quote?.evo_osago_payer,
}),
},
},
values: {
GPSBrand: quote?.evo_gps_brandid,
GPSModel: quote?.evo_gps_modelid,
insAgeDrivers: quote?.evo_age_drivers ?? defaultValues.insAgeDrivers,
insDecentral: quote?.evo_insurance_decentral ?? defaultValues.insDecentral,
insExpDrivers: quote?.evo_exp_drivers ?? defaultValues.insExpDrivers,
insFranchise: quote?.evo_franchise ?? defaultValues.insFranchise,
insUnlimitDrivers: quote?.evo_unlimit_drivers ?? defaultValues.insUnlimitDrivers,
},
};
}