Исправлено обновление резервов при завершении заказа

Проблема: Резервы не обновлялись в статус 'converted_to_sale' если Sale уже существовали,
что приводило к отображению завершенных заказов на странице активных резервов.

Решение: Переместил обновление резервов ПЕРЕД проверкой существования Sale.
Теперь резервы всегда обновляются при переходе заказа в статус 'completed',
независимо от того, были ли уже созданы записи Sale.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-30 22:36:39 +03:00
parent 6a2e180b29
commit 4e66f03957

View File

@@ -71,9 +71,21 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
if not instance.status or instance.status.code != 'completed': if not instance.status or instance.status.code != 'completed':
return # Только для статуса '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 для этого заказа # Защита от повторного списания: проверяем, не созданы ли уже Sale для этого заказа
if Sale.objects.filter(order=instance).exists(): if Sale.objects.filter(order=instance).exists():
return # Продажи уже созданы, выходим return # Продажи уже созданы, резервы обновлены, выходим
# Определяем склад (используем склад самовывоза из заказа или первый активный) # Определяем склад (используем склад самовывоза из заказа или первый активный)
warehouse = instance.pickup_warehouse or Warehouse.objects.filter(is_active=True).first() 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: if not warehouse:
return return
# Для каждого товара в заказе # Для каждого товара в заказе создаем Sale
for item in instance.items.all(): for item in instance.items.all():
# Определяем товар # Определяем товар
product = item.product if item.product else item.product_kit 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 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: except ValueError as e:
# Логируем ошибку, но не прерываем процесс # Логируем ошибку, но не прерываем процесс
import logging import logging