- Модуль: 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);
}