Files
octopus/myproject/inventory/signals.py
Andrey Smakotin 503a00de74 Улучшена логика флага is_returned и добавлен запрет повторного completed для возвращённых заказов
Проблема:
1. Флаг is_returned управлялся в разных местах непоследовательно
2. При цепочке completed → cancelled → completed флаг оставался True
3. Можно было установить положительный статус для заказа с is_returned=True
   без резервов (товар уже продан в другом заказе)

Решение:

1. ЕДИНАЯ ФУНКЦИЯ update_is_returned_flag():
   - Флаг основан на РЕАЛЬНОМ состоянии заказа (наличие Sale)
   - Логика: есть Sale → is_returned=False
   - Нет Sale + был когда-то в положительном финальном статусе → is_returned=True
   - Нет Sale + никогда не был в положительном статусе → is_returned=False

2. ВЫЗОВ update_is_returned_flag() в ключевых точках:
   - После создания Sale (create_sale_on_order_completion)
   - После отката Sale (rollback_sale_on_status_change)
   - После освобождения резервов (release_reservations_on_cancellation)

3. ВАЛИДАЦИЯ в create_sale_on_order_completion:
   - Запрещаем переход в положительный финальный статус (is_positive_end=True)
     для заказов с is_returned=True, у которых нет резервов
   - Даём понятное сообщение: резервы отсутствуют, товары могли быть проданы
     в другом заказе, оставьте статус отрицательного исхода или создайте новый заказ

4. АВТОМАТИЧЕСКИЙ СБРОС is_returned:
   - При законном переходе в положительный статус с резервами флаг сбрасывается
   - Это позволяет исправить ошибочную отмену: cancelled → completed работает,
     если резервы на месте (товар не ушёл в другой заказ)

5. УДАЛЕНА ДУБЛИРУЮЩАЯ ЛОГИКА:
   - Убрали ручное управление is_returned в rollback_sale_on_status_change
   - Убрали ручное управление is_returned в release_reservations_on_cancellation
   - Теперь один источник истины через update_is_returned_flag()

Результат:
- Флаг is_returned всегда соответствует реальности (наличию Sale)
- Невозможно установить completed для возвращённого заказа без резервов
- Защита от двойного списания при переиспользовании витринных комплектов
- Понятные сообщения об ошибках для пользователя
- Предсказуемое поведение при любых комбинациях смены статусов
2025-12-11 23:54:48 +03:00

68 KiB