diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 7021bfc..611fbd8 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -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: - showcase_item.mark_sold_from_reserved() + if showcase_item.status == 'reserved': + # Обычный flow: reserved → sold + showcase_item.mark_sold_from_reserved() + 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 - logger.info( - f"✓ Витринный экземпляр #{showcase_item.id} финализирован: reserved → sold" - ) except Exception as e: logger.error( f"❌ Ошибка финализации ShowcaseItem #{showcase_item.id}: {e}"