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

	/** @var DiscountCouponsManager $couponClassName */
	$couponClassName = $this->getDiscountCouponClassName();

	$this->orderData['DISCOUNT_RESULT'] = DiscountActions::getActionResult();
	if (!empty($this->orderData['DISCOUNT_RESULT']) && is_array($this->orderData['DISCOUNT_RESULT']))
		$stepResult = $this->getStepResult($this->orderData);
	else
		$stepResult = DiscountResultCompatibleFormat::getStepResult(
			$this->orderData, $this->currentStep['oldData']
		);
	$applied = !empty($stepResult);

	$orderDiscountId = 0;
	$orderCouponId = '';

	if ($applied)
	{
		$this->correctStepResult($stepResult, $this->discountsCache[$this->currentStep['discountId']]);

		$orderDiscountId = $this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['DISCOUNT_ID'];
		$orderCouponId = $this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['COUPON_ID'];
	}

	unset($this->orderData['DISCOUNT_RESULT']);

	if ($applied)
	{
		if (
			(
				!empty($this->applyResult['DISCOUNT_LIST'][$orderDiscountId])
				&& $this->applyResult['DISCOUNT_LIST'][$orderDiscountId] == 'N'
			)
			||
			(
				$orderCouponId != ''
				&& !empty($this->applyResult['COUPON_LIST'][$orderCouponId])
				&& $this->applyResult['COUPON_LIST'][$orderCouponId] == 'N'
			)
		)
		{
			$this->orderData = $this->currentStep['oldData'];
			if (!empty($stepResult['BASKET']))
			{
				foreach ($stepResult['BASKET'] as &$basketItem)
					$basketItem['APPLY'] = 'N';
				unset($basketItem);
			}
			if (!empty($stepResult['DELIVERY']))
				$stepResult['DELIVERY']['APPLY'] = 'N';
		}
		else
		{
			if (!empty($this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['RESULT']))
			{
				$existDiscountResult = $this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['RESULT'];
				if (!empty($existDiscountResult['BASKET']))
				{
					$basketCodeList = $this->getBasketCodes(false);
					if (!empty($basketCodeList))
					{
						foreach ($basketCodeList as &$basketCode)
						{
							if ($this->isCustomPriceByCode($basketCode))
								continue;
							if (isset($existDiscountResult['BASKET'][$basketCode]))
							{
								$disable = ($existDiscountResult['BASKET'][$basketCode]['APPLY'] == 'N');
								if (isset($this->applyResult['BASKET'][$basketCode][$orderDiscountId]))
								{
									$applyDisable = ($this->applyResult['BASKET'][$basketCode][$orderDiscountId] == 'N');
									if ($disable != $applyDisable)
										$disable = $applyDisable;
									unset($applyDisable);
								}
								if ($disable)
								{
									$stepResult['BASKET'][$basketCode]['APPLY'] = 'N';
									$this->orderData['BASKET_ITEMS'][$basketCode] = $this->currentStep['oldData']['BASKET_ITEMS'][$basketCode];
								}
								else
								{
									$stepResult['BASKET'][$basketCode]['APPLY'] = 'Y';
									$this->orderData['BASKET_ITEMS'][$basketCode]['ACTION_APPLIED'] = 'Y';
								}
							}
						}
						unset($disable, $basketCode);
					}
				}
				if (!empty($existDiscountResult['DELIVERY']))
				{
					$disable = ($existDiscountResult['DELIVERY']['APPLY'] == 'N');
					if (!empty($this->applyResult['DELIVERY'][$orderDiscountId]))
					{
						$applyDisable = ($this->applyResult['DELIVERY'][$orderDiscountId] == 'N');
						if ($disable != $applyDisable)
							$disable = $applyDisable;
						unset($applyDisable);
					}
					if ($disable)
					{
						$this->orderData['PRICE_DELIVERY'] = $this->currentStep['oldData']['PRICE_DELIVERY'];
						$this->orderData['PRICE_DELIVERY_DIFF'] = $this->currentStep['oldData']['PRICE_DELIVERY_DIFF'];
						$stepResult['DELIVERY']['APPLY'] = 'N';
					}
					else
					{
						$stepResult['DELIVERY']['APPLY'] = 'Y';
					}
					unset($disable);
				}
			}
		}
	}

	if ($applied && $orderCouponId != '')
	{
		$couponApply = $couponClassName::setApply($this->couponsCache[$orderCouponId]['COUPON'], $stepResult);
		unset($couponApply);
	}

	if ($applied)
	{
		$this->mergeDiscountActionResult($this->currentStep['discountIndex'], $stepResult);
	}
	else
	{
		if (!empty($this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]))
			$this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['RESULT'] = array();
	}

	return $result;
}