Если резерв заказа не снимается после отмены, товар зависает: покупатель уже не купил его, но система не дает продать позицию другому клиенту. Причина чаще всего в неполной цепочке статусов заказа и склада.

Проверьте, какой именно статус отмены наступил: отмена клиентом, администратором, платежной системой, доставкой или cron-задачей. Для каждого пути должен быть одинаково понятный сценарий снятия резерва.

Что проверить в первую очередь

  • Найдите отмененный заказ, SKU, количество и склад.
  • Проверьте, осталась ли запись резерва в отдельной таблице.
  • Сравните доступный остаток, физический остаток и зарезервированное количество.
  • Проверьте, не был ли заказ частично оплачен или частично отгружен.

Основные причины

Такая проблема редко появляется сама по себе. Обычно ломается связка из нескольких настроек: данные уходят не туда, событие приходит не в том порядке, старая логика остается в кеше или права проверяются не на том уровне. Поэтому сначала нужно отделить симптом от причины.

  • Снятие резерва выполняется только для одного типа отмены.
  • Статус заказа изменился, но складское движение не создано.
  • Cron снятия резервов падает или не обрабатывает старые заказы.
  • Синхронизация с учетной системой возвращает старый резерв.

Пошаговая диагностика

  • Проверьте историю статусов заказа и кто инициировал отмену.
  • Посмотрите журнал складских движений по конкретной позиции.
  • Проверьте транзакцию отмены: не откатилось ли снятие резерва.
  • Сравните ручную отмену, автоотмену и отмену после неуспешной оплаты.
  • Проверьте очередь задач и ошибки синхронизации.

Как исправить

Исправление лучше делать небольшими шагами. Сначала зафиксируйте текущее поведение, затем внесите одну правку, проверьте контрольный сценарий и только после этого переходите к следующему месту. Так проще понять, какая именно правка решила проблему.

  • Сделайте единый обработчик отмены, который всегда пересчитывает резерв.
  • Создавайте складское движение снятия резерва с привязкой к заказу.
  • Учитывайте частично отгруженные и частично оплаченные заказы.
  • Добавьте идемпотентность, чтобы повторная отмена не дала отрицательный резерв.
  • Настройте сверку зависших резервов и автоматический отчет.

Безопасный план решения

  • Сделайте резервную копию файлов, базы или конфигурации, если правка затрагивает рабочий проект.
  • Повторите ошибку на тестовом пользователе, заказе, заявке или окружении, чтобы не работать вслепую.
  • Внесите минимальное изменение и сохраните возможность быстрого отката.
  • Проверьте основной сценарий, крайние случаи и права доступа для разных ролей.
  • После выкладки посмотрите логи и реальные события за первые часы работы.

Как проверить результат

  • После отмены доступный остаток увеличивается на правильное количество.
  • Повтор отмены не меняет остаток второй раз.
  • Частичная отмена снимает резерв только по отмененным позициям.
  • Сверка не показывает зависшие резервы по старым заказам.

Чего не стоит делать

  • Не отключайте проверки, права, платежные статусы или защиту только ради быстрого исчезновения ошибки.
  • Не правьте рабочую базу массовым запросом без выборки, бэкапа и понимания последствий.
  • Не ориентируйтесь только на один успешный тест: проверьте повторный запуск, отмену, ошибку и нестандартные данные.
  • Не оставляйте временные ключи, токены, debug-режим и лишний вывод в публичном доступе.

Как не допустить повторения

  • Разделяйте статусы заказа и складские движения, но связывайте их событиями.
  • Покрывайте тестами все виды отмены заказа.
  • Добавьте мониторинг заказов в отмененном статусе с активным резервом.
  • Не редактируйте остатки вручную без записи движения.

Что подготовить перед исправлением

  • Ссылку на проблемную страницу, кабинет, заказ, интеграцию или API-метод.
  • Точное время ошибки и пример пользователя, товара, платежа или запроса.
  • Скриншот, текст ошибки, лог веб-сервера, приложения или webhook-события.
  • Краткое описание ожидаемого поведения: что должно было произойти вместо ошибки.

Частые вопросы

Почему резерв не снялся только у части заказов?

Скорее всего, они прошли другим путем отмены: через оплату, доставку, cron или ручное действие администратора.

Можно ли удалить старые резервы SQL-запросом?

Можно только после выборки и бэкапа. Массовое удаление без понимания статусов может испортить реальные отгрузки.

Когда стоит обратиться за помощью

Для исправления нужны примеры зависших заказов, структура таблиц остатков и правила резервирования.

Итог

Резерв должен сниматься таким же надежным событием, как и ставиться. Я могу найти зависшие резервы, исправить логику отмены и добавить сверку остатков.