Fix: Auto-fill product prices when empty or zero in autosave

Исправлена проблема с пропаданием цен товаров при автосохранении и
перезагрузке страницы.

ПРОБЛЕМА:
- При автосохранении пустые поля цен отправлялись как '0'
- Backend сохранял 0 в базу данных
- При перезагрузке страницы поля цен оставались пустыми
- Итоговая сумма товаров показывала 0.00 руб.

РЕШЕНИЕ 1 - Backend (draft_service.py):
- Изменена логика обработки цен в update_draft()
- Если цена пустая или равна 0, используется actual_price из каталога
- Добавлена корректная обработка price_raw перед конвертацией в Decimal
- Улучшена логика определения is_custom_price

Логика обработки цены:
1. Получаем price_raw из items_data
2. Если price_raw пустой или 0 → используем original_price из каталога
3. Если price_raw заполнен → используем его и сравниваем с original_price
4. is_custom_price = True только если разница больше 0.01

РЕШЕНИЕ 2 - Frontend (order_form.html):
- Добавлена fallback логика в шаблоне для отображения цены
- Если item_form.instance.price пустой/None/0 → показываем actual_price
- Используется inline условие {% if %} для проверки наличия цены
- Отдельная логика для product и product_kit

Теперь работает корректно:
 При выборе товара цена автоматически заполняется из каталога
 Автосохранение сохраняет правильную цену (из каталога или изменённую)
 При перезагрузке страницы цены отображаются корректно
 Итоговая сумма товаров рассчитывается правильно
 Бейдж "Изменена" показывается только для реально изменённых цен

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-25 20:15:50 +03:00
parent 80260c8a34
commit 5df182e030
2 changed files with 20 additions and 7 deletions

View File

@@ -231,12 +231,11 @@ class DraftOrderService:
product_id = item_data.get('product_id')
product_kit_id = item_data.get('product_kit_id')
quantity = item_data.get('quantity', 1)
price = item_data.get('price', 0)
price_raw = item_data.get('price', '')
# Конвертируем в Decimal
# Конвертируем количество в Decimal
try:
quantity = Decimal(str(quantity))
price = Decimal(str(price))
except (ValueError, TypeError, decimal.InvalidOperation):
continue
@@ -257,9 +256,23 @@ class DraftOrderService:
else:
continue
# Определяем, изменилась ли цена
# Определяем оригинальную цену из каталога
original_price = product.actual_price if product else product_kit.actual_price
is_custom_price = abs(price - original_price) > Decimal('0.01')
# Конвертируем цену в Decimal, если пустая - используем оригинальную
try:
price = Decimal(str(price_raw)) if price_raw else Decimal('0')
# Если цена 0 или пустая, используем оригинальную цену
if price == Decimal('0'):
price = original_price
is_custom_price = False
else:
# Определяем, изменилась ли цена
is_custom_price = abs(price - original_price) > Decimal('0.01')
except (ValueError, TypeError, decimal.InvalidOperation):
# В случае ошибки используем оригинальную цену
price = original_price
is_custom_price = False
# Обновляем существующую позицию или создаём новую
if index < len(existing_items):