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

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

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

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

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

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

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

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

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

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

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

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

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

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

Удалить товары из корзины, если есть определенные товары. Просмотров: 217 Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины... XML в формате Commerce ML-2, города России и Мира, для выгрузки в инф... Просмотров: 5816 Подвернулась задачка, создать инфоблок для Битрикс, в котором будут просто города России и... Использование WebP изображений в 1С-Битрикс (на Битрикс: Веб окружени... Просмотров: 24039 WebP это современный формат сжатия изображений, который позволяет, при правильных настройк... AJAX корзина с отправкой количества из раздела каталога Просмотров: 18293 Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При... Увидеть файл заказов который передаст Битрикс в 1С Просмотров: 22146 Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей,... Заполнение габаритов товара, после обмена с 1С, из свойств элемента и... Просмотров: 9218 Если Ваш интернет-магазин интегрирован с 1С, скорее всего столкнулись с такой проблемой: 1... Менять большую картинку, при клике на маленькую, в детальной карточке Просмотров: 1287 Мини скриптик, может кому пригодится для каталога товаров или новостей при использовании д... Отсортировать элементы в Битрикс по свойству привязка к разделам Просмотров: 26759 При создании достаточно сложных интернет-магазинов на Битрикс, иногда встает задача помимо... Заполнить поля пользователя из свойства заказа, на примере ФИО Просмотров: 321 При создании заказа покупатель заполняет поле "ФИО". Необходимо скопировать эти данные в п... Определить местоположение пользователя и показать на карте Просмотров: 2711 Задача определить местоположение текущего пользователя и показать его на карте, с меткой. ...