- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/orderdiscountbase.php
- Класс: BitrixSaleOrderDiscountBase
- Вызов: OrderDiscountBase::loadResultFromDb
static function loadResultFromDb($order, array $basketList = [], array $basketData = [])
{
static::init();
$result = new Result;
/** @var Discount $discountClassName */
$discountClassName = static::getDiscountClassName();
$emptyApplyBlock = $discountClassName::getEmptyApplyBlock();
$order = (int)$order;
if ($order <= 0)
{
$result->addError(new MainEntityEntityError(
Loc::getMessage('SALE_ORDER_DISCOUNT_BAD_ORDER_ID'),
self::ERROR_ID
));
return $result;
}
$resultData = [
'APPLY_BLOCKS' => [],
'DISCOUNT_LIST' => [],
'COUPON_LIST' => [],
'STORED_ACTION_DATA' => []
];
$applyBlocks = [];
$orderDiscountIndex = [];
$orderDiscountLink = [];
$discountList = [];
$discountSort = [];
$couponList = [];
$resultData['COUPON_LIST'] = static::loadCouponsFromDb($order);
if (!empty($resultData['COUPON_LIST']))
{
foreach ($resultData['COUPON_LIST'] as $coupon)
$couponList[$coupon['ID']] = $coupon['COUPON'];
unset($coupon);
}
$ruleIterator = static::getResultIterator([
'filter' => ['=ORDER_ID' => $order],
'order' => ['ID' => 'ASC']
]);
while ($rule = $ruleIterator->fetch())
{
$rule['ID'] = (int)$rule['ID'];
$rule['ORDER_DISCOUNT_ID'] = (int)$rule['ORDER_DISCOUNT_ID'];
$rule['ORDER_COUPON_ID'] = (int)$rule['COUPON_ID'];
$rule['ENTITY_ID'] = (int)$rule['ENTITY_ID'];
if ($rule['ORDER_COUPON_ID'] > 0)
{
if (!isset($couponList[$rule['COUPON_ID']]))
{
$result->addError(new MainEntityEntityError(
Loc::getMessage(
'SALE_ORDER_DISCOUNT_ERR_RULE_COUPON_NOT_FOUND',
array('#ID#' => $rule['ID'], '#COUPON_ID#' => $rule['COUPON_ID'])
)
));
}
else
{
$rule['COUPON_ID'] = $couponList[$rule['ORDER_COUPON_ID']];
}
}
if (!isset($rule['RULE_DESCR_ID']))
$rule['RULE_DESCR_ID'] = 0;
$rule['RULE_DESCR_ID'] = (int)$rule['RULE_DESCR_ID'];
$rule['APPLY_BLOCK_COUNTER'] = (int)$rule['APPLY_BLOCK_COUNTER'];
$blockCounter = $rule['APPLY_BLOCK_COUNTER'];
if (!isset($applyBlocks[$blockCounter]))
$applyBlocks[$blockCounter] = $emptyApplyBlock;
if (!isset($orderDiscountIndex[$blockCounter]))
$orderDiscountIndex[$blockCounter] = 0;
if (!isset($discountList[$rule['ORDER_DISCOUNT_ID']]))
{
$discountList[$rule['ORDER_DISCOUNT_ID']] = $rule['ORDER_DISCOUNT_ID'];
$discountSort[] = $rule['ORDER_DISCOUNT_ID'];
}
if (static::isNativeModule($rule['MODULE_ID']))
{
$discountId = (int)$rule['ORDER_DISCOUNT_ID'];
if (!isset($orderDiscountLink[$discountId]))
{
$applyBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]] = static::formatSaleRuleResult($rule);
$orderDiscountLink[$discountId] = &$applyBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]];
$orderDiscountIndex[$blockCounter]++;
}
$ruleItem = static::formatSaleItemRuleResult($rule);
switch (static::getResultEntityFromInternal($rule['ENTITY_TYPE']))
{
case $discountClassName::ENTITY_BASKET_ITEM:
$index = static::transferEntityCodeFromInternal($rule, $basketList);
if ($index == '')
continue 2;
$ruleItem['BASKET_ID'] = static::transferEntityCodeFromInternal($rule, []);
static::fillRuleProductFields($ruleItem, $basketData, $index);
if (!isset($orderDiscountLink[$discountId]['RESULT']['BASKET']))
$orderDiscountLink[$discountId]['RESULT']['BASKET'] = [];
$orderDiscountLink[$discountId]['RESULT']['BASKET'][$index] = $ruleItem;
if ($ruleItem['ACTION_BLOCK_LIST'] === null)
$orderDiscountLink[$discountId]['ACTION_BLOCK_LIST'] = false;
break;
case $discountClassName::ENTITY_DELIVERY:
if (!isset($orderDiscountLink[$discountId]['RESULT']['DELIVERY']))
$orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = [];
$ruleItem['DELIVERY_ID'] = static::transferEntityCodeFromInternal($rule, []);
$orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = $ruleItem;
break;
}
unset($ruleItem, $discountId);
}
else
{
if (
$rule['ENTITY_ID'] <= 0
|| static::getResultEntityFromInternal($rule['ENTITY_TYPE']) != $discountClassName::ENTITY_BASKET_ITEM
)
continue;
$index = static::transferEntityCodeFromInternal($rule, $basketList);
if ($index == '')
continue;
$ruleResult = static::formatBasketRuleResult($rule);
static::fillRuleProductFields($ruleResult, $basketData, $index);
if (!isset($applyBlocks[$blockCounter]['BASKET'][$index]))
$applyBlocks[$blockCounter]['BASKET'][$index] = [];
$applyBlocks[$blockCounter]['BASKET'][$index][] = $ruleResult;
unset($ruleResult);
}
}
unset($rule, $ruleIterator);
unset($couponList);
unset($orderDiscountLink, $orderDiscountIndex);
if (!empty($discountList))
{
$resultData['DISCOUNT_LIST'] = static::loadOrderDiscountFromDb($discountList, $discountSort);
if ($resultData['DISCOUNT_LIST'] === null)
$resultData['DISCOUNT_LIST'] = [];
}
unset($discountSort, $discountList);
$actionsData = static::loadOrderStoredDataFromDb(
$order,
self::STORAGE_TYPE_DISCOUNT_ACTION_DATA
);
if ($actionsData !== null)
$resultData['STORED_ACTION_DATA'] = $actionsData;
unset($actionsData);
$dataIterator = static::getRoundResultIterator([
'select' => ['*'],
'filter' => [
'=ORDER_ID' => $order,
'=ENTITY_TYPE' => static::getRoundEntityInternal($discountClassName::ENTITY_BASKET_ITEM)
]
]);
while ($data = $dataIterator->fetch())
{
$data['APPLY_BLOCK_COUNTER'] = (int)$data['APPLY_BLOCK_COUNTER'];
$blockCounter = $data['APPLY_BLOCK_COUNTER'];
if (!isset($applyBlocks[$blockCounter]))
$applyBlocks[$blockCounter] = $emptyApplyBlock;
$basketCode = static::transferEntityCodeFromInternal($data, $basketList);
if ($basketCode == '')
continue;
$applyBlocks[$blockCounter]['BASKET_ROUND'][$basketCode] = array(
'RULE_ID' => (int)$data['ID'],
'APPLY' => $data['APPLY'],
'ROUND_RULE' => $data['ROUND_RULE']
);
unset($basketCode, $blockCounter);
}
unset($data, $dataIterator);
if (!empty($applyBlocks))
ksort($applyBlocks);
$resultData['APPLY_BLOCKS'] = $applyBlocks;
unset($applyBlocks);
$result->setData($resultData);
unset($resultData);
unset($emptyApplyBlock, $discountClassName);
return $result;
}