From d502a37583fbf4afeb3af87f7edf007c414a1116 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sun, 30 Nov 2025 21:51:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D1=81=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=BE=D0=B2=20=D1=81?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BA=D0=BB=D0=B0=D0=B4=D0=B0=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=20'completed'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Изменения: - Сигнал create_sale_on_order_shipment переименован в create_sale_on_order_completion - Списание товаров (создание Sale) теперь происходит при статусе 'completed' вместо 'in_delivery' - Исправлен выбор склада: используется Order.pickup_warehouse, если задан - Та же логика применена к резервированию товаров Обоснование для цветочного бизнеса: - Букет может вернуться в магазин (клиента нет дома, перенос доставки) - Товар физически находится в магазине до момента доставки - Резерв показывает что товар занят - этого достаточно для промежуточных статусов - Простота: списываем только когда ТОЧНО продали 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- myproject/inventory/signals.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 46da24e..13ed59c 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -29,8 +29,8 @@ def reserve_stock_on_order_create(sender, instance, created, **kwargs): if not created: return # Только для новых заказов - # Определяем склад (пока используем первый активный) - warehouse = Warehouse.objects.filter(is_active=True).first() + # Определяем склад (используем склад самовывоза из заказа или первый активный) + warehouse = instance.pickup_warehouse or Warehouse.objects.filter(is_active=True).first() if not warehouse: # Если нет активных складов, зарезервировать не можем @@ -54,24 +54,24 @@ def reserve_stock_on_order_create(sender, instance, created, **kwargs): @receiver(post_save, sender=Order) -def create_sale_on_order_shipment(sender, instance, created, **kwargs): +def create_sale_on_order_completion(sender, instance, created, **kwargs): """ - Сигнал: Когда заказ переходит в статус 'in_delivery', + Сигнал: Когда заказ переходит в статус 'completed' (доставлен), создается операция Sale и резервы преобразуются в продажу. Процесс: - 1. Проверяем, изменился ли статус на 'in_delivery' + 1. Проверяем, изменился ли статус на 'completed' 2. Для каждого товара создаем Sale (автоматический FIFO-список) 3. Обновляем резерв на 'converted_to_sale' """ if created: return # Только для обновлений - if instance.status != 'in_delivery': - return # Только для статуса 'in_delivery' + if instance.status != 'completed': + return # Только для статуса 'completed' - # Определяем склад - warehouse = Warehouse.objects.filter(is_active=True).first() + # Определяем склад (используем склад самовывоза из заказа или первый активный) + warehouse = instance.pickup_warehouse or Warehouse.objects.filter(is_active=True).first() if not warehouse: return