Исправлены 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>
8.1 KiB
Итоговый отчет об улучшениях системы ценообразования комплектов
Дата: 2025-11-02
Статус: ✅ Полностью готово к использованию
Исправления, выполненные в этой сессии
1. Расчёт цены первого товара ✅
Проблема: Первая строка не считалась в цену. Цена начинала считаться только со второго товара.
Решение:
- Улучшена функция
getProductPrice()с более строгой валидацией - Улучшена функция
calculateFinalPrice()с проверками:- Пропуск пустых товаров
- Валидация количества (минимум 1)
- Проверка что цена > 0
Файлы:
productkit_create.htmlproductkit_edit.html
2. Отображение цены в Select2 ✅
Проблема: Select2 dropdown отображал обычную цену без скидки, а не actual_price (цену со скидкой).
Решение:
- Обновлена функция
formatSelectResult()в Select2 инициализации - Теперь приоритет:
actual_price(если есть скидка) →price(обычная цена)
Файл: products/templates/products/includes/select2-product-init.html
3. Количество по умолчанию ✅
Проблема: При добавлении первого товара поле количества было пустым. При добавлении второго товара появлялась 1 по умолчанию.
Решение:
- Добавлен метод
__init__в классKitItemForm - Устанавливает
quantity.initial = 1для новых форм
Файл: products/forms.py
4. Auto-select текста в поле количества ✅
Проблема: При клике на поле количества нужно было вручную выделять число перед его изменением.
Решение:
- Добавлен обработчик события
focusдля полей количества - При клике поле автоматически выделяет весь текст
- Пользователь может сразу начать вводить новое значение с клавиатуры
Файлы:
productkit_create.html(строки 657-659)productkit_edit.html(строки 657-659)
Код:
quantityInput.addEventListener('focus', function() {
this.select();
});
Архитектура решения
Поток расчёта цены
1. Пользователь выбирает товар в Select2
2. select2:select событие срабатывает
3. getProductPrice() получает цену товара:
- Сначала проверяет кэш
- Затем data-атрибуты
- Затем Select2 data
- В последнюю очередь AJAX к API
4. calculateFinalPrice() вызывается
5. Для каждого товара:
- Проверяется что товар выбран
- Получается количество (или 1)
- Ждёт await getProductPrice()
- Суммирует actual_price × quantity
6. Базовая цена обновляется
7. Определяется тип корректировки (какое поле заполнено)
8. Рассчитывается финальная цена
9. Обновляются display элементы
Валидация данных
В Python (forms.py):
- KitItemForm.clean() проверяет что quantity > 0
- ProductKitForm.clean() проверяет что adjustment_value > 0 если тип не 'none'
В JavaScript:
- getProductPrice() проверяет isNaN и productId > 0
- calculateFinalPrice() проверяет что товар выбран
- Валидация количества: если quantity <= 0, использует 1
Пользовательский опыт
-
При создании комплекта:
- Первое поле количества уже имеет значение 1 ✓
- При выборе товара цена обновляется в реальном времени ✓
- Select2 показывает actual_price (цену со скидкой) ✓
- Клик на количество выделяет текст для быстрого ввода ✓
-
При добавлении товара:
- Новый товар имеет количество 1 по умолчанию ✓
- Обработчик auto-select работает и для новых полей ✓
-
При редактировании:
- Все сохранённые значения загружаются ✓
- Цена пересчитывается при изменении компонентов ✓
Все изменённые файлы
| Файл | Изменение | Строки |
|---|---|---|
products/forms.py |
Добавлен __init__ в KitItemForm с quantity.initial = 1 |
181-185 |
products/templates/includes/select2-product-init.html |
Обновлена formatSelectResult для отображения actual_price | 8-19 |
products/templates/productkit_create.html |
Добавлен обработчик auto-select для quantity | 657-659 |
products/templates/productkit_edit.html |
Добавлен обработчик auto-select для quantity | 657-659 |
Тестирование
Сценарий 1: Первый товар ✓
1. Открыть http://grach.localhost:8000/products/kits/create/
2. Добавить товар "Роза красная"
3. ✓ Поле количества показывает 1
4. ✓ Базовая цена обновляется на 20.00
5. ✓ При клике на количество текст выделяется
6. Изменить на 3
7. ✓ Базовая цена обновляется на 60.00
Сценарий 2: Добавление второго товара ✓
1. Нажать "Добавить товар"
2. ✓ Новое поле имеет количество 1
3. Выбрать "Белая роза"
4. ✓ Цена обновляется (базовая = 60 + 5 = 65)
5. ✓ Auto-select работает для обоих полей
Сценарий 3: Select2 отображение ✓
1. В поле товара начать писать "роз"
2. ✓ Dropdown показывает товары с actual_price:
- "Роза красная" - 20.00 руб (со скидкой)
- Не 50.00 руб (обычная цена)
Сценарий 4: Редактирование ✓
1. Создать комплект
2. Открыть для редактирования
3. ✓ Все значения загружены
4. ✓ Цена правильно отображается
5. ✓ Auto-select работает при клике
Готово к запуску! 🎉
Все улучшения реализованы и готовы к использованию.
Точки входа для тестирования:
- Создание: http://grach.localhost:8000/products/kits/create/
- Редактирование: http://grach.localhost:8000/products/kits/
- API: http://grach.localhost:8000/products/api/search-products-variants/
Новые возможности: ✅ Расчёт цены для первого товара ✅ Правильное отображение actual_price в Select2 ✅ Количество по умолчанию = 1 ✅ Auto-select текста при клике на количество ✅ Логирование для отладки в консоли браузера ✅ Надёжная валидация данных на разных уровнях