@tgarl

Как создать скидку 10% в корзине только на товары добавленных линий более 2 штух?

Есть 200+ линий. Если клиент добавит несколько товаров одинаковой линии, нужно на такие товары назначить скидку.
Решил через кастомное условие скидок. Но в этом случае оно возвращает либо true либо false.и соответственно скидка применяется/нет на всю корзину. Как сделать только на те товары, которые подходят под условие?
  • Вопрос задан
  • 31 просмотр
Решения вопроса 1
@tgarl Автор вопроса
Решил.
1. Есть событие на действия и условия. Нужно различать когда когда и какое использовать(это была моя главная ошибка)
2. в моем случае нужно использовать OnCondSaleActionsControlBuildList, а не OnCondSaleControlBuildList
3. само решение:

public static function Generate($arConditions, $arParams, $control, $subs = false)
    {

        $resultValues = array();
        $arValues = false;

        if (is_string($arControl))
        {
            $arControl = static::GetControls($arControl);
        }
        $boolError = !is_array($arControl);

        if (!$boolError)
        {
            $arValues = static::Check($arOneCondition, $arOneCondition, $arControl, false);
            $boolError = (false === $arValues);
        }


        if($arOneCondition['logic']=='Equal')
        {
            $logic='true';
        }
        else
        {
            $logic='false';
        }
$strResult  = '(SaleActionDeactivateDiscount::qDiscAction('.$arParams['BASKET_ROW'].','.$arConditions['value'].'))=='.$logic;
        return  $strResult;

    }
 public static function qDiscAction($row,$arCond)
    {
//пришлось использовать \Bitrix\Sale\Basket::loadItemsForFUser, т.к. кроме $arParams['BASKET_ROW'] другие параметры по какой-то причине пустые и при попытке их передать в свою функцию напрочь ломают скидки
		$basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), 's1');
		$linia=[];
		foreach ($basket as $basketItem) {
			$mxResult = \CCatalogSku::GetProductInfo($basketItem->getProductId())['ID'];
			$dbEl = \CIBlockElement::GetList(array('sort' => 'asc'), array('ID' => $mxResult), false, false, Array('ID','PROPERTY___2'));
			while($obEl = $dbEl->Fetch())	
			{
				$linia[$obEl['PROPERTY___2_VALUE']]['ID'][]=$basketItem->getProductId();
				$linia[$obEl['PROPERTY___2_VALUE']]['CNT']+=$basketItem->getQuantity();
			}			
		}
		
		foreach($linia as $ln=>$massa){
			if($massa['CNT']>=$arCond && in_array($row['PRODUCT_ID'],$massa['ID'])){
				return false;
			}
		}
		
       return true;
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы