Задача: после того как заказ, в интернет-магазине, перешел в статус "Выполнен" начислить пользователю 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 ); } } } }
В личном кабинете можно вывести историю начислений и списаний, например так:
Расширяем задачу: нужно начислять 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 ); } } } }
Дополнительно, к коду из первого варианта добавили:
Расширяем задачу, дальше: начислять разный процент, на внутренний счет, в зависимости от стоимости заказа.
Создаем и заполняем HL инфоблок с пользовательскими полями:
После наполнения:
И расширяем код из примеров выше:
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 ); } } } }
![]()
Ksyusha Darovykh
|
Здравствуйте, можете дать наводку/пример, как Вы вывели историю начислений и списаний? Пыталась написать это в комментариях к теме, не получилось
|
![]()
Михаил Базаров
|
||||
История уже есть в компоненте sale.personal.account (Счета текущего пользователя) Распечатайте массив $arResult этого компонента и увидите все данные, которыми можно манипулировать Недостающие данные можно получить методом GetByUserID
|
||||
![]()
Ольга Стафиевская
|
||
Скажите, почему строка
Parse error: syntax error, unexpected 'use' (T_USE) in /var/www/u0972962/data/www/noutland.ru/mini1c/web/reports/index.php on line 234? |
||
![]()
Михаил Базаров
|
||||
|
||||
На нем, уже много видеоуроков по 1С-Битрикс. Как одиночные видео так и серии видеоуроков Перейти на канал
Совсем скоро выйдет видеокурс по разработке доски объявлений с мобильным приложением. Подписывайтесь и будьте в курсе: