Skip to content
ms3PromoCode
Промо-коды для MiniShop3 с гибкими правилами, генерацией по маске и интеграцией в позиции заказа
  1. Компоненты
  2. ms3PromoCode
  3. Интерфейс админки
  4. Вкладка в заказе

Вкладка «Промо-код» в карточке заказа

Дополнительная вкладка, встраивающаяся в окно редактирования заказа 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.