2023-03-16 15:35:44 +03:00

81 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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'],
});
}
}
}
);
}