В 1С-Битрикс имеются как одноразовые купоны, так и многоразовые.
Как быть, если многоразовый купон необходимо сделать одноразовым? Как это понимать?
Очень просто, бывает стоит задача создать какой то один купон с кодом, например СКИДКА и ограничить его использование одним и тем же пользователем много раз. Т.е. если покупатель уже воспользовался купоном и создал заказ, то чтобы более не мог его использовать. Деактивировать купон или сделать его одноразовым нельзя, т.к. этим же купоном должны иметь возможность воспользоваться другие покупатели.
Внимание: В статье приведены фрагменты кода, описывающие принцип реализации. Для внедрения рекомендуется обратиться к разработчикам.
В зависимости от задач функция может быть более сложной. В данном материале описан принцип реализации.
Конечно, задачу можно решить не одним способом. Но мы предлагаем воспользоваться модулем Произвольное PHP условие правил работы с корзиной.
Принцип реализации не сложен. Также необходимо создать правило для работы с корзиной, создать нужный многоразовый купон. На дополнительных условиях правила прописать произвольную PHP-функцию, которая будет проверять совершал ли покупатель с данным купоном заказ или нет, и возвращать ИСТИНУ (true) или ЛОЖЬ (false). Например функция __sc_check_multi_coupon() (это всего лишь пример, как может выглядеть функция, для внедрения рекомендуется обратиться к разработчикам.):
function __sc_check_multi_coupon()
{
$btrue = true;
$ar_orders = array();
$arFilter = Array(
"USER_ID" => $GLOBALS["USER"]->GetID(),
"!CANCELED" => "Y",
);
$db_sales = CSaleOrder::GetList(
array("DATE_INSERT" => "desc"),
$arFilter,
false,
false,
array("ID")
);
while ($ar_sales = $db_sales->Fetch())
{
$ar_orders[] = $ar_sales["ID"];
}
if (count($ar_orders)>0)
{
$str_coupons = "КУПОН1,КУПОН2,...,КУПОНN"; //TODO заменить на свои купоны
$ar = explode(",",$str_coupons);
if (is_array($ar) && count($ar)>0)
{
$ar_coupons = array();
foreach ($ar as $key => $coupon)
{
if (strlen(trim($coupon))>0)
$ar_coupons[] = trim($coupon);
}
}
if (is_array($ar_coupons))
{
$couponList = \Bitrix\Sale\Internals\OrderCouponsTable::getList(array(
'select' => array('COUPON'),
'filter' => array(
'=ORDER_ID' => $ar_orders,
'COUPON' => $ar_coupons
)
));
if ($coupon = $couponList->fetch())
{
$btrue = false;
}
}
}
return $btrue;
}