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>
This commit is contained in:
149
KIT_PRICING_SYSTEM_READY.md
Normal file
149
KIT_PRICING_SYSTEM_READY.md
Normal file
@@ -0,0 +1,149 @@
|
||||
# Система динамического ценообразования комплектов - Готово к тестированию
|
||||
|
||||
## Резюме изменений
|
||||
|
||||
Реализована новая, упрощённая система ценообразования для комплектов (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/
|
||||
Reference in New Issue
Block a user