+7 (843) 212-62-17 - Казань
+7 (843) 212-62-17 - Казань

Установка срока активности бонусов за категории

Используемое событие: "Событие до расчета бонусов каждой позиции"

Результат: В настройках начисления бонусов за категории товаров можно установить срок активности бонусов.
Например, можно установить на определенную категорию товаров акцию: начислять 10% бонусов с 01.01.2019 по 31.01.2019
Если на данную категорию установлено начисление бонусов (именно на категорию, а не из общих настроек модуля), то бонусы на категорию будут начисляться только в указанные даты. По истечение даты, или до ее начала, будут применяться общие настройки начисления бонусов.

Реализация:

  1. В настройках категорий добавить поля:

    Имя поля: Дата начала действия бонусов
    Тип поля: Дата со временем
    Код поля: UF_BONUS_BEGIN

    Имя поля: Дата окончания действия бонусов
    Тип поля: Дата со временем
    Код поля: UF_BONUS_END

  2. Создать файл
    /bitrix/php_interface/include/logictim_balls/custom.php

    И разместить в нем код:
    <?
    
    \Bitrix\Main\EventManager::getInstance()->addEventHandler("logictim.balls", "BeforeGetBonusItem", "LogictimCustomDateBonus");
    function LogictimCustomDateBonus(\Bitrix\Main\Event $event)
    {
    	global $USER;
    	
    	$arBonus = $event->getParameters();
    	
    	//Если есть бонусы на категорию
    	if($arBonus["IBLOCK_SECTION"]["PROPERTY_BONUS"] > 0 && $arBonus["IBLOCK_SECTION"]["PROPERTY_BONUS_NO"] != 1)
    	{
    		$arCategoryTree = GetCategoriesTreeCustom('UF_LOGICTIM_BONUS');
    		$dateBegin = $arCategoryTree["CATEGORY_LIST"][$arBonus["IBLOCK_SECTION"]["ID"]]["UF_BONUS_BEGIN"];
    		$dateEnd = $arCategoryTree["CATEGORY_LIST"][$arBonus["IBLOCK_SECTION"]["ID"]]["UF_BONUS_END"];
    		
    		//Если дата начла не наступило, то запрещаем начисление
    		if($dateBegin != '')
    		{
    			$dateBeginUnix = MakeTimeStamp($dateBegin, CSite::GetDateFormat());
    			$nowTime = getmicrotime();
    			if($dateBeginUnix > $nowTime)
    				$arBonus["IBLOCK_SECTION"]["PROPERTY_BONUS_NO"] = 1;
    		}
    		//Если дата окончания наступила, то запрещаем начисление
    		if($dateEnd != '')
    		{
    			$dateEndUnix = MakeTimeStamp($dateEnd, CSite::GetDateFormat());
    			$nowTime = getmicrotime();
    			if($nowTime > $dateEndUnix)
    				$arBonus["IBLOCK_SECTION"]["PROPERTY_BONUS_NO"] = 1;
    		}
    	}
    	
    	//echo '<pre>'; print_r($arBonus); echo '</pre>';
    	
    	$result = new Bitrix\Main\EventResult($event->getEventType(), $arBonus);
        return $result;
    	
    }
    
    //Функция для получения дерева категорий с кастомными свойствами дат
    function GetCategoriesTreeCustom($bonusCatProp = 'UF_LOGICTIM_BONUS')
    {
    	CModule::IncludeModule('iblock');
    	CModule::IncludeModule("catalog");
    	
    	//take id of catalogs, and offers
    	$dbCatalogs = CIBlock::GetList(
    		Array(), 
    		Array(
    			'ACTIVE'=>'Y', 
    		), false
    	);
    	//take only torgoviy catalog
    	while($arCatalog = $dbCatalogs->Fetch())
    	{
    		$catDb = CCatalog::GetByID($arCatalog["ID"]);
    		if($catDb) {
    			$catalogsId[] = $catDb["ID"];
    			}
    	}
    	
    	$category_tree = array();
    	$category_list = array();
    	$arrCat = Array();
    	
    	foreach($catalogsId as $iblock_id):
    		$res = CIBlockSection::GetList(Array(),Array('IBLOCK_ID'=>$iblock_id,'ACTIVE'=>'Y'),false,Array('ID','NAME','CODE','DEPTH_LEVEL','IBLOCK_SECTION_ID',$bonusCatProp,'UF_LOGICTIM_BONUS_NO', 'UF_LOGICTIM_BONUS_NP', "UF_BONUS_BEGIN","UF_BONUS_END"));
    		while ($arr = $res->fetch())
    		{
    			$arrCat[$arr['ID']] = $arr;
    		}
    	endforeach;
    	$category_list = $arrCat;
    	
    	foreach($arrCat as $id=>&$node):
    		   if($node['IBLOCK_SECTION_ID'] == '') 
    		   { // root node
    			   $category_tree[$id] = &$node;
    		   } 
    		   else 
    		   { // sub node
    			   if(!isset($arrCat[$node['IBLOCK_SECTION_ID']]['CHILD']))
    			   {
    				   $arrCat[$node['IBLOCK_SECTION_ID']]['CHILD'] = array();
    			   }
    			   
    			   $node['TEST'] =  $node[$bonusCatProp];
    			   
    			   if($node[$bonusCatProp] == '')
    			   {
    				  $node['UF_BONUS_BEGIN'] =  $arrCat[$node['IBLOCK_SECTION_ID']]["UF_BONUS_BEGIN"];
    				  $category_list[$id]['UF_BONUS_BEGIN'] = $arrCat[$node['IBLOCK_SECTION_ID']]["UF_BONUS_BEGIN"];
    			   }
    			   if($node[$bonusCatProp] == '')
    			   {
    				  $node['UF_BONUS_END'] =  $arrCat[$node['IBLOCK_SECTION_ID']]["UF_BONUS_END"];
    				  $category_list[$id]['UF_BONUS_END'] = $arrCat[$node['IBLOCK_SECTION_ID']]["UF_BONUS_END"];
    			   }
    			   
    			   if($node[$bonusCatProp] == '')
    			   {
    				  $node[$bonusCatProp] =  $arrCat[$node['IBLOCK_SECTION_ID']][$bonusCatProp];
    				  $category_list[$id][$bonusCatProp] = $arrCat[$node['IBLOCK_SECTION_ID']][$bonusCatProp];
    			   }
    			   if($node['UF_LOGICTIM_BONUS_NO'] == '' || $node['UF_LOGICTIM_BONUS_NO'] == 0)
    			   {
    				  $node['UF_LOGICTIM_BONUS_NO'] =  $arrCat[$node['IBLOCK_SECTION_ID']]["UF_LOGICTIM_BONUS_NO"];
    				  $category_list[$id]['UF_LOGICTIM_BONUS_NO'] = $arrCat[$node['IBLOCK_SECTION_ID']]["UF_LOGICTIM_BONUS_NO"];
    			   }
    			   if($node['UF_LOGICTIM_BONUS_NP'] == '' || $node['UF_LOGICTIM_BONUS_NP'] == 0)
    			   {
    				  $node['UF_LOGICTIM_BONUS_NP'] =  $arrCat[$node['IBLOCK_SECTION_ID']]["UF_LOGICTIM_BONUS_NP"];
    				  $category_list[$id]['UF_LOGICTIM_BONUS_NP'] = $arrCat[$node['IBLOCK_SECTION_ID']]["UF_LOGICTIM_BONUS_NP"];
    			   }
    			   $arrCat[$node['IBLOCK_SECTION_ID']]['CHILD'][$id] = &$node;
    		   }
    	endforeach;
    	
    	$arCategoriesTree = array("CATEGORY_TREE" => $category_tree, "CATEGORY_LIST" => $category_list);
    	
    	return $arCategoriesTree;
    	
    }
    ?>

  3. Подключить файл для выполнения.
    Для этого, в файле /bitrix/php_interface/init.php прописать код:
    //Доработки для модуля бонусной систему logictim.balls
    include($_SERVER["DOCUMENT_ROOT"].'/bitrix/php_interface/include/logictim_balls/custom.php');







Возврат к списку