# Система динамического ценообразования комплектов - Готово к тестированию ## Резюме изменений Реализована новая, упрощённая система ценообразования для комплектов (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`) ```python @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 отображение финальной цены #### 6. **Шаблон редактирования комплекта** (`productkit_edit.html`) - Идентичен созданию - Плюс автоматическая загрузка сохранённых значений корректировки ### JavaScript функциональность #### Ключевые функции: 1. **getProductPrice(selectElement)** - async функция для получения цены товара - Проверка кэша - Проверка data-атрибутов - Проверка Select2 data - AJAX запрос к API при необходимости 2. **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" Для тестирования доступны товары: 1. **Роза красная** - price: 50.00, sale: 20.00, actual: 20.00 ✓ 2. **Белая роза** - price: 5.00, sale: null, actual: 5.00 ✓ 3. **Ваниль гибискус** - price: 6.00, sale: null, actual: 6.00 ✓ 4. **Хризантема оранжевая** - 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/