From 4a65a39ba38146de54fff26b9224b7336b080bfd Mon Sep 17 00:00:00 2001 From: vchikalkin Date: Tue, 6 Jun 2023 12:23:45 +0300 Subject: [PATCH] process:subsidy: fix subsidySum ,importProgramSum --- apps/web/process/subsidy/get-kp-data.ts | 59 ++++++++++++++-- apps/web/process/subsidy/lib/helper.ts | 80 ++++++++++++++++++++++ apps/web/process/subsidy/reactions.ts | 91 ++++++++----------------- 3 files changed, 161 insertions(+), 69 deletions(-) create mode 100644 apps/web/process/subsidy/lib/helper.ts diff --git a/apps/web/process/subsidy/get-kp-data.ts b/apps/web/process/subsidy/get-kp-data.ts index 11e616f..592139a 100644 --- a/apps/web/process/subsidy/get-kp-data.ts +++ b/apps/web/process/subsidy/get-kp-data.ts @@ -1,9 +1,13 @@ import type { GetQuoteInputData, GetQuoteProcessData } from '../load-kp/types'; +import helper from './lib/helper'; import initializeApollo from '@/apollo/client'; import defaultValues from '@/config/default-values'; import * as CRMTypes from '@/graphql/crm.types'; +import { getKPData as getKPDataPrice } from '@/process/price/get-kp-data'; +import { createCurrencyUtility } from '@/utils/currency'; import { gql } from '@apollo/client'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars const QUERY_GET_QUOTE_SUBSIDY_DATA = gql` query GetQuoteSubsidyData($quoteId: Uuid!) { quote(quoteId: $quoteId) { @@ -13,11 +17,11 @@ const QUERY_GET_QUOTE_SUBSIDY_DATA = gql` } `; -export async function getKPData({ - values: { quote: quoteId }, -}: GetQuoteInputData): Promise { +export async function getKPData({ values }: GetQuoteInputData): Promise { const apolloClient = initializeApollo(); + const { quote: quoteId } = values; + const { data: { quote }, } = await apolloClient.query({ @@ -27,10 +31,55 @@ export async function getKPData({ }, }); + const kpDataPrice = await getKPDataPrice({ values }); + const { RUB } = createCurrencyUtility({ apolloClient }); + + const supplierCurrency = kpDataPrice.values?.supplierCurrency ?? defaultValues.supplierCurrency; + const leaseObjectPrice = kpDataPrice.values?.leaseObjectPrice ?? defaultValues.leaseObjectPrice; + const supplierDiscountRub = + kpDataPrice.values?.supplierDiscountRub ?? defaultValues.supplierDiscountRub; + + 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 importProgram = quote?.evo_program_import_subsidyid ?? defaultValues.importProgram; + const subsidy = quote?.evo_subsidyid ?? defaultValues.subsidy; + + const { getSubsidySum } = helper({ apolloClient }); + const subsidySum = await getSubsidySum({ + addEquipmentPrice: kpDataPrice.values?.addEquipmentPrice ?? 0, + discountRub, + importProgramSum: kpDataPrice.values?.importProgramSum ?? 0, + plPriceRub, + subsidy: quote?.evo_subsidyid ?? defaultValues.subsidy, + }); + + const { getImportProgramSum } = helper({ apolloClient }); + const importProgramSum = await getImportProgramSum({ + discountRub, + importProgram, + plPriceRub, + }); + return { values: { - importProgram: quote?.evo_program_import_subsidyid ?? defaultValues.importProgram, - subsidy: quote?.evo_subsidyid ?? defaultValues.subsidy, + importProgram, + importProgramSum, + subsidy, + subsidySum, }, }; } diff --git a/apps/web/process/subsidy/lib/helper.ts b/apps/web/process/subsidy/lib/helper.ts new file mode 100644 index 0000000..fd0f120 --- /dev/null +++ b/apps/web/process/subsidy/lib/helper.ts @@ -0,0 +1,80 @@ +import type { ProcessContext } from '../../types'; +import * as CRMTypes from '@/graphql/crm.types'; +import type { CalculationValues } from '@/stores/calculation/values/types'; + +type GetSubsidySumInput = Pick< + CalculationValues, + 'addEquipmentPrice' | 'discountRub' | 'importProgramSum' | 'plPriceRub' | 'subsidy' +>; + +type GetImportProgramSumInput = Pick< + CalculationValues, + 'discountRub' | 'importProgram' | 'plPriceRub' +>; + +export default function helper({ apolloClient }: Pick) { + return { + async getImportProgramSum({ + importProgram: importProgramId, + plPriceRub, + discountRub, + }: GetImportProgramSumInput) { + if (!importProgramId) { + return 0; + } + + const { + data: { evo_subsidy: importProgram }, + } = await apolloClient.query({ + query: CRMTypes.GetSubsidyDocument, + variables: { + subsidyId: importProgramId, + }, + }); + + if (importProgram?.evo_subsidy_summ && importProgram?.evo_subsidy_summ > 0) { + return importProgram?.evo_subsidy_summ; + } else { + const subsidyPercent = (importProgram?.evo_percent_subsidy || 0) / 100; + + const sum = (plPriceRub - discountRub) * subsidyPercent; + const maxSum = importProgram?.evo_max_subsidy_summ || 0; + + return Math.min(sum, maxSum); + } + }, + + async getSubsidySum({ + subsidy: subsidyId, + plPriceRub, + discountRub, + addEquipmentPrice, + importProgramSum, + }: GetSubsidySumInput) { + if (!subsidyId) { + return 0; + } + + const { + data: { evo_subsidy }, + } = await apolloClient.query({ + query: CRMTypes.GetSubsidyDocument, + variables: { + subsidyId, + }, + }); + + if (evo_subsidy?.evo_subsidy_summ) { + return evo_subsidy?.evo_subsidy_summ; + } + + const price = plPriceRub - discountRub - importProgramSum + addEquipmentPrice; + + let sum = (price * (evo_subsidy?.evo_percent_subsidy ?? 0)) / 100; + const maxSum = evo_subsidy?.evo_max_subsidy_summ ?? 0; + if (sum > maxSum) sum = maxSum; + + return sum; + }, + }; +} diff --git a/apps/web/process/subsidy/reactions.ts b/apps/web/process/subsidy/reactions.ts index e5209ff..d31eb8d 100644 --- a/apps/web/process/subsidy/reactions.ts +++ b/apps/web/process/subsidy/reactions.ts @@ -1,6 +1,7 @@ -import * as CRMTypes from '@/graphql/crm.types'; +import helper from './lib/helper'; import type { ProcessContext } from '@/process/types'; -import { reaction } from 'mobx'; +import { disposableReaction } from '@/utils/mobx'; +import { comparer } from 'mobx'; /** * При изменении "Программа от производителя" selectImportProgram , Стоимости ПЛ tbxLeaseObjectPrice, Валюты selectSupplierCurrency, Скидка от поставщика, в валюте поставщика (tbxSupplierDiscountRub) @@ -19,39 +20,28 @@ import { reaction } from 'mobx'; */ /* eslint-enable */ -export function common({ store, apolloClient }: ProcessContext) { - const { $calculation } = store; +export function common(context: ProcessContext) { + const { store } = context; + const { $calculation, $process } = store; - reaction( - () => $calculation.$values.getValues(['importProgram', 'plPriceRub', 'supplierDiscountRub']), - async ({ importProgram: importProgramId, plPriceRub, supplierDiscountRub }) => { - if (importProgramId) { - const { - data: { evo_subsidy: importProgram }, - } = await apolloClient.query({ - query: CRMTypes.GetSubsidyDocument, - variables: { - subsidyId: importProgramId, - }, - }); + const { getSubsidySum, getImportProgramSum } = helper(context); - if (importProgram?.evo_subsidy_summ && importProgram?.evo_subsidy_summ > 0) { - $calculation.element('tbxImportProgramSum').setValue(importProgram?.evo_subsidy_summ); - } else { - const subsidyPercent = (importProgram?.evo_percent_subsidy || 0) / 100; + disposableReaction( + () => $process.has('LoadKP'), + () => $calculation.$values.getValues(['importProgram', 'plPriceRub', 'discountRub']), + async (values) => { + const importProgramSum = await getImportProgramSum(values); - const sum = (plPriceRub - supplierDiscountRub) * subsidyPercent; - const maxSum = importProgram?.evo_max_subsidy_summ || 0; - - $calculation.element('tbxImportProgramSum').setValue(Math.min(sum, maxSum)); - } - } else { - $calculation.element('tbxImportProgramSum').setValue(0); - } + $calculation.element('tbxImportProgramSum').setValue(importProgramSum); + }, + { + delay: 5, + equals: comparer.shallow, } ); - reaction( + disposableReaction( + () => $process.has('LoadKP'), () => $calculation.$values.getValues([ 'subsidy', @@ -59,42 +49,15 @@ export function common({ store, apolloClient }: ProcessContext) { 'discountRub', 'addEquipmentPrice', 'importProgramSum', + 'quote', ]), - async ({ - subsidy: subsidyId, - plPriceRub, - discountRub, - addEquipmentPrice, - importProgramSum, - }) => { - if (!subsidyId) { - $calculation.element('tbxSubsidySum').resetValue(); - - return; - } - - const { - data: { evo_subsidy: subsidy }, - } = await apolloClient.query({ - query: CRMTypes.GetSubsidyDocument, - variables: { - subsidyId, - }, - }); - - if (subsidy?.evo_subsidy_summ) { - $calculation.element('tbxSubsidySum').setValue(subsidy?.evo_subsidy_summ); - - return; - } - - const price = plPriceRub - discountRub - importProgramSum + addEquipmentPrice; - - let sum = (price * (subsidy?.evo_percent_subsidy ?? 0)) / 100; - const maxSum = subsidy?.evo_max_subsidy_summ ?? 0; - if (sum > maxSum) sum = maxSum; - - $calculation.element('tbxSubsidySum').setValue(sum); + async (values) => { + const subsidySum = await getSubsidySum(values); + $calculation.element('tbxSubsidySum').setValue(subsidySum); + }, + { + delay: 5, + equals: comparer.shallow, } ); }