Проблема:
- При переходе cancelled → completed срабатывали ОБА сигнала:
1. reserve_stock_on_uncancellation переводил ShowcaseItem: available → reserved
2. create_sale_on_order_completion искал букеты в available, но они уже в reserved
3. Букеты оставались в reserved вместо sold
Решение:
- inventory/signals.py: в reserve_stock_on_uncancellation добавлена проверка current_status.is_positive_end
- Если текущий статус положительный финальный (completed) - ShowcaseItem НЕ трогаем
- Оставляем в available для финализации в create_sale_on_order_completion
- Если текущий статус нейтральный (draft/pending) - переводим available → reserved как раньше
Flow теперь работает корректно:
1. cancelled → draft/pending: ShowcaseItem available → reserved ✅
2. cancelled → completed: ShowcaseItem available → sold ✅ (ИСПРАВЛЕНО!)
- reserve_stock_on_uncancellation пропускает (видит is_positive_end)
- create_sale_on_order_completion финализирует: available → sold
Защита от race condition между двумя сигналами.