Files
octopus/DEBUG_PRICE_CALCULATION.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

4.8 KiB
Raw Blame History

Отладка расчёта цены комплекта

Проблема

Первая строка (компонент) не считается в цену. При добавлении второго товара начинает считать.

Решение

Что было исправлено

  1. Улучшена функция getProductPrice() с добавлением:

    • Строгой проверки валидности элемента и productId
    • Логирования для отладки (console.log)
    • Проверки на isNaN и productId <= 0
  2. Улучшена функция calculateFinalPrice() с добавлением:

    • Проверки что товар выбран (!productSelect || !productSelect.value)
    • Валидации количества (если quantity <= 0, использует 1)
    • Проверки что цена > 0 перед добавлением в сумму
  3. Добавлено логирование для отладки в браузерной консоли:

    console.log('getProductPrice: from cache', productId, cachedPrice);
    console.log('getProductPrice: from API', productId, price);
    console.warn('getProductPrice: returning 0 for product', productId);
    

Как провести отладку

  1. Откройте DevTools в браузере (F12 или Ctrl+Shift+I)

  2. Перейдите на вкладку Console

  3. Добавьте первый товар на форму создания комплекта

  4. Посмотрите в Console - должны увидеть логи вида:

    getProductPrice: fetching from API 1
    getProductPrice: from API 1 20.00
    
  5. Введите количество товара

  6. Проверьте что в Console логируется calculateFinalPrice вызывается

  7. Убедитесь что базовая цена обновилась

Возможные проблемы и решения

1. "getProductPrice: no valid product id"

Проблема: selectElement пуст или не имеет ID товара Решение: Убедитесь что товар действительно выбран в Select2

2. "getProductPrice: returning 0 for product"

Проблема: Цена товара не найдена ни в одном источнике Решение:

  • Проверьте что товар имеет цену в базе данных
  • Проверьте API endpoint возвращает actual_price

3. Цена считается только со 2-го товара

Проблема: Первая форма загружается с пустыми значениями, но JavaScript пытается считать её Решение:

  • Логика теперь пропускает пустые товары (if (!productSelect.value) continue)
  • Убедитесь что Вы выбираете товар перед добавлением количества

Тест в консоли браузера

После добавления товара выполните в консоли:

// Получить текущую базовую цену
console.log(basePrice);

// Получить кэш цен
console.log(priceCache);

// Получить все формы компонентов
document.querySelectorAll('.kititem-form').length;

// Проверить значение в первой форме
document.querySelector('[name$="-product"]').value;

Network отладка

  1. Откройте вкладку Network в DevTools
  2. Добавьте товар
  3. Должен быть запрос к /products/api/search-products-variants/?id=1
  4. Проверьте Response - должна быть actual_price в результате

Состояние системы после исправлений

getProductPrice() - теперь надёжно получает цены с логированием calculateFinalPrice() - корректно обрабатывает пустые и частично заполненные формы Event handlers - срабатывают корректно при select2:select Кэширование - работает, ускоряет повторный доступ к ценам

Если проблема сохраняется

  1. Проверьте в консоли логи при добавлении товара
  2. Убедитесь что API endpoint возвращает данные:
    GET /products/api/search-products-variants/?id=1
    Response: {"results": [{"id": 1, "actual_price": "20.00", ...}]}
    
  3. Очистите кэш браузера (Ctrl+Shift+Delete)
  4. Перезагрузите страницу