• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/discount/migration/orderdiscountmigrator.php
  • Класс: BitrixSaleDiscountMigrationOrderDiscountMigrator
  • Вызов: OrderDiscountMigrator::processing
static function processing(array $order)
{
	static $useBasePrice = null;
	if ($useBasePrice === null)
		$useBasePrice = (string)MainConfigOption::get('sale', 'get_discount_percent_from_base_price');

	$process = true;
	$result = new SaleResult();

	if (empty($order['ID']) || (int)$order['ID'] <= 0)
	{
		$process = false;
		$result->addError(new MainEntityEntityError(
			Loc::getMessage('SALE_ORDER_DISCOUNT_MIGRATOR_ERR_EMPTY_ORDER_ID'),
			self::ERROR_ID
		));
	}

	$catalogOrder = false;
	$basketData = array();
	if ($process)
	{
		$order['ID'] = (int)$order['ID'];
		$basePrices = array();

		$basketIterator = SaleInternalsBasketTable::getList(array(
			'select' => array(
				'ID', 'DISCOUNT_COUPON', 'DISCOUNT_NAME', 'DISCOUNT_VALUE',
				'MODULE', 'PRICE', 'DISCOUNT_PRICE', 'CURRENCY', 'SET_PARENT_ID', 'TYPE'
			),
			'filter' => array('=ORDER_ID' => $order['ID'])
		));
		while ($basket = $basketIterator->fetch())
		{
			$basket['ID'] = (int)$basket['ID'];
			$basket['MODULE'] = (string)$basket['MODULE'];
			$basket['DISCOUNT_COUPON'] = trim((string)$basket['DISCOUNT_COUPON']);
			$basket['DISCOUNT_NAME'] = trim((string)$basket['DISCOUNT_NAME']);
			$basket['SET_PARENT_ID'] = (int)$basket['SET_PARENT_ID'];
			$basket['TYPE'] = (int)$basket['TYPE'];
			if ($basket['MODULE'] == 'catalog')
			{
				$basePrices[$basket['ID']] = array(
					'BASE_PRICE' => $basket['PRICE'] + $basket['DISCOUNT_PRICE'],
					'BASE_PRICE_CURRENCY' => $basket['CURRENCY']
				);
			}

			if ($basket['MODULE'] != 'catalog' || ($basket['DISCOUNT_NAME'] == '' && $basket['DISCOUNT_COUPON'] == ''))
				continue;
			if ($basket['SET_PARENT_ID'] > 0 && $basket['TYPE'] <= 0)
				continue;

			$catalogOrder = true;
			$hash = md5($basket['DISCOUNT_NAME'].'|'.$basket['DISCOUNT_COUPON']);
			if (!isset($basketData[$hash]))
				$basketData[$hash] = array(
					'DISCOUNT_NAME' => $basket['DISCOUNT_NAME'],
					'DISCOUNT_COUPON' => $basket['DISCOUNT_COUPON'],
					'ITEMS' => array()
				);
			$basketData[$hash]['ITEMS'][$basket['ID']] = $basket;
		}
		unset($basket, $basketIterator);
	}

	if ($process && $catalogOrder)
	{
		SaleOrderDiscount::setManagerConfig(array(
			'CURRENCY' => $order['CURRENCY'],
			'SITE_ID' => $order['LID'],
			'USE_BASE_PRICE' => $useBasePrice
		));
		foreach ($basketData as $row)
		{
			if (!self::migrateDiscount($order['ID'], $row))
			{
				$process = false;
				$result->addError(new MainEntityEntityError(
					Loc::getMessage('SALE_ORDER_DISCOUNT_MIGRATOR_ERR_SAVE_MIGRATE_DISCOUNT'),
					self::ERROR_ID
				));
				break;
			}
		}
		unset($row);
	}
	unset($basketData);

	SaleInternalsOrderDiscountDataTable::clearByOrder($order['ID']);
	if ($process)
	{
		if (!empty($basePrices))
		{
			foreach ($basePrices as $basketId => $price)
			{
				$fields = array(
					'ORDER_ID' => $order['ID'],
					'ENTITY_TYPE' => SaleInternalsOrderDiscountDataTable::ENTITY_TYPE_BASKET_ITEM,
					'ENTITY_ID' => $basketId,
					'ENTITY_VALUE' => $basketId,
					'ENTITY_DATA' => $price,
				);
				$operationResult = SaleInternalsOrderDiscountDataTable::add($fields);
				if (!$operationResult->isSuccess())
				{
					$process = false;
					$result->addErrors($operationResult->getErrors());
				}
				unset($operationResult);
			}
			unset($basketId, $price);
		}
	}

	if ($process)
	{
		$fields = array(
			'ORDER_ID' => $order['ID'],
			'ENTITY_TYPE' => SaleInternalsOrderDiscountDataTable::ENTITY_TYPE_ORDER,
			'ENTITY_ID' => $order['ID'],
			'ENTITY_VALUE' => $order['ID'],
			'ENTITY_DATA' => array(
				'OLD_ORDER' => 'Y'
			)
		);
		$operationResult = SaleInternalsOrderDiscountDataTable::add($fields);
		if (!$operationResult->isSuccess())
		{
			$process = false;
			$result->addErrors($operationResult->getErrors());
		}
		unset($operationResult);
	}
	unset($process);

	return $result;
}