Акции

29 августа 2018, 07:00

В msDiscount есть 2 вида скидок: постоянные акции и одноразовые купоны.

Для акций вы можете указать:

  • Дату начала и дату окончания
  • Группы товаров, на которые скидка действует, или наоборот - не действует
  • Группы пользователей, для которых скидка есть, или нет
  • Каждую скидку можно связать с ресурсов MODX и назначить картинку, если вы заходите вывести их список через xPDO

Алгоритм работы и проверка

  1. Выбираются все активные акции, то есть включенные и с нужной датой работы (если указана)
  2. Затем группы указанного пользователя
  3. И группы товаров
  4. Если активных акций нет — просто проверяем персональные скидки у групп и выбираем максимальную
  5. Если акции есть — проверяем еще их, в цикле
  6. Если акция исключает какую то группу — то она не работает для текущего юзера и товара, то есть - пропускается
  7. Если пользователь и товар входят в требуемые группы — назначаем скидку акции
  8. И сравниваем её с персональной скидкой групп товаров и юзеров. Если какая-то из них выше — она перекрывает акционную
  9. Если в подходящих акциях указана скидка и абсолютная (в валюте магазина), и в процентах — приводим процент к числу от цены товара и сравниваем, что из них больше.
  10. В итоге проходимся по всем скидкам и выбираем максимальную

Для проверки этого алгоритма, в админке компонента предусмотрен отдельный раздел:

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

Вывод скидки пользователя

Следуя логике работы компонента, у покупателя нет скидки, как таковой - она есть только по отношению к определённому товару и времени.

Однако, если пользователь приписан к группе, для которой указана скидка, её можно вывести таким сниппетом:

<?php
// Если не указан &uid=``, то выбираем для текущего юзера
if (empty($uid)) {$uid = $modx->user->id;}

$pdoFetch = $modx->getService('pdoFetch');
$group = $pdoFetch->getObject('msdUserGroup', array('modUser.id' => $uid), array(
    'loadModels' => 'msdiscount',
    'leftJoin' => array(
        'modUserGroupMember' => array('class' => 'modUserGroupMember', 'on' => 'modUserGroupMember.user_group = msdUserGroup.id'),
        'modUser' => array('class' => 'modUser', 'on' => 'modUser.id = modUserGroupMember.member AND modUser.id = '.$uid),
    ),
    'groupby' => 'msdUserGroup.id',
    'sortby' => 'CAST(`msdUserGroup`.`discount` AS DECIMAL(13,3))',
    'sortdir' => 'desc',
    'select' => 'discount',
));

if (isset($group['discount'])) {
    return $group['discount'];
}

Сниппет вернёт максимальную скидку группы пользователя, или пустоту.

Для работы требуется pdoTools, который идёт в комплекте с miniShop2.