81 lines
3.3 KiB
TypeScript
81 lines
3.3 KiB
TypeScript
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'],
|
||
});
|
||
}
|
||
}
|
||
}
|
||
);
|
||
}
|