import type { ValidationContext } from '../types'; import ValuesSchema from '@/config/schema/values'; import * as CRMTypes from '@/graphql/crm.types'; import { z } from 'zod'; const vinRegex = /^[\dA-HJ-NPR-Za-hj-npr-z]+$/u; export function createValidationSchema({ apolloClient }: ValidationContext) { return ValuesSchema.pick({ engineHours: true, leaseObjectCategory: true, leaseObjectType: true, leaseObjectUsed: true, mileage: true, vin: true, }).superRefine( async ( { engineHours, leaseObjectCategory, leaseObjectType: leaseObjectTypeId, leaseObjectUsed, mileage, vin, }, ctx ) => { /** * Добавить реакцию на изменение Типа ПЛ selectLeaseObjectType , ПЛ БУ cbxLeaseObjectUsed и Моточасы tbxEngineHours: * Если ПЛ БУ cbxLeaseObjectUsed = True и Тип ПЛ selectLeaseObjectType = Спецтехника (id=9) и Моточасы = 0, * то поле Моточасы tbxEngineHours должно обводиться красной рамкой и выводиться сообщение * "Укажите Моточасы, иначе красная рамка снимается. * При красной рамке в данном поле нельзя осуществить расчет графика. */ if (leaseObjectTypeId) { const { data: { evo_leasingobject_type }, } = await apolloClient.query({ query: CRMTypes.GetLeaseObjectTypeDocument, variables: { leaseObjectTypeId }, }); if (leaseObjectUsed && evo_leasingobject_type?.evo_id === '9' && !engineHours) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Не заполнено поле', path: ['tbxEngineHours'], }); } } if (leaseObjectUsed && !mileage) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Не заполнено поле', path: ['tbxMileage'], }); } /** * Если "Категория" содержит данные, то должны быть доступными для набора только арабские цифры и буквы латинского алфавита за исключением I, O, Q, так как они сходны по начертанию с цифрами 1, 0, 9. Можно использовать регулярное выражение: "^[A-HJ-NPR-Za-hj-npr-z0-9]{17}$". * Иначе (если Категория = пусто) то требуется аналогичная первому условию маска, но без проверки 17ти символов (допускать и больше и меньше символов, мб так: "^[A-HJ-NPR-Za-hj-npr-z0-9]{99}$". * Вот так: /^[A-HJ-NPR-Za-hj-npr-z0-9]+$/ */ if (vin) { let invalid = vinRegex.test(vin) === false; if (leaseObjectCategory && vin?.length !== 17) { invalid = true; } if (invalid) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: 'Неверно заполнено поле', path: ['tbxVIN'], }); } } } ); }