Skip to content
ms3FirstTimeBuyerDiscount
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
  • Для гостей: проверка по email/phone из draft -> Address
  • При наличии draft текущий заказ исключается из подсчёта
php
public function isEligible(int $userId, ?object $draft = null): bool
ПараметрТипОписание
userIdintID пользователя
draftobject|nullЧерновик заказа (опционально)

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


getPaidOrdersCount

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

php
public function getPaidOrdersCount(int $userId, int $excludeOrderId = 0): int
ПараметрТипОписание
userIdintID пользователя
excludeOrderIdintID заказа, который нужно исключить из подсчёта (0 — не исключать)

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


getGuestContactFromDraft

Извлекает контакты гостя из draft -> Address и нормализует значения.

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

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


getPaidOrdersCountByContact

Количество оплаченных заказов гостя по email/phone.

php
public function getPaidOrdersCountByContact(string $email, string $phone, int $excludeOrderId = 0): int
ПараметрТипОписание
emailstringEmail гостя
phonestringТелефон гостя
excludeOrderIdintID заказа, который нужно исключить из подсчёта (0 — не исключать)

Сравнение:

  • email — в lower-case
  • phone — по нормализованным цифрам (для телефона используется tail-10 сопоставление через LIKE)

Возврат: число заказов (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: c ограничением 0–100%).


apply

Полный цикл: проверка права → ftbOnBeforeApply → расчёт → ftbOnApply.

php
public function apply(array $scriptProperties): ?float
КлючТипОписание
costfloatТекущая стоимость корзины
cartmixedОбъект/данные корзины MiniShop3
draftobject|nullЧерновик заказа

Дополнительно учитывается настройка ftb_allow_combination:

  • если false и в корзине уже есть скидка (total_discount > 0), FTB-скидка не применяется

Возврат: новая стоимость (float) или null.


События MODX

ftbOnBeforeApply

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

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

returnedValues:

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

ftbOnApply

Вызывается после успешного применения скидки.

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

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

Префикс: ms3firsttimebuyerdiscount_.

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

Связанные настройки MiniShop3:

  • ms3_status_for_stat — статусы оплаченных заказов
  • ms3_status_new — добавляется в список учитываемых статусов как маркер первого заказа