Files
octopus/KIT_PRICING_SYSTEM_READY.md
Andrey Smakotin 6c8af5ab2c 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>
2025-11-02 19:04:03 +03:00

150 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Система динамического ценообразования комплектов - Готово к тестированию
## Резюме изменений
Реализована новая, упрощённая система ценообразования для комплектов (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/