8Loc::loadMessages(__FILE__);
44 protected static $useMode = self::MODE_CALCULATE;
58 private static $compatibleBasketFields =
array(
'DISCOUNT_PRICE',
'PRICE',
'VAT_VALUE',
'PRICE_DEFAULT');
68 return (abs($value) <= self::VALUE_EPS ? 0 : $value);
94 if ($mode !== self::MODE_CALCULATE && $mode !== self::MODE_MANUAL && $mode !== self::MODE_MIXED)
96 self::$useMode = $mode;
97 switch (self::$useMode)
99 case self::MODE_CALCULATE:
100 $percentOption = (string)
Main\
Config\Option::get(
'sale',
'get_discount_percent_from_base_price');
101 self::$percentValueMode = ($percentOption ==
'Y' ? self::PERCENT_FROM_BASE_PRICE : self::PERCENT_FROM_CURRENT_PRICE);
102 unset($percentOption);
103 if (isset(
$config[
'CURRENCY']))
104 self::$currencyId =
$config[
'CURRENCY'];
107 self::$siteId =
$config[
'SITE_ID'];
108 if (self::$currencyId ==
'')
112 case self::MODE_MANUAL:
113 case self::MODE_MIXED:
115 if (isset(
$config[
'USE_BASE_PRICE']))
116 $percentOption =
$config[
'USE_BASE_PRICE'];
117 if ($percentOption ==
'')
118 $percentOption = (string)
Main\
Config\Option::get(
'sale',
'get_discount_percent_from_base_price');
119 self::$percentValueMode = ($percentOption ==
'Y' ? self::PERCENT_FROM_BASE_PRICE : self::PERCENT_FROM_CURRENT_PRICE);
120 unset($percentOption);
121 if (isset(
$config[
'CURRENCY']))
122 self::$currencyId =
$config[
'CURRENCY'];
125 self::$siteId =
$config[
'SITE_ID'];
126 if (self::$currencyId ==
'')
131 static::clearApplyCounter();
132 static::enableBasketFilter();
142 return self::$useMode;
152 return self::$useMode === self::MODE_CALCULATE;
162 return self::$useMode === self::MODE_MANUAL;
172 return self::$useMode === self::MODE_MIXED;
183 return (in_array(self::$useMode, $list,
true));
193 return self::$percentValueMode;
203 return self::$currencyId;
213 self::$applyCounter = self::APPLY_COUNTER_START;
223 return self::$applyCounter;
233 self::$applyCounter++;
243 if (!static::isMixedMode())
245 self::$useBasketFilter =
false;
255 if (!static::isMixedMode())
257 self::$useBasketFilter =
true;
267 return self::$useBasketFilter;
278 $adminSection = Main\Context::getCurrent()->getRequest()->isAdminSection();
281 if (!empty(
$order[
'BASKET_ITEMS']) && is_array(
$order[
'BASKET_ITEMS']))
283 foreach (
$order[
'BASKET_ITEMS'] as &$item)
285 if (isset($item[
'PRICE_DEFAULT']))
286 $item[
'PRICE_DEFAULT'] = $item[
'PRICE'];
290 foreach (self::$compatibleBasketFields as &$fieldName)
292 if (array_key_exists($fieldName, $item) && !is_array($item[$fieldName]))
293 $item[
'~'.$fieldName] = $item[$fieldName];
310 (!isset($item[
'CUSTOM_PRICE']) || $item[
'CUSTOM_PRICE'] !=
'Y') &&
313 (!isset($item[
'SET_PARENT_ID']) || (
int)$item[
'SET_PARENT_ID'] <= 0)
315 (!isset($item[
'ITEM_FIX']) || $item[
'ITEM_FIX'] !=
'Y') &&
316 (!isset($item[
'LAST_DISCOUNT']) || $item[
'LAST_DISCOUNT'] !=
'Y') &&
317 (!isset($item[
'IN_SET']) || $item[
'IN_SET'] !=
'Y')
328 return self::$actionDescription;
338 return self::$actionResult;
350 if ($mode != self::APPLY_RESULT_MODE_COUNTER && $mode != self::APPLY_RESULT_MODE_DESCR && $mode != self::APPLY_RESULT_MODE_SIMPLE)
352 self::$applyResultMode = $mode;
353 self::$applyResult =
array();
363 return self::$applyResultMode;
385 self::$storedData =
$data;
395 return self::$storedData;
406 if (!static::isCalculateMode())
410 self::$storedData[static::getApplyCounter()] =
$data;
420 $counter = static::getApplyCounter();
421 if (isset(self::$storedData[
$counter]))
434 self::$applyResult =
array();
435 self::$actionResult =
array();
436 self::$actionDescription =
array();
437 self::$storedData =
array();
457 static::increaseApplyCounter();
462 $orderCurrency = static::getCurrency();
463 $value = (float)
$action[
'VALUE'];
464 $limitValue = (int)
$action[
'LIMIT_VALUE'];
465 $unit = (string)
$action[
'UNIT'];
468 if ($unit == self::VALUE_TYPE_FIX && $value < 0)
469 $maxBound = (isset(
$action[
'MAX_BOUND']) &&
$action[
'MAX_BOUND'] ==
'Y');
478 'VALUE' => abs($value),
479 'VALUE_ACTION' => $valueAction
483 case self::VALUE_TYPE_SUMM:
486 'VALUE' => abs($value),
492 case self::VALUE_TYPE_PERCENT:
495 'VALUE' => abs($value),
500 case self::VALUE_TYPE_FIX:
503 'VALUE' => abs($value),
509 case self::VALUE_TYPE_CLOSEOUT:
512 'VALUE' => abs($value),
524 if(!empty($limitValue))
534 if (empty(
$order[
'BASKET_ITEMS']) || !is_array(
$order[
'BASKET_ITEMS']))
537 static::enableBasketFilter();
539 if (empty($filteredBasket))
542 $applyBasket = array_filter($filteredBasket,
'\Bitrix\Sale\Discount\Actions::filterBasketForAction');
543 unset($filteredBasket);
544 if (empty($applyBasket))
547 if ($unit == self::VALUE_TYPE_SUMM || $unit == self::VALUE_TYPE_FIX)
551 if ($unit == self::VALUE_TYPE_SUMM)
553 $value = static::getPercentByValue($applyBasket, $value);
560 $unit = self::VALUE_TYPE_PERCENT;
563 $value = static::roundZeroValue($value);
567 foreach ($applyBasket as $basketCode => $basketRow)
580 $order[
'BASKET_ITEMS'][$basketCode] = $basketRow;
583 $rowActionDescription[
'BASKET_CODE'] = $basketCode;
584 $rowActionDescription[
'RESULT_VALUE'] = abs($calculateValue);
585 $rowActionDescription[
'RESULT_UNIT'] = $orderCurrency;
587 if(!empty($limitValue))
591 $rowActionDescription[
'LIMIT_UNIT'] = $orderCurrency;
592 $rowActionDescription[
'LIMIT_VALUE'] = $limitValue;
595 static::setActionResult(self::RESULT_ENTITY_BASKET, $rowActionDescription);
596 unset($rowActionDescription);
600 unset($basketCode, $basketRow);
615 static::increaseApplyCounter();
619 $sumConfiguration = $configuration[
'sum']?:
array();
620 $applyIfMoreProfitable = $configuration[
'apply_if_more_profitable'] ===
'Y';
622 if (static::checkUseMode(
array(self::MODE_MANUAL, self::MODE_MIXED)))
625 $cumulativeOrderUserValue = $actionStoredData[
'cumulative_value'];
630 $cumulativeCalculator->setSumConfiguration(
632 'type_sum_period' => $sumConfiguration[
'type_sum_period'],
633 'sum_period_data' =>
array(
634 'order_start' => $sumConfiguration[
'sum_period_data'][
'discount_sum_order_start'],
635 'order_end' => $sumConfiguration[
'sum_period_data'][
'discount_sum_order_end'],
636 'period_value' => $sumConfiguration[
'sum_period_data'][
'discount_sum_period_value'],
637 'period_type' => $sumConfiguration[
'sum_period_data'][
'discount_sum_period_type'],
641 $cumulativeOrderUserValue = $cumulativeCalculator->calculate();
644 $rangeToApply =
null;
645 foreach ($ranges as $range)
647 if ($cumulativeOrderUserValue >= $range[
'sum'])
649 $rangeToApply = $range;
659 'VALUE' => -$rangeToApply[
'value'],
660 'UNIT' => $rangeToApply[
'type'],
666 $orderCurrency = static::getCurrency();
667 $value = (float)
$action[
'VALUE'];
669 $unit = (string)
$action[
'UNIT'];
672 if ($unit == self::VALUE_TYPE_FIX && $value < 0)
673 $maxBound = (isset(
$action[
'MAX_BOUND']) &&
$action[
'MAX_BOUND'] ==
'Y');
678 'VALUE' => abs($value),
679 'VALUE_ACTION' => $valueAction
683 case self::VALUE_TYPE_PERCENT:
686 case self::VALUE_TYPE_FIX:
696 if ($unit == self::VALUE_TYPE_FIX &&
$currency != $orderCurrency)
701 $value = static::roundZeroValue($value);
707 if(!empty($limitValue))
717 if (empty(
$order[
'BASKET_ITEMS']) || !is_array(
$order[
'BASKET_ITEMS']))
720 static::enableBasketFilter();
722 if ($applyIfMoreProfitable)
730 $filter = self::wrapFilterToFindMoreProfitableForCumulative(
$filter, $unit, $value, $limitValue, $maxBound);
734 if (empty($filteredBasket))
738 $applyBasket = array_filter($filteredBasket,
'\Bitrix\Sale\Discount\Actions::filterBasketForAction');
739 unset($filteredBasket);
740 if (empty($applyBasket))
743 foreach ($applyBasket as $basketCode => $basketRow)
745 if ($applyIfMoreProfitable)
747 $basketRow[
'PRICE'] = $basketRow[
'BASE_PRICE'];
748 $basketRow[
'DISCOUNT_PRICE'] = 0;
762 $order[
'BASKET_ITEMS'][$basketCode] = $basketRow;
765 $rowActionDescription[
'BASKET_CODE'] = $basketCode;
766 $rowActionDescription[
'RESULT_VALUE'] = abs($calculateValue);
767 $rowActionDescription[
'RESULT_UNIT'] = $orderCurrency;
769 if(!empty($limitValue))
773 $rowActionDescription[
'LIMIT_UNIT'] = $orderCurrency;
774 $rowActionDescription[
'LIMIT_VALUE'] = $limitValue;
777 if ($applyIfMoreProfitable)
781 $rowActionDescription[
'REVERT_APPLY'] =
true;
784 static::setActionResult(self::RESULT_ENTITY_BASKET, $rowActionDescription);
785 unset($rowActionDescription);
789 unset($basketCode, $basketRow);
791 if (self::getUseMode() == self::MODE_CALCULATE)
795 'cumulative_value' => $cumulativeOrderUserValue,
801 private static function wrapFilterToFindMoreProfitableForCumulative(
$filter, $unit, $value, $limitValue, $maxBound)
808 return function($basketItem) use (
$filter, $unit, $value, $limitValue, $maxBound) {
809 if (empty($basketItem[
'BASE_PRICE']))
814 if (empty($basketItem[
'DISCOUNT_PRICE']))
824 $prevPrice = $basketItem[
'PRICE'];
825 $basketItem[
'PRICE'] = $basketItem[
'BASE_PRICE'];
834 return $newPrice < $prevPrice;
854 static::increaseApplyCounter();
858 if (
$action[
'UNIT'] != self::VALUE_TYPE_PERCENT &&
$action[
'UNIT'] != self::VALUE_TYPE_FIX)
861 $orderCurrency = static::getCurrency();
862 $unit = (string)
$action[
'UNIT'];
863 $value = (float)
$action[
'VALUE'];
866 if ($unit == self::VALUE_TYPE_FIX && $value < 0)
867 $maxBound = (isset(
$action[
'MAX_BOUND']) &&
$action[
'MAX_BOUND'] ==
'Y');
871 'VALUE' => abs($value),
883 case self::VALUE_TYPE_PERCENT:
885 $value = (
$order[
'PRICE_DELIVERY'] * $value) / 100;
887 case self::VALUE_TYPE_FIX:
896 if (isset(
$order[
'CUSTOM_PRICE_DELIVERY']) &&
$order[
'CUSTOM_PRICE_DELIVERY'] ==
'Y')
899 !isset(
$order[
'PRICE_DELIVERY'])
901 static::roundZeroValue(
$order[
'PRICE_DELIVERY']) == 0
907 $value = static::roundValue($value,
$order[
'CURRENCY']);
908 $value = static::roundZeroValue($value);
912 $resultValue = static::roundZeroValue(
$order[
'PRICE_DELIVERY'] + $value);
913 if ($maxBound && $resultValue < 0)
916 $value = -
$order[
'PRICE_DELIVERY'];
919 if ($resultValue < 0)
922 if (!isset(
$order[
'PRICE_DELIVERY_DIFF']))
923 $order[
'PRICE_DELIVERY_DIFF'] = 0;
924 $order[
'PRICE_DELIVERY_DIFF'] -= $value;
925 $order[
'PRICE_DELIVERY'] = $resultValue;
944 static::increaseApplyCounter();
954 if (empty(
$order[
'BASKET_ITEMS']) || !is_array(
$order[
'BASKET_ITEMS']))
957 static::disableBasketFilter();
959 $itemsCopy =
$order[
'BASKET_ITEMS'];
961 $filteredBasket = static::getBasketForApply(
965 'GIFT_TITLE' => Loc::getMessage(
'BX_SALE_DISCOUNT_ACTIONS_SIMPLE_GIFT_DESCR')
970 static::enableBasketFilter();
972 if (empty($filteredBasket))
975 $applyBasket = array_filter($filteredBasket,
'\Bitrix\Sale\Discount\Actions::filterBasketForAction');
976 unset($filteredBasket);
977 if (empty($applyBasket))
980 foreach ($applyBasket as $basketCode => $basketRow)
984 $order[
'BASKET_ITEMS'][$basketCode] = $basketRow;
987 $rowActionDescription[
'BASKET_CODE'] = $basketCode;
988 static::setActionResult(self::RESULT_ENTITY_BASKET, $rowActionDescription);
989 unset($rowActionDescription);
991 unset($basketCode, $basketRow);
1005 switch (static::getUseMode())
1007 case self::MODE_CALCULATE:
1010 case self::MODE_MANUAL:
1011 case self::MODE_MIXED:
1012 switch (static::getApplyResultMode())
1014 case self::APPLY_RESULT_MODE_COUNTER:
1015 $currentCounter = static::getApplyCounter();
1016 $basketCodeList = array_keys($basket);
1017 foreach ($basketCodeList as &
$code)
1019 if (empty(self::$applyResult[
'BASKET'][
$code]) || !is_array(self::$applyResult[
'BASKET'][
$code]))
1021 if (!in_array($currentCounter, self::$applyResult[
'BASKET'][
$code]))
1025 unset(
$code, $basketCodeList, $currentCounter);
1027 case self::APPLY_RESULT_MODE_DESCR:
1028 $basketCodeList = array_keys($basket);
1029 foreach ($basketCodeList as &
$code)
1031 if (empty(self::$applyResult[
'BASKET'][
$code]) || !is_array(self::$applyResult[
'BASKET'][
$code]))
1033 foreach (self::$applyResult[
'BASKET'][
$code] as $descr)
1035 if (static::compareBasketResultDescr(
$action, $descr))
1045 if (isset(
$action[
'GIFT_TITLE']))
1047 end(self::$applyResult[
'BASKET'][
$code]);
1048 $descr = current(self::$applyResult[
'BASKET'][
$code]);
1051 && $descr[
'DESCR'] ==
$action[
'GIFT_TITLE']
1058 unset(
$code, $basketCodeList);
1060 case self::APPLY_RESULT_MODE_SIMPLE:
1061 $basketCodeList = array_keys($basket);
1062 foreach ($basketCodeList as &
$code)
1064 if (isset(self::$applyResult[
'BASKET'][
$code]))
1067 unset(
$code, $basketCodeList);
1085 if (!static::isCalculateMode())
1096 if ($prepareResult !==
null)
1100 case self::RESULT_ENTITY_BASKET:
1101 if (!isset(self::$actionDescription[
'BASKET']))
1102 self::$actionDescription[
'BASKET'] =
array();
1103 self::$actionDescription[
'BASKET'][static::getApplyCounter()] = $prepareResult;
1105 case self::RESULT_ENTITY_DELIVERY:
1106 if (!isset(self::$actionDescription[
'DELIVERY']))
1107 self::$actionDescription[
'DELIVERY'] =
array();
1108 self::$actionDescription[
'DELIVERY'][static::getApplyCounter()] = $prepareResult;
1112 unset($prepareResult);
1135 if ($prepareResult !==
null)
1139 case self::RESULT_ENTITY_BASKET:
1140 if (!isset(self::$actionResult[
'BASKET']))
1141 self::$actionResult[
'BASKET'] =
array();
1143 if (!isset(self::$actionResult[
'BASKET'][$basketCode]))
1144 self::$actionResult[
'BASKET'][$basketCode] =
array();
1147 $prepareResult[
'REVERT_APPLY'] =
$actionResult[
'REVERT_APPLY'];
1148 self::$actionResult[
'BASKET'][$basketCode][static::getApplyCounter()] = $prepareResult;
1151 case self::RESULT_ENTITY_DELIVERY:
1152 if (!isset(self::$actionResult[
'DELIVERY']))
1153 self::$actionResult[
'DELIVERY'] =
array();
1154 self::$actionResult[
'DELIVERY'][static::getApplyCounter()] = $prepareResult;
1158 unset($prepareResult);
1170 case self::RESULT_ENTITY_BASKET:
1171 if (empty($entityParams))
1173 if (array_key_exists(
'BASKET', self::$actionResult))
1174 unset(self::$actionResult[
'BASKET']);
1178 if (isset($entityParams[
'BASKET_CODE']) && array_key_exists($entityParams[
'BASKET_CODE'], self::$actionResult[
'BASKET']))
1179 unset(self::$actionResult[
'BASKET'][$entityParams[
'BASKET_CODE']]);
1182 case self::RESULT_ENTITY_DELIVERY:
1183 if (array_key_exists(
'DELIVERY', self::$actionResult))
1184 unset(self::$actionResult[
'DELIVERY']);
1199 switch (static::getPercentMode())
1201 case self::PERCENT_FROM_BASE_PRICE:
1202 foreach ($basket as $basketRow)
1203 $summ += (float)$basketRow[
'BASE_PRICE'] * (
float)$basketRow[
'QUANTITY'];
1206 case self::PERCENT_FROM_CURRENT_PRICE:
1207 foreach ($basket as $basketRow)
1208 $summ += (float)$basketRow[
'PRICE'] * (
float)$basketRow[
'QUANTITY'];
1213 return static::roundZeroValue($summ > 0 ? ($value * 100) / $summ : 0);
1226 switch (static::getPercentMode())
1228 case self::PERCENT_FROM_BASE_PRICE:
1229 $value = ((float)$basketRow[
'BASE_PRICE'] * $percent) / 100;
1231 case self::PERCENT_FROM_CURRENT_PRICE:
1232 $value = ((float)$basketRow[
'PRICE'] * $percent) / 100;
1243 if(!$actionStructure || !is_array($actionStructure))
1248 if($actionStructure[
'CLASS_ID'] !=
'CondGroup')
1253 if(
count($actionStructure[
'CHILDREN']) > 1)
1258 $action = reset($actionStructure[
'CHILDREN']);
1259 if(
$action[
'CLASS_ID'] !=
'ActSaleBsktGrp')
1264 $actionData =
$action[
'DATA'];
1266 $configuration =
array(
1267 'TYPE' => $actionData[
'Type'],
1268 'VALUE' => $actionData[
'Value'],
1269 'LIMIT_VALUE' => $actionData[
'Max']?: 0,
1271 switch ($actionData[
'Unit'])
1284 return $configuration;
1289 $actionStructure =
null;
1292 $actionStructure =
false;
1297 $actionStructure = unserialize(
$discount[
'ACTIONS'], [
'allowed_classes' =>
false]);
1302 $actionStructure =
$discount[
'ACTIONS'];
1307 $actionStructure =
$discount[
'ACTIONS_LIST'];
1310 return $actionStructure;
1326 if (!is_array($resultDescr) || !isset($resultDescr[
'TYPE']))
1330 $value = abs(
$action[
'VALUE']);
1337 switch ($resultDescr[
'TYPE'])
1341 $resultDescr[
'VALUE'] == $value
1342 && $resultDescr[
'VALUE_ACTION'] = $valueAction
1347 case self::VALUE_TYPE_SUMM:
1353 && $resultDescr[
'VALUE_UNIT'] ==
$currency
1356 case self::VALUE_TYPE_PERCENT:
1359 case self::VALUE_TYPE_FIX:
1362 && $resultDescr[
'VALUE_UNIT'] ==
$currency
1370 $resultDescr[
'VALUE'] == $value
1371 && $resultDescr[
'VALUE_ACTION'] == $valueAction
1373 && $resultDescr[
'VALUE_UNIT'] ==
$currency
1396 $calculateValue = $value;
1397 if ($unit == self::VALUE_TYPE_PERCENT)
1398 $calculateValue = static::percentToValue($basketRow, $calculateValue);
1399 $calculateValue = static::roundValue($calculateValue, $basketRow[
'CURRENCY']);
1401 if ($unit == self::VALUE_TYPE_CLOSEOUT)
1403 if ($calculateValue < $basketRow[
'PRICE'])
1406 $calculateValue =
$result - $basketRow[
'PRICE'];
1415 if (!empty($limitValue) && $limitValue + $calculateValue <= 0)
1416 $calculateValue = -$limitValue;
1418 $result = static::roundZeroValue($basketRow[
'PRICE'] + $calculateValue);
1422 $calculateValue = -$basketRow[
'PRICE'];
1426 return [$calculateValue,
$result];
1439 if (!isset($basketRow[
'DISCOUNT_PRICE']))
1440 $basketRow[
'DISCOUNT_PRICE'] = 0;
1441 $basketRow[
'PRICE'] = $price;
1442 $basketRow[
'DISCOUNT_PRICE'] +=
$discount;
static sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
static filterBasketForAction(array $item)
static fillCompatibleFields(array &$order)
static setActionDescription($type, $description)
static setActionStoredData(array $data)
static $actionDescription
static usedBasketFilter()
static clearEntityActionResult($entity, array $entityParams=array())
static applyToDelivery(array &$order, array $action)
static percentToValue($basketRow, $percent)
static getActionStoredData()
const APPLY_RESULT_MODE_DESCR
const PERCENT_FROM_CURRENT_PRICE
static getActionDescription()
const GIFT_SELECT_TYPE_ALL
const BASKET_APPLIED_FIELD
static increaseApplyCounter()
const PERCENT_FROM_BASE_PRICE
static clearApplyCounter()
static getActionConfiguration(array $discount)
static calculateDiscountPrice($value, $unit, array $basketRow, $limitValue, $maxBound)
static getActionStructure(array $discount)
const APPLY_RESULT_MODE_SIMPLE
static disableBasketFilter()
static applySimpleGift(array &$order, $filter)
static compareBasketResultDescr(array $action, $resultDescr)
static enableBasketFilter()
static getApplyResultMode()
static roundZeroValue($value)
static setUseMode($mode, array $config=array())
static applyToBasket(array &$order, array $action, $filter)
const APPLY_RESULT_MODE_COUNTER
static setActionResult($entity, array $actionResult)
const RESULT_ENTITY_ORDER
const RESULT_ENTITY_BASKET
const ACTION_TYPE_DISCOUNT
const GIFT_SELECT_TYPE_ONE
static setApplyResult(array $applyResult)
static applyCumulativeToBasket(array &$order, array $ranges, array $configuration=array(), $filter=null)
static getPercentByValue($basket, $value)
static fillDiscountPrice(array &$basketRow, $price, $discount)
const VALUE_TYPE_CLOSEOUT
static roundValue($value, $currency)
const APPLY_COUNTER_START
static getBasketForApply(array $basket, $filter, $action=array())
static setApplyResultMode($mode)
static checkUseMode(array $list)
static setStoredData(array $data)
const RESULT_ENTITY_DELIVERY
static getSiteCurrency($siteId)
static roundPrecision($value)
static ConvertCurrency($valSum, $curFrom, $curTo, $valDate="")
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(Loader::includeModule( 'bitrix24')) elseif(Loader::includeModule('intranet') &&CIntranetUtils::getPortalZone() !=='ru') $description
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
CheckSerializedData($str, $max_depth=200)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"