Bitrix (1с-Битрикс) если цена купона больше цены корзины/создание собственного правила корзины

ВАЖНО! Посмотрите видео, там описано как нужно настраивать!
Между 9:30 и 11:30 - я тупанул, простите:) но времени нет перезаписывать)

Ссылка на проблему на форуме с 2011 года - https://dev.1c-bitrix.ru/community/forums/forum6/topic38923/

Архив для скачивания файлов: Скачать


Помните что файлы могут быть в /bitrix/ и /local/.

Код в init.php :
Bitrix\Main\Loader::includeModule('catalog');

AddEventHandler("sale", "OnCondSaleActionsControlBuildList", Array("DiscountForCoupon", "GetControlDescr")); // Действия

class DiscountForCoupon extends CGlobalCondCtrlComplex
{
	protected static $handlerDisallow = false; 
    public static function GetClassName()
    {
        return __CLASS__;
    }
  
    public static function GetControlID()
    {
        return array('SaleActionCoupon');
    }


    public static function GetControlShow($arParams)
    {
		
        $arControls = static::GetControls();
        $arResult = array(
            'controlgroup' => true,
            'group' =>  false,
            'label' => 'Специальная проверка',
            'showIn' => static::GetShowIn($arParams['SHOW_IN_GROUPS']),
            'children' => array()
        );
        foreach ($arControls as &$arOneControl)
        {
            $arResult['children'][] = array(
                'controlId' => $arOneControl['ID'],
                'group' => false,
                'label' => $arOneControl['LABEL'],
                'showIn' => static::GetShowIn($arParams['SHOW_IN_GROUPS']),
                'control' => array(
                    array(
                        'id' => 'prefix',
                        'type' => 'prefix',
                        'text' => $arOneControl['PREFIX']
                    ),
                    static::GetLogicAtom($arOneControl['LOGIC']),
                    static::GetValueAtom($arOneControl['JS_VALUE'])
                )
            );
        }
        if (isset($arOneControl))
            unset($arOneControl);

        return $arResult;
    }


    public static function GetControls($strControlID = false)
    {
        $arControlList = array(
            'SaleActionCoupon' => array(
                'ID' => 'SaleActionCoupon',
                'FIELD' => 'BASKET_PRICE_IN',
                'FIELD_TYPE' => 'text',
                'LABEL' => 'Сумма корзины',
                'PREFIX' => 'Сумма корзины',
                 'LOGIC' => static::GetLogic(array(
							/*BT_COND_LOGIC_EQ,
							BT_COND_LOGIC_NOT_EQ,
							BT_COND_LOGIC_GR,
							BT_COND_LOGIC_LS,*/
							BT_COND_LOGIC_EGR,
							BT_COND_LOGIC_ELS
						)),
                'JS_VALUE' => array(
					'type' => 'input',
                    /*'type' => 'select',
					'values' => array(
						'Y' => "Да",
						'N' => "Нет",
					)*/
                ),
                'PHP_VALUE' => ''
            ),
        );

        foreach ($arControlList as &$control)
        {
            if (!isset($control['PARENT']))
                $control['PARENT'] = true;

            $control['MULTIPLE'] = 'N';
        }
        unset($control);

        if ($strControlID === false)
        {
            return $arControlList;
        }
        elseif (isset($arControlList[$strControlID]))
        {
            return $arControlList[$strControlID];
        }
        else
        {
            return false;
        }
    }

    public static function Generate($arOneCondition, $arParams, $arControl, $arSubs = false)
    {
		 // if($arOneCondition['logic']=='EqGr') EqGr - больше либо равно , EqLs - меньше либо равно
	
	
		$strResult  = 'DiscountForCoupon::BasketCheck("'.$arOneCondition['logic'].'",'.$arOneCondition['value'].')';
        return  $strResult;

    }

    public static function BasketCheck($logic,$value)
    {
		if (self::$handlerDisallow) 
           return; 
		self::$handlerDisallow = true;
		$basket = \Bitrix\Sale\Basket::loadItemsForFUser(
		\CSaleBasket::GetBasketUserID(), "s1")->getOrderableItems();
		$discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, new \Bitrix\Sale\Discount\Context\Fuser($basket->getFUserId(true)));
		$discounts->calculate();
		$arBasketDiscounts = $discounts->getApplyResult(true);
		$priceSum = 0;
		$basketItems = $basket->getBasketItems();
		foreach ($basketItems  as $basketItem ) {
			$basketCode = $basketItem->getBasketCode();
			if (isset($arBasketDiscounts["PRICES"]['BASKET'][$basketCode]))
			{
				$priceSum += $arBasketDiscounts["PRICES"]['BASKET'][$basketCode]["PRICE"]*$basketItem->getQuantity();
			} else {
				$priceSum += $basketItem->getFinalPrice();
			}
		}
		
		//$priceSum = $basket->getPrice();
		
		
		if($logic=="EqGr"){
			if($priceSum>=$value){
				self::$handlerDisallow = false;
				return true;
			}
			self::$handlerDisallow = false;
			return false;
		}else{
			if($priceSum<=$value){
				self::$handlerDisallow = false;
				return true;
			}
			self::$handlerDisallow = false;
			return false;
		}
		self::$handlerDisallow = false;
        return true;
    }
} 

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