Form Validation Checklist (Универсальный)

Применяется к каждой форме во всех зонах. Прогоняется один раз при первом тестировании формы + регрессионно после любого фикса формы.

Контекст: в базе ~10 багов про валидацию (нет maxlength, ошибки на латинице, нет сообщений, фокус теряется, отрицательные значения проходят). Это системная проблема. Этот чек-лист — её ловушка.

Как использовать

Для каждой формы создаётся отдельный test case вида:

## TC-T{#}-{AREA}-VAL — Validation: {Form name}

**Type:** Negative
**Priority:** P1
**Regression:** yes

### Preconditions
- Открыта форма {URL / путь}

### Steps
Прогнать [02-form-validation-checklist.md](../../02-form-validation-checklist.md) — все пункты применимые к форме.

### Expected
- Все обязательные поля имеют валидацию по типу
- Все ошибки на русском
- Сохранение блокируется при невалидных данных
- Фокус сохраняется при вводе
- Подсказки показываются inline под полем

Чек-лист: 6 секций

1. Базовое поведение формы

#ПроверкаОжиданиеИзвестные баги
1.1Открыть формуВсе поля и кнопки видны, форма не сломана
1.2Кликнуть в каждое полеФокус устанавливается, label корректно показан
1.3Ввести 1 символ в полеФокус остаётся в поле, символ виденBUG: ЮЛ Создать — фокус теряется со строки
1.4Tab по полямTab-order логичный (сверху вниз, слева направо)
1.5Esc / клик вне модалкиЗакрытие с подтверждением если есть несохранённые данные
1.6Очистить все поляМожно очистить через Backspace / Ctrl+A+Delete
1.7Реакция на медленный вводНет debounce-проблем (поле не сбрасывается при паузе)
1.8Шрифты и стили полейВсе input одинакового шрифта (НЕ textarea-style для одиночных)BUG: Каталог Товары/Ингредиенты — Описание в шрифте area

2. Обязательные поля

#ПроверкаОжидание
2.1Submit с пустыми обязательнымиБлокируется. Inline-ошибка под полем «Поле обязательно»
2.2Submit с одним пустым обязательнымБлокируется. Скролл / фокус на первое невалидное
2.3Submit после заполнения всехПроходит на backend
2.4Звёздочка * у labelVisible для каждого обязательного

3. Типы данных

3.1 Текстовые поля (Имя, Фамилия, Название и т.д.)

#ПроверкаОжиданиеИзвестные баги
3.1.1Только пробелыОтклонить с «Поле не может быть пустым»BUG: Модификаторы — опции принимают пробел
3.1.2255 символов без пробеловОтклонить или truncate. Не должно ломать вёрсткуBUG: Категории — 255 символов ломают вёрстку, 409 при редактировании
3.1.3Превышение maxlengthStop input при достижении лимита, либо валидация при submitBUG: Модификаторы — нет maxlength=255
3.1.4Очистить и сохранитьОтклонить, не сохранять предыдущее тихоBUG: Категории — пустое название сохраняется без ошибки
3.1.5Спецсимволы (<>"'&)Принять и корректно отобразить (не XSS, не сломать вёрстку)
3.1.6ЭмодзиПринять либо отклонить с понятной ошибкой
3.1.7Пробелы в начале/концеTrim при сохранении

3.2 Email

#ПроверкаОжидание
3.2.1Без @Отклонить «Некорректный email»
3.2.2a@b (без TLD)Отклонить
3.2.3a@b.cПринять
3.2.4UPPERCASEПринять, нормализовать в lowercase
3.2.5Дубль (UNIQUE constraint)Отклонить «Email уже используется»

3.3 Телефон

#ПроверкаОжиданиеИзвестные баги
3.3.1+7 (XXX) XXX-XX-XXМаска применяется, хранится как +79991234567
3.3.2Без +7Подставить или отклонить
3.3.3БуквыОтклонить
3.3.4Меньше 11 цифрОтклонить «Некорректный телефон»BUG: ЮЛ Создать — нет сообщений об ошибке у Телефон
3.3.5Зарубежный номерОтклонить или принять (по решению)

3.4 Числовые (цены, ставки, кол-во)

#ПроверкаОжиданиеИзвестные баги
3.4.1Отрицательное значениеОтклонить (если >= 0 по правилу)BUG: Формулы зарплат — Ставка в час принимает -1
3.4.2НольПринять или отклонить (по правилу)
3.4.3Дробное (запятая vs точка)Поддержать оба разделителя
3.4.4Очень большое (10^15)Отклонить или ограничить
3.4.5БуквыОтклонить
3.4.6Min > MaxОтклонить «Минимум должен быть ≤ максимума»BUG: Модификаторы — нет валидации min/max

3.5 ИНН / КПП / ОГРН / БИК / счёт

#ПроверкаОжиданиеИзвестные баги
3.5.1ИНН: ровно 10 или 12 цифрОтклонить иное
3.5.2ИНН: контрольная суммаОтклонить «Некорректный ИНН» если не сходится
3.5.3КПП: 9 цифрОтклонить иноеBUG: КПП — валидация на латинице
3.5.4КПП: латиницаОтклонить
3.5.5ОГРН: 13 или 15 цифрОтклонить иное
3.5.6БИК: 9 цифрОтклонить иноеBUG: ЮЛ — нет сообщений об ошибке у БИК
3.5.7Расч.счёт / Корр.счёт: 20 цифрОтклонить иноеBUG: ЮЛ — нет сообщений у Расч.счёт, Корр.счёт
3.5.8Дубль ИНН в рамках franchiseОтклонить «ИНН уже используется»
3.5.9ИНН после созданияПоле readonly

3.6 PIN

#ПроверкаОжидание
3.6.1Ровно 4 цифрыПринять
3.6.23 или 5 цифрОтклонить
3.6.3Буквы / спецсимволыОтклонить
3.6.4Дубль в рамках ТТОтклонить «PIN уже используется в этой ТТ»
3.6.50000, 1234Принять или предупредить (по правилу безопасности)

3.7 Даты / время

#ПроверкаОжидание
3.7.1Прошедшая дата (для будущих расписаний)Отклонить
3.7.2Время 25:00Отклонить или нормализовать
3.7.3Открытие после закрытияПринять (работа через полночь) либо предупредить

3.8 Координаты (latitude / longitude)

#ПроверкаОжиданиеИзвестные баги
3.8.1Latitude вне [-90, 90]Отклонить
3.8.2Longitude вне [-180, 180]Отклонить
3.8.3Вставка из 2gis (обе координаты в одну)Желательно: распарсить в оба поляBUG: ТТ Создать — не вставляются одним действием

3.9 Файлы (импорт xlsx, фото)

#ПроверкаОжиданиеИзвестные баги
3.9.1Корректный xlsxПринятьBUG: ЮЛ Импорт — Unsupported Media Type
3.9.2Не xlsx (csv, txt, jpg)Отклонить «Только .xlsx»
3.9.3Файл > лимита (10 000 строк / N MB)Отклонить
3.9.4Пустой файлОтклонить
3.9.5Битый файлОтклонить с понятной ошибкой

4. Сообщения об ошибках

#ПроверкаОжиданиеИзвестные баги
4.1Язык сообщенийРусскийBUG: КПП валидация на латинице, ЮЛ/Сотрудники — ошибки на латинице
4.2РасположениеInline под полем
4.3СтильКрасный текст / иконка / красная рамка поля
4.4СкрытиеПосле исправления — сообщение пропадает (не ждёт submit)
4.5Множественные ошибкиВсе показаны одновременно, не по одной
4.6Backend ошибка (500/422)Показать toast/notification, не молча
4.7Технические ошибкиНе показывать stack trace / ID транзакции конечному пользователю

5. Поведение при сохранении

#ПроверкаОжиданиеИзвестные баги
5.1Successful saveToast «Сохранено», редирект или закрытие модалки
5.2Save при невалидныхКнопка «Сохранить» disabled или клик игнорируется (не отправлять запрос)BUG: Зарплата — позволяет подтвердить ведомость с ошибкой
5.3Двойной клик «Сохранить»Не создаёт дубликат (debounce / disable после клика)
5.4Save → 500 ошибкаToast с ошибкой, форма не закрывается, данные не теряютсяBUG: Сотрудник Создать — 500. Шаблон смены — 500. Формула зарплаты — 500
5.5Save → 422То жеBUG: Создание смены вручную — 422. Экспорт CSV — 422
5.6Cancel после измененийПодтверждение «Несохранённые изменения будут потеряны»

6. UI/UX-консистентность

#ПроверкаОжиданиеИзвестные баги
6.1Все textarea с одинаковым стилемШрифт как у inputBUG: Описание — area-шрифт
6.2Textarea — auto-resize / max-heightНе растягивается бесконечноBUG: Описание товара — безграничная высота
6.3Textarea — длинные строки без пробеловword-wrap, не выходит за границыBUG: Описание товара — выходит за пределы страницы
6.4Технические коды НЕ видныUI показывает названия, не ID/permission keysBUG: Сотрудники — фильтр «Все роли (permissions)». Ведомости — техкод в Действия. Формулы — техкод у «Ставка в час»
6.5Дубликация полейОдна сущность = одно отображениеBUG: Сотрудник — PIN дублируется в шапке и блоке
6.6Disabled-состояния визуально отличимыСерый/полупрозрачный
6.7Loading при долгих операцияхSpinner / progress bar
6.8Required-поля помечены *Везде одинаково