5  /  5

Одноразовый многоразовый купон

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