# Тестирование улучшений WriteOff UI ## Краткая инструкция тестирования ### Подготовка 1. Убедитесь что у вас есть актуальные данные: - Склад (Warehouse) - Товар (Product) - Партия товара (StockBatch) с остатком > 0 2. Откройте страницу: `http://grach.localhost:8000/inventory/writeoffs/create/` --- ## Тест 1: Информация об остатке партии **Шаги:** 1. Выберите партию из dropdown "Партия" 2. **Ожидаемый результат:** - Под dropdown появляется серый блок: ``` 📋 Остаток в партии: X шт ``` - Где X это количество в выбранной партии **Проверка:** - ✅ Блок информации появляется при выборе - ✅ Блок исчезает если выбрать пустое значение - ✅ Количество обновляется при смене партии --- ## Тест 2: Реал-тайм предупреждение при превышении **Шаги:** 1. Выберите партию (например, с остатком 5 шт) 2. Введите в поле "Количество" число МЕНЬШЕ остатка (например, 3) 3. **Ожидаемый результат:** Никаких предупреждений **Шаги 2:** 1. Введите в поле "Количество" число БОЛЬШЕ остатка (например, 10) 2. **Ожидаемый результат:** ``` ⚠️ Внимание! Вы пытаетесь списать 10 шт, а в партии только 5 шт. Недостаток: 5 шт. ``` **Проверка:** - ✅ Предупреждение НЕ появляется при quantity <= batch.quantity - ✅ Предупреждение ПОЯВЛЯЕТСЯ при quantity > batch.quantity - ✅ Предупреждение обновляется в реал-тайме при каждом вводе - ✅ Правильно рассчитывается недостаток (shortage) --- ## Тест 3: Отправка валидных данных **Шаги:** 1. Выберите партию (остаток = 5 шт) 2. Введите количество = 3 (меньше остатка) 3. Выберите причину (например, "damage") 4. Нажмите кнопку "Сохранить" **Ожидаемый результат:** - ✅ Форма отправляется успешно - ✅ Перенаправляется на список списаний - ✅ Появляется зеленое сообщение об успехе - ✅ Остаток в партии уменьшился на 3 (стал 2) --- ## Тест 4: Отправка невалидных данных (количество > остатка) **Шаги:** 1. Выберите партию (остаток = 5 шт) 2. Введите количество = 10 (больше остатка) 3. Нажмите кнопку "Сохранить" **Ожидаемый результат:** - ✅ Форма НЕ отправляется - ✅ На странице появляется красный alert: ``` ❌ Ошибка: Невозможно списать 10 шт из партии, где только 5 шт. Недостаток: 5 шт. ``` - ✅ Пользователь остается на форме - ✅ Данные в полях сохраняются (он может отредактировать) - ✅ Остаток в партии не изменился (остался 5) --- ## Тест 5: Отключенный JavaScript (браузерная консоль) Если JavaScript отключен: **Шаги:** 1. Откройте DevTools (F12) 2. Отключите JavaScript 3. Обновите страницу 4. Заполните форму с quantity > batch.quantity 5. Нажмите "Сохранить" **Ожидаемый результат:** - ✅ Реал-тайм валидация не работает (это ок - это просто nice-to-have) - ✅ Форма отправляется на сервер - ✅ Django form validation ловит ошибку - ✅ На странице появляется красный alert с ошибкой - ✅ Остаток в партии не изменился (данные защищены) --- ## Тест 6: Граничные случаи ### Граничный случай 1: Количество = остатку **Шаги:** 1. Партия имеет остаток = 5 шт 2. Введите количество = 5 3. **Ожидаемый результат:** - ✅ Никаких предупреждений (это валидное значение) - ✅ Форма отправляется успешно - ✅ Партия полностью списывается (остаток = 0) - ✅ Партия деактивируется (is_active = False) ### Граничный случай 2: Очень малое количество **Шаги:** 1. Введите количество = 0.001 (если поддерживается) 2. **Ожидаемый результат:** - ✅ Форма отправляется - ✅ Остаток уменьшается на 0.001 - ✅ Все работает корректно ### Граничный случай 3: Дробные числа **Шаги:** 1. Партия имеет остаток = 5.5 шт 2. Введите количество = 5.6 3. **Ожидаемый результат:** - ✅ Появляется предупреждение о превышении - ✅ Недостаток = 0.1 шт (правильный расчет) --- ## Проверочный лист ### Общие проверки - [ ] JavaScript выполняется без ошибок (проверить консоль F12) - [ ] Стили Bootstrap применены правильно - [ ] Все иконки (⚠️, ❌, 📋) отображаются корректно - [ ] Alert блоки имеют правильные цвета (красный для ошибок, желтый для warning) - [ ] Кнопка закрытия alert работает ### Функциональные проверки - [ ] Информация об остатке появляется при выборе партии - [ ] Предупреждение появляется при quantity > batch.quantity - [ ] Ошибка валидации отображается красиво - [ ] Форма не отправляется при невалидных данных - [ ] При валидных данных форма отправляется и остаток уменьшается ### Граничные случаи - [ ] Количество = остатку работает правильно - [ ] Дробные количества поддерживаются - [ ] Партия деактивируется когда количество <= 0 - [ ] JavaScript отключение не ломает functionality (только UX) --- ## Логирование для отладки Если что-то не работает, проверьте: 1. **Консоль браузера (F12 → Console)** - Ошибки JavaScript - Логи из скрипта 2. **Django логи** - Ошибки валидации - Ошибки в сохранении модели 3. **Network tab (F12 → Network)** - Проверить POST запросы - Ответ сервера (200, 400, 500 и т.д.) --- ## Быстрая проверка Самый быстрый способ проверить что все работает: ```bash # 1. Откройте форму # http://grach.localhost:8000/inventory/writeoffs/create/ # 2. Выберите партию - должна появиться информация об остатке # 3. Введите количество больше остатка - должно появиться предупреждение # 4. Нажмите сохранить - должна появиться ошибка # 5. Поправьте количество на меньшее - предупреждение исчезнет # 6. Нажмите сохранить - форма отправится успешно ``` --- ## Известные ограничения 1. **Форматирование дробных чисел:** JavaScript использует `.toFixed(3)` для недостатка, может быть 0.100 вместо 0.1 - Это не критично, просто визуально 2. **Локализация запятой/точки:** Код поддерживает оба варианта в regex но может быть проблемы с разными локалями - Проверьте что в вашей локали правильно парсятся дробные числа 3. **Старые браузеры:** Код использует `addEventListener` и `querySelector` - не поддерживается IE11 - Но IE11 давно не поддерживается, это нормально --- ## Что дальше? Если тестирование прошло успешно: 1. ✅ Все остатки партий уменьшаются правильно 2. ✅ Никакие отрицательные значения не создаются 3. ✅ UI четкий и понятный То система готова к использованию!