• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/discount/migration/orderdiscountmigrator.php
  • Класс: BitrixSaleDiscountMigrationOrderDiscountMigrator
  • Вызов: OrderDiscountMigrator::migrateDiscount
static function migrateDiscount($orderId, array &$data)
{
	if (self::$catalogIncluded === null)
		self::$catalogIncluded = MainLoader::includeModule('catalog');
	if (!self::$catalogIncluded)
		return false;

	$discountData = array(
		'COUPON' => '',
		'NAME' => '',
		'DISCOUNT_ID' => 0
	);
	if ($data['DISCOUNT_NAME'] != '')
	{
		$discountName = array();
		if (preg_match('/^[(d+)][ ](.+)$/', $data['DISCOUNT_NAME'], $discountName) == 1)
		{
			$discountData['NAME'] = $discountName[2];
			$discountData['DISCOUNT_ID'] = $discountName[1];
		}
		unset($discountName);
	}
	if ($data['DISCOUNT_COUPON'] != '')
	{
		$discountData['COUPON'] = $data['DISCOUNT_COUPON'];
		if (!self::checkMigrateCoupon($discountData['COUPON']))
			return false;

		if ($discountData['DISCOUNT_ID'] == 0)
		{
			$discountData['NAME'] = self::$migrateCouponsCache[$discountData['COUPON']]['DISCOUNT_NAME'];
			$discountData['DISCOUNT_ID'] = self::$migrateCouponsCache[$discountData['COUPON']]['DISCOUNT_ID'];
		}
		else
		{
			if (
				self::$migrateCouponsCache[$discountData['COUPON']]['TYPE'] != SaleInternalsDiscountCouponTable::TYPE_ARCHIVED
				&& self::$migrateCouponsCache[$discountData['COUPON']]['DISCOUNT_ID'] >= 0
				&& $discountData['DISCOUNT_ID'] != self::$migrateCouponsCache[$discountData['COUPON']]['DISCOUNT_ID']
			)
				$discountData['DISCOUNT_ID'] = 0;
		}
	}
	if ($discountData['DISCOUNT_ID'] == 0)
	{
		if ($discountData['COUPON'] == '')
			return false;
		self::createEmptyDiscount($discountData);
	}
	else
	{
		self::checkMigrateDiscount($discountData);
	}
	$saveResult = self::saveMigrateDiscount($discountData);
	if (!$saveResult->isSuccess())
		return false;

	$migrateDiscountData = $saveResult->getData();
	unset($saveResult);
	$orderDiscountId = $migrateDiscountData['ORDER_DISCOUNT_ID'];
	$orderCouponId = 0;
	$discountDescr = current($migrateDiscountData['ACTIONS_DESCR']['BASKET']);
	if ($discountData['COUPON'] != '')
	{
		$couponData = self::$migrateCouponsCache[$discountData['COUPON']];
		$couponData['ORDER_ID'] = $orderId;
		$couponData['ORDER_DISCOUNT_ID'] = $migrateDiscountData['ORDER_DISCOUNT_ID'];
		$couponData['DATA']['DISCOUNT_ID'] = $migrateDiscountData['DISCOUNT_ID'];
		if (array_key_exists('DISCOUNT_ID', $couponData))
			unset($couponData['DISCOUNT_ID']);
		if (array_key_exists('DISCOUNT_NAME', $couponData))
			unset($couponData['DISCOUNT_NAME']);

		$saveResult = SaleOrderDiscount::saveCoupon($couponData);
		if (!$saveResult->isSuccess())
			return false;
		$migrateCoupon = $saveResult->getData();
		$orderCouponId = $migrateCoupon['ID'];
	}

	foreach ($data['ITEMS'] as $basketItem)
	{
		$applyDescr = $discountDescr;
		if ($basketItem['DISCOUNT_VALUE'] != '')
		{
			if ($applyDescr['TYPE'] == SaleDiscountFormatter::TYPE_SIMPLE)
			{
				$applyDescr['DESCR'] .= ' ('.$basketItem['DISCOUNT_VALUE'].')';
			}
			else
			{
				$valueData = array();
				if (preg_match('/^(|+|-)(d+|[.,]d+|d+[.,]d+)s?%$/', $basketItem['DISCOUNT_VALUE'], $valueData) == 1)
				{
					$applyDescr['RESULT_VALUE'] = (float)$basketItem['DISCOUNT_VALUE'];
					$applyDescr['RESULT_UNIT'] = SaleDiscountFormatter::VALUE_TYPE_PERCENT;
				}
				unset($valueData);
			}
		}
		$ruleRow = array(
			'MODULE_ID' => 'catalog',
			'ORDER_DISCOUNT_ID' => $orderDiscountId,
			'ORDER_ID' => $orderId,
			'ENTITY_TYPE' => SaleInternalsOrderRulesTable::ENTITY_TYPE_BASKET_ITEM,
			'ENTITY_ID' => $basketItem['ID'],
			'ENTITY_VALUE' => $basketItem['ID'],
			'COUPON_ID' => $orderCouponId,
			'APPLY' => 'Y'
		);
		$ruleDescr = array(
			'MODULE_ID' => 'catalog',
			'ORDER_DISCOUNT_ID' => $orderDiscountId,
			'ORDER_ID' => $orderId,
			'DESCR' => array($applyDescr)
		);
		$ruleResult = SaleInternalsOrderRulesTable::add($ruleRow);
		if ($ruleResult->isSuccess())
		{
			$ruleDescr['RULE_ID'] = $ruleResult->getId();
			$descrResult = SaleInternalsOrderRulesDescrTable::add($ruleDescr);
			if (!$descrResult->isSuccess())
				return false;
		}
		else
		{
			return false;
		}
		unset($ruleResult);
	}
	unset($basketItem);

	return true;
}