Проблема: При отмене заказа (completed → cancelled) и последующем возврате в completed витринные комплекты оставались зарезервированными и не уходили со склада. Резервы не конвертировались в продажи, Sale не создавались. Причина: При откате заказа (уход от completed) мы обнуляли reservation.order_item = None для витринных комплектов. Это разрывало связь между резервом и позицией заказа. При повторном переходе в completed сигнал create_sale_on_order_completion искал резервы по фильтру: Reservation.objects.filter(order_item=item, product_kit=kit) Но так как order_item был None, резервы не находились и Sale не создавались. Решение: Разделили семантику полей Reservation: - order_item - принадлежность к позиции заказа (часть жизненного цикла заказа) - cart_lock_expires_at, locked_by_user, cart_session_id - блокировки корзины При откате заказа (completed → другой_статус): - НЕ трогаем order_item - он остаётся привязанным к OrderItem - Очищаем ТОЛЬКО cart lock поля (expires_at, locked_by_user, session_id) - Резервы витринных комплектов: status = reserved При повторном переходе в completed: - create_sale_on_order_completion находит резервы (order_item сохранён!) - Создаёт Sale для каждого компонента - Конвертирует резервы: reserved → converted_to_sale - Витринный экземпляр помечается как проданный через ShowcaseManager Изменения в 3 местах: 1. rollback_sale_on_status_change - откат от completed 2. release_reservations_on_cancellation - переход к cancelled 3. release_stock_on_order_delete - удаление заказа Во всех случаях для витринных комплектов сохраняем order_item, очищаем только cart lock поля. Результат: Теперь витринные комплекты можно продавать/отменять/продавать снова через смену статуса заказа в админке - как в реальной жизни.
65 KiB
65 KiB