Задача: после того как заказ, в интернет-магазине, перешел в статус "Выполнен" начислить пользователю 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 ); } } } }
На нем, уже много видеоуроков по 1С-Битрикс. Как одиночные видео так и серии видеоуроков Перейти на канал
Совсем скоро выйдет видеокурс по разработке доски объявлений с мобильным приложением. Подписывайтесь и будьте в курсе: