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

Просмотров: 3951

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

В модуле маркетинга создана вот такая накопительная скидка:

Накопительная скидка

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

Получить сумму всех выполненных заказов пользователя

Для этого воспользуемся 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 можно поиграться с данными и сделать например так (слайдер всех этапов скидки с показом текущей):

Компонент накопительная скидка битрикс

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

Максим 20.07.2023
Спасибо, то что нужно! Не работает на php8, подскажете что поправить?
Михаил Базаров 20.07.2023
Цитата
Максим написал:
Спасибо, то что нужно! Не работает на php8, подскажете что поправить?

Какую ошибку выдает?
Максим 22.07.2023
При вызове .parameters.php выдает ошибку в двух строчках: Argument #1 ($value) must be of type Countable|array, null given (0)

$arDiscountsId = array_combine($arDiscountId, $arDiscountName);
$arOrdersStatus = array_combine($arOrdersStatusId, $arOrdersStatusName);

Их нужно обернуть условием if - я прописал проверку этих $ar...., и вызов параметров заработал. Но теперь невозможно выбрать ID скидки в вашем компоненте. Просто неактивно. Вывод общей суммы заказов получилось сделать.
Максим 23.07.2023
Вместо CCatalogDiscount::GetList получилось вывести список скидок с помощью CSaleDiscount::GetList
Михаил Базаров 23.07.2023
Чуть попозже разберусь что там не так, сам давно этим компонентом не пользовался. Видимо, что то изменилось в битриксе.
Плюс да, если php 8+ надо доп. проверки массива делать на не null
(это в компонент добавил, но не проверяя)