diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 3e18647..db34f74 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -133,31 +133,33 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs): if not instance.status: return - # Проверяем: это положительный финальный статус? - is_positive_end = instance.status.is_positive_end - - if not is_positive_end: - return # Только для положительных финальных статусов (completed и т.п.) - - # === ВАЛИДАЦИЯ: Запрет повторного completed для возвращённых заказов без резервов === + # === ВАЛИДАЦИЯ: Запрет изменения статуса для возвращённых заказов без резервов === + # Если заказ был возвращён (is_returned=True) и резервов нет, можно использовать + # только статусы отрицательного исхода (отменён и т.п.) if instance.is_returned: - # Заказ уже был продан и возвращён — проверяем наличие резервов has_reservations = Reservation.objects.filter( order_item__order=instance ).exists() if not has_reservations: - # Резервов нет — товар уже ушёл в другой заказ или был освобождён - logger.error( - f"❌ Заказ {instance.order_number} имеет флаг is_returned=True и не имеет резервов. " - f"Невозможно перевести в статус '{instance.status.name}'." - ) - raise ValidationError( - f"Невозможно установить статус '{instance.status.name}' для заказа {instance.order_number}. " - f"Этот заказ уже был отменён после продажи, резервы отсутствуют. " - f"Товары могли быть проданы в другом заказе. " - f"Пожалуйста, оставьте статус отрицательного исхода (отменён) или создайте новый заказ." - ) + # Резервов нет — разрешены только отрицательные статусы + if not instance.status.is_negative_end: + logger.error( + f"❌ Заказ {instance.order_number}: is_returned=True, резервов нет. " + f"Попытка установить '{instance.status.name}' запрещена." + ) + raise ValidationError( + f"Невозможно изменить статус заказа {instance.order_number}.\n\n" + f"Этот заказ был отменён после продажи, товары проданы в другом заказе.\n" + f"Разрешены только статусы отрицательного исхода (отменён).\n\n" + f"Для новой продажи создайте новый заказ." + ) + + # Проверяем: это положительный финальный статус? + is_positive_end = instance.status.is_positive_end + + if not is_positive_end: + return # Только для положительных финальных статусов (completed и т.п.) # Защита от повторного списания: проверяем, не созданы ли уже Sale для этого заказа if Sale.objects.filter(order=instance).exists():