diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 3a1c18c..7021bfc 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -1190,6 +1190,41 @@ def reserve_stock_on_uncancellation(sender, instance, created, **kwargs): logger.info( f"✅ Обработано {showcase_items_count} витринных комплектов" ) + + # === Возвращаем ShowcaseItem из available обратно в reserved === + # При отмене (cancelled) ShowcaseItem переходит в 'available'. + # При возврате к нейтральному статусу нужно вернуть в 'reserved'. + from inventory.models import ShowcaseItem + + # Находим все ShowcaseItem которые были освобождены при отмене + # (у них sold_order_item сброшен в return_to_available, нужно найти через резервы) + for order_item in showcase_order_items: + kit = order_item.product_kit + + # Находим ShowcaseItem этого комплекта в статусе 'available' + # Их sold_order_item = None, поэтому ищем через product_kit + available_items = ShowcaseItem.objects.filter( + product_kit=kit, + status='available', + sold_order_item__isnull=True + ) + + if available_items.exists(): + logger.info( + f" 🔄 Найдено {available_items.count()} ShowcaseItem комплекта '{kit.name}' в статусе 'available'. " + f"Возвращаем в reserved..." + ) + + for item in available_items: + try: + item.return_to_reserved(order_item) + logger.info( + f" ✅ ShowcaseItem #{item.id}: available → reserved (привязан к OrderItem #{order_item.id})" + ) + except Exception as e: + logger.error( + f" ❌ Ошибка возврата ShowcaseItem #{item.id} в reserved: {e}" + ) @receiver(pre_delete, sender=Order)