diff --git a/apps/web/process/bonuses/reactions/common.ts b/apps/web/process/bonuses/reactions/common.ts index 69df4f0..18288bb 100644 --- a/apps/web/process/bonuses/reactions/common.ts +++ b/apps/web/process/bonuses/reactions/common.ts @@ -6,7 +6,6 @@ import * as CRMTypes from '@/graphql/crm.types'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import { reaction } from 'mobx'; -import { pick } from 'radash'; dayjs.extend(utc); @@ -67,7 +66,7 @@ export default function commonReactions(context: ReactionsContext) { * данная запись должна быть связана с Продуктом product из поля Продукт selectProduct */ reaction( - () => pick($calculation.$values.values, ['product', 'saleBonus']), + () => $calculation.$values.getValues(['product', 'saleBonus']), async ({ product: productId, saleBonus }) => { if (!productId) { $calculation.element('tbxBonusCoefficient').resetValue(); diff --git a/apps/web/process/bonuses/reactions/validation.ts b/apps/web/process/bonuses/reactions/validation.ts index 1b3770c..b01132e 100644 --- a/apps/web/process/bonuses/reactions/validation.ts +++ b/apps/web/process/bonuses/reactions/validation.ts @@ -1,7 +1,6 @@ import helper from './lib/helper'; import type { ReactionsContext } from '@/process/types'; import { reaction } from 'mobx'; -import { pick } from 'radash'; import { round } from 'tools'; export default function reactions(context: ReactionsContext) { @@ -10,7 +9,7 @@ export default function reactions(context: ReactionsContext) { const { getCoefficient } = helper(context); reaction( - () => pick($calculation.$values.values, ['product', 'saleBonus']), + () => $calculation.$values.getValues(['product', 'saleBonus']), async ({ product: productId, saleBonus }) => { const coefficient = await getCoefficient(productId); const maxBonus = (coefficient?.evo_sot_coefficient || 0) * 100; diff --git a/apps/web/process/calculate/reactions/common.ts b/apps/web/process/calculate/reactions/common.ts index dc83981..0f10e9f 100644 --- a/apps/web/process/calculate/reactions/common.ts +++ b/apps/web/process/calculate/reactions/common.ts @@ -2,7 +2,6 @@ import * as CRMTypes from '@/graphql/crm.types'; import type { ReactionsContext } from '@/process/types'; import { reaction } from 'mobx'; -import { pick } from 'radash'; import { formatter } from 'tools'; export default function commonReactions({ store, apolloClient }: ReactionsContext) { @@ -31,7 +30,7 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex ); reaction( - () => pick($calculation.$values.values, ['product', 'tarif', 'bonusCoefficient']), + () => $calculation.$values.getValues(['product', 'tarif', 'bonusCoefficient']), async ({ product: productId, tarif: tarifId, bonusCoefficient }) => { let max = 0; let min = 0; diff --git a/apps/web/process/configurator/reactions/filters.ts b/apps/web/process/configurator/reactions/filters.ts index 1a0db4b..2e22343 100644 --- a/apps/web/process/configurator/reactions/filters.ts +++ b/apps/web/process/configurator/reactions/filters.ts @@ -15,18 +15,14 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex const { $calculation } = store; reaction( - () => { - const { product, subsidy, importProgram, dealer } = $calculation.$values.values; - - return { - dealerId: dealer, - importProgramId: importProgram, - productId: product, - subsidyId: subsidy, - }; - }, - // eslint-disable-next-line sonarjs/cognitive-complexity - async ({ productId, subsidyId, importProgramId, dealerId }) => { + () => $calculation.$values.getValues(['dealer', 'importProgram', 'product', 'subsidy']), + async ({ + product: productId, + subsidy: subsidyId, + importProgram: importProgramId, + dealer: dealerId, + // eslint-disable-next-line sonarjs/cognitive-complexity + }) => { /** * #1 * DYN-190 При выборе значения в поле selectSubsidy необходимо добавить diff --git a/apps/web/process/configurator/reactions/values.ts b/apps/web/process/configurator/reactions/values.ts index fcf7c1b..b4de4bc 100644 --- a/apps/web/process/configurator/reactions/values.ts +++ b/apps/web/process/configurator/reactions/values.ts @@ -3,7 +3,7 @@ import * as CRMTypes from '@/graphql/crm.types'; import type { ReactionsContext } from '@/process/types'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; -import { autorun, reaction } from 'mobx'; +import { reaction } from 'mobx'; import { makeDisposable, normalizeOptions } from 'tools'; dayjs.extend(utc); @@ -11,17 +11,24 @@ dayjs.extend(utc); export default function valuesReactions({ store, apolloClient }: ReactionsContext) { const { $calculation, $process } = store; - autorun( - async () => { - const { - product, - leasingPeriod, - leaseObjectUsed, - deliveryTime, - firstPaymentPerc, - lastPaymentPerc, - } = $calculation.$values.values; - + reaction( + () => + $calculation.$values.getValues([ + 'product', + 'leasingPeriod', + 'leaseObjectUsed', + 'deliveryTime', + 'firstPaymentPerc', + 'lastPaymentPerc', + ]), + async ({ + product, + leasingPeriod, + leaseObjectUsed, + deliveryTime, + firstPaymentPerc, + lastPaymentPerc, + }) => { const currentDate = dayjs().utc(false).toISOString(); let { @@ -74,6 +81,7 @@ export default function valuesReactions({ store, apolloClient }: ReactionsContex }, { delay: 10, + fireImmediately: true, } ); diff --git a/apps/web/process/leasing-object/reactions/common.ts b/apps/web/process/leasing-object/reactions/common.ts index a4e75f4..09ac44b 100644 --- a/apps/web/process/leasing-object/reactions/common.ts +++ b/apps/web/process/leasing-object/reactions/common.ts @@ -9,18 +9,14 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex const { $calculation } = store; reaction( - () => { - const { brand, subsidy, importProgram, leaseObjectType } = $calculation.$values.values; - - return { - brandId: brand, - importProgramId: importProgram, - leaseObjectTypeId: leaseObjectType, - subsidyId: subsidy, - }; - }, - // eslint-disable-next-line sonarjs/cognitive-complexity - async ({ brandId, subsidyId, importProgramId, leaseObjectTypeId }) => { + () => $calculation.$values.getValues(['brand', 'importProgram', 'leaseObjectType', 'subsidy']), + async ({ + brand: brandId, + importProgram: importProgramId, + leaseObjectType: leaseObjectTypeId, + subsidy: subsidyId, + // eslint-disable-next-line sonarjs/cognitive-complexity + }) => { if (!brandId) { $calculation.element('selectModel').reset(); @@ -122,18 +118,14 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex ); reaction( - () => { - const { product, subsidy, importProgram, leaseObjectType } = $calculation.$values.values; - - return { - importProgramId: importProgram, - leaseObjectTypeId: leaseObjectType, - productId: product, - subsidyId: subsidy, - }; - }, - // eslint-disable-next-line sonarjs/cognitive-complexity - async ({ productId, subsidyId, importProgramId, leaseObjectTypeId }) => { + () => + $calculation.$values.getValues(['importProgram', 'leaseObjectType', 'product', 'subsidy']), + async ({ + importProgram: importProgramId, + leaseObjectType: leaseObjectTypeId, + product: productId, + subsidy: subsidyId, + }) => { const { data: { evo_brands }, } = await apolloClient.query({ diff --git a/apps/web/process/leasing-object/reactions/validation.ts b/apps/web/process/leasing-object/reactions/validation.ts index d6c74b8..67a14b0 100644 --- a/apps/web/process/leasing-object/reactions/validation.ts +++ b/apps/web/process/leasing-object/reactions/validation.ts @@ -2,7 +2,6 @@ import * as CRMTypes from '@/graphql/crm.types'; import type { ReactionsContext } from '@/process/types'; import { autorun, reaction } from 'mobx'; -import { pick } from 'radash'; export default function validationReactions({ store, apolloClient }: ReactionsContext) { const { $calculation } = store; @@ -26,7 +25,7 @@ export default function validationReactions({ store, apolloClient }: ReactionsCo reaction( () => - pick($calculation.$values.values, [ + $calculation.$values.getValues([ 'leaseObjectType', 'engineVolume', 'engineType', diff --git a/apps/web/process/leasing-without-kasko/reactions/common.ts b/apps/web/process/leasing-without-kasko/reactions/common.ts index cd735b6..b1c97e7 100644 --- a/apps/web/process/leasing-without-kasko/reactions/common.ts +++ b/apps/web/process/leasing-without-kasko/reactions/common.ts @@ -6,7 +6,7 @@ import { gql } from '@apollo/client'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc'; import { reaction } from 'mobx'; -import { pick, uid } from 'radash'; +import { uid } from 'radash'; import { normalizeOptions } from 'tools'; import notification from 'ui/elements/notification'; @@ -74,10 +74,8 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex ); reaction( - () => { - const { values } = $calculation.$values; - - return pick(values, [ + () => + $calculation.$values.getValues([ 'plPriceRub', 'discountRub', 'importProgramSum', @@ -86,8 +84,7 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex 'leaseObjectType', 'firstPaymentPerc', 'model', - ]); - }, + ]), async ({ plPriceRub, discountRub, diff --git a/apps/web/process/load-kp/reactions.ts b/apps/web/process/load-kp/reactions.ts index 905e171..a4a49e3 100644 --- a/apps/web/process/load-kp/reactions.ts +++ b/apps/web/process/load-kp/reactions.ts @@ -1,7 +1,6 @@ import type { ReactionsContext } from '@/process/types'; import extend from '@/stores/tables/insurance/tools'; import { reaction } from 'mobx'; -import { pick } from 'radash'; import message from 'ui/elements/message'; const key = 'KP_LOADING_INFO'; @@ -23,7 +22,7 @@ export default function loadKpReactions({ store, trpcClient }: ReactionsContext) key, }); - const { recalcWithRevision } = $calculation.$values.values; + const recalcWithRevision = $calculation.element('cbxRecalcWithRevision').getValue(); trpcClient.quote.getData .query({ @@ -33,7 +32,7 @@ export default function loadKpReactions({ store, trpcClient }: ReactionsContext) }, }) .then(({ values, payments, insurance, fingap }) => { - const savedValues = pick($calculation.$values.values, [ + const savedValues = $calculation.$values.getValues([ 'lead', 'opportunity', 'quote', diff --git a/apps/web/process/price/reactions/common.ts b/apps/web/process/price/reactions/common.ts index cacd4c6..f21f9c7 100644 --- a/apps/web/process/price/reactions/common.ts +++ b/apps/web/process/price/reactions/common.ts @@ -2,8 +2,7 @@ import { VAT } from '@/constants/values'; import * as CRMTypes from '@/graphql/crm.types'; import type { ReactionsContext } from '@/process/types'; -import { autorun, reaction } from 'mobx'; -import { pick } from 'radash'; +import { reaction } from 'mobx'; import { makeDisposable } from 'tools'; export default function commonReactions({ store, apolloClient }: ReactionsContext) { @@ -39,30 +38,37 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex */ makeDisposable( () => - autorun(() => { - const { leaseObjectPrice, supplierDiscountRub } = $calculation.$values.values; - - $calculation - .element('tbxSupplierDiscountPerc') - .setValue((supplierDiscountRub / leaseObjectPrice) * 100); - }), + reaction( + () => $calculation.$values.getValues(['leaseObjectPrice', 'supplierDiscountRub']), + ({ leaseObjectPrice, supplierDiscountRub }) => { + $calculation + .element('tbxSupplierDiscountPerc') + .setValue((supplierDiscountRub / leaseObjectPrice) * 100); + }, + { + fireImmediately: true, + } + ), () => $process.has('LoadKP') ); /** * Расчет суммы скидки поставщика в валюте */ - autorun(() => { - const { leaseObjectPrice, supplierDiscountPerc } = $calculation.$values.values; - - $calculation - .element('tbxSupplierDiscountRub') - .setValue((supplierDiscountPerc * leaseObjectPrice) / 100); - }); + reaction( + () => $calculation.$values.getValues(['leaseObjectPrice', 'supplierDiscountPerc']), + ({ leaseObjectPrice, supplierDiscountPerc }) => { + $calculation + .element('tbxSupplierDiscountRub') + .setValue((supplierDiscountPerc * leaseObjectPrice) / 100); + }, + { + fireImmediately: true, + } + ); reaction( - () => - pick($calculation.$values.values, ['product', 'leaseObjectPrice', 'VATInLeaseObjectPrice']), + () => $calculation.$values.getValues(['product', 'leaseObjectPrice', 'VATInLeaseObjectPrice']), async ({ product: productId, leaseObjectPrice, VATInLeaseObjectPrice }) => { let evo_sale_without_nds = false; @@ -95,7 +101,7 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex reaction( () => - pick($calculation.$values.values, [ + $calculation.$values.getValues([ 'firstPaymentPerc', 'addEquipmentPrice', 'importProgramSum', @@ -122,7 +128,7 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex ); reaction( - () => pick($calculation.$values.values, ['comissionPerc', 'plPriceRub']), + () => $calculation.$values.getValues(['comissionPerc', 'plPriceRub']), ({ plPriceRub, comissionPerc }) => { const rub = (comissionPerc * plPriceRub) / 100; $calculation.element('tbxComissionRub').setValue(rub); @@ -146,7 +152,7 @@ export default function commonReactions({ store, apolloClient }: ReactionsContex () => reaction( () => - pick($calculation.$values.values, [ + $calculation.$values.getValues([ 'plPriceRub', 'lastPaymentPerc', 'addEquipmentPrice', diff --git a/apps/web/process/price/reactions/validation.ts b/apps/web/process/price/reactions/validation.ts index 476265d..9ed3923 100644 --- a/apps/web/process/price/reactions/validation.ts +++ b/apps/web/process/price/reactions/validation.ts @@ -3,7 +3,6 @@ import { VAT } from '@/constants/values'; import * as CRMTypes from '@/graphql/crm.types'; import type { ReactionsContext } from '@/process/types'; import { reaction } from 'mobx'; -import { pick } from 'radash'; import { round } from 'tools'; export default function validationReactions({ store, apolloClient }: ReactionsContext) { @@ -11,7 +10,7 @@ export default function validationReactions({ store, apolloClient }: ReactionsCo reaction( () => - pick($calculation.$values.values, [ + $calculation.$values.getValues([ 'VATInLeaseObjectPrice', 'leaseObjectPriceWthtVAT', 'product', @@ -43,7 +42,7 @@ export default function validationReactions({ store, apolloClient }: ReactionsCo ); reaction( - () => pick($calculation.$values.values, ['supplierDiscountRub', 'plPriceRub']), + () => $calculation.$values.getValues(['supplierDiscountRub', 'plPriceRub']), ({ supplierDiscountRub, plPriceRub }) => { $calculation.element('tbxSupplierDiscountRub').validate({ invalid: supplierDiscountRub >= plPriceRub, @@ -53,7 +52,7 @@ export default function validationReactions({ store, apolloClient }: ReactionsCo ); reaction( - () => pick($calculation.$values.values, ['firstPaymentRub', 'plPriceRub']), + () => $calculation.$values.getValues(['firstPaymentRub', 'plPriceRub']), ({ firstPaymentRub, plPriceRub }) => { $calculation.element('tbxFirstPaymentRub').validate({ invalid: firstPaymentRub >= plPriceRub, @@ -63,7 +62,7 @@ export default function validationReactions({ store, apolloClient }: ReactionsCo ); reaction( - () => pick($calculation.$values.values, ['firstPaymentRub', 'subsidySum']), + () => $calculation.$values.getValues(['firstPaymentRub', 'subsidySum']), ({ firstPaymentRub, subsidySum }) => { $calculation.element('tbxFirstPaymentRub').validate({ invalid: firstPaymentRub - subsidySum < 0, diff --git a/apps/web/process/subsidy/reactions.ts b/apps/web/process/subsidy/reactions.ts index 41217c0..3dbd832 100644 --- a/apps/web/process/subsidy/reactions.ts +++ b/apps/web/process/subsidy/reactions.ts @@ -1,7 +1,6 @@ import * as CRMTypes from '@/graphql/crm.types'; import type { ReactionsContext } from '@/process/types'; -import { autorun, reaction } from 'mobx'; -import { pick } from 'radash'; +import { reaction } from 'mobx'; /** * При изменении "Программа от производителя" selectImportProgram , Стоимости ПЛ tbxLeaseObjectPrice, Валюты selectSupplierCurrency, Скидка от поставщика, в валюте поставщика (tbxSupplierDiscountRub) @@ -24,7 +23,7 @@ export function computedReactions({ store, apolloClient }: ReactionsContext) { const { $calculation } = store; reaction( - () => pick($calculation.$values.values, ['importProgram', 'plPriceRub', 'supplierDiscountRub']), + () => $calculation.$values.getValues(['importProgram', 'plPriceRub', 'supplierDiscountRub']), async ({ importProgram: importProgramId, plPriceRub, supplierDiscountRub }) => { if (importProgramId) { const { @@ -52,44 +51,52 @@ export function computedReactions({ store, apolloClient }: ReactionsContext) { } ); - autorun(async () => { - const { + reaction( + () => + $calculation.$values.getValues([ + 'subsidy', + 'plPriceRub', + 'discountRub', + 'addEquipmentPrice', + 'importProgramSum', + ]), + async ({ subsidy: subsidyId, plPriceRub, discountRub, addEquipmentPrice, importProgramSum, - } = $calculation.$values.values; + }) => { + if (!subsidyId) { + $calculation.element('tbxSubsidySum').resetValue(); - if (!subsidyId) { - $calculation.element('tbxSubsidySum').resetValue(); + return; + } - 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); } - - 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); - }); + ); } // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/apps/web/stores/calculation/values/index.ts b/apps/web/stores/calculation/values/index.ts index 42ac3d1..bcbcb9c 100644 --- a/apps/web/stores/calculation/values/index.ts +++ b/apps/web/stores/calculation/values/index.ts @@ -2,6 +2,7 @@ import type RootStore from '../../root'; import type { CalculationValues, Values } from './types'; import defaultValues from '@/config/default-values'; import { makeAutoObservable } from 'mobx'; +import { pick } from 'radash'; export default class ValuesStore { private root: RootStore; @@ -16,6 +17,8 @@ export default class ValuesStore { this.values = initialValues; }; + public getValues = (keys: K[]) => pick(this.values, keys); + public setValues = (params: { values: CalculationValues }) => { const { values } = params;