Исправлен поиск витринных резервов при создании Sale из отменённого заказа

Проблема:
- При переходе cancelled → completed резервы витринных букетов отвязаны от order_item (order_item=None)
- В create_sale_on_order_completion поиск резервов по order_item не находит их
- Sale не создаются → букет освобождается вместо продажи

Решение:
- inventory/signals.py: в create_sale_on_order_completion добавлена fallback-логика для витринных комплектов
- Если резервы не найдены по order_item=item, проверяем: витринный комплект?
- Для витринных: ищем резервы через product_kit + showcase__isnull=False + status='reserved'
- Найденные резервы привязываем к order_item перед созданием Sale
- Затем создаются Sale и ShowcaseItem корректно переходит в sold

Flow теперь работает полностью:
1. cancelled: ShowcaseItem → available, Reservation order_item=None
2. cancelled → completed:
   - create_sale_on_order_completion находит резервы через product_kit 
   - Привязывает их к order_item 
   - Создаёт Sale для компонентов 
   - Финализирует ShowcaseItem: available → sold 

Гарантирует создание Sale даже если порядок срабатывания сигналов не предсказуем.
This commit is contained in:
2026-01-05 09:45:18 +03:00
parent 0faae69c63
commit d65a69e2bb

View File

@@ -365,6 +365,28 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
product_kit=kit product_kit=kit
).exclude(status='converted_to_sale') ).exclude(status='converted_to_sale')
# Если резервы не найдены по order_item (например, при переходе из cancelled),
# ищем витринные резервы через product_kit
if not kit_reservations.exists() and kit.is_temporary and kit.showcase:
logger.info(
f"🔄 Витринный комплект '{kit.name}': резервы не найдены по order_item. "
f"Ищем через product_kit..."
)
# Ищем резервы для этого комплекта (могут быть без order_item при переходе из cancelled)
kit_reservations = Reservation.objects.filter(
product_kit=kit,
showcase__isnull=False,
status='reserved'
)
# Привязываем резервы к order_item перед созданием Sale
if kit_reservations.exists():
updated_count = kit_reservations.update(order_item=item)
logger.info(
f" ✅ Привязано {updated_count} резервов к OrderItem #{item.id}"
)
if not kit_reservations.exists(): if not kit_reservations.exists():
# Проверяем, может быть витринный комплект уже продан через ShowcaseManager? # Проверяем, может быть витринный комплект уже продан через ShowcaseManager?
already_sold = Reservation.objects.filter( already_sold = Reservation.objects.filter(