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

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

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

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

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

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

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

Для этого воспользуемся 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
(это в компонент добавил, но не проверяя)

Блог-note: заметки разработчика

Основные функции вывода в шаблонах Битрикс

Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну кучку. Ведь у каждого бывают мо...

Input Type File, множественный с дропзоной и показом превью

Задача: Сделать возможность загрузки файлов в множественный input type="file" c помощью drag&drop и показом превью загру...

Увидеть файл заказов который передаст Битрикс в 1С

Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей, нужно увидеть xml файл с зака...

Работа с HTTP-запросами в Bitrix: Обзор возможностей класса \Bitrix\Main\HttpRequest

Класс \Bitrix\Main\HttpRequest, является наследником класса Request, представляет собой мощный инструмент для работы с д...

AJAX корзина с отправкой количества из раздела каталога

Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При этом, у пользователя должна б...

Вывести артикул в печатную форму бланка заказа

Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе.

Ajax форма обратной связи, реализация в битрикс

Иногда, на сайте требуется создать форму обратной связи, которая будет писать все данные в инфоблок. Способов реализации...

Получить и вывести все цены товара в 1С-Битрикс

Задача: получить и вывести все цены товара по его ID в каталоге 1С-Битрикс (например, в детальной карточке catalog.e...

Сортировка элементов по индексу сортировки значений типа список

Внутри любого компонента есть заранее заложенные поля для сортировки элементов. Можно сортировать элементы в разных напр...