B
B
BarneyGumble2021-03-01 00:38:39
1C-Bitrix
BarneyGumble, 2021-03-01 00:38:39

How to programmatically create a coupon for goods in Bitrix?

I do the following:

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(
    "IBLOCK_ID" => array(17),
    "SECTION_ID" => array(787)
  ),
  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();
}


As a result, I get an error on the page:
Error creating a new discount rule: The actions specified for the rule are incorrect. The rule cannot be saved.

What am I doing wrong?

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question