Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Бонус за выполненный заказ на внутренний счет пользователя

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

Задача: после того как заказ, в интернет-магазине, перешел в статус "Выполнен" начислить пользователю 5% от стоимости заказа, на накопительный счет - с которого можно оплатить будущие заказы.

Для этого нам нужно событие смены статуса заказа OnSaleStatusOrder или (вариант в новом ядре) OnSaleStatusOrderChange и метод CSaleUserAccount::UpdateAccount изменяющий сумму на счете пользователя

Добавим следующий код в init.php, пояснения ниже

use Bitrix\Main\Loader;
AddEventHandler("sale", "OnSaleStatusOrder", "OrderComplete");
function OrderComplete($orderID, &$arFields)
{
    Loader::includeModule("sale");
    if ($arFields == 'F') {
        $order = \Bitrix\Sale\Order::load($orderID);
        $orderUser = $order->getUserId();
        $orderSumm = $order->getPrice();
        $bonusPercent = orderSumm * 5 / 100;
        CSaleUserAccount::UpdateAccount(
            $orderUser,
            $bonusPercent,
            "RUB",
            false,
            $orderID,
            false
        );
    }
}
  • Подключили модуль sale Loader::includeModule("sale");;
  • Проверили, что статус заказ перешел в выполнен if ($arFields == 'F') ;
  • Зная id заказа, из переменной $orderID, получили ID пользователя $orderUser = $order->getUserId(); и сумму заказа $orderSumm = $order->getPrice();;
  • Высчитали 5% из стоимости заказа $bonusPercent;
  • Методом CSaleUserAccount::UpdateAccount начислил пользователю сумму бонуса, основанием сделали ID заказа;

В личном кабинете можно вывести историю начислений и списаний, например так:

Бонус пользователям на заказ

Начислить процент без учета стоимости доставки и без учета оплаты с накопительного счета

Расширяем задачу: нужно начислять 10% но при этом учитывать только стоимость товаров, без учета стоимости доставки. Дополнительно, не учитываем полную или частичную оплату с внутреннего счета. То есть: начисляем бонус, только на реально потраченные деньги.

use Bitrix\Main\Loader;
AddEventHandler("sale", "OnSaleStatusOrder", "OrderComplete");
function OrderComplete($orderID, &$arFields)
{
    Loader::includeModule("sale");
    if ($arFields == 'F') { 
        $order = \Bitrix\Sale\Order::load($orderID);
        $orderUser = $order->getUserId();
        $orderSumm = $order->getPrice();
  $orderDeliveryPrice = $order->getDeliveryPrice();
        $orderPayments = \Bitrix\Sale\PaymentCollection::getList([
            'select' => ['SUM'],
            'filter' => [
                '=ORDER_ID' => $orderID,
                '=PAY_SYSTEM_ID' => 13,
                '=PAID' => 'Y']
        ]);
        while ($orderPayment = $orderPayments->fetch()) {
            $orderPayid = $orderPayment['SUM'];
        }
        // Общая сумма минус доставка и минус накопительный счет
        if (empty($orderPayid)) {
            $realOrderPrice = $orderSumm - $orderDeliveryPrice;
        } else {
            $realOrderPrice = $orderSumm - $orderDeliveryPrice - $orderPayId;
        }
  $bonusPercent = $realOrderPrice * 10 / 100;
        CSaleUserAccount::UpdateAccount(
                    $orderUser,
                    $bonusPercent,
                    "RUB",
                    false,
                    $orderID,
                    false
                );
            }
        }
    }
}

Дополнительно, к коду из первого варианта добавили:

  • Получили стоимость доставки $orderDeliveryPrice = $order->getDeliveryPrice();;
  • Получили коллекцию оплат для заказа $orderPayments = \Bitrix\Sale\PaymentCollection::getList, отфильтровав только оплату с внутреннего счета с 'select' => ['SUM'], - так как нам нужн только сумма оплаты;
  • В переменной $realOrderPrice высчитали сумму заказа за минусом стоимости доставки и оплаты с накопительного счета;

Усложнение. Процент для начисления в зависимости от суммы заказа

Расширяем задачу, дальше: начислять разный процент, на внутренний счет, в зависимости от стоимости заказа.

Создаем и заполняем HL инфоблок с пользовательскими полями:

  • 'UF_BONUS_FROM' - Стоимость заказа от
  • UF_BONUS_TO' - Стоимость заказа до
  • UF_BONUS_PRICE' - Величина процента начисления

После наполнения:

Бонус пользователям на заказ

И расширяем код из примеров выше:

use Bitrix\Main\Loader;
use Bitrix\Highloadblock as HL;
use Bitrix\Main\Entity;
AddEventHandler("sale", "OnSaleStatusOrder", "OrderComplete");
function OrderComplete($orderID, &$arFields)
{
    Loader::includeModule("sale");
    Loader::includeModule("highloadblock");
    if ($arFields == 'F') { 
        $order = \Bitrix\Sale\Order::load($orderID); // 123 - ID заказа
        $orderUser = $order->getUserId();
        $orderSumm = $order->getPrice();
        $orderDeliveryPrice = $order->getDeliveryPrice();
        $orderPayments = \Bitrix\Sale\PaymentCollection::getList([
            'select' => ['SUM'],
            'filter' => [
                '=ORDER_ID' => $orderID,
                '=PAY_SYSTEM_ID' => 13,
                '=PAID' => 'Y']
        ]);
        while ($orderPayment = $orderPayments->fetch()) {
            $orderPayid = $orderPayment['SUM'];
        }
        if (empty($orderPayid)) {
            $orderPriceBonus = $orderSumm - $orderDeliveryPrice;
        } else {
            $orderPriceBonus = $orderSumm - $orderDeliveryPrice - $orderPayid;
        }
        $hlblockDatas = HL\HighloadBlockTable::getById(5)->fetch();
        $entityHlBonus = HL\HighloadBlockTable::compileEntity($hlblockDatas);
        $entityDataClassBonus = $entityHlBonus->getDataClass();
        $bonusData = $entityDataClassBonus::getList(array(
            'select' => array('UF_BONUS_FROM', 'UF_BONUS_TO', 'UF_BONUS_PRICE'),
        ));
        while ($arBonusData = $bonusData->Fetch()) {
            $priceFrom = $arBonusData['UF_BONUS_FROM'];
            $priceTo = $arBonusData['UF_BONUS_TO'];
            if (($orderPriceBonus > $priceFrom) && ($orderPriceBonus < $priceTo)) {
                $priceBonus = $arBonusData['UF_BONUS_PRICE'];
                $summToAddBonus = $orderPriceBonus * $priceBonus / 100;
                CSaleUserAccount::UpdateAccount(
                    $orderUser,
                    $summToAddBonus,
                    "RUB",
                    false,
                    $orderID,
                    false
                );
            }
        }
    }
}
  • Подключили модуль Hl инфоблоков Loader::includeModule("highloadblock");
  • Минимальное и максимальное значения, из HLблока загоняем в переменные $priceFrom и $priceTo
  • Получили значения пользовательских полей инфоблока и отсекли диапазаон подпадающий под условия начисления
    if (($orderPriceBonus > $priceFrom) && ($orderPriceBonus < $priceTo))
Ksyusha Darovykh 26.02.2021
Здравствуйте, можете дать наводку/пример, как Вы вывели историю начислений и списаний? Пыталась написать это в комментариях к теме, не получилось
Михаил Базаров 26.02.2021
Цитата
Ksyusha Darovykh написал:
Здравствуйте, можете дать наводку/пример, как Вы вывели историю начислений и списаний? Пыталась написать это в комментариях к теме, не получилось

История уже есть в компоненте sale.personal.account (Счета текущего пользователя)

Распечатайте массив $arResult этого компонента и увидите все данные, которыми можно манипулировать

Недостающие данные можно получить методом GetByUserID
Код
Метод возвращает ассоциативный массив параметров счета с валютой currency для пользователя с кодом userID. Нестатический метод.
Ольга Стафиевская 11.04.2021
Скажите, почему строка
Код
use Bitrix\Main\Loader;
мне выдает ошибку
Parse error: syntax error, unexpected 'use' (T_USE) in /var/www/u0972962/data/www/noutland.ru/mini1c/web/reports/index.php on line 234?
Михаил Базаров 11.04.2021
Цитата
Ольга Стафиевская пишет:
Скажите, почему строка  [CODE] use Bitrix\Main\Loader; [/CODE] мне выдает ошибку
Parse error: syntax error, unexpected 'use' (T_USE) in /var/www/u0972962/data/www/noutland.ru/mini1c/web/reports/index.php on line 234?
Это у вас, что за путь такой?
Код
noutland.ru/mini1c/web/reports/index.php
Можете привести весь код этого файла?  
Guest 30.07.2021
Здравствуйте. Вставляю ваш код, но сайт становится не доступным. Можете подсказать? спасибо большое!
Михаил Базаров 30.07.2021
Цитата
Guest пишет:
Здравствуйте. Вставляю ваш код, но сайт становится не доступным. Можете подсказать? спасибо большое!
Включите вывод ошибок и скопируйте ее сюда
Алексей 30.07.2021
Цитата
Михаил Базаров пишет:
[QUOTE]Guest пишет:
Здравствуйте. Вставляю ваш код, но сайт становится не доступным. Можете подсказать? спасибо большое![/QUOTE] Включите вывод ошибок и скопируйте ее сюда
[ParseError] syntax error, unexpected '}', expecting end of file (0)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/local/php_interface/init.php:61
#0: require_once
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/bitrix/modules/main/include/prolog_before.php:14
#1: require_once(string)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/bitrix/modules/main/include/prolog.php:10
#2: require_once(string)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/bitrix/header.php:1
#3: require(string)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/refer/tech.php:2
Михаил Базаров 31.07.2021
Цитата
expecting end of file (0)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/local/php_interface/init.php:61
#0: require_once
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/bitrix/modules/main/include/prolog_before.php:14
#1: require_once(string)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/bitrix/modules/main/include/prolog.php:10
#2: require_once(string)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/bitrix/header.php:1
#3: require(string)
/home/b/bazaklfm/bazaklfm.beget.tech/public_html/refer/tech.php:2
В своем примере ошибки при беглом  просмотре не вижу, но проверю попозже.
Проверьте 61-ую строчку, не хватает или лишняя скобка }
Guest 02.08.2021
Вы были правы. Убрал две лишние скобки и сайт с вашим кодом заработал. Но есть нюанс - на ЛС не зачисляются деньги после статуса выполнен.
Алексей 03.08.2021
А можете подробнее подсказать как реализовать историю sale.personal.account?

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Автогенерация символьных кодов разделов и элементов Битрикс Просмотров: 14950 Иногда нужно создать символьные коды для разделов и элементов. Например: если сайт создан ... Самодельная форма добавления элемента на API Битрикс Просмотров: 42448 Компонент iblock.element.add.form написан таким образом, что вы не сможете (не попотев изр... Сортировать товары по названию, цене и дате поступления в каталоге Би... Просмотров: 39343 Достаточно часто заказчик просит вывести сортировку по цене, новым поступлениям и названию... Хостинг панель BrainyCp: оптимизация под 1С-битрикс Просмотров: 7503 В этой видео-заметке расскажу как установить и оптимизировать панель управления сервером B... Отключить поиск по описаниям товаров в Битрикс Просмотров: 10581 Иногда, нужно отключить поиск по описаниям анонсов и детальному описанию товаров, при разр... Получение доступа к железу устройства из Битрикс мобильное приложение Просмотров: 5573 Документация к мобильному приложению 1С-Битрикс очень куцая. В основном описывает функцион... Фотогалерея на базе компонента новостей, с fancybox. Просмотров: 1512 Это заметка обновление к очень старой, уже имеющейся на сайте. Сделаем что-то типа фотогал... Время на БД и веб сервере отличается на 3600 секунд, тест Битрикс Просмотров: 15280 Достаточно часто, при проверке параметров системы, в Битрикс, можно увидеть одну из ошибок... Отсортировать элементы в Битрикс по свойству привязка к разделам Просмотров: 27876 При создании достаточно сложных интернет-магазинов на Битрикс, иногда встает задача помимо... Звездочки в рейтинге Битрикс статей и новостей Просмотров: 18037 Стандартный вид рейтинга в новостях Битрикс, ну скажем так- не очень красив. Давайте его п... Ускорение работы сайта на 1С-Битрикс Просмотров: 15839 Данная статья написана специально под видеоролик (приложен в конце статьи), опубликованный... XML в формате Commerce ML-2, города России и Мира, для выгрузки в инф... Просмотров: 6285 Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и... Малая корзина Битрикс, упрощенный шаблон Просмотров: 12513 Шаблон малой корзины битрикс, который можно вывести в боковом разделе шаблона или в шапке ... Установка веб-сервера LAMP на ubuntu 20.04 LTS, оптимизированный под ... Просмотров: 11378 В последнее время, плотно пересел c macOS на ubuntu, и решил настроить себе полноценное ра... Увеличение диска на готовой виртуальной машине Битрикс Просмотров: 8732 Как всем известно, на официальном сайте 1С-битрикс можно скачать готовую виртуальную машин... Отфильтровать новости в Битрикс за заданный период Просмотров: 15552 Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компо... Вывести дату окончания скидки в карточке товара Просмотров: 3632 Если нужно вывести информацию о скидке в карточке товара, можно воспользоваться методом Заполнение габаритов товара, после обмена с 1С, из свойств элемента и... Просмотров: 10383 Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1... Основные функции вывода в шаблонах Битрикс Просмотров: 155255 Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну к... Добавление в избранное или отложенные, на AJAX из карточки товара Просмотров: 27299 В этой заметке рассакажу как добавлять товары в "Отложенные", для иммитации функционала "И...