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

	DiscountActions::clearApplyCounter();

	$discount = (
		isset($this->currentStep['discountIndex'])
		? $this->discountsCache[$this->currentStep['discountId']]
		: $this->currentStep['discount']
	);
	if (isset($this->currentStep['discountIndex']))
	{
		if (!empty($discount['APPLICATION']) && !$this->loadDiscountModules($this->discountsCache[$this->currentStep['discountId']]['MODULES']))
		{
			$discount['APPLICATION'] = null;
			$result->addError(new MainEntityEntityError(
				Loc::getMessage('BX_SALE_DISCOUNT_ERR_SALE_DISCOUNT_MODULES_ABSENT'),
				self::ERROR_ID
			));
		}
	}

	if (!empty($discount['APPLICATION']))
	{
		$executeKey = self::getExecuteFieldName('APPLICATION');
		if (!array_key_exists($executeKey, $discount))
		{
			$discount[$executeKey] = null;

			$evalCode = '$discount["'.$executeKey.'"] = '.$discount['APPLICATION'].';';
			if (PHP_MAJOR_VERSION >= 7)
			{
				try
				{
					eval($evalCode);
				}
				catch (ParseError $e)
				{
					$this->showAdminError();
				}
			}
			else
			{
				eval($evalCode);
			}
			unset($evalCode);
		}
		if (is_callable($discount[$executeKey]))
		{
			$currentUseMode = $this->getUseMode();
			$this->currentStep['oldData'] = $this->orderData;
			if (
				$currentUseMode == self::USE_MODE_APPLY
				|| $currentUseMode == self::USE_MODE_MIXED
			)
			{
				$discountStoredActionData = $this->getDiscountStoredActionData($this->currentStep['discountId']);
				if (!empty($discountStoredActionData) && is_array($discountStoredActionData))
					DiscountActions::setStoredData($discountStoredActionData);
				unset($discountStoredActionData);
			}
			$discount[$executeKey]($this->orderData);
			switch ($currentUseMode)
			{
				case self::USE_MODE_COUPONS:
				case self::USE_MODE_FULL:
					$actionsResult = $this->calculateFullSaleDiscountResult();
					break;
				case self::USE_MODE_APPLY:
				case self::USE_MODE_MIXED:
					$actionsResult = $this->calculateApplySaleDiscountResult();
					break;
				default:
					$actionsResult = new Result;

			}
			if (!$actionsResult->isSuccess())
				$result->addErrors($actionsResult->getErrors());
			unset($actionsResult);
			unset($currentUseMode);
		}
	}
	unset($discount);
	DiscountActions::clearAction();

	return $result;
}