Вкладка «Промо-код» в карточке заказа
Дополнительная вкладка, встраивающаяся в окно редактирования заказа MS3. Позволяет менеджеру применить или снять промо-код к существующему заказу.
Где находится
Магазин → Заказы → конкретный заказ → вкладка «Промо-код».
Вкладка регистрируется через window.MS3OrderTabsRegistry и работает в новой Vue-админке MS3.
Состояния
Код не применён
Показано:
- Текущая сумма заказа.
- Сообщение «К заказу не применён промо-код».
- Поле ввода кода + кнопка «Применить».
При вводе кода и нажатии кнопки — вызывается процессор Mgr/Order/ApplyPromo. При успешном применении состояние меняется на «применён», msOrder.cost обновляется автоматически.
Код применён
Показано:
- Текущая сумма заказа (со скидкой).
- Информация о применённом коде:
- Код — сам код (например,
SALE10). - Скидка — сумма скидки в рублях.
- Применён — дата и время применения.
- Код — сам код (например,
- Кнопка Отменить (с подтверждением через PrimeVue ConfirmDialog).
Заблокировано по статусу
Если статус заказа входит в 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>.
Это решение позволяет:
- Не дублировать в пакете тяжёлый bundler.
- Подключаться через
<script src="...">без модульной системы. - Совместимо с любой версией Vue, которую использует MS3.
