Исправлен баг: ShowcaseItem теперь корректно переходит available → sold при cancelled → completed
Проблема: - При переходе заказа cancelled → completed витринный букет оставался в статусе 'available' - Логика финализации искала только ShowcaseItem в статусе 'reserved' - НО при отмене (cancelled) ShowcaseItem переходит в 'available', а не остаётся в 'reserved' - Итог: букет не финализировался, оставался свободным вместо проданного Решение: - inventory/signals.py: в сигнале create_sale_on_order_completion обновлена логика финализации - Теперь ищем ShowcaseItem в статусах ['reserved', 'available'] - Для статуса 'reserved': вызываем mark_sold_from_reserved() (обычный flow) - Для статуса 'available': вызываем mark_sold() (переход из отмены cancelled → completed) - Оба метода корректно переводят букет в 'sold' и устанавливают sold_at Flow переходов: 1. Обычный: draft → completed: ShowcaseItem reserved → sold ✅ 2. Из отмены: cancelled → completed: ShowcaseItem available → sold ✅ (ИСПРАВЛЕНО)
This commit is contained in:
@@ -494,23 +494,34 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
|
||||
f"✓ Обновлено {updated_count} резервов для заказа {instance.order_number}: reserved → converted_to_sale"
|
||||
)
|
||||
|
||||
# === Финализация витринных экземпляров: reserved → sold ===
|
||||
# Находим все витринные комплекты в этом заказе, которые в статусе reserved
|
||||
# === Финализация витринных экземпляров: reserved/available → sold ===
|
||||
# Находим все витринные комплекты в этом заказе:
|
||||
# - в статусе 'reserved' (обычный flow: создание черновика → завершение)
|
||||
# - в статусе 'available' (переход из отмены: cancelled → completed)
|
||||
from inventory.models import ShowcaseItem
|
||||
|
||||
showcase_items_to_finalize = ShowcaseItem.objects.filter(
|
||||
sold_order_item__order=instance,
|
||||
status='reserved'
|
||||
status__in=['reserved', 'available']
|
||||
)
|
||||
|
||||
finalized_count = 0
|
||||
for showcase_item in showcase_items_to_finalize:
|
||||
try:
|
||||
if showcase_item.status == 'reserved':
|
||||
# Обычный flow: reserved → sold
|
||||
showcase_item.mark_sold_from_reserved()
|
||||
finalized_count += 1
|
||||
logger.info(
|
||||
f"✓ Витринный экземпляр #{showcase_item.id} финализирован: reserved → sold"
|
||||
)
|
||||
elif showcase_item.status == 'available':
|
||||
# Переход из отмены: available → sold (минуя reserved)
|
||||
# Используем mark_sold() который работает с available
|
||||
showcase_item.mark_sold(showcase_item.sold_order_item)
|
||||
logger.info(
|
||||
f"✓ Витринный экземпляр #{showcase_item.id} финализирован: available → sold (из отмены)"
|
||||
)
|
||||
finalized_count += 1
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"❌ Ошибка финализации ShowcaseItem #{showcase_item.id}: {e}"
|
||||
|
||||
Reference in New Issue
Block a user