06.07.2019

Использование в письмах кастомного sale.discount.coupon.mail

В Битрикс есть много интерестного функционала из коробки. Но иногда вводит в ступор реализация тех или иных идей.

Рассмотрим компонент sale.discount.coupon.mail
Вот что сказано о нём в документации:

Одностраничный компонент генерирует купон для правила корзины с соответствии с заданными параметрами. Компонент стандартный и входит в дистрибутив модуля.
В визуальном редакторе компонент расположен по пути: Магазин > Информация о товарах > Генерация купона на товар для почты.
Компонент относится к модулю Интернет-магазин.
<?$APPLICATION->IncludeComponent(
    "bitrix:sale.discount.coupon.mail",
    "",
    Array(
        "DISCOUNT_VALUE" => "10",
        "DISCOUNT_UNIT" => "Perc",
        "COUPON_TYPE" => "Order",
        "DISCOUNT_XML_ID" => "{#SENDER_CHAIN_CODE#}",
        "COUPON_DESCRIPTION" => "{#EMAIL_TO#}"
    )
);?>

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

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

Данное поведение можно исправить кастомизиров компонент (конечно же, кастомизацию надо делать в своем пространстве имен). Для этого нужно открыть class.php компонента и найти там следующий код:

$saleDiscountDb = CSaleDiscount::GetList(array('DATE_CREATE' => 'DESC'), $fields, false, false, array('ID', 'ACTIONS', 'CONDITIONS'));
if($saleDiscount = $saleDiscountDb->Fetch())
{
	if($saleDiscount['ACTIONS'] == $fieldsAdd['ACTIONS'] && $saleDiscount['CONDITIONS'] == $fieldsAdd['CONDITIONS'])
	{
		$saleDiscountId = $saleDiscount['ID'];
	}
}

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

$saleDiscountDb = CSaleDiscount::GetList(array('DATE_CREATE' => 'DESC'), $fields, false, false, array('ID', 'ACTIONS', 'CONDITIONS'));
if($saleDiscount = $saleDiscountDb->Fetch())
{
	$saleDiscountId = $saleDiscount['ID'];
}

Всё! Данная простая модификация исправляет данную проблему.