
- MODX 3
- PHP 8.2
- miniShop3


Позволяет менеджеру применить или снять промо-код к существующему заказу MS3.
Магазин → Заказы → конкретный заказ → вкладка «Промо-код».
Регистрируется через window.MS3OrderTabsRegistry в новой Vue-админке MS3. При создании заказа скрыта (hideOnCreate: true), появляется после сохранения.
При каждом открытии (переключение на вкладку, перемонтирование компонентом MS3) вызывается процессор Mgr/Order/GetPromo: возвращает current, order_cost, cart_cost и определяет текущее состояние.
Показано:
При нажатии кнопки вызывается процессор Mgr/Order/ApplyPromo. При успехе состояние меняется на «применён», msOrder.cost обновляется мгновенно. Под карточкой состояния появляется подсказка «Изменения применены. Для отображения новой суммы в остальных вкладках обновите страницу.» со ссылкой на window.location.reload(). Та же подсказка показывается после снятия кода.
Показано:
WELCOME10).ms3_currency_symbol и ms3_currency_position.Mgr/Order/RemovePromo. По умолчанию подтверждение запрашивается через PrimeVue ConfirmDialog; если ConfirmService недоступен — через window.confirm.Если статус заказа входит в ms3promocode.lock_statuses, вкладка показывает уведомление:
Текущий статус заказа не позволяет менять промо-код.
Кнопки «Применить» и «Отменить» отключены.
Если на вкладке Товары этого же заказа добавить, изменить или удалить позицию, скидка пересчитается автоматически:
cart_cost стал меньше min_order_amount) — код автоматически снимается.msOrderLog с операцией ms3promocode_auto_remove).Технический нюанс
Vue-админка MS3 не вызывает MODX-процессоры при изменении позиций (см. issue #207), поэтому ms3PromoCode использует JS-перехватчик в order-tab.js:
window.fetch.XMLHttpRequest.prototype.{open, send, addEventListener} для случаев, если MS3 отправит мутацию через XMLHttpRequest.Оба хука срабатывают на мутациях (POST / PUT / PATCH / DELETE) по URL-паттерну /api/mgr/orders/{id}/products(/|) — путь дополнительно декодируется, потому что MS3 оборачивает запросы в query-параметр route=. После успешной мутации вызывается процессор Mgr/Order/Resync, Vue получает ответ только после завершения пересчёта — на UI всегда актуальные суммы.
После мерджа PR в MS3 этот обходной механизм можно будет убрать.
Применение и снятие кода сразу меняют msOrder.cost: компонент мутирует prop.order.cost и обнуляет cost_formatted. MS3-вкладка «Информация о заказе» на это опирается — показывает новую сумму без перезагрузки. Цены позиций в других вкладках обновляются только после window.location.reload() (ссылка «обновите страницу» в состоянии «код применён»).
Вкладка реализована как Vue-компонент без сборки в assets/components/ms3promocode/js/mgr/order-tab.js: использует Vue, уже загруженный MS3-админкой, и встраивает свои стили в <head>. Это не Vite-сборка.
Так удаётся:
<script src="..."> без модульной системы;