Skip to content

Instantly share code, notes, and snippets.

@imgsrc
Created April 1, 2023 09:55
Show Gist options
  • Save imgsrc/4c780953a5cacfe7309b09372c917318 to your computer and use it in GitHub Desktop.
Save imgsrc/4c780953a5cacfe7309b09372c917318 to your computer and use it in GitHub Desktop.
import * as yup from 'yup';
import cleanDeep from 'clean-deep';
import { INewDriver, IReplacedCar, ISvZak, ITransport } from 'AppFeatures/ETRN/types/IEtrnContent';
import { isObjectNotEmpty } from 'AppFeatures/ETRN/lib';
yup.setLocale({
mixed: {
required: 'Обязательное поле',
},
string: {
max: 'Максимум ${max} символов',
min: 'Минимум ${min} символов',
length: 'Длина должна быть ${length} символов',
},
});
const transportFields = yup.object({
ТипВлад: yup.string().required(),
РегНомер: yup.string().required(),
НомСТС: yup.string(),
НомерВИН: yup.string(),
ПарТС: yup.object({
Тип: yup.string().required(),
Марка: yup.string().required(),
Грузопод: yup.number().nullable(true).required(),
Вместим: yup.number().nullable(true).required(),
}),
ОснАрЛиз: yup.array(yup.object({})).when('ТипВлад', {
is: (ТипВлад: string) => ТипВлад === '3' || ТипВлад === '4' || ТипВлад === '5',
then: (ОснАрЛиз) => ОснАрЛиз.min(1, 'Обязательное поле'),
}),
});
export const driverFields = yup.object({
НовВодит: yup.object().shape(
{
НомВУ: yup
.string()
.max(20)
.when('ИННФЛ', {
is: (ИННФЛ: string) => !ИННФЛ,
then: () =>
yup.string().required('Заполните номер, серию и дату водительского удостоверения или ИНН'),
}),
СерВУ: yup
.string()
.max(20)
.when('ИННФЛ', {
is: (ИННФЛ: string) => !ИННФЛ,
then: () =>
yup.string().required('Заполните номер, серию и дату водительского удостоверения или ИНН'),
}),
ДатаВыдВУ: yup.string().when('ИННФЛ', {
is: (val: string) => !val,
then: () => yup.string().required('Заполните номер, серию и дату водительского удостоверения или ИНН'),
}),
ИННФЛ: yup
.string()
.min(12, 'ИНН 12 символов')
.max(12, 'ИНН 12 символов')
.when(['ДатаВыдВУ', 'НомВУ', 'СерВУ'], {
is: (ДатаВыдВУ: string, НомВУ: string, СерВУ: string) => !НомВУ || !СерВУ || !ДатаВыдВУ,
then: () =>
yup
.string()
.required('Заполните номер, серию и дату водительского удостоверения или ИНН')
.min(12, 'ИНН 12 символов')
.max(12, 'ИНН 12 символов'),
})
.matches(/([0-9]{1}[1-9]{1}|[1-9]{1}[0-9]{1})[0-9]{10}/, {
excludeEmptyString: true,
message: 'Невалидный формат',
}),
СвСпИдПодп: yup.string().max(1000),
Тлф: yup
.array(
yup.object({
Тлф: yup.string().max(20).required(),
}),
)
.min(1),
ФИО: yup.object({
Фамилия: yup.string().max(60).required(),
Имя: yup.string().max(60).required(),
Отчество: yup.string().max(60),
}),
ПутевойЛист: yup.array(yup.object({})),
},
[
['ИННФЛ', 'НомВУ'],
['ИННФЛ', 'СерВУ'],
['ИННФЛ', 'ДатаВыдВУ'],
],
),
ДокПерГрВод: yup.array(yup.object({})),
});
export const schema = yup.object({
Файл: yup.object({
Документ: yup.object({
СодИнфЗамен: yup.object().shape(
{
ЗаменВодит: yup
.array(driverFields)
.min(1)
.when('ЗаменТС', {
is: (ЗаменТС: IReplacedCar[]) => cleanDeep(ЗаменТС).length > 0,
then: yup.array().min(0).notRequired(),
}),
ЗаменТС: yup
.array(
yup.object().shape(
{
ТС: transportFields.when('Прицеп', {
is: (Прицеп: ITransport[]) => cleanDeep(Прицеп).length > 0,
then: yup.object().notRequired(),
}),
Прицеп: yup
.array(transportFields)
.min(1)
.when('ТС', {
is: (ТС: ITransport) => isObjectNotEmpty(ТС),
then: yup.array().min(0).notRequired(),
}),
},
[['ТС', 'Прицеп']],
),
)
.min(1)
.when('ЗаменВодит', {
is: (ЗаменВодит: INewDriver[]) => cleanDeep(ЗаменВодит).length > 0,
then: yup.array().min(0).notRequired(),
}),
СодОпер: yup.string().required(),
ДатЗамен: yup.string().nullable(true),
ВрЗамен: yup.string().nullable(true),
UTCПА: yup.string().nullable(true),
НалКоорТочВрПА: yup.string(),
ПричЗамДок: yup.object({}).when('ПричЗамТекст', {
is: (ПричЗамТекст: string) => !ПричЗамТекст,
then: (ПричЗамДок) => ПричЗамДок.required(),
}),
ПричЗамТекст: yup.string().when('ПричЗамДок', {
is: (ПричЗамДок: ISvZak) => !ПричЗамДок,
then: (ПричЗамТекст) => ПричЗамТекст.required(),
}),
},
[
['ПричЗамДок', 'ПричЗамТекст'],
['ЗаменВодит', 'ЗаменТС'],
],
),
}),
}),
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment