From 6150bc9f47f0e246a0cf39eb38e76f9863e550e3 Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Thu, 24 Aug 2023 15:00:29 +0300 Subject: [PATCH] process/fingap: get fingap.insCost in get-kp-data --- apps/web/process/fingap/lib/helper.ts | 129 ++++++++++++++++++++ apps/web/process/fingap/reactions/common.ts | 127 ++++--------------- apps/web/process/insurance/get-kp-data.ts | 64 +++++++++- apps/web/stores/tables/fingap/index.ts | 2 +- 4 files changed, 214 insertions(+), 108 deletions(-) create mode 100644 apps/web/process/fingap/lib/helper.ts diff --git a/apps/web/process/fingap/lib/helper.ts b/apps/web/process/fingap/lib/helper.ts new file mode 100644 index 0000000..77dd5ca --- /dev/null +++ b/apps/web/process/fingap/lib/helper.ts @@ -0,0 +1,129 @@ +import { calculateFinGAP } from '@/api/core/query'; +import type { RequestFinGAP } from '@/api/core/types'; +import type { Risk } from '@/Components/Calculation/Form/Insurance/FinGAPTable/types'; +import type * as Insurance from '@/Components/Calculation/Form/Insurance/InsuranceTable/types'; +import { STALE_TIME } from '@/constants/request'; +import type * as CRMTypes from '@/graphql/crm.types'; +import type { ProcessContext } from '@/process/types'; +import type { CalculationValues } from '@/stores/calculation/values/types'; +import { gql } from '@apollo/client'; +import type { QueryFunctionContext } from '@tanstack/react-query'; +import dayjs from 'dayjs'; +import { flatten } from 'tools/object'; + +type GetFingapRisksInputValues = Pick< + CalculationValues, + 'discountRub' | 'firstPaymentRub' | 'leasingPeriod' | 'plPriceRub' +>; + +type GetFingapRisksInsuranceValues = { + fingap: Pick; +}; + +type GetFingapRisksPaymentsValues = { + values: number[]; +}; + +const QUERY_GET_FINGAP_ADDPRODUCT_TYPES = gql` + query GetFinGAPAddProductTypes($currentDate: DateTime) { + evo_addproduct_types( + statecode: 0 + evo_datefrom_param: { lte: $currentDate } + evo_dateto_param: { gte: $currentDate } + evo_product_type: 100000006 + ) { + evo_addproduct_typeid + evo_name + evo_type_calc_cerebellum + evo_cost_service_provider_withoutnds + evo_addproduct_types { + evo_addproduct_typeid + } + } + } +`; + +export default function helper({ + apolloClient, + queryClient, +}: Pick) { + return { + async getFingapRisks( + { discountRub, firstPaymentRub, leasingPeriod, plPriceRub }: GetFingapRisksInputValues, + insurance: GetFingapRisksInsuranceValues, + payments: GetFingapRisksPaymentsValues + ) { + const { + data: { evo_addproduct_types }, + } = await apolloClient.query< + CRMTypes.GetFinGapAddProductTypesQuery, + CRMTypes.GetFinGapAddProductTypesQueryVariables + >({ + query: QUERY_GET_FINGAP_ADDPRODUCT_TYPES, + variables: { + currentDate: dayjs().utc(false).toISOString(), + }, + }); + + const risks = evo_addproduct_types?.map( + (evo_addproduct_type) => + ({ + calcType: evo_addproduct_type?.evo_type_calc_cerebellum, + key: evo_addproduct_type?.evo_addproduct_typeid, + keys: evo_addproduct_type?.evo_addproduct_types?.map( + (addproduct_type) => addproduct_type?.evo_addproduct_typeid + ), + premium: 0, + premiumPerc: evo_addproduct_type?.evo_cost_service_provider_withoutnds, + riskId: evo_addproduct_type?.evo_addproduct_typeid, + riskName: evo_addproduct_type?.evo_name, + sum: 0, + } as Risk) + ); + + if (!risks) return []; + + function getFingapRequestDataFromRisk(risk: Risk): RequestFinGAP { + return { + calcType: risk.calcType, + payments: payments.values.map((payment) => ({ + percentPayment: payment, + })), + values: { + discount: discountRub, + firstPayment: firstPaymentRub, + leasingPeriod, + plPrice: plPriceRub, + premiumPerc: risk.premiumPerc || 0, + }, + }; + } + + // eslint-disable-next-line unicorn/consistent-function-scoping + function makeRequestGetFinGAP(request: RequestFinGAP) { + const queryCalculateFinGAP = (context: QueryFunctionContext) => + calculateFinGAP(request, context); + + return queryClient.fetchQuery( + ['core', 'fingap', ...flatten(request)], + queryCalculateFinGAP, + { + staleTime: STALE_TIME, + } + ); + } + + return Promise.all( + risks + .map((risk) => getFingapRequestDataFromRisk(risk)) + .map((data) => makeRequestGetFinGAP(data)) + ).then((results) => + risks.map((risk, i) => ({ + ...risk, + premium: results.at(i)?.premium || 0, + sum: results.at(i)?.sum || 0, + })) + ); + }, + }; +} diff --git a/apps/web/process/fingap/reactions/common.ts b/apps/web/process/fingap/reactions/common.ts index 493454f..df9d990 100644 --- a/apps/web/process/fingap/reactions/common.ts +++ b/apps/web/process/fingap/reactions/common.ts @@ -1,26 +1,25 @@ -import { calculateFinGAP } from '@/api/core/query'; -import type { RequestFinGAP } from '@/api/core/types'; -import type { Risk } from '@/Components/Calculation/Form/Insurance/FinGAPTable/types'; -import { STALE_TIME } from '@/constants/request'; -import type * as CRMTypes from '@/graphql/crm.types'; +import helper from '../lib/helper'; import type { ProcessContext } from '@/process/types'; import { disposableReaction } from '@/utils/mobx'; -import { gql } from '@apollo/client'; -import type { QueryFunctionContext } from '@tanstack/react-query'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; -import { comparer, reaction, toJS } from 'mobx'; -import { flatten } from 'tools/object'; +import { comparer, reaction } from 'mobx'; dayjs.extend(utc); export default function reactions({ store, apolloClient, queryClient }: ProcessContext) { + const { getFingapRisks } = helper({ apolloClient, queryClient }); + const { $calculation, $tables, $process } = store; // Расчет итоговой суммы ФинГАП и запись в таблицу страхования - reaction( + disposableReaction( + () => $process.has('LoadKP'), () => $tables.fingap.totalSum, (totalSum) => { $tables.insurance.row('fingap').setValue('insCost', totalSum); + }, + { + delay: 50, } ); @@ -82,32 +81,13 @@ export default function reactions({ store, apolloClient, queryClient }: ProcessC } ); - const QUERY_GET_FINGAP_ADDPRODUCT_TYPES = gql` - query GetFinGAPAddProductTypes($currentDate: DateTime) { - evo_addproduct_types( - statecode: 0 - evo_datefrom_param: { lte: $currentDate } - evo_dateto_param: { gte: $currentDate } - evo_product_type: 100000006 - ) { - evo_addproduct_typeid - evo_name - evo_type_calc_cerebellum - evo_cost_service_provider_withoutnds - evo_addproduct_types { - evo_addproduct_typeid - } - } - } - `; - // Заполнение таблицы рисков ФинГАП + Запрос расчета финГАП в мозжечок disposableReaction( () => $process.has('Calculate'), () => { const finGAPInsuranceCompany = $tables.insurance.row('fingap').getValue('insuranceCompany'); - const paymentsValues = toJS($tables.payments.values); + const paymentsValues = $tables.payments.getValues; const plPriceRub = $calculation.$values.getValue('plPriceRub'); const discountRub = $calculation.$values.getValue('discountRub'); const firstPaymentRub = $calculation.element('tbxFirstPaymentRub').getValue(); @@ -139,81 +119,22 @@ export default function reactions({ store, apolloClient, queryClient }: ProcessC return; } - const { - data: { evo_addproduct_types }, - } = await apolloClient.query< - CRMTypes.GetFinGapAddProductTypesQuery, - CRMTypes.GetFinGapAddProductTypesQueryVariables - >({ - query: QUERY_GET_FINGAP_ADDPRODUCT_TYPES, - variables: { - currentDate: dayjs().utc(false).toISOString(), + getFingapRisks( + { + discountRub, + firstPaymentRub, + leasingPeriod, + plPriceRub, }, - }); - - const risks = evo_addproduct_types?.map( - (evo_addproduct_type) => - ({ - calcType: evo_addproduct_type?.evo_type_calc_cerebellum, - key: evo_addproduct_type?.evo_addproduct_typeid, - keys: evo_addproduct_type?.evo_addproduct_types?.map( - (addproduct_type) => addproduct_type?.evo_addproduct_typeid - ), - premium: 0, - premiumPerc: evo_addproduct_type?.evo_cost_service_provider_withoutnds, - riskId: evo_addproduct_type?.evo_addproduct_typeid, - riskName: evo_addproduct_type?.evo_name, - sum: 0, - } as Risk) - ); - - if (!risks) return; - - // $tables.fingap.setRisks(risks); - - function getFingapRequestDataFromRisk(risk: Risk): RequestFinGAP { - return { - calcType: risk.calcType, - payments: paymentsValues.map((payment) => ({ - percentPayment: payment, - })), - values: { - discount: discountRub, - firstPayment: firstPaymentRub, - leasingPeriod, - plPrice: plPriceRub, - premiumPerc: risk.premiumPerc || 0, - }, - }; - } - - // eslint-disable-next-line unicorn/consistent-function-scoping - function makeRequestGetFinGAP(request: RequestFinGAP) { - const queryCalculateFinGAP = (context: QueryFunctionContext) => - calculateFinGAP(request, context); - - return queryClient.fetchQuery( - ['core', 'fingap', ...flatten(request)], - queryCalculateFinGAP, - { - staleTime: STALE_TIME, - } - ); - } - - Promise.all( - risks - .map((risk) => getFingapRequestDataFromRisk(risk)) - .map((data) => makeRequestGetFinGAP(data)) + { fingap: { insuranceCompany: finGAPInsuranceCompany } }, + { values: paymentsValues } ) - .then((results) => { - const newRisks = risks.map((risk, i) => ({ - ...risk, - premium: results.at(i)?.premium || 0, - sum: results.at(i)?.sum || 0, - })); - - $tables.fingap.setRisks(newRisks); + .then((risks) => { + if (risks?.length) { + $tables.fingap.setRisks(risks); + } else { + $tables.fingap.clear(); + } }) .catch(() => { $tables.fingap.clear(); diff --git a/apps/web/process/insurance/get-kp-data.ts b/apps/web/process/insurance/get-kp-data.ts index 8b8ac42..02a65f7 100644 --- a/apps/web/process/insurance/get-kp-data.ts +++ b/apps/web/process/insurance/get-kp-data.ts @@ -1,10 +1,18 @@ +/* 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; @@ -34,10 +42,13 @@ const QUERY_GET_QUOTE_INSURANCE_DATA = gql` } `; -export async function getKPData({ - values: { quote: quoteId }, -}: GetQuoteInputData): Promise { +export async function getKPData({ values }: GetQuoteInputData): Promise { + const { quote: quoteId } = values; + const apolloClient = initializeApollo(); + const queryClient = new QueryClient(); + + const { getFingapRisks } = helper({ apolloClient, queryClient }); const { data: { quote }, @@ -48,11 +59,56 @@ export async function getKPData({ }, }); + 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: quote?.evo_fingap_price ?? DEFAULT_FINGAP_ROW.insCost, + insCost: fingapInsCost ?? DEFAULT_FINGAP_ROW.insCost, insTerm: quote?.evo_fingap_period, insuranceCompany: quote?.evo_fingap_accountid, insured: quote?.evo_fingap_payer, diff --git a/apps/web/stores/tables/fingap/index.ts b/apps/web/stores/tables/fingap/index.ts index 4b7fe50..055b7b6 100644 --- a/apps/web/stores/tables/fingap/index.ts +++ b/apps/web/stores/tables/fingap/index.ts @@ -44,7 +44,7 @@ export default class FinGAPTable { }; public get totalSum() { - return this.risks + return toJS(this.risks) .filter((risk) => this.selectedKeys.has(risk.key)) .reduce((sum, risk) => sum + risk.premium, 0); }