Проблема:
- При переходе cancelled → completed резервы витринных букетов отвязаны от order_item (order_item=None)
- В create_sale_on_order_completion поиск резервов по order_item не находит их
- Sale не создаются → букет освобождается вместо продажи
Решение:
- inventory/signals.py: в create_sale_on_order_completion добавлена fallback-логика для витринных комплектов
- Если резервы не найдены по order_item=item, проверяем: витринный комплект?
- Для витринных: ищем резервы через product_kit + showcase__isnull=False + status='reserved'
- Найденные резервы привязываем к order_item перед созданием Sale
- Затем создаются Sale и ShowcaseItem корректно переходит в sold
Flow теперь работает полностью:
1. cancelled: ShowcaseItem → available, Reservation order_item=None
2. cancelled → completed:
- create_sale_on_order_completion находит резервы через product_kit ✅
- Привязывает их к order_item ✅
- Создаёт Sale для компонентов ✅
- Финализирует ShowcaseItem: available → sold ✅
Гарантирует создание Sale даже если порядок срабатывания сигналов не предсказуем.