В 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; }