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

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

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

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

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

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

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

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

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

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

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

В /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-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Если предложение SKU в корзине, поменять кнопку добавления на "В корз... Просмотров: 3112 Данная заметка является дополнением к ранее опубликованной: Есл... Очистить брошенные корзины с помощью API 1С-Битрикс Просмотров: 330 Задача: в интернет-магазине накапливается большое количество брошенных корзин, нужно их оч... Заполнить коэффициент единицы измерения (MEASURE_RATIO) из свойства э... Просмотров: 5694 Задачка: Каталог наполняется из 1С, но 1С не передает коэффициент единицы измерения (особе... Показать пользователю накопительную скидку за все сделанные заказы, и... Просмотров: 1736 Задача: показать, текущему авторизованному, пользователю сумму всех выполненных заказов и ... Модифицировать состав заказа #ORDER_LIST# в почтовом событии "Новый з... Просмотров: 28402 Если вы хотите как-то по особенному сверстать состав заказа в почтовом уведомлении 1С-Битр... Memcached на сайте под управлением битрикс, при использовании Веб Окр... Просмотров: 6908 Если вам важна скорость отдачи сайта, а у вашего сервера медленный диск для использования ... Правильное подключение стилей и скриптов в Битрикс Просмотров: 80470 Есть несколько способов подключения файлов стилей и скриптов, при верстке шаблонов в систе... Сравнение двух типов цен для иммитации системы скидок, в Битрикс Просмотров: 5839 Встала задачка, иммититровать систему скидок в интернет магазине на Битрикс. Из 1С-УТ, на ... Пошагово получить информацию о заказах и сохранить как Excel (xls) Просмотров: 506 Задача: Нужно получить информацию о заказах с возможностью указания даты создания "от"" и ... Базовая защита "Битрикс виртуальная машина" от DDoS атак. Просмотров: 5242 Данный способ защиты не панацея, и скорее всего не спасет от профессиональной DDoS атаки, ... Привязка к разделам в компоненте "Добавления элементов пользователем" Просмотров: 12032 В системе управления 1С Битрикс есть компонент "Форма добавления / редактирования" - котор... Вывести общее количество товаров в шаблоне корзины 1С-Битрикс Просмотров: 5685 Задача: вывести общее количество товаров в корзине (именно количество единиц товара, а не ... Запретить изменения описаний товаров при выгрузке из 1С УТ на сайт Просмотров: 16837 При разработке сайтов на Битрикс, с интеграцией с 1С Управление Тороговлей, нужно запретит... Создать pdf файл из элемента инфоблока, дать скачать пользователю, по... Просмотров: 3900 Задача: при каждом посещении статьи, на сайте, нужно создавать pdf файл с ее содержимым и ... Установка вебсервера на Apple M1 (нативный ARM стек), оптимизированны... Просмотров: 6114 Появилась задачка, установить стек MAMP (macOS, Apache, MYSQL, PHP) на рабочий ноутбук с п... Умный фильтр на главной странице Битрикс Просмотров: 20823 Редкая но востребованная задачка- это вывести компонент "умный фильтр" на главную страницу... Изменить размер картинок на лету в битрикс Просмотров: 46733 Встала задачка: на собственном сайте, уменьшить размер превьюшек картинок у анонсов раздел... Моментальная фильтрация на AJAX в умном фильтре 1С-Битрикс Просмотров: 24578 При штатной установке, интернет-магазина на 1С Битрикс, умный фильтр по товарам, показывае... Использование WebP изображений в 1С-Битрикс (на Битрикс: Веб окружени... Просмотров: 25830 WebP это современный формат сжатия изображений, который позволяет, при правильных настройк... Добавить свойство в административную форму заказа Просмотров: 2770 Задача, кастомизировать административную форму заказа: добавить свойство заказа в шапку фо...