Задача: показать, текущему авторизованному, пользователю сумму всех выполненных заказов и процент накопительной скидки- доступной на данный момент.
В модуле маркетинга создана вот такая накопительная скидка:

В целом, задача решается легко: нам нужно получить все заказы текущего пользоватетеля и сопоставить попадание их суммы в диапазон накопительной скидки:
Получить сумму всех выполненных заказов пользователя
Для этого воспользуемся API методом Order::getList класса \Bitrix\Sale\Order, который дастн нам всю информацию обо всех заказах (вообще всех).
С помощью select отбираем, только, стоимость заказа (PRICE), так как вся остальная информация нам не нужна. И с помощью фильтра отбираем заказы текущего пользователя, которые находятся в статусе N (Выполнен)
use Bitrix\Main\Loader;
Loader::includeModule("sale");
Loader::includeModule("catalog");
$bunusPrice = 0;
$dbRes = \Bitrix\Sale\Order::getList([
'select' => [
'PRICE'
],
'filter' => [
'=USER_ID' => $USER->GetID(),
'=STATUS_ID' => 'N',
]
]);
while ($item = $dbRes->fetch()) {
$bunusPrice += (int)$item['PRICE'];
}
echo $bunusPrice;
Таким образом, в переменной $bunusPrice, получаем сумму всех выполненных заказов текущего пользователя
Получить данные о накопительной скидке через API
Теперь, получим все параметры накопительной скидки c ID=1, методом CCatalogDiscountSave::GetList
$arProductDiscounts = CCatalogDiscountSave::GetList(
array("SORT" => "ASC"),
array(
"ACTIVE" => "Y",
'ID' => "1"
),
false,
false,
array("ID", "NAME", "VALUE", "RANGE_FROM")
);
while ($Discounts = $arProductDiscounts->Fetch()) {
$arResult['ALL_DISCOUNTS'][] = $Discounts;
}
Теперь, в массиве $arResult['ALL_DISCOUNTS'] все параметры накопительной скидки, самое главное диапазоны применения скидок, в VALUE и RANGE_FROM.
Выводим текущую скидку и потраченную сумму
Осталось самое простое, найти в массиве $arResult['ALL_DISCOUNTS'] конкретную скидку для переменной $bunusPrice
Просто, прогоняем массив через foreach с индексом и внутри него находим текущий диапазон, смещаясь по индексу.
foreach ($arResult['ALL_DISCOUNTS'] as $k => $discount) {
if (
($arResult['USER_ODREDS_SUM'] >= $discount['RANGE_FROM']) &&
($arResult['USER_ODREDS_SUM'] < $arResult['ALL_DISCOUNTS'][$k - 1]) &&
($arResult['USER_ODREDS_SUM'] < $arResult['ALL_DISCOUNTS'][$k + 1])
) {
echo 'Ваша скидка:' . $discount['VALUE'];
echo 'Вы потратили:' . $bunusPrice;
}
}
Да можно было воспользоваться более простым вариантом for или while для поиска диапазона в массиве. Но, решил оставить больше гибкости для компонента. Если понадобится, допишу в комментарии.
В общем-то и все. Проверка на статус заказа вполне надежна, так как сюда не попадут отмененные заказ. Если нужна сверх надежность (хотя избыточна), можно получить сумму из оплаченных заказов (которые в статусе "Оплачен" и не "Возврат") классом \Bitrix\Sale\PaymentCollection
Компонент: вывод текущей скидки пользователю
На базе написанного выше, сделал набросок-компонент "Бонусная система" - название не очень удачное, но переименовать можете сами. Языковые файлы не создавал, названия параметров прямо в .parameters.php
Скачать архив с компонентомПосле добавления, компонент попадет в "Служебные -> Пользователь -> Бонусная система" (хотя, не плохо переместить его в "магазин")))

Параметров у компонента всего 3:
- Выбор шаблона. Работает как и все, можно копировать
- Выбор скидки. Если у вас их несколько сюда подтянутся все
- Выбор статуса заказа. Не очень нужно, так как компонент имеет смысл только на выполненных заказах. Но, если захотите его расширить, может пригодиться.

Сам шаблон просто, без верстки. Но распечатав массив $arResult можно поиграться с данными и сделать например так (слайдер всех этапов скидки с показом текущей):

Далее можно развивать компонент как угодно, добавлять новые данные в массив и .... в общем фантазировать как угодно