diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index ab006a9..e1614d3 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -96,17 +96,18 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs): if Sale.objects.filter(order=instance).exists(): return # Продажи уже созданы, выходим БЕЗ обновления резервов - # Проверяем наличие резервов ДО начала операции + # Проверяем наличие резервов для этого заказа + # Ищем резервы в статусах 'reserved' (новые) и 'released' (после отката) + # Исключаем уже обработанные 'converted_to_sale' reservations_to_update = Reservation.objects.filter( - order_item__order=instance, - status='reserved' - ) + order_item__order=instance + ).exclude(status='converted_to_sale') if not reservations_to_update.exists(): logger.warning( - f"⚠ Заказ {instance.order_number} переведён в 'completed', но нет резервов в статусе 'reserved'" + f"⚠ Заказ {instance.order_number} переведён в 'completed', " + f"но нет резервов для обновления (все уже converted_to_sale или отсутствуют)" ) - # Продолжаем выполнение - возможно, это повторный вызов или резервы уже обработаны # Определяем склад (используем склад самовывоза из заказа или первый активный) warehouse = instance.pickup_warehouse or Warehouse.objects.filter(is_active=True).first() @@ -708,6 +709,7 @@ def update_stock_on_writeoff(sender, instance, created, **kwargs): @receiver(post_save, sender=Reservation) +@transaction.atomic def update_stock_on_reservation_change(sender, instance, created, **kwargs): """ Сигнал: При создании или изменении резерва (Reservation) обновляем Stock. @@ -755,6 +757,7 @@ def update_stock_on_reservation_change(sender, instance, created, **kwargs): @receiver(post_delete, sender=Reservation) +@transaction.atomic def update_stock_on_reservation_delete(sender, instance, **kwargs): """ Сигнал: При удалении резерва (Reservation) обновляем Stock.