Исправлено обновление резервов при завершении заказа
Проблема: Резервы не обновлялись в статус '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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user