Skip to content
ms3FirstTimeBuyerDiscount
Скидка на первый заказ для MiniShop3 — автоматическое применение при 0 оплаченных заказов (процент или фикс)
  1. Компоненты
  2. ms3FirstTimeBuyerDiscount
  3. API и события

API и события

Сервис FtbDiscountService

Класс: Ms3FirstTimeBuyerDiscount\Services\FtbDiscountService
Ключ в контейнере: ms3ftb_discount

Конструктор

php
public function __construct(modX $modx)

Публичные методы

isEligible

Проверяет, можно ли применить скидку: включена настройка и 0 оплаченных заказов.

  • Для авторизованного пользователя проверка выполняется по user_id.
  • Для гостя (user_id = 0) проверка выполняется по email или phone из draft->getOne('Address').
php
public function isEligible(int $userId, ?object $draft = null): bool
ПараметрТипОписание
userIdintID пользователя
draftobject|nullОбъект черновика заказа (опционально), используется для гостей

Возврат: true, если скидку можно применить, иначе false.


getPaidOrdersCount

Количество оплаченных заказов пользователя в статусах из настройки MiniShop3 ms3_status_for_stat.

php
public function getPaidOrdersCount(int $userId): int
ПараметрТипОписание
userIdintID пользователя

Возврат: число заказов (0 и больше).


getGuestContactFromDraft

Извлекает контакты гостя (email/phone) из draft.

php
public function getGuestContactFromDraft(?object $draft): array
ПараметрТипОписание
draftobject|nullЧерновик заказа (ожидается связь Address)

Возврат: массив вида ['email' => string, 'phone' => string].


getPaidOrdersCountByContact

Количество оплаченных заказов по контактам гостя (совпадение по Address.email или Address.phone).

php
public function getPaidOrdersCountByContact(string $email, string $phone): int
ПараметрТипОписание
emailstringEmail гостя
phonestringТелефон гостя

Возврат: число заказов (0 и больше).


calculateDiscount

Вычисляет стоимость после скидки (процент или фиксированная сумма).

php
public function calculateDiscount(float $cost, string $type, float $value): float
ПараметрТипОписание
costfloatИсходная сумма
typestringpercent или fixed (сравнение без учёта регистра)
valuefloatПроцент (0–100) или фиксированная сумма

Возврат: новая сумма (fixed: max(0, cost - max(0, value)); percent: диапазон 0–100%).


apply

Полный цикл: проверка права → ftbOnBeforeApply → расчёт → ftbOnApply. Используется плагином из msOnGetCartCost.

php
public function apply(array $scriptProperties): ?float

Вход (scriptProperties): массив из события msOnGetCartCost:

КлючТипОписание
costfloatТекущая стоимость корзины
cartmixedДанные корзины (зависит от MS3)
draftobject|nullЧерновик заказа (если есть)

Возврат: новая стоимость (float) при успешном применении скидки, иначе null.


События MODX

ftbOnBeforeApply

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

Параметры:

КлючТипОписание
user_idintID пользователя
costfloatТекущая стоимость
draftobject|nullЧерновик заказа
cartmixedКорзина
settingsarrayТекущие настройки (ftb_enabled, ftb_discount_type, ftb_discount_value)

Возвращаемые значения (returnedValues):

КлючТипОписание
applyboolfalse — отменить применение скидки
costfloatПодменить сумму, к которой применяется скидка

Если apply === false, сервис возвращает null. Если задан cost, он используется вместо исходного cost для расчёта.


ftbOnApply

Уведомление после успешного применения скидки (для логирования, аналитики).

Параметры:

КлючТипОписание
user_idintID пользователя
cost_beforefloatСтоимость до скидки
cost_afterfloatСтоимость после скидки
discount_amountfloatРазмер скидки
draftobject|nullЧерновик заказа

Системные настройки

Префикс в конфиге: ms3firsttimebuyerdiscount_ (например, ms3firsttimebuyerdiscount_ftb_enabled).

КлючxtypeПо умолчаниюОписание
ftb_enabledcombo-booleantrueВключить скидку для первых покупок
ftb_discount_typetextfieldpercentТип: percent (процент) или fixed (фиксированная сумма). Ввод вручную; сравнение без учёта регистра.
ftb_discount_valuenumber10Значение: процент (0–100) или сумма в валюте
ftb_allow_combinationcombo-booleantrueЗарезервировано на будущее (совмещение с другими скидками)

Получение в коде: $modx->getOption('ms3firsttimebuyerdiscount_ftb_enabled', null, true).