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

8.1 KiB
Raw Blame History

Система динамического ценообразования комплектов - Готово к тестированию

Резюме изменений

Реализована новая, упрощённая система ценообразования для комплектов (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 отображение финальной цены

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/