• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/discount/actions.php
  • Класс: BitrixSaleDiscountActions
  • Вызов: Actions::applyToDelivery
static function applyToDelivery(array &$order, array $action)
{
	static::increaseApplyCounter();

	if (!isset($action['VALUE']) || !isset($action['UNIT']))
		return;
	if ($action['UNIT'] != self::VALUE_TYPE_PERCENT && $action['UNIT'] != self::VALUE_TYPE_FIX)
		return;

	$orderCurrency = static::getCurrency();
	$unit = (string)$action['UNIT'];
	$value = (float)$action['VALUE'];
	$currency = (isset($action['CURRENCY']) ? $action['CURRENCY'] : $orderCurrency);
	$maxBound = false;
	if ($unit == self::VALUE_TYPE_FIX && $value < 0)
		$maxBound = (isset($action['MAX_BOUND']) && $action['MAX_BOUND'] == 'Y');

	$actionDescription = array(
		'ACTION_TYPE' => Formatter::TYPE_VALUE,
		'VALUE' => abs($value),
		'VALUE_ACTION' => (
			$value < 0
			? Formatter::VALUE_ACTION_DISCOUNT
			: Formatter::VALUE_ACTION_EXTRA
		)
	);
	if ($maxBound)
		$actionDescription['ACTION_TYPE'] = Formatter::TYPE_MAX_BOUND;

	switch ($unit)
	{
		case self::VALUE_TYPE_PERCENT:
			$actionDescription['VALUE_TYPE'] = Formatter::VALUE_TYPE_PERCENT;
			$value = ($order['PRICE_DELIVERY'] * $value) / 100;
			break;
		case self::VALUE_TYPE_FIX:
			$actionDescription['VALUE_TYPE'] = Formatter::VALUE_TYPE_CURRENCY;
			$actionDescription['VALUE_UNIT'] = $currency;
			if ($currency != $orderCurrency)
				$value = CCurrencyRates::ConvertCurrency($value, $currency, $orderCurrency);
			break;
	}
	static::setActionDescription(self::RESULT_ENTITY_DELIVERY, $actionDescription);

	if (isset($order['CUSTOM_PRICE_DELIVERY']) && $order['CUSTOM_PRICE_DELIVERY'] == 'Y')
		return;
	if (
		!isset($order['PRICE_DELIVERY'])
		|| (
			static::roundZeroValue($order['PRICE_DELIVERY']) == 0
			&& $actionDescription['VALUE_ACTION'] == Formatter::VALUE_ACTION_DISCOUNT
		)
	)
		return;

	$value = static::roundValue($value, $order['CURRENCY']);
	$value = static::roundZeroValue($value);
	if ($value == 0)
		return;

	$resultValue = static::roundZeroValue($order['PRICE_DELIVERY'] + $value);
	if ($maxBound && $resultValue < 0)
	{
		$resultValue = 0;
		$value = -$order['PRICE_DELIVERY'];
	}

	if ($resultValue < 0)
		return;

	if (!isset($order['PRICE_DELIVERY_DIFF']))
		$order['PRICE_DELIVERY_DIFF'] = 0;
	$order['PRICE_DELIVERY_DIFF'] -= $value;
	$order['PRICE_DELIVERY'] = $resultValue;

	$actionDescription['RESULT_VALUE'] = abs($value);
	$actionDescription['RESULT_UNIT'] = $orderCurrency;

	static::setActionResult(self::RESULT_ENTITY_DELIVERY, $actionDescription);
	unset($actionDescription);
}