2023-08-24 15:21:00 +03:00

130 lines
4.1 KiB
TypeScript

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<Insurance.RowValues, 'insuranceCompany'>;
};
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<ProcessContext, 'apolloClient' | 'queryClient'>) {
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,
}))
);
},
};
}