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>
This commit is contained in:
2025-11-02 19:04:03 +03:00
parent c84a372f98
commit 6c8af5ab2c
120 changed files with 9035 additions and 3036 deletions

101
DEBUG_PRICE_CALCULATION.md Normal file
View File

@@ -0,0 +1,101 @@
# Отладка расчёта цены комплекта
## Проблема
Первая строка (компонент) не считается в цену. При добавлении второго товара начинает считать.
## Решение
### Что было исправлено
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. Перезагрузите страницу