diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 3918e8e..185a328 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -71,9 +71,21 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs): if not instance.status or instance.status.code != 'completed': return # Только для статуса 'completed' + # Сначала обновляем резервы (независимо от наличия Sale) + # Это важно для случаев, когда Sale уже созданы, но резервы не обновлены + for item in instance.items.all(): + reservations = Reservation.objects.filter( + order_item=item, + status='reserved' + ) + for res in reservations: + res.status = 'converted_to_sale' + res.converted_at = timezone.now() + res.save() + # Защита от повторного списания: проверяем, не созданы ли уже Sale для этого заказа if Sale.objects.filter(order=instance).exists(): - return # Продажи уже созданы, выходим + return # Продажи уже созданы, резервы обновлены, выходим # Определяем склад (используем склад самовывоза из заказа или первый активный) warehouse = instance.pickup_warehouse or Warehouse.objects.filter(is_active=True).first() @@ -81,7 +93,7 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs): if not warehouse: return - # Для каждого товара в заказе + # Для каждого товара в заказе создаем Sale for item in instance.items.all(): # Определяем товар product = item.product if item.product else item.product_kit @@ -100,17 +112,6 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs): document_number=instance.order_number ) - # Обновляем резерв - reservations = Reservation.objects.filter( - order_item=item, - status='reserved' - ) - - for res in reservations: - res.status = 'converted_to_sale' - res.converted_at = timezone.now() - res.save() - except ValueError as e: # Логируем ошибку, но не прерываем процесс import logging