Если резерв заказа не снимается после отмены, товар зависает: покупатель уже не купил его, но система не дает продать позицию другому клиенту. Причина чаще всего в неполной цепочке статусов заказа и склада.
Проверьте, какой именно статус отмены наступил: отмена клиентом, администратором, платежной системой, доставкой или cron-задачей. Для каждого пути должен быть одинаково понятный сценарий снятия резерва.
Что проверить в первую очередь
- Найдите отмененный заказ, SKU, количество и склад.
- Проверьте, осталась ли запись резерва в отдельной таблице.
- Сравните доступный остаток, физический остаток и зарезервированное количество.
- Проверьте, не был ли заказ частично оплачен или частично отгружен.
Основные причины
Такая проблема редко появляется сама по себе. Обычно ломается связка из нескольких настроек: данные уходят не туда, событие приходит не в том порядке, старая логика остается в кеше или права проверяются не на том уровне. Поэтому сначала нужно отделить симптом от причины.
- Снятие резерва выполняется только для одного типа отмены.
- Статус заказа изменился, но складское движение не создано.
- Cron снятия резервов падает или не обрабатывает старые заказы.
- Синхронизация с учетной системой возвращает старый резерв.
Пошаговая диагностика
- Проверьте историю статусов заказа и кто инициировал отмену.
- Посмотрите журнал складских движений по конкретной позиции.
- Проверьте транзакцию отмены: не откатилось ли снятие резерва.
- Сравните ручную отмену, автоотмену и отмену после неуспешной оплаты.
- Проверьте очередь задач и ошибки синхронизации.
Как исправить
Исправление лучше делать небольшими шагами. Сначала зафиксируйте текущее поведение, затем внесите одну правку, проверьте контрольный сценарий и только после этого переходите к следующему месту. Так проще понять, какая именно правка решила проблему.
- Сделайте единый обработчик отмены, который всегда пересчитывает резерв.
- Создавайте складское движение снятия резерва с привязкой к заказу.
- Учитывайте частично отгруженные и частично оплаченные заказы.
- Добавьте идемпотентность, чтобы повторная отмена не дала отрицательный резерв.
- Настройте сверку зависших резервов и автоматический отчет.
Безопасный план решения
- Сделайте резервную копию файлов, базы или конфигурации, если правка затрагивает рабочий проект.
- Повторите ошибку на тестовом пользователе, заказе, заявке или окружении, чтобы не работать вслепую.
- Внесите минимальное изменение и сохраните возможность быстрого отката.
- Проверьте основной сценарий, крайние случаи и права доступа для разных ролей.
- После выкладки посмотрите логи и реальные события за первые часы работы.
Как проверить результат
- После отмены доступный остаток увеличивается на правильное количество.
- Повтор отмены не меняет остаток второй раз.
- Частичная отмена снимает резерв только по отмененным позициям.
- Сверка не показывает зависшие резервы по старым заказам.
Чего не стоит делать
- Не отключайте проверки, права, платежные статусы или защиту только ради быстрого исчезновения ошибки.
- Не правьте рабочую базу массовым запросом без выборки, бэкапа и понимания последствий.
- Не ориентируйтесь только на один успешный тест: проверьте повторный запуск, отмену, ошибку и нестандартные данные.
- Не оставляйте временные ключи, токены, debug-режим и лишний вывод в публичном доступе.
Как не допустить повторения
- Разделяйте статусы заказа и складские движения, но связывайте их событиями.
- Покрывайте тестами все виды отмены заказа.
- Добавьте мониторинг заказов в отмененном статусе с активным резервом.
- Не редактируйте остатки вручную без записи движения.
Что подготовить перед исправлением
- Ссылку на проблемную страницу, кабинет, заказ, интеграцию или API-метод.
- Точное время ошибки и пример пользователя, товара, платежа или запроса.
- Скриншот, текст ошибки, лог веб-сервера, приложения или webhook-события.
- Краткое описание ожидаемого поведения: что должно было произойти вместо ошибки.
Частые вопросы
Почему резерв не снялся только у части заказов?
Скорее всего, они прошли другим путем отмены: через оплату, доставку, cron или ручное действие администратора.
Можно ли удалить старые резервы SQL-запросом?
Можно только после выборки и бэкапа. Массовое удаление без понимания статусов может испортить реальные отгрузки.
Когда стоит обратиться за помощью
Для исправления нужны примеры зависших заказов, структура таблиц остатков и правила резервирования.
Итог
Резерв должен сниматься таким же надежным событием, как и ставиться. Я могу найти зависшие резервы, исправить логику отмены и добавить сверку остатков.