Files
octopus/myproject/orders/models/order.py
Andrey Smakotin 03794356d0 Добавлен автоматический промежуточный переход cancelled → draft → completed
Проблема:
- Прямой переход cancelled → completed вызывал race condition между сигналами
- Сигналы срабатывали в непредсказуемом порядке
- ShowcaseItem и Reservation не успевали корректно обработаться
- Букеты оставались в неправильном статусе

Решение ПОД КАПОТОМ:
- orders/models/order.py: Order.save() теперь перехватывает прямой переход cancelled → completed
- Автоматически разбивает на два последовательных шага:
  1. cancelled → draft: reserve_stock_on_uncancellation возвращает резервы и букеты в reserved
  2. draft → completed: create_sale_on_order_completion корректно финализирует в sold
- Каждый шаг вызывает super().save() в отдельной транзакции
- Сигналы срабатывают последовательно в правильном порядке

Преимущества:
- Пользователь не замечает промежуточный переход (происходит мгновенно)
- Не нужны сложные проверки порядка срабатывания сигналов
- Гарантируется корректная работа всех существующих сигналов
- Решение элегантное и не требует изменений в сигналах

Flow теперь гарантированно работает:
cancelled → draft → completed:
  Шаг 1: ShowcaseItem available → reserved 
  Шаг 2: ShowcaseItem reserved → sold 
  Шаг 1: Reservation order_item=None → привязаны 
  Шаг 2: Sale создаются, резервы converted_to_sale 
2026-01-05 09:51:00 +03:00

22 KiB