Меню

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

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

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

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

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

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

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

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

Стоимость и сроки разработки сайтов и приложений

Окончательная стоимость и сроки разработки сайта формируются после обсуждения деталей на этапе заказа. Как правило, они редко выходят за обозначенные ниже рамки.

Интернет магазин: разработка с нуля от 350 000 руб.
от 4-х недель

Cоздание интернет-магазина на 1С-Битрикс. Разработка с нуля, оптимизация кода под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Интернет-магазин на готовом решении от 100 000 руб.
от 7-ми дней

Готовое решение — вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Запускается на одном из 200-та (на ваш выбор) готовых решений.

Мобильное приложение от 400 000 руб.
от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.