
Акции 
В msDiscount есть 2 вида скидок: постоянные акции и одноразовые купоны.
Для акций вы можете указать:
- Дату начала и дату окончания
 - Группы товаров, на которые скидка действует, или наоборот - не действует
 - Группы пользователей, для которых скидка есть, или нет
 - Каждую скидку можно связать с ресурсов MODX и назначить картинку, если вы заходите вывести их список через xPDO
 
Алгоритм работы и проверка 
- Выбираются все активные акции, то есть включенные и с нужной датой работы (если указана)
 - Затем группы указанного пользователя
 - И группы товаров
 - Если активных акций нет — просто проверяем персональные скидки у групп и выбираем максимальную
 - Если акции есть — проверяем еще их, в цикле
 - Если акция исключает какую то группу — то она не работает для текущего юзера и товара, то есть - пропускается
 - Если пользователь и товар входят в требуемые группы — назначаем скидку акции
 - И сравниваем её с персональной скидкой групп товаров и юзеров. Если какая-то из них выше — она перекрывает акционную
 - Если в подходящих акциях указана скидка и абсолютная (в валюте магазина), и в процентах — приводим процент к числу от цены товара и сравниваем, что из них больше.
 - В итоге проходимся по всем скидкам и выбираем максимальную
 
Для проверки этого алгоритма, в админке компонента предусмотрен отдельный раздел:
Вы можете указать товар, пользователя и проверить скидку на определённую дату.
Вывод скидки пользователя 
Следуя логике работы компонента, у покупателя нет скидки, как таковой - она есть только по отношению к определённому товару и времени.
Однако, если пользователь приписан к группе, для которой указана скидка, её можно вывести таким сниппетом:
php
<?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.

