Skip to content

fix: сверять резерв склада при правке состава заказа - #936

Merged
biz87 merged 2 commits into
betafrom
fix/issue-829-order-inventory-reconcile
Oct 19, 2026
Merged

biz87 merged 2 commits into
betafrom
fix/issue-829-order-inventory-reconcile

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Описание

При включённом учёте остатков правка состава заказа в менеджере (добавление, изменение количества, удаление строки) теперь сверяет журнал резерва с итоговым количеством по каждому товару. Оплата и отмена списывают уже отредактированное количество, а не то, что было в заказе до правки.

Если остатка не хватает, строка не сохраняется. Право msorder_inventory_override позволяет провести правку в минус. В шаблоне политики менеджера право есть, в политике по умолчанию оно не выдано. Пользователь с sudo получает его через hasPermission MODX. Остальным его нужно выдать явно.

Если подменённый складской сервис не реализует AdjustableInventoryInterface, правка заказа, который уже держит остаток, отклоняется.

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #829

Как это было протестировано?

Локально, без MySQL:

  • ./vendor/bin/phpunit tests/Unit/Services/Inventory/ — OK (40 tests, 95 assertions), PHP 8.5.8
  • сценарии увеличения, уменьшения, добавления и удаления строки, двух вариантов одного товара, резерва и списания, черновика и отмены
  • нехватка без force не меняет остаток; force уводит остаток в минус
  • сбой второй строки и исключение хранилища откатывают уже применённую первую
  • событие после записи не отменяет уже сохранённый остаток; компенсация неудачного сохранения идёт без событий плагинов
  • php tests/PoliciesPackagingTest.php: право есть в шаблоне и резолвере и отсутствует в miniShopManagerPolicy
  • npx eslint src/composables/useOrderProducts.js

Полные composer ci:php и PHPStan для этого diff не запускались.

  • Ручное тестирование
  • Автоматические тесты (composer ci:php / composer test, npm run lint:ci, composer stan / GitHub Actions CI)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка fix/issue-829-order-inventory-reconcile от beta
  • MODX: без установки, unit-тесты на заглушке
  • PHP: 8.5.8

Скриншоты (если применимо)

До После

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint проходит без ошибок (npm run lint:ci для Vue)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

После ревью: событие msOnInventoryAdjust после коммита больше не выглядит как неудачная правка. Дельта считается по строке журнала, залоченной в транзакции. Откат сверки и компенсация несохранённой строки не отменяются плагином и срабатывают на любом исключении хранилища.

Уже разошедшиеся заказы прошлых версий эта правка не пересчитывает.

Правка строк заказа меняла состав, но не журнал резерва, поэтому оплата и отмена списывали старое количество.
@Ibochkarev
Ibochkarev requested a review from biz87 October 18, 2026 18:13
Алиас ReservationRow виден только в интерфейсе, а isset() по всегда заданному modx PHPStan считает лишним.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Складской учёт: правка состава заказа в админке не синхронизирует резерв

2 participants