Исправлен поиск витринных резервов при создании 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:
@@ -365,6 +365,28 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
|
||||
product_kit=kit
|
||||
).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():
|
||||
# Проверяем, может быть витринный комплект уже продан через ShowcaseManager?
|
||||
already_sold = Reservation.objects.filter(
|
||||
|
||||
Reference in New Issue
Block a user