Проблема: - При изменении количества в OrderItem для заказа в статусе 'completed' - Создавался ДУБЛИКАТ резерва (старый converted_to_sale + новый reserved) - Это приводило к двойному списанию товара со склада (-10 лишних единиц) - Фильтр status='reserved' пропускал существующие резервы в других статусах Сценарий бага: 1. Заказ выполнен: 20 шт → резерв 20 шт (converted_to_sale) 2. Увеличить на 10 шт (до 30) → создаётся НОВЫЙ резерв 30 шт (reserved) 3. Итого: 20 + 30 = 50 шт зарезервировано вместо 30! 4. При переводе обратно в 'completed' → двойное списание (50 вместо 30) Решение: - Убран фильтр status='reserved' из update_reservation_on_item_change - Теперь резерв ищется по order_item независимо от статуса - Обновляется ТОЛЬКО quantity, статус НЕ меняется - Добавлен @transaction.atomic для атомарности операции - Добавлено логирование всех операций с резервами - Используется save(update_fields=['quantity']) для оптимизации Безопасность решения: - Резервы разных заказов НЕ конфликтуют (разные order_item) - Один товар в разных заказах = разные OrderItem = разные Reservation - Каждый OrderItem имеет уникальный резерв - Дубликаты больше НЕ создаются Изменённые файлы: - inventory/signals.py (функция update_reservation_on_item_change) - FIX_RESERVATION_DUPLICATE_BUG.md (полная документация бага и решения) Покрытие всех сценариев: ✅ Создание заказа с товарами ✅ Добавление товара при редактировании ✅ Изменение количества (черновик) ✅ Изменение количества (выполнен) - ИСПРАВЛЕНО ✅ Повторное сохранение заказа КРИТИЧНО: Это исправление влияет на учёт товара и требует тестирования!
44 KiB
44 KiB