О web-разработке
и даже немного больше...

Работа с купонами в Bitrix API

Для реализации возможности использования персональных скидок в системе Битрикс есть функционал купонов. Нужно понимать, что купоны являются отдельной разновидностью скидок. Отличаются они главным образом тем, что могут генерироваться отдельно в любой момент времени, и быть уникальными для отдельных покупателей. Основная особенность в том, что право на пользование скидкой может получить пользователь, предъявивший уникальную последовательность символов при заказе либо в самой корзине. Это бывает очень удобно при проведении различных рекламных акций среди покупателей.

Для работы с купонами в администраторской части есть отдельный раздел, который находится по следующему пути:
Маркетинг – Товарный маркетинг – Купоны

Там вы можете создавать новые купоны и настраивать их для их последующего предоставления покупателям. Довольно часто есть необходимость автоматизации процесса создания купонов, к примеру, нужно создавать купоны программно и отправлять пользователю. Тогда возникает вопрос работы с купонами посредством API Битрикса. Далее мы рассмотрим примеры работы с купонами через специальные классы модуля.

Создание правила корзины и купона

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

Для примера, давайте попробуем создать купон, с возможностью получить скидку в 10 процентов на определённые товары.

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Sale\Internals;

CModule::IncludeModule("catalog");
CModule::IncludeModule("iblock");
CModule::IncludeModule("sale");

global $APPLICATION;

// Первым делом, создадим правило со скидкой для купона

// размер скридки в %
$discountValue = 10; 

$arActions["CLASS_ID"] = "CondGroup";
$arActions["DATA"]["All"] = "AND";
$arActions["CLASS_ID"] = "CondGroup";
$arActions["CHILDREN"][0]["CLASS_ID"] = "ActSaleBsktGrp";
$arActions["CHILDREN"][0]["DATA"]["Type"] = "Discount";
$arActions["CHILDREN"][0]["DATA"]["Value"] = $discountValue;
$arActions["CHILDREN"][0]["DATA"]["Unit"] = "Perc";
$arActions["CHILDREN"][0]["DATA"]["All"] = "OR";

// получаем список товаров из определённых разделов, по SECTION_ID
$DbParentEl = CIBlockElement::GetList(
						array(),
						array(
							"SECTION_ID" => array(10, 11)
						),
						false,
						false,
						array("ID")
					);
$i=0;
while($arElem = $DbParentEl->Fetch()){

	// формируем массив для создания скидок на товары
	$arActions["CHILDREN"][0]["CHILDREN"][$i]["CLASS_ID"] = "CondIBElement"; 
	$arActions["CHILDREN"][0]["CHILDREN"][$i]["DATA"]["logic"] = "Equal";
	$arActions["CHILDREN"][0]["CHILDREN"][$i]["DATA"]["value"] = $arElem["ID"];
	$i++;

}

$arConditions["CLASS_ID"] = "CondGroup";
$arConditions["DATA"]["All"] = "AND";
$arConditions["DATA"]["True"] = "True";
$arConditions["CHILDREN"] = "";

// начало активности скидки
$unixStart = strtotime(date("d.m.Y H:i:s"));

// окончание активности скидки
$unixEnd = $unixStart + 43200; // интервал 12 часов

// Формируем массив для добавления правила
$arFields = array(
		"LID" => "s1",
		"NAME" => $discountValue."% Скидки ".date("d.m.y"), // название скидки
		"CURRENCY" => "RUB", // валюта
		"ACTIVE" => "Y", // активность
		"USER_GROUPS" => array(1), // группа пользователей
		"ACTIVE_FROM" => ConvertTimeStamp($unixStart, "FULL"),
		"ACTIVE_TO" => ConvertTimeStamp($unixEnd, "FULL"),
		"CONDITIONS" => $arConditions,
		'ACTIONS' => $arActions
	);

// добавление нового правило скидок
$discountID = CSaleDiscount::Add($arFields);
if ($discountID > 0) {

	// генерируем новый код купона
	$codeCoupon = CatalogGenerateCoupon();

	$couponFields = array(
					"DISCOUNT_ID" => $discountID, // ID правила скидок
					"COUPON" => $codeCoupon,
					"ACTIVE" => "Y",
					"TYPE" => 2,
					"MAX_USE" => 0
				);

	// добавляем новый купон
	$addCouponRes = Internals\DiscountCouponTable::add($couponFields);
	if (!$addCouponRes->isSuccess()){
		
		$err = $addCouponRes->getErrorMessages();
		print_r($err);
		
	} else {
		echo 'Новый купон успешно создан! Номер купона: '.$codeCoupon;
	}

} else {
	$ex = $APPLICATION->GetException();  
	echo 'Ошибка при создании нового правила скидок: '.$ex->GetString();
}
?>

По сути в этом примере описан полный цикл создания правила скидок, и создание нового купона. Основываясь на этом примере, можно менять условие для скидок, либо создавать купоны уже на существующие правила скидок. Вопрос доставки купона до пользователя тут не указан, т.к. это уже отдельное дело каждого проекта, кто-то может отправлять его на почту, кто-то по SMS, кто-то распечатывать его при вручении покупателю. Далее рассмотрим возможность использования купона в заказе и в корзине.

Использование купона в корзине Bitrix API

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

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Sale;

CModule::IncludeModule("sale");

// код купона, который следует применить к корзине
$coupon = 'SL-QAGTG-WWLDUA0';

// применяем купон
Sale\DiscountCouponsManager::add($coupon);

// получаем объект корзины для текущего пользователя
$oBasket = Sale\Basket::loadItemsForFUser(
					Sale\Fuser::getId(),
					\Bitrix\Main\Context::getCurrent()->getSite()
				);

// получаем объект скидок для корзины
$oDiscounts = Sale\Discount::loadByBasket($oBasket);

// обновляем поля в корзине
$oBasket->refreshData(['PRICE','COUPONS']);

// пересчёт скидок для корзины
$oDiscounts->calculate();

// получаем результаты расчёта скидок для корзины
$result = $oDiscounts->getApplyResult();

echo '<pre>';
	print_r($result);
echo '</pre>';

?>

Применять купон со скидкой для корзины довольно просто. Происходит в коде следующее, первым делом применяется купон, после этого получается объект корзины для текущего пользователя, и выполняется перерастёт итоговой цены корзины. Комментарии в коде объясняют весь процесс. Применять скидки можно на этапе корзины, и к существующему заказу. Теперь рассмотрим второй вариант, когда требуется применить скидку для заказа, который уже был создан.

Использование купона в заказе Bitrix API

Чтобы применить купон к заказу, первым делом нужно получить сам объект заказа по ID. Далее инициализировать менеджер купонов к заказу, и применить купон. Все изменения в заказе так же следует сохранять, посредством метода save().

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Sale;

CModule::IncludeModule("sale");

// код купона
$coupon = "SL-QAGTG-WWLDUA0";  

// получаем объект заказа
$order = Sale\Order::load($orderId);

// инициализация менеджера купонов для заказа
Sale\DiscountCouponsManager::init(
    Sale\DiscountCouponsManager::MODE_ORDER, [
        "userId" => $order->getUserId(),
        "orderId" => $order->getId()
    ]
);

// применение скидки
Sale\DiscountCouponsManager::add($coupon);

// получение объекта скидок заказа
$discounts = $order->getDiscount();

// перерасчёт стоимости заказа
$discounts->calculate();

// сохранение изменений заказа
$order->save();

?>

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

// проверка активации купона (true/false)
\Bitrix\Sale\DiscountCouponsManager::isEntered());

// отмена применения купона
\Bitrix\Sale\DiscountCouponsManager::clear(true);

// получение информации о купоне
\Bitrix\Sale\DiscountCouponsManager::getData($coupon);

Как уже известно купоны можно применять к заказу и корзине, а также отменять их. Поэтому все эти методы вероятно могут вам пригодиться для реализации своего функционала в интернет-магазине.

Опубликован: 29.06.2020 г.

См. также:

«Не удалось установить соединение с сервером. Проверьте …».
Получение Email-адреса покупателя в заказе (Bitrix D7)
Работа с URL-адресами в Bitrix D7
Добавляем пункт меню для списков в админке Битрикс
Диалоговые окна в Bitrix API
Создание инфоблока при установке модуля
Создание копии корзины из заказа на Bitrix D7
Создание копии заказа в Bitrix D7

Комментарии

  1. денис пишет:

    Не хватает $arActions["CHILDREN"][0]["DATA"]["True"] = "True";

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта