• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/archive/recovery/firstschemebuilder.php
  • Класс: BitrixSaleArchiveRecoveryFirstSchemeBuilder
  • Вызов: FirstSchemeBuilder::riseDiscount
protected function riseDiscount($discountData)
{
	$discountResultList = array();

	$resultData = array(
		'BASKET' => array(),
		'ORDER' => array(),
		'APPLY_BLOCKS' => array(),
		'DISCOUNT_LIST' => array(),
		'DISCOUNT_MODULES' => array(),
		'COUPON_LIST' => array(),
		'SHIPMENTS_ID' => array(),
		'DATA' => array()
	);

	$resultData['DATA'] = $this->prepareDiscountOrderData($discountData);

	$orderDiscountData = $resultData['DATA']['ORDER'];

	$orderDiscountIndex =
	$appliedBlocks =
	$orderDiscountLink =
	$couponAppliedList = [];

	foreach ($discountData['RULES_DATA'] as $rule)
	{
		$discountList[] = $rule["DISCOUNT_DATA"];

		if ($rule['APPLY_BLOCK_COUNTER'] < 0)
			continue;

		if ($rule['APPLY'] === 'Y'	&& (int)$rule['COUPON_ID'] > 0)
		{
			$couponAppliedList[] = (int)$rule['COUPON_ID'];
		}

		$blockCounter = $rule['APPLY_BLOCK_COUNTER'];

		if (!isset($orderDiscountIndex[$blockCounter]))
			$orderDiscountIndex[$blockCounter] = 0;

		if (!isset($appliedBlocks[$blockCounter]))
		{
			$appliedBlocks[$blockCounter] = array(
				'BASKET' => array(),
				'BASKET_ROUND' => array(),
				'ORDER' => array(),
				'ORDER_ROUND' => array()
			);
		}

		if ($rule['MODULE_ID'] == 'sale')
		{
			$orderDiscountId = (int)$rule['ORDER_DISCOUNT_ID'];
			$orderDiscountItem = $orderDiscountLink[$orderDiscountId];
			if (!isset($orderDiscountItem))
			{
				$appliedBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]] = array(
					'ORDER_ID' => $rule['ORDER_ID'],
					'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'],
					'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'],
					'COUPON_ID' => ($rule['COUPON_ID'] > 0 ? $rule['COUPON_ID'] : ''),
					'RESULT' => array(),
					'ACTION_BLOCK_LIST' => true
				);
				$orderDiscountItem = &$appliedBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]];
				$orderDiscountIndex[$blockCounter]++;
			}

			$ruleItem = array(
				'RULE_ID' => $rule['ID'],
				'APPLY' => $rule['APPLY'],
				'RULE_DESCR_ID' => $rule['RULE_DESCR_ID'],
				'ACTION_BLOCK_LIST' => (!empty($rule['ACTION_BLOCK_LIST']) && is_array($rule['ACTION_BLOCK_LIST']) ? $rule['ACTION_BLOCK_LIST'] : null)
			);
			
			if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR']))
			{
				$ruleItem['DESCR_DATA'] = $rule['RULE_DESCR'];
				$ruleItem['DESCR'] = SaleOrderDiscountManager::formatArrayDescription($rule['RULE_DESCR']);
				$ruleItem['DESCR_ID'] = $rule['RULE_DESCR_ID'];
			}

			switch ($rule['ENTITY_TYPE'])
			{
				case InternalsOrderRulesTable::ENTITY_TYPE_BASKET_ITEM:
					$ruleItem['BASKET_ID'] = $rule['ENTITY_ID'];
					$index = $rule['ENTITY_ID'];
					if (!isset($orderDiscountItem['RESULT']['BASKET']))
						$orderDiscountItem['RESULT']['BASKET'] = array();

					$orderDiscountItem['RESULT']['BASKET'][$index] = $ruleItem;
					if ($ruleItem['ACTION_BLOCK_LIST'] === null)
						$orderDiscountItem['ACTION_BLOCK_LIST'] = false;

					$discountResultList['BASKET'][$ruleItem['BASKET_ID']][] = array(
						'DISCOUNT_ID' => $orderDiscountItem['DISCOUNT_ID'],
						'COUPON_ID' => $orderDiscountItem['COUPON_ID'],
						'APPLY' => $ruleItem['APPLY'],
						'DESCR' => $ruleItem['DESCR']
					);
					break;

				case InternalsOrderRulesTable::ENTITY_TYPE_DELIVERY:
					if (!isset($orderDiscountItem['RESULT']['DELIVERY']))
						$orderDiscountItem['RESULT']['DELIVERY'] = array();

					$ruleItem['DELIVERY_ID'] = ($rule['ENTITY_ID'] > 0 ? $rule['ENTITY_ID'] : (string)$rule['ENTITY_VALUE']);
					$orderDiscountItem['RESULT']['DELIVERY'] = $ruleItem;

					$discountResultList['DELIVERY'][] = array(
						'DISCOUNT_ID' => $orderDiscountItem['DISCOUNT_ID'],
						'COUPON_ID' => $orderDiscountItem['COUPON_ID'],
						'APPLY' => $orderDiscountItem['RESULT']['DELIVERY']['APPLY'],
						'DESCR' => $orderDiscountItem['RESULT']['DELIVERY']['DESCR'][0],
						'DELIVERY_ID' => $orderDiscountItem['RESULT']['DELIVERY']['DELIVERY_ID']
					);

					foreach ($orderDiscountData as $data)
					{
						if ((int)$data['DELIVERY_ID'] == (int)$orderDiscountItem['RESULT']['DELIVERY']['DELIVERY_ID'])
							$resultData['SHIPMENTS_ID'][] = (int)$data['SHIPMENT_ID'];
					}
					break;
			}

			$orderDiscountLink[$orderDiscountId] = $orderDiscountItem;
			unset($ruleItem, $orderDiscountId);
		}
		else
		{
			if ($rule['ENTITY_ID'] <= 0 || $rule['ENTITY_TYPE'] != InternalsOrderRulesTable::ENTITY_TYPE_BASKET_ITEM)
				continue;

			$index = $rule['ENTITY_ID'];

			$ruleResult = array(
				'BASKET_ID' => $rule['ENTITY_ID'],
				'RULE_ID' => $rule['ID'],
				'ORDER_ID' => $rule['ORDER_ID'],
				'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'],
				'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'],
				'COUPON_ID' => ($rule['ORDER_COUPON_ID'] > 0 ? $rule['COUPON_ID'] : ''),
				'RESULT' => array(
					'APPLY' => $rule['APPLY']
				),
				'RULE_DESCR_ID' => $rule['RULE_DESCR_ID'],
				'ACTION_BLOCK_LIST' => (isset($rule['ACTION_BLOCK_LIST']) ? $rule['ACTION_BLOCK_LIST'] : null)
			);

			if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR']))
			{
				$ruleResult['RESULT']['DESCR_DATA'] = $rule['RULE_DESCR'];
				$ruleResult['RESULT']['DESCR'] = SaleOrderDiscountManager::formatArrayDescription($rule['RULE_DESCR']);
				$ruleResult['DESCR_ID'] = $rule['RULE_DESCR_ID'];
			}

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

			$discountResultList['BASKET'][$index][] = array(
				'DISCOUNT_ID' => $ruleResult['DISCOUNT_ID'],
				'COUPON_ID' => $ruleResult['COUPON_ID'],
				'APPLY' => $ruleResult['RESULT']['APPLY'],
				'DESCR' => $ruleResult['RESULT']['DESCR']
			);

			unset($ruleResult);
		}
	}

	$resultData['APPLY_BLOCKS'] = $appliedBlocks;

	$resultData['COUPON_LIST'] = is_array($discountData['COUPON_LIST']) ? $discountData['COUPON_LIST'] : [];
	foreach ($resultData['COUPON_LIST'] as &$coupon)
	{
		if (in_array((int)$coupon['ID'], $couponAppliedList))
		{
			$coupon['APPLY'] = 'Y';
			$coupon['JS_STATUS'] = 'APPLYED';
		}
	}

	$resultData['PRICES'] = $this->prepareDiscountPrices();
	$resultData['RESULT'] = $this->prepareDiscountResult($discountResultList);

	if (!empty($discountList))
	{
		$resultData['DISCOUNT_LIST'] = $this->prepareDiscountList($discountList, $resultData['RESULT']);
	}

	$this->order->setDiscountData($resultData);
	return;
}