Это тот же самый Sale\Discount\Actions::applyToBasket только с учетом моих доппараметров
if(!empty($action0['dopparam']['PROC'])){
$value = '-'.(float)$action0['dopparam']['PROC'];
}
Скрытый текст |
---|
[CODE] /** * Basket action. * * @param array &$order Order data. * @param array $action Action detail * keys are case sensitive: * <ul> * <li>float|int VALUE Discount value. * <li>char UNIT Discount type. * <li>string CURRENCY Currency discount (optional). * <li>char MAX_BOUND Max bound. * </ul>. * @param callable $filter Filter for basket items. * @return void */ public static function applyToBasket(array &$order, $action0, $filter) { if(!is_array($action0)){ $action=$action0($order); }else{ $action=$action0; } static::increaseApplyCounter();
if (!isset($action['VALUE']) || !isset($action['UNIT'])) return;
$orderCurrency = static::getCurrency(); $value = (float)$action['VALUE']; if(!empty($action0['dopparam']['PROC'])){ $value = '-'.(float)$action0['dopparam']['PROC']; } $limitValue = (int)$action['LIMIT_VALUE']; $unit = (string)$action['UNIT']; $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'); $valueAction = ( $value < 0 ? Sale\OrderDiscountManager::DESCR_VALUE_ACTION_DISCOUNT : Sale\OrderDiscountManager::DESCR_VALUE_ACTION_EXTRA );
$actionDescription = array( 'ACTION_TYPE' => Sale\OrderDiscountManager::DESCR_TYPE_VALUE, 'VALUE' => abs($value), 'VALUE_ACTION' => $valueAction ); switch ($unit) { case self::VALUE_TYPE_SUMM: $actionDescription['VALUE_TYPE'] = Sale\OrderDiscountManager::DESCR_VALUE_TYPE_SUMM; $actionDescription['VALUE_UNIT'] = $currency; break; case self::VALUE_TYPE_PERCENT: $actionDescription['VALUE_TYPE'] = Sale\OrderDiscountManager::DESCR_VALUE_TYPE_PERCENT; break; case self::VALUE_TYPE_FIX: $actionDescription['VALUE_TYPE'] = Sale\OrderDiscountManager::DESCR_VALUE_TYPE_CURRENCY; $actionDescription['VALUE_UNIT'] = $currency; if ($maxBound) $actionDescription['ACTION_TYPE'] = Sale\OrderDiscountManager::DESCR_TYPE_MAX_BOUND; break; default: return; break; }
if(!empty($limitValue)) { $actionDescription['ACTION_TYPE'] = Sale\OrderDiscountManager::DESCR_TYPE_LIMIT_VALUE; $actionDescription['LIMIT_TYPE'] = Sale\OrderDiscountManager::DESCR_LIMIT_MAX; $actionDescription['LIMIT_UNIT'] = $orderCurrency; $actionDescription['LIMIT_VALUE'] = $limitValue; }
static::setActionDescription(self::RESULT_ENTITY_BASKET, $actionDescription);
if (empty($order['BASKET_ITEMS']) || !is_array($order['BASKET_ITEMS'])) return;
static::enableBasketFilter(); $filteredBasket = static::getBasketForApply($order['BASKET_ITEMS'], $filter, $action); if (empty($filteredBasket)) return;
$applyBasket = array_filter($filteredBasket, '\Roztech\SaleDiscount\Actions2::filterBasketForAction'); unset($filteredBasket); if (empty($applyBasket)) return;
if ($unit == self::VALUE_TYPE_SUMM || $unit == self::VALUE_TYPE_FIX) { if ($currency != $orderCurrency) /** @noinspection PhpMethodOrClassCallIsNotCaseSensitiveInspection */ $value = \CCurrencyRates::convertCurrency($value, $currency, $orderCurrency); if ($unit == self::VALUE_TYPE_SUMM) { $value = static::getPercentByValue($applyBasket, $value); if ( ($valueAction == Sale\OrderDiscountManager::DESCR_VALUE_ACTION_DISCOUNT && ($value >= 0 || $value < -100)) || ($valueAction == Sale\OrderDiscountManager::DESCR_VALUE_ACTION_EXTRA && $value <= 0) ) return; $unit = self::VALUE_TYPE_PERCENT; } } $value = static::roundZeroValue($value); if ($value == 0) return;
foreach ($applyBasket as $basketCode => $basketRow) { $calculateValue = $value; if ($unit == self::VALUE_TYPE_PERCENT) $calculateValue = static::percentToValue($basketRow, $calculateValue); $calculateValue = static::roundValue($calculateValue, $basketRow['CURRENCY']);
if(!empty($limitValue) && $limitValue + $calculateValue <= 0) { $calculateValue = -$limitValue; }
$result = static::roundZeroValue($basketRow['PRICE'] + $calculateValue); if ($maxBound && $result < 0) { $result = 0; $calculateValue = -$basketRow['PRICE']; } if ($result >= 0) { if (!isset($basketRow['DISCOUNT_PRICE'])) $basketRow['DISCOUNT_PRICE'] = 0; $basketRow['PRICE'] = $result; if (isset($basketRow['PRICE_DEFAULT'])) $basketRow['PRICE_DEFAULT'] = $result; $basketRow['DISCOUNT_PRICE'] -= $calculateValue;
$order['BASKET_ITEMS'][$basketCode] = $basketRow;
$rowActionDescription = $actionDescription; $rowActionDescription['BASKET_CODE'] = $basketCode; $rowActionDescription['RESULT_VALUE'] = abs($calculateValue); $rowActionDescription['RESULT_UNIT'] = $orderCurrency;
if(!empty($limitValue)) { $rowActionDescription['ACTION_TYPE'] = Sale\OrderDiscountManager::DESCR_TYPE_LIMIT_VALUE; $rowActionDescription['LIMIT_TYPE'] = Sale\OrderDiscountManager::DESCR_LIMIT_MAX; $rowActionDescription['LIMIT_UNIT'] = $orderCurrency; $rowActionDescription['LIMIT_VALUE'] = $limitValue; }
static::setActionResult(self::RESULT_ENTITY_BASKET, $rowActionDescription); unset($rowActionDescription); } unset($result); } unset($basketCode, $basketRow); } [/CODE] |