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

Сгенерировать скидочные купоны, при заказе и отправить на почту

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

Задача: после того как пользователь сделал заказ, нужно сгенерировать одноразовые купоны для скидки (правила корзины) и отправить, эти купоны, на почту указанную при оформлении заказа. Купоны генерируются и отправляются, только после полного завершения заказа, который оплачен и переведен в статус "Выполнен".

генерировать скидочные купоны, при заказе и отправить на почту.

Для начала создаем правило корзины, для которого будем генерировать купоны. Переходим в "Администрирование -> Маркетинг -> Товарный маркетинг -> Правила работы с корзиной" и создаем скидку на нужную сумму и процент.

генерировать скидочные купоны, при заказе и отправить на почту.

Уже при желании добавляете нужные ограничения по разделам, товарам и прочим условиям. В моем случае правило распостраняется на весь каталог.

Для этого правила, на вкладке "Купоны" обязательно сгенерируйте один купон- что бы правило не работало просто так.

Программная генерация скидочного купона

В моей задаче, должно сгенерироваться столько купонов, сколько товаров (именно единиц) в заказе у пользователя. Вы можете доработать пример таким образом, что бы генерировался только один купон. Или в зависимости от какого-то конкретного товара или ряда товаров с определенным свойством.

В /local/php_interface/init.php добавляем следующий обработчик.


use Bitrix\Main\Loader;

AddEventHandler("sale", "OnSaleStatusOrder", "OrderComplete");
function OrderComplete($orderID, &$arFields)
{
    if ($arFields == 'F') {
        Loader::includeModule("sale");

        // Товары заказа
        $dbRes = \Bitrix\Sale\Basket::getList([
            'select' => ['QUANTITY'],
            'filter' => [
                '=ORDER_ID' => $orderID,
            ]
        ]);
        while ($item = $dbRes->fetch()) {
        	$itemsCount += (int)$item['QUANTITY'];
        }
     	// end Товары заказа


	// Генерируем купоны
	$i = 1;
 	while ($i <= $itemsCount) {
                $generateCoupon = \Bitrix\Sale\Internals\DiscountCouponTable::generateCoupon(true);
                $fields = array(
                    "DISCOUNT_ID" => "7",
                    "ACTIVE" => "Y",
                    "TYPE" => \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_ONE_ORDER,
                    "COUPON" => $generateCoupon,
                    "DATE_APPLY" => false
                );
                $result = \Bitrix\Sale\Internals\DiscountCouponTable::add($fields);
                $cuponsList[] = '<br>' . $generateCoupon;
                $i++;
        }
	// end Генерируем купоны

        // Получаем email для отправки купона
        $dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
            'select' => ['CODE', 'VALUE'],
            'filter' => ['=ORDER_ID' => $orderID, '=CODE' => 'EMAIL']
        ]);
        while ($item = $dbRes->fetch()) {
            $userOrderEmail = $item['VALUE'];
        }
        // end Получаем email для отправки купона
        
        // Отправляем письмо
        $EVEN_TYPE = 'SEND_CUPONS';
        $SITE_ID = 's1';
        $arFeedForm = array(
            "EMAIL_TO" => $userOrderEmail,
            "CUPON_LIST" => $cuponsList
        );
        CEvent::Send($EVEN_TYPE, $SITE_ID, $arFeedForm );
    }
}	
  • Здесь мы воспользовались событием OnSaleStatusOrder которое срабатывает при изменении статуса заказа.
  • При условии что заказ перешел в статус выполнен ($arFields == 'F') запускаем дальнейшую работу.
  • С помощью \Bitrix\Sale\Basket::getList получили состав этого заказа. Указываем 'select' => ['QUANTITY'],- нам нужны только количества товаров, не зачем тянуть все данные.
  • В переменной $itemsCount общее количество товаров в заказе.
  • Запускаем цикл, который работает до тех пор, пока счетчик $i не совпадет с $itemsCount

В теле цикла используем Internals\DiscountCouponTable::generateCoupon для генерации самого купона. И Internals\DiscountCouponTable::add который прявязывает купон к правилу корзины, с ID=7 (правило созданное выше, у вас другой ID).

Сам купон создается одноразовым, с помощью Internals\DiscountCouponTable::TYPE_ONE_ORDER. Если понадобится создать другой типа купона:

  • TYPE_BASKET_ROW - на одну позицию
  • TYPE_ONE_ORDER - на один заказ
  • TYPE_MULTI_ORDER - многоразовый

Отправка письма, средствами 1С-Битрикс

Дальше, осталось отправить письмо. В теле цикла, генерирующего купоны, мы собирали массив $cuponsList[] с купонами- его и будем отправлять.

С помощью PropertyValueCollection::getList мы получили электронную почту покупателя, указанную при оформлении заказа. Занесли ее в переменную $userOrderEmail.

А дальше, с помощью CEvent::Send дергаем почтовое событие с типом SEND_CUPONS и передаем в него массив с купонами и электронной почтой покупателя.

Теперь, создаем новый тип почтового события (Настройки -> Настройки продукта -> Почтовые и СМС события -> Типы событий), с названием SEND_CUPONS

генерировать скидочные купоны, при заказе и отправить на почту.

И само письмо, с любым текстом, самое главное не забываем добавить переменную с массивом купонов. Настройки -> Настройки продукта -> Почтовые и СМС события -> Почтовые шаблоны

генерировать скидочные купоны, при заказе и отправить на почту.

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

Михаил Базаров 30.07.2022
Что бы купоны не копились в базе, если они больше не нужны.
Можно запускать периодический скрипт с методом
\Bitrix\Sale\Internals\DiscountCouponTable::onDelete
который будет подчищать использованные купоны.
Alexey 01.09.2022
Спасибо за материал! Очень полезно.
Но, для ленивых, подскажите, как поправить под генерацию одного купона?
Михаил Базаров 01.09.2022
Цитата
Alexey написал:
Сгенерировать скидочные купоны, при заказе и отправить на почту

Как-то так. Не проверял, но вроде бы все правильно.
То есть даже не получаем список товаров заказа. Достатоно знать что он стал в статусе F
Код
if ($arFields == 'F') {
   // Генерируем купон
                $generateCoupon = \Bitrix\Sale\Internals\DiscountCouponTable::generateCoupon(true);
                $fields = array(
                    "DISCOUNT_ID" => "7",
                    "ACTIVE" => "Y",
                    "TYPE" => \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_ONE_ORDER,
                    "COUPON" => $generateCoupon,
                    "DATE_APPLY" => false
                );
                $result = \Bitrix\Sale\Internals\DiscountCouponTable::add($fields);
                $cupon = $generateCoupon;
   // end Генерируем купон

        // Получаем email для отправки купона
        $dbRes = \Bitrix\Sale\PropertyValueCollection::getList([
            'select' => ['CODE', 'VALUE'],
            'filter' => ['=ORDER_ID' => $orderID, '=CODE' => 'EMAIL']
        ]);
        while ($item = $dbRes->fetch()) {
            $userOrderEmail = $item['VALUE'];
        }
        // end Получаем email для отправки купона
        
        // Отправляем письмо
        $EVEN_TYPE = 'SEND_CUPONS';
        $SITE_ID = 's1';
        $arFeedForm = array(
            "EMAIL_TO" => $userOrderEmail,
            "CUPON_LIST" => $cupon
        );
        CEvent::Send($EVEN_TYPE, $SITE_ID, $arFeedForm );
    }
Alexey 01.09.2022
Благодарю, Михаил :) Буду пробовать

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

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

Композитный сайт на 1С-Битрикс Просмотров: 3600 Для новых клиентов: Все новые проекты будут включать в себя применение технологии "Компози... Определить местоположение пользователя и показать на карте Просмотров: 3957 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ... Настройка прав доступа в 1С-Битрикс Просмотров: 8265 Часто, в интернет-магазине под управлением 1С Битрикс, нужно создать группу пользователей ... Наличие на складах в умном фильтре 1С-Битрикс, с автоматическим обнов... Просмотров: 1116 Задача: добавить возможность фильтрации товаров по складам в умном фильтре. Данные должны ... Сниппеты типографики bootstrap, для Битрикс Просмотров: 8269 Если вы подключили bootstrap к своему сайту, или сверстали весь шаблон, подключив bootstra... Свойство: привязка к Яндекс:Картам - вывести из нескольких элементов ... Просмотров: 18667 Предположим, что у вас есть инфоблок со свойством "Привязка к яндекс картам". В этом инфоб... Добавить все свойства инфоблока в умный фильтр одним разом Просмотров: 11239 Если у вас достаточно много свойств, в инфоблоке с товарами, например: больше 1000-чи, пос... Вывести все разделы в которых находится элемент инфоблока Просмотров: 14937 Если нужно вывести все разделы, со всей доступной информацией о них, внутри элемента инфоб... Отфильтровать товары бренда и вывести по разделам каталога Просмотров: 1628 Задача: на странице бренда, который выводится компонентом новостей, нужно показать все тов... Вывести дату окончания скидки в карточке товара Просмотров: 4521 Если нужно вывести информацию о скидке в карточке товара, можно воспользоваться методом Ускорение работы сайта на 1С-Битрикс Просмотров: 17734 Данная статья написана специально под видеоролик (приложен в конце статьи), опубликованный... Получить множественное пользовательское поле раздела. Значения множес... Просмотров: 987 Задача: У разделов инфоблока есть множественное поле типа список. Зная ID раздела, нужно п... Вывести производителей на сайте с отбором его товаров из каталога Просмотров: 19597 Достаточно частая задачка для каталога или интернет-магазина: вывести список производителе... Вывести минимальную и максимальную цену в разделе каталога Битрикс. Просмотров: 3664 Что бы вывести минимальную и максимальную стоимость товаров, из каталога 1С-Битрикс, доста... Помечаем новинки лейблом в каталоге битрикс Просмотров: 20850 Достаточно часто, при разработке каталога товаров или интернет магазина на системе управле... Быстрая отписка от всех рассылок модуля "E-mail маркетинг", в кабинет... Просмотров: 277 Задача: дать пользователям возможность отписаться от всех рассылок "E-mail маркетинга", не... Получение местоположений через API Битрикс c поиском по select. Просмотров: 23193 Если нужно получить список городов из модуля "Местоположения" можно воспользоваться API Би... Отсортировать элементы в Битрикс по свойству привязка к разделам Просмотров: 28992 При создании достаточно сложных интернет-магазинов на Битрикс, иногда встает задача помимо... Умный фильтр во всплывающей панели на мобильных. Просмотров: 2358 Шаблон умного фильтра в Битриксе достаточно сложный, с точки зрения верстки и не очень кра... Сортировать товары по названию, цене и дате поступления в каталоге Би... Просмотров: 41067 Достаточно часто заказчик просит вывести сортировку по цене, новым поступлениям и названию...