• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/orderdiscountbase.php
  • Класс: BitrixSaleOrderDiscountBase
  • Вызов: OrderDiscountBase::loadResultFromDb
static function loadResultFromDb($order, array $basketList = [], array $basketData = [])
{
	static::init();
	$result = new Result;

	/** @var Discount $discountClassName */
	$discountClassName = static::getDiscountClassName();
	$emptyApplyBlock = $discountClassName::getEmptyApplyBlock();

	$order = (int)$order;
	if ($order <= 0)
	{
		$result->addError(new MainEntityEntityError(
			Loc::getMessage('SALE_ORDER_DISCOUNT_BAD_ORDER_ID'),
			self::ERROR_ID
		));
		return $result;
	}
	$resultData = [
		'APPLY_BLOCKS' => [],
		'DISCOUNT_LIST' => [],
		'COUPON_LIST' => [],
		'STORED_ACTION_DATA' => []
	];

	$applyBlocks = [];

	$orderDiscountIndex = [];
	$orderDiscountLink = [];

	$discountList = [];
	$discountSort = [];
	$couponList = [];

	$resultData['COUPON_LIST'] = static::loadCouponsFromDb($order);
	if (!empty($resultData['COUPON_LIST']))
	{
		foreach ($resultData['COUPON_LIST'] as $coupon)
			$couponList[$coupon['ID']] = $coupon['COUPON'];
		unset($coupon);
	}

	$ruleIterator = static::getResultIterator([
		'filter' => ['=ORDER_ID' => $order],
		'order' => ['ID' => 'ASC']
	]);
	while ($rule = $ruleIterator->fetch())
	{
		$rule['ID'] = (int)$rule['ID'];
		$rule['ORDER_DISCOUNT_ID'] = (int)$rule['ORDER_DISCOUNT_ID'];
		$rule['ORDER_COUPON_ID'] = (int)$rule['COUPON_ID'];
		$rule['ENTITY_ID'] = (int)$rule['ENTITY_ID'];

		if ($rule['ORDER_COUPON_ID'] > 0)
		{
			if (!isset($couponList[$rule['COUPON_ID']]))
			{
				$result->addError(new MainEntityEntityError(
					Loc::getMessage(
						'SALE_ORDER_DISCOUNT_ERR_RULE_COUPON_NOT_FOUND',
						array('#ID#' => $rule['ID'], '#COUPON_ID#' => $rule['COUPON_ID'])
					)
				));
			}
			else
			{
				$rule['COUPON_ID'] = $couponList[$rule['ORDER_COUPON_ID']];
			}
		}
		if (!isset($rule['RULE_DESCR_ID']))
			$rule['RULE_DESCR_ID'] = 0;
		$rule['RULE_DESCR_ID'] = (int)$rule['RULE_DESCR_ID'];

		$rule['APPLY_BLOCK_COUNTER'] = (int)$rule['APPLY_BLOCK_COUNTER'];
		$blockCounter = $rule['APPLY_BLOCK_COUNTER'];
		if (!isset($applyBlocks[$blockCounter]))
			$applyBlocks[$blockCounter] = $emptyApplyBlock;
		if (!isset($orderDiscountIndex[$blockCounter]))
			$orderDiscountIndex[$blockCounter] = 0;

		if (!isset($discountList[$rule['ORDER_DISCOUNT_ID']]))
		{
			$discountList[$rule['ORDER_DISCOUNT_ID']] = $rule['ORDER_DISCOUNT_ID'];
			$discountSort[] = $rule['ORDER_DISCOUNT_ID'];
		}

		if (static::isNativeModule($rule['MODULE_ID']))
		{
			$discountId = (int)$rule['ORDER_DISCOUNT_ID'];
			if (!isset($orderDiscountLink[$discountId]))
			{
				$applyBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]] = static::formatSaleRuleResult($rule);
				$orderDiscountLink[$discountId] = &$applyBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]];
				$orderDiscountIndex[$blockCounter]++;
			}

			$ruleItem = static::formatSaleItemRuleResult($rule);

			switch (static::getResultEntityFromInternal($rule['ENTITY_TYPE']))
			{
				case $discountClassName::ENTITY_BASKET_ITEM:
					$index = static::transferEntityCodeFromInternal($rule, $basketList);
					if ($index == '')
						continue 2;

					$ruleItem['BASKET_ID'] = static::transferEntityCodeFromInternal($rule, []);
					static::fillRuleProductFields($ruleItem, $basketData, $index);
					if (!isset($orderDiscountLink[$discountId]['RESULT']['BASKET']))
						$orderDiscountLink[$discountId]['RESULT']['BASKET'] = [];
					$orderDiscountLink[$discountId]['RESULT']['BASKET'][$index] = $ruleItem;
					if ($ruleItem['ACTION_BLOCK_LIST'] === null)
						$orderDiscountLink[$discountId]['ACTION_BLOCK_LIST'] = false;
					break;
				case $discountClassName::ENTITY_DELIVERY:
					if (!isset($orderDiscountLink[$discountId]['RESULT']['DELIVERY']))
						$orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = [];
					$ruleItem['DELIVERY_ID'] = static::transferEntityCodeFromInternal($rule, []);
					$orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = $ruleItem;
					break;
			}
			unset($ruleItem, $discountId);
		}
		else
		{
			if (
				$rule['ENTITY_ID'] <= 0
				|| static::getResultEntityFromInternal($rule['ENTITY_TYPE']) != $discountClassName::ENTITY_BASKET_ITEM
			)
				continue;

			$index = static::transferEntityCodeFromInternal($rule, $basketList);
			if ($index == '')
				continue;

			$ruleResult = static::formatBasketRuleResult($rule);
			static::fillRuleProductFields($ruleResult, $basketData, $index);

			if (!isset($applyBlocks[$blockCounter]['BASKET'][$index]))
				$applyBlocks[$blockCounter]['BASKET'][$index] = [];
			$applyBlocks[$blockCounter]['BASKET'][$index][] = $ruleResult;

			unset($ruleResult);
		}
	}
	unset($rule, $ruleIterator);
	unset($couponList);
	unset($orderDiscountLink, $orderDiscountIndex);

	if (!empty($discountList))
	{
		$resultData['DISCOUNT_LIST'] = static::loadOrderDiscountFromDb($discountList, $discountSort);
		if ($resultData['DISCOUNT_LIST'] === null)
			$resultData['DISCOUNT_LIST'] = [];
	}
	unset($discountSort, $discountList);

	$actionsData = static::loadOrderStoredDataFromDb(
		$order,
		self::STORAGE_TYPE_DISCOUNT_ACTION_DATA
	);
	if ($actionsData !== null)
		$resultData['STORED_ACTION_DATA'] = $actionsData;
	unset($actionsData);

	$dataIterator = static::getRoundResultIterator([
		'select' => ['*'],
		'filter' => [
			'=ORDER_ID' => $order,
			'=ENTITY_TYPE' => static::getRoundEntityInternal($discountClassName::ENTITY_BASKET_ITEM)
		]
	]);
	while ($data = $dataIterator->fetch())
	{
		$data['APPLY_BLOCK_COUNTER'] = (int)$data['APPLY_BLOCK_COUNTER'];
		$blockCounter = $data['APPLY_BLOCK_COUNTER'];
		if (!isset($applyBlocks[$blockCounter]))
			$applyBlocks[$blockCounter] = $emptyApplyBlock;
		$basketCode = static::transferEntityCodeFromInternal($data, $basketList);
		if ($basketCode == '')
			continue;

		$applyBlocks[$blockCounter]['BASKET_ROUND'][$basketCode] = array(
			'RULE_ID' => (int)$data['ID'],
			'APPLY' => $data['APPLY'],
			'ROUND_RULE' => $data['ROUND_RULE']
		);
		unset($basketCode, $blockCounter);
	}
	unset($data, $dataIterator);

	if (!empty($applyBlocks))
		ksort($applyBlocks);

	$resultData['APPLY_BLOCKS'] = $applyBlocks;
	unset($applyBlocks);

	$result->setData($resultData);
	unset($resultData);

	unset($emptyApplyBlock, $discountClassName);

	return $result;
}