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

	if ($this->useOnlySaleDiscounts())
		return $result;
	if (empty($applyCoupons))
		return $result;

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

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

	$applyExist = $this->isBasketApplyResultExist();

	$basketCodeList = $this->getBasketCodes(false);
	foreach ($basketCodeList as &$basketCode)
	{
		if (array_key_exists($basketCode, $applyBlock))
			unset($applyBlock[$basketCode]);
		if (empty($applyCoupons[$basketCode]))
			continue;

		$itemData = array(
			'MODULE_ID' => $this->orderData['BASKET_ITEMS'][$basketCode]['MODULE'],
			'PRODUCT_ID' => $this->orderData['BASKET_ITEMS'][$basketCode]['PRODUCT_ID'],
			'BASKET_ID' => $basketCode
		);
		$this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE_TMP'] = $this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE'];
		$this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE'] = $this->orderData['BASKET_ITEMS'][$basketCode]['PRICE'];
		foreach ($applyCoupons[$basketCode] as $index => $discount)
		{
			$discountResult = $this->convertDiscount($discount);
			if (!$discountResult->isSuccess())
			{
				$result->addErrors($discountResult->getErrors());
				unset($discountResult);
				return $result;
			}
			$orderDiscountId = $discountResult->getId();
			$discountData = $discountResult->getData();
			$applyCoupons[$basketCode][$index]['ORDER_DISCOUNT_ID'] = $orderDiscountId;

			if (empty($discount['COUPON']))
			{
				$result->addError(new MainEntityEntityError(
					Loc::getMessage('BX_SALE_DISCOUNT_ERR_DISCOUNT_WITHOUT_COUPON'),
					self::ERROR_ID
				));
				return $result;
			}
			$couponResult = $this->convertCoupon($discount['COUPON'], $orderDiscountId);
			if (!$couponResult->isSuccess())
			{
				$result->addErrors($couponResult->getErrors());
				unset($couponResult);
				return $result;
			}
			$orderCouponId = $couponResult->getId();

			$couponClassName::setApplyByProduct($itemData, array($orderCouponId));
			unset($couponResult);

			unset($discountData, $discountResult);
			if (!isset($applyBlock[$basketCode]))
				$applyBlock[$basketCode] = array();
			$applyBlock[$basketCode][$index] = array(
				'DISCOUNT_ID' => $orderDiscountId,
				'COUPON_ID' => $orderCouponId,
				'RESULT' => array(
					'APPLY' => 'Y',
					'DESCR' => false,
					'DESCR_DATA' => false
				)
			);

			$currentProduct = $this->orderData['BASKET_ITEMS'][$basketCode];
			$orderApplication = (
				!empty($this->discountsCache[$orderDiscountId]['APPLICATION'])
				? $this->discountsCache[$orderDiscountId]['APPLICATION']
				: 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']['BASKET'];
					$applyBlock[$basketCode][$index]['RESULT']['DESCR'] = $this->formatDescription($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']);
				}
				unset($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']);
			}
			unset($orderApplication);

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

	unset($applyBlock);

	return $result;
}