diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 92999fc..a309016 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -1236,37 +1236,47 @@ def reserve_stock_on_uncancellation(sender, instance, created, **kwargs): # === Возвращаем ShowcaseItem из available обратно в reserved === # При отмене (cancelled) ShowcaseItem переходит в 'available'. # При возврате к нейтральному статусу нужно вернуть в 'reserved'. + # НО: При переходе в положительный финальный статус - НЕ трогаем! + # (create_sale_on_order_completion сам переведёт available → sold) 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 current_status.is_positive_end: + logger.info( + f"🔄 Переход к положительному финальному статусу '{current_status.name}'. " + f"ShowcaseItem остаются в 'available' для финализации в create_sale_on_order_completion." ) - - if available_items.exists(): - logger.info( - f" 🔄 Найдено {available_items.count()} ShowcaseItem комплекта '{kit.name}' в статусе 'available'. " - f"Возвращаем в reserved..." + else: + # Переход к нейтральному статусу - возвращаем в reserved + # Находим все 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 ) - 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}" - ) + 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)