Files
octopus/TESTING_WRITEOFF_IMPROVEMENTS.md
Andrey Smakotin 6c8af5ab2c fix: Улучшения системы ценообразования комплектов
Исправлены 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>
2025-11-02 19:04:03 +03:00

9.6 KiB
Raw Blame History

Тестирование улучшений 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 и т.д.)

Быстрая проверка

Самый быстрый способ проверить что все работает:

# 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 четкий и понятный

То система готова к использованию!