Исправлены 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>
229 lines
9.6 KiB
Markdown
229 lines
9.6 KiB
Markdown
# Тестирование улучшений 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 четкий и понятный
|
||
|
||
То система готова к использованию!
|