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

	$extResult = ($extResult === true);

	$process = true;

	$internal = null;
	$discountData = false;
	$fields = false;
	$emptyData = array(
		'ID' => 0,
		'DISCOUNT_ID' => 0,
		'NAME' => '',
		'ORDER_DISCOUNT_ID' => 0,
		'ORDER_COUPON_ID' => 0,
		'USE_COUPONS' => '',
		'LAST_DISCOUNT' => '',
		'MODULE_ID' => '',
		'EDIT_PAGE_URL' => '',
		'ACTIONS_DESCR' => array()
	);
	if ($extResult)
	{
		$emptyData['RAW_DATA'] = array();
		$emptyData['PREPARED_DATA'] = array();
	}
	$resultData = $emptyData;

	$config = static::getManagerConfig();

	if (empty($config))
	{
		$process = false;
		$result->addError(new MainEntityEntityError(
			Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_EMPTY_MANAGER_PARAMS'),
			self::ERROR_ID
		));
	}

	if (empty($discount) || empty($discount['MODULE_ID']))
	{
		$process = false;
		$result->addError(new MainEntityEntityError(
			Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_EMPTY_DISCOUNT'),
			self::ERROR_ID
		));
	}

	if ($process)
	{
		if (!static::isNativeModule($discount['MODULE_ID']))
		{
			if (!static::checkDiscountProvider($discount['MODULE_ID']))
			{
				$process = false;
				$result->addError(new MainEntityEntityError(
					Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_DISCOUNT_MODULE'),
					self::ERROR_ID
				));
			}
			else
			{
				$discountData = static::executeDiscountProvider(
					array('MODULE_ID' => $discount['MODULE_ID'], 'METHOD' => self::PROVIDER_ACTION_PREPARE_DISCOUNT),
					array($discount, $config)
				);
			}
		}
		else
		{
			$discountData = static::prepareData($discount);
		}
		if (empty($discountData) || !is_array($discountData))
		{
			$process = false;
			$result->addError(new MainEntityEntityError(
				Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_PREPARE_DISCOUNT'),
				self::ERROR_ID
			));
		}
	}

	if ($process)
	{
		$fields = static::normalizeDiscountFields($discountData);
		if (empty($fields) || !is_array($fields))
		{
			$process = false;
			$result->addError(new MainEntityEntityError(
				Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_PREPARE_DISCOUNT'),
				self::ERROR_ID
			));
		}
		elseif ($fields['DISCOUNT_HASH'] === null)
		{
			$process = false;
			$result->addError(new MainEntityEntityError(
				Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_BAD_DISCOUNT_HASH'),
				self::ERROR_ID
			));
		}
	}

	if ($process)
	{
		$existDiscount = static::searchDiscount($fields['DISCOUNT_HASH']);
		if ($existDiscount === null)
		{
			/** @var Result $internalResult */
			$internalResult = static::addDiscount($fields, $discountData);
			if ($internalResult->isSuccess())
			{
				$existDiscount = static::searchDiscount($fields['DISCOUNT_HASH']);
			}
			else
			{
				$process = false;
				$result->addErrors($internalResult->getErrors());
			}
			unset($internalResult);
		}
		if ($existDiscount !== null)
		{
			$resultData = $existDiscount;
			$result->setId($resultData['ID']);
		}
	}

	if ($process)
	{
		$resultData['EDIT_PAGE_URL'] = $discountData['EDIT_PAGE_URL'];
		if ($extResult)
		{
			$resultData['RAW_DATA'] = $discount;
			$resultData['PREPARED_DATA'] = $discountData;
		}
		$result->setData($resultData);
	}
	unset($resultData, $process);

	return $result;
}