Исправлены 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>
150 lines
8.1 KiB
Markdown
150 lines
8.1 KiB
Markdown
# Система динамического ценообразования комплектов - Готово к тестированию
|
||
|
||
## Резюме изменений
|
||
|
||
Реализована новая, упрощённая система ценообразования для комплектов (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/
|