diff --git a/apps/web/Components/Calculation/Form/Payments/PaymentsTable/index.jsx b/apps/web/Components/Calculation/Form/Payments/PaymentsTable/index.jsx index 804ecbd..a8fd83b 100644 --- a/apps/web/Components/Calculation/Form/Payments/PaymentsTable/index.jsx +++ b/apps/web/Components/Calculation/Form/Payments/PaymentsTable/index.jsx @@ -33,10 +33,10 @@ const Validation = observer(() => { const store = useStore(); const { payments } = store.$tables; - const messages = payments.validation.getMessages(); + const errors = payments.validation.getErrors(); - if (messages?.length) { - return ; + if (errors?.length) { + return ; } return null; diff --git a/apps/web/config/process/default.ts b/apps/web/config/process/default.ts index 37b6f8e..f81c6b9 100644 --- a/apps/web/config/process/default.ts +++ b/apps/web/config/process/default.ts @@ -1,7 +1,7 @@ // import * as addProduct from '@/process/add-product'; import * as bonuses from '@/process/bonuses'; // import * as calculate from '@/process/calculate'; -// import * as configurator from '@/process/configurator'; +import * as configurator from '@/process/configurator'; // import * as createKP from '@/process/create-kp'; // import * as fingap from '@/process/fingap'; // import * as gibdd from '@/process/gibdd'; @@ -28,7 +28,7 @@ export default function useReactions() { // useProcess(leasingWithoutKasko); // useProcess(subsidy); // useProcess(leasingObject); - // useProcess(configurator); + useProcess(configurator); // useProcess(createKP); useProcess(bonuses); // useProcess(usedPl); diff --git a/apps/web/process/configurator/reactions/validation.ts b/apps/web/process/configurator/reactions/validation.ts index 9e24896..93d290f 100644 --- a/apps/web/process/configurator/reactions/validation.ts +++ b/apps/web/process/configurator/reactions/validation.ts @@ -1,44 +1,32 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -import * as CRMTypes from '@/graphql/crm.types'; +import { createValidationSchema } from '../validation'; +import type { Elements } from '@/Components/Calculation/config/map/values'; import type { ProcessContext } from '@/process/types'; +import ValidationHelper from '@/stores/validation/helper'; import { reaction } from 'mobx'; +import { uid } from 'radash'; -export default function reactions({ store, apolloClient }: ProcessContext) { +const key = uid(7); + +export default function reactions(context: ProcessContext) { + const { store } = context; const { $calculation } = store; - /** - * На изменение поля Процет убывания платежей tbxParmentsDecreasePercent необходимо заложить проверку: - * Если значение поля меньше значения в поле "Минимальный % убывания платежей" evo_min_decreasing_perc из записи, - * указанной в поле ТарифselectTarif , то поле Процет убывания платежей tbxParmentsDecreasePercent должно обводиться красной рамкой - * и выводиться сообщение "Процент убывания не может быть меньше минимального значения по данному тарифу - * - <указывается значение из поля "Минимальный % убывания платежей">, иначе красная рамка снимается. - * При красной рамке в данном поле нельзя осуществить расчет графика. - */ + const validationSchema = createValidationSchema(context); + + const helper = new ValidationHelper(); reaction( - () => ({ - parmentsDecreasePercent: $calculation.element('tbxParmentsDecreasePercent').getValue(), - tarifId: $calculation.element('selectTarif').getValue(), - }), - async ({ parmentsDecreasePercent, tarifId }) => { - let evo_tarif: CRMTypes.GetTarifQuery['evo_tarif'] = null; + () => $calculation.$values.getValues(['parmentsDecreasePercent', 'tarif']), + async (values) => { + helper.removeErrors(); + const validationResult = await validationSchema.safeParseAsync(values); - if (tarifId) { - const { data } = await apolloClient.query({ - query: CRMTypes.GetTarifDocument, - variables: { - tarifId, - }, + if (!validationResult.success) { + validationResult.error.errors.forEach(({ path, message }) => { + (path as Elements[]).forEach((elementName) => { + const removeError = $calculation.element(elementName).setError({ key, message }); + if (removeError) helper.add(removeError); + }); }); - - ({ evo_tarif } = data); } - - $calculation.element('tbxParmentsDecreasePercent').validate({ - invalid: Boolean( - evo_tarif?.evo_min_decreasing_perc && - parmentsDecreasePercent < evo_tarif?.evo_min_decreasing_perc - ), - message: `Процент убывания не может быть меньше минимального значения по данному тарифу - ${evo_tarif?.evo_min_decreasing_perc}`, - }); } ); } diff --git a/apps/web/process/configurator/validation.ts b/apps/web/process/configurator/validation.ts new file mode 100644 index 0000000..4d3aa70 --- /dev/null +++ b/apps/web/process/configurator/validation.ts @@ -0,0 +1,41 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import type { ProcessContext } from '../types'; +import ValuesSchema from '@/config/schema/values'; +import * as CRMTypes from '@/graphql/crm.types'; +import { z } from 'zod'; + +export function createValidationSchema({ apolloClient }: ProcessContext) { + return ValuesSchema.pick({ parmentsDecreasePercent: true, tarif: true }).superRefine( + async ({ parmentsDecreasePercent, tarif: tarifId }, ctx) => { + /** + * На изменение поля Процет убывания платежей tbxParmentsDecreasePercent необходимо заложить проверку: + * Если значение поля меньше значения в поле "Минимальный % убывания платежей" evo_min_decreasing_perc из записи, + * указанной в поле ТарифselectTarif , то поле Процет убывания платежей tbxParmentsDecreasePercent должно обводиться красной рамкой + * и выводиться сообщение "Процент убывания не может быть меньше минимального значения по данному тарифу + * - <указывается значение из поля "Минимальный % убывания платежей">, иначе красная рамка снимается. + * При красной рамке в данном поле нельзя осуществить расчет графика. + */ + if (tarifId) { + const { + data: { evo_tarif }, + } = await apolloClient.query({ + query: CRMTypes.GetTarifDocument, + variables: { + tarifId, + }, + }); + + if ( + evo_tarif?.evo_min_decreasing_perc && + parmentsDecreasePercent < evo_tarif?.evo_min_decreasing_perc + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: `Процент убывания не может быть меньше минимального значения по данному тарифу - ${evo_tarif?.evo_min_decreasing_perc}`, + path: ['tbxParmentsDecreasePercent'], + }); + } + } + } + ); +}