
- MODX 3
- PHP 8.2
- miniShop3


Дополнительная вкладка, встраивающаяся в окно редактирования заказа MS3. Позволяет менеджеру применить или снять промо-код к существующему заказу.
Магазин → Заказы → конкретный заказ → вкладка «Промо-код».
Вкладка регистрируется через window.MS3OrderTabsRegistry и работает в новой Vue-админке MS3.
Показано:
При вводе кода и нажатии кнопки — вызывается процессор Mgr/Order/ApplyPromo. При успешном применении состояние меняется на «применён», msOrder.cost обновляется автоматически.
Показано:
SALE10).Если статус заказа входит в ms3promocode.lock_statuses, вкладка показывает уведомление:
Текущий статус заказа не позволяет менять промо-код.
Кнопки «Применить» и «Отменить» отключены.
Если менеджер на вкладке Товары этого же заказа добавит, изменит или удалит позицию, скидка автоматически пересчитается:
cart_cost стал меньше min_order_amount) — код автоматически снимается.msOrderLog с операцией ms3promocode_auto_remove).Технический нюанс
Vue-админка MS3 не вызывает MODX-процессоры при изменении позиций (см. issue #207), поэтому ms3PromoCode использует JS-перехватчик fetch в order-tab.js: после каждой успешной мутации позиций вызывается процессор Mgr/Order/Resync. Vue получает ответ только после завершения пересчёта — на UI всегда актуальные суммы.
После мерджа PR в MS3 этот обходной механизм можно будет убрать.
При изменении order.cost через применение/снятие кода компонент мутирует prop.order.cost напрямую и обнуляет cost_formatted. Вкладка «Информация о заказе» читает order.cost_formatted || formatPrice(order.cost) — поэтому новая сумма видна без перезагрузки страницы.
Вкладка реализована как plain-JS Vue-компонент в assets/components/ms3promocode/js/mgr/order-tab.js. Это не Vite-сборка — компонент использует runtime-Vue, уже загруженный MS3-админкой, и инлайнит свои стили в <head>.
Это решение позволяет:
<script src="..."> без модульной системы.