• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/discountbase.php
  • Класс: BitrixSaleDiscountBase
  • Вызов: DiscountBase::calculateApplyBasketDiscount
protected function calculateApplyBasketDiscount()
{
	$result = new Result;

	if ($this->useOnlySaleDiscounts())
		return $result;
	if (empty($this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['BASKET']))
		return $result;

	$applyExist = $this->isBasketApplyResultExist();

	$applyBlock = &$this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['BASKET'];

	foreach ($this->getBasketCodes(false) as $basketCode)
	{
		if ($this->isCustomPriceByCode($basketCode))
		{
			if (isset($applyBlock[$basketCode]))
				unset($applyBlock[$basketCode]);
			continue;
		}
		if (empty($applyBlock[$basketCode]))
			continue;

		foreach ($applyBlock[$basketCode] as $index => $discount)
		{
			$currentProduct = $this->orderData['BASKET_ITEMS'][$basketCode];
			$orderDiscountId = $discount['DISCOUNT_ID'];
			$orderCouponId = $discount['COUPON_ID'];

			if (!isset($this->discountsCache[$orderDiscountId]))
			{
				$result->addError(new MainEntityEntityError(
					Loc::getMessage('BX_SALE_DISCOUNT_ERR_APPLY_WITHOUT_EXT_DISCOUNT'),
					self::ERROR_ID
				));
				return $result;
			}

			$orderApplication = (
				!empty($this->discountsCache[$orderDiscountId]['APPLICATION'])
				? $this->discountsCache[$orderDiscountId]['APPLICATION']
				: null
			);
			if (!empty($orderApplication) && !$this->loadDiscountModules($this->discountsCache[$orderDiscountId]['MODULES']))
				$orderApplication = null;

			if (!empty($orderApplication))
			{
				$this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT'] = (
					!empty($this->discountsCache[$orderDiscountId]['ACTIONS_DESCR_DATA'])
					? $this->discountsCache[$orderDiscountId]['ACTIONS_DESCR_DATA']
					: false
				);

				$applyProduct = null;
				eval('$applyProduct='.$orderApplication.';');
				if (is_callable($applyProduct))
					$applyProduct($this->orderData['BASKET_ITEMS'][$basketCode]);
				unset($applyProduct);

				if (!empty($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']))
				{
					$applyBlock[$basketCode][$index]['RESULT']['DESCR_DATA'] = $this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT'];
					$applyBlock[$basketCode][$index]['RESULT']['DESCR'] = $this->formatDescription($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']);
				}
				unset($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']);
			}
			unset($orderApplication);

			$disable = ($applyBlock[$basketCode][$index]['RESULT']['APPLY'] == 'N');
			if ($applyExist)
			{
				$applyDisable = !$this->getStatusApplyBasketDiscount($basketCode, $orderDiscountId, $orderCouponId);
				if ($applyDisable != $disable)
					$disable = $applyDisable;
				unset($applyDisable);
			}
			if ($disable)
			{
				$this->orderData['BASKET_ITEMS'][$basketCode] = $currentProduct;
				$applyBlock[$basketCode][$index]['RESULT']['APPLY'] = 'N';
			}
			else
			{
				$applyBlock[$basketCode][$index]['RESULT']['APPLY'] = 'Y';
				$this->orderData['BASKET_ITEMS'][$basketCode]['ACTION_APPLIED'] = 'Y';
			}
			unset($disable, $currentProduct);

		}
		unset($index, $discount);
	}
	unset($basketCode);

	unset($applyBlock);

	return $result;
}