Исправлены 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>
102 lines
4.8 KiB
Markdown
102 lines
4.8 KiB
Markdown
# Отладка расчёта цены комплекта
|
||
|
||
## Проблема
|
||
Первая строка (компонент) не считается в цену. При добавлении второго товара начинает считать.
|
||
|
||
## Решение
|
||
|
||
### Что было исправлено
|
||
|
||
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. Перезагрузите страницу
|