Перенесено списание товаров со склада на статус 'completed'

Изменения:
- Сигнал 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 <noreply@anthropic.com>
This commit is contained in:
2025-11-30 21:51:28 +03:00
parent e723c26e6c
commit d502a37583

View File

@@ -29,8 +29,8 @@ def reserve_stock_on_order_create(sender, instance, created, **kwargs):
if not created: if not created:
return # Только для новых заказов return # Только для новых заказов
# Определяем склад (пока используем первый активный) # Определяем склад (используем склад самовывоза из заказа или первый активный)
warehouse = Warehouse.objects.filter(is_active=True).first() warehouse = instance.pickup_warehouse or Warehouse.objects.filter(is_active=True).first()
if not warehouse: if not warehouse:
# Если нет активных складов, зарезервировать не можем # Если нет активных складов, зарезервировать не можем
@@ -54,24 +54,24 @@ def reserve_stock_on_order_create(sender, instance, created, **kwargs):
@receiver(post_save, sender=Order) @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 и резервы преобразуются в продажу. создается операция Sale и резервы преобразуются в продажу.
Процесс: Процесс:
1. Проверяем, изменился ли статус на 'in_delivery' 1. Проверяем, изменился ли статус на 'completed'
2. Для каждого товара создаем Sale (автоматический FIFO-список) 2. Для каждого товара создаем Sale (автоматический FIFO-список)
3. Обновляем резерв на 'converted_to_sale' 3. Обновляем резерв на 'converted_to_sale'
""" """
if created: if created:
return # Только для обновлений return # Только для обновлений
if instance.status != 'in_delivery': if instance.status != 'completed':
return # Только для статуса 'in_delivery' 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: if not warehouse:
return return