Исправлены 4 проблемы: 1. Расчёт цены первого товара - улучшена валидация в getProductPrice и calculateFinalPrice 2. Отображение actual_price в Select2 вместо обычной цены 3. Количество по умолчанию = 1 для новых форм компонентов 4. Auto-select текста при клике на поле количества для удобства редактирования Изменённые файлы: - products/forms.py: добавлен __init__ в KitItemForm для quantity.initial = 1 - products/templates/includes/select2-product-init.html: обновлена formatSelectResult - products/templates/productkit_create.html: добавлен focus handler для auto-select - products/templates/productkit_edit.html: добавлен focus handler для auto-select 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
9.6 KiB
Тестирование улучшений WriteOff UI
Краткая инструкция тестирования
Подготовка
-
Убедитесь что у вас есть актуальные данные:
- Склад (Warehouse)
- Товар (Product)
- Партия товара (StockBatch) с остатком > 0
-
Откройте страницу:
http://grach.localhost:8000/inventory/writeoffs/create/
Тест 1: Информация об остатке партии
Шаги:
- Выберите партию из dropdown "Партия"
- Ожидаемый результат:
- Под dropdown появляется серый блок:
📋 Остаток в партии: X шт- Где X это количество в выбранной партии
Проверка:
- ✅ Блок информации появляется при выборе
- ✅ Блок исчезает если выбрать пустое значение
- ✅ Количество обновляется при смене партии
Тест 2: Реал-тайм предупреждение при превышении
Шаги:
- Выберите партию (например, с остатком 5 шт)
- Введите в поле "Количество" число МЕНЬШЕ остатка (например, 3)
- Ожидаемый результат: Никаких предупреждений
Шаги 2:
- Введите в поле "Количество" число БОЛЬШЕ остатка (например, 10)
- Ожидаемый результат:
⚠️ Внимание! Вы пытаетесь списать 10 шт, а в партии только 5 шт. Недостаток: 5 шт.
Проверка:
- ✅ Предупреждение НЕ появляется при quantity <= batch.quantity
- ✅ Предупреждение ПОЯВЛЯЕТСЯ при quantity > batch.quantity
- ✅ Предупреждение обновляется в реал-тайме при каждом вводе
- ✅ Правильно рассчитывается недостаток (shortage)
Тест 3: Отправка валидных данных
Шаги:
- Выберите партию (остаток = 5 шт)
- Введите количество = 3 (меньше остатка)
- Выберите причину (например, "damage")
- Нажмите кнопку "Сохранить"
Ожидаемый результат:
- ✅ Форма отправляется успешно
- ✅ Перенаправляется на список списаний
- ✅ Появляется зеленое сообщение об успехе
- ✅ Остаток в партии уменьшился на 3 (стал 2)
Тест 4: Отправка невалидных данных (количество > остатка)
Шаги:
- Выберите партию (остаток = 5 шт)
- Введите количество = 10 (больше остатка)
- Нажмите кнопку "Сохранить"
Ожидаемый результат:
- ✅ Форма НЕ отправляется
- ✅ На странице появляется красный alert:
❌ Ошибка: Невозможно списать 10 шт из партии, где только 5 шт. Недостаток: 5 шт. - ✅ Пользователь остается на форме
- ✅ Данные в полях сохраняются (он может отредактировать)
- ✅ Остаток в партии не изменился (остался 5)
Тест 5: Отключенный JavaScript (браузерная консоль)
Если JavaScript отключен:
Шаги:
- Откройте DevTools (F12)
- Отключите JavaScript
- Обновите страницу
- Заполните форму с quantity > batch.quantity
- Нажмите "Сохранить"
Ожидаемый результат:
- ✅ Реал-тайм валидация не работает (это ок - это просто nice-to-have)
- ✅ Форма отправляется на сервер
- ✅ Django form validation ловит ошибку
- ✅ На странице появляется красный alert с ошибкой
- ✅ Остаток в партии не изменился (данные защищены)
Тест 6: Граничные случаи
Граничный случай 1: Количество = остатку
Шаги:
- Партия имеет остаток = 5 шт
- Введите количество = 5
- Ожидаемый результат:
- ✅ Никаких предупреждений (это валидное значение)
- ✅ Форма отправляется успешно
- ✅ Партия полностью списывается (остаток = 0)
- ✅ Партия деактивируется (is_active = False)
Граничный случай 2: Очень малое количество
Шаги:
- Введите количество = 0.001 (если поддерживается)
- Ожидаемый результат:
- ✅ Форма отправляется
- ✅ Остаток уменьшается на 0.001
- ✅ Все работает корректно
Граничный случай 3: Дробные числа
Шаги:
- Партия имеет остаток = 5.5 шт
- Введите количество = 5.6
- Ожидаемый результат:
- ✅ Появляется предупреждение о превышении
- ✅ Недостаток = 0.1 шт (правильный расчет)
Проверочный лист
Общие проверки
- JavaScript выполняется без ошибок (проверить консоль F12)
- Стили Bootstrap применены правильно
- Все иконки (⚠️, ❌, 📋) отображаются корректно
- Alert блоки имеют правильные цвета (красный для ошибок, желтый для warning)
- Кнопка закрытия alert работает
Функциональные проверки
- Информация об остатке появляется при выборе партии
- Предупреждение появляется при quantity > batch.quantity
- Ошибка валидации отображается красиво
- Форма не отправляется при невалидных данных
- При валидных данных форма отправляется и остаток уменьшается
Граничные случаи
- Количество = остатку работает правильно
- Дробные количества поддерживаются
- Партия деактивируется когда количество <= 0
- JavaScript отключение не ломает functionality (только UX)
Логирование для отладки
Если что-то не работает, проверьте:
-
Консоль браузера (F12 → Console)
- Ошибки JavaScript
- Логи из скрипта
-
Django логи
- Ошибки валидации
- Ошибки в сохранении модели
-
Network tab (F12 → Network)
- Проверить POST запросы
- Ответ сервера (200, 400, 500 и т.д.)
Быстрая проверка
Самый быстрый способ проверить что все работает:
# 1. Откройте форму
# http://grach.localhost:8000/inventory/writeoffs/create/
# 2. Выберите партию - должна появиться информация об остатке
# 3. Введите количество больше остатка - должно появиться предупреждение
# 4. Нажмите сохранить - должна появиться ошибка
# 5. Поправьте количество на меньшее - предупреждение исчезнет
# 6. Нажмите сохранить - форма отправится успешно
Известные ограничения
-
Форматирование дробных чисел: JavaScript использует
.toFixed(3)для недостатка, может быть 0.100 вместо 0.1- Это не критично, просто визуально
-
Локализация запятой/точки: Код поддерживает оба варианта в regex но может быть проблемы с разными локалями
- Проверьте что в вашей локали правильно парсятся дробные числа
-
Старые браузеры: Код использует
addEventListenerиquerySelector- не поддерживается IE11- Но IE11 давно не поддерживается, это нормально
Что дальше?
Если тестирование прошло успешно:
- ✅ Все остатки партий уменьшаются правильно
- ✅ Никакие отрицательные значения не создаются
- ✅ UI четкий и понятный
То система готова к использованию!