Исправлены 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
Система динамического ценообразования комплектов - Готово к тестированию
Резюме изменений
Реализована новая, упрощённая система ценообразования для комплектов (ProductKit), которая заменяет сложную систему с множественными методами.
Архитектура решения
Основной принцип: Цена комплекта = сумма(actual_price компонентов × количество) + опциональная корректировка
Компоненты системы
1. Модель ProductKit (products/models/kits.py)
-
Новые поля:
base_price- сумма цен всех компонентов (пересчитывается автоматически)price- итоговая цена (база + корректировка)price_adjustment_type- тип корректировки (none, increase_percent, increase_amount, decrease_percent, decrease_amount)price_adjustment_value- значение корректировки (% или руб)
-
Ключевые методы:
calculate_final_price()- расчёт финальной цены с корректировкойrecalculate_base_price()- пересчёт базовой цены из компонентов
2. Django Signal (inventory/signals.py)
@receiver(post_save, sender='products.Product')
def update_kit_prices_on_product_change(sender, instance, created, **kwargs):
"""Автоматически пересчитывает все комплекты при изменении цены товара"""
3. API Endpoint (products/views/api_views.py)
- Обновлён
search_products_and_variants()для возвратаactual_priceв JSON
4. Форма ProductKit (products/forms.py)
- Упрощена валидация
- Удалены старые поля ценообразования
- Оставлены только: name, sku, description, categories, tags, price_adjustment_type, price_adjustment_value
5. Шаблон создания комплекта (productkit_create.html)
- Удалены:
- Выпадающий список для выбора типа корректировки
- Добавлены:
- 4 поля ввода в 2×2 сетке для автоматического определения типа:
- Увеличить на %
- Увеличить на руб
- Уменьшить на %
- Уменьшить на руб
- Real-time отображение базовой цены
- Real-time отображение финальной цены
- 4 поля ввода в 2×2 сетке для автоматического определения типа:
6. Шаблон редактирования комплекта (productkit_edit.html)
- Идентичен созданию
- Плюс автоматическая загрузка сохранённых значений корректировки
JavaScript функциональность
Ключевые функции:
-
getProductPrice(selectElement) - async функция для получения цены товара
- Проверка кэша
- Проверка data-атрибутов
- Проверка Select2 data
- AJAX запрос к API при необходимости
-
calculateFinalPrice() - async функция для расчёта финальной цены
- Суммирует actual_price × quantity для всех компонентов
- Автоматически определяет тип корректировки (какое одно поле заполнено)
- Обновляет скрытые форм-поля (price_adjustment_type, price_adjustment_value)
- Обновляет display элементы в реальном времени
Event Handlers:
- Select2 события (select2:select, select2:unselect) → calculateFinalPrice()
- Input/change события в полях корректировки → calculateFinalPrice()
- Изменение количества → calculateFinalPrice()
Данные в тенанте "grach"
Для тестирования доступны товары:
- Роза красная - price: 50.00, sale: 20.00, actual: 20.00 ✓
- Белая роза - price: 5.00, sale: null, actual: 5.00 ✓
- Ваниль гибискус - price: 6.00, sale: null, actual: 6.00 ✓
- Хризантема оранжевая - price: 5.00, sale: null, actual: 5.00 ✓
Сценарии тестирования
Тест 1: Создание простого комплекта
1. Перейти на http://grach.localhost:8000/products/kits/create/
2. Заполнить название: "Букет из 3 роз"
3. Добавить товар "Роза красная" (qty: 3) → base_price должна быть 60.00 (20×3)
4. Увеличить на 10% → final_price должна быть 66.00 (60×1.10)
5. Сохранить и проверить
Тест 2: Прямое увеличение суммой
1. Создать комплект с товарами на сумму 50 руб
2. В поле "Увеличить на руб" ввести 10
3. Final_price должна быть 60.00
Тест 3: Уменьшение
1. Создать комплект базовой ценой 100 руб
2. Уменьшить на 20% → final_price = 80
3. Или уменьшить на 15 руб → final_price = 85
Тест 4: Редактирование
1. Создать комплект с увеличением на 10%
2. Открыть для редактирования
3. Проверить, что значение 10 загружено в поле "Увеличить на %"
4. Изменить на 15% → final_price пересчитывается
Тест 5: Автоматический пересчёт при изменении цены товара
1. Создать комплект с "Роза красная" (qty: 2), base_price = 40
2. В админке изменить sale_price розы на 15
3. Открыть комплект в БД или API → base_price должна пересчитаться на 30
Файлы изменены
| Файл | Изменение |
|---|---|
products/models/kits.py |
Полностью переписан с новой моделью ценообразования |
products/forms.py |
Упрощена, удалены старые поля |
products/views/api_views.py |
Добавлен actual_price в JSON responses |
products/views/productkit_views.py |
Обновлен контекст для actual_price |
products/templates/productkit_create.html |
Новый UI с 4 полями корректировки + real-time расчёты |
products/templates/productkit_edit.html |
Идентичен create + загрузка сохранённых значений |
products/templates/includes/kititem_formset.html |
Добавлены data-product-price атрибуты |
inventory/signals.py |
Добавлен обработчик для auto-recalculation при изменении Product |
products/migrations/0004_add_kit_price_adjustment_fields.py |
Migration для новых полей |
Status
✅ Миграция применена - БД обновлена ✅ API endpoint - Возвращает actual_price ✅ Шаблоны - Полностью переработаны ✅ JavaScript - Реализована real-time калькуляция ✅ Signal - Готов автоматически пересчитывать при изменении товаров ✅ Тестовые данные - Есть товары в тенанте grach
Готово к запуску
Система полностью готова к тестированию на http://grach.localhost:8000/products/kits/create/