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

102 lines
4.8 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.
# Отладка расчёта цены комплекта
## Проблема
Первая строка (компонент) не считается в цену. При добавлении второго товара начинает считать.
## Решение
### Что было исправлено
1. **Улучшена функция `getProductPrice()`** с добавлением:
- Строгой проверки валидности элемента и productId
- Логирования для отладки (console.log)
- Проверки на isNaN и productId <= 0
2. **Улучшена функция `calculateFinalPrice()`** с добавлением:
- Проверки что товар выбран (!productSelect || !productSelect.value)
- Валидации количества (если quantity <= 0, использует 1)
- Проверки что цена > 0 перед добавлением в сумму
3. **Добавлено логирование** для отладки в браузерной консоли:
```javascript
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`)
- Убедитесь что Вы выбираете товар перед добавлением количества
### Тест в консоли браузера
После добавления товара выполните в консоли:
```javascript
// Получить текущую базовую цену
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. Перезагрузите страницу