- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/archive/recovery/firstschemebuilder.php
- Класс: BitrixSaleArchiveRecoveryFirstSchemeBuilder
- Вызов: FirstSchemeBuilder::riseDiscount
protected function riseDiscount($discountData)
{
$discountResultList = array();
$resultData = array(
'BASKET' => array(),
'ORDER' => array(),
'APPLY_BLOCKS' => array(),
'DISCOUNT_LIST' => array(),
'DISCOUNT_MODULES' => array(),
'COUPON_LIST' => array(),
'SHIPMENTS_ID' => array(),
'DATA' => array()
);
$resultData['DATA'] = $this->prepareDiscountOrderData($discountData);
$orderDiscountData = $resultData['DATA']['ORDER'];
$orderDiscountIndex =
$appliedBlocks =
$orderDiscountLink =
$couponAppliedList = [];
foreach ($discountData['RULES_DATA'] as $rule)
{
$discountList[] = $rule["DISCOUNT_DATA"];
if ($rule['APPLY_BLOCK_COUNTER'] < 0)
continue;
if ($rule['APPLY'] === 'Y' && (int)$rule['COUPON_ID'] > 0)
{
$couponAppliedList[] = (int)$rule['COUPON_ID'];
}
$blockCounter = $rule['APPLY_BLOCK_COUNTER'];
if (!isset($orderDiscountIndex[$blockCounter]))
$orderDiscountIndex[$blockCounter] = 0;
if (!isset($appliedBlocks[$blockCounter]))
{
$appliedBlocks[$blockCounter] = array(
'BASKET' => array(),
'BASKET_ROUND' => array(),
'ORDER' => array(),
'ORDER_ROUND' => array()
);
}
if ($rule['MODULE_ID'] == 'sale')
{
$orderDiscountId = (int)$rule['ORDER_DISCOUNT_ID'];
$orderDiscountItem = $orderDiscountLink[$orderDiscountId];
if (!isset($orderDiscountItem))
{
$appliedBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]] = array(
'ORDER_ID' => $rule['ORDER_ID'],
'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'],
'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'],
'COUPON_ID' => ($rule['COUPON_ID'] > 0 ? $rule['COUPON_ID'] : ''),
'RESULT' => array(),
'ACTION_BLOCK_LIST' => true
);
$orderDiscountItem = &$appliedBlocks[$blockCounter]['ORDER'][$orderDiscountIndex[$blockCounter]];
$orderDiscountIndex[$blockCounter]++;
}
$ruleItem = array(
'RULE_ID' => $rule['ID'],
'APPLY' => $rule['APPLY'],
'RULE_DESCR_ID' => $rule['RULE_DESCR_ID'],
'ACTION_BLOCK_LIST' => (!empty($rule['ACTION_BLOCK_LIST']) && is_array($rule['ACTION_BLOCK_LIST']) ? $rule['ACTION_BLOCK_LIST'] : null)
);
if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR']))
{
$ruleItem['DESCR_DATA'] = $rule['RULE_DESCR'];
$ruleItem['DESCR'] = SaleOrderDiscountManager::formatArrayDescription($rule['RULE_DESCR']);
$ruleItem['DESCR_ID'] = $rule['RULE_DESCR_ID'];
}
switch ($rule['ENTITY_TYPE'])
{
case InternalsOrderRulesTable::ENTITY_TYPE_BASKET_ITEM:
$ruleItem['BASKET_ID'] = $rule['ENTITY_ID'];
$index = $rule['ENTITY_ID'];
if (!isset($orderDiscountItem['RESULT']['BASKET']))
$orderDiscountItem['RESULT']['BASKET'] = array();
$orderDiscountItem['RESULT']['BASKET'][$index] = $ruleItem;
if ($ruleItem['ACTION_BLOCK_LIST'] === null)
$orderDiscountItem['ACTION_BLOCK_LIST'] = false;
$discountResultList['BASKET'][$ruleItem['BASKET_ID']][] = array(
'DISCOUNT_ID' => $orderDiscountItem['DISCOUNT_ID'],
'COUPON_ID' => $orderDiscountItem['COUPON_ID'],
'APPLY' => $ruleItem['APPLY'],
'DESCR' => $ruleItem['DESCR']
);
break;
case InternalsOrderRulesTable::ENTITY_TYPE_DELIVERY:
if (!isset($orderDiscountItem['RESULT']['DELIVERY']))
$orderDiscountItem['RESULT']['DELIVERY'] = array();
$ruleItem['DELIVERY_ID'] = ($rule['ENTITY_ID'] > 0 ? $rule['ENTITY_ID'] : (string)$rule['ENTITY_VALUE']);
$orderDiscountItem['RESULT']['DELIVERY'] = $ruleItem;
$discountResultList['DELIVERY'][] = array(
'DISCOUNT_ID' => $orderDiscountItem['DISCOUNT_ID'],
'COUPON_ID' => $orderDiscountItem['COUPON_ID'],
'APPLY' => $orderDiscountItem['RESULT']['DELIVERY']['APPLY'],
'DESCR' => $orderDiscountItem['RESULT']['DELIVERY']['DESCR'][0],
'DELIVERY_ID' => $orderDiscountItem['RESULT']['DELIVERY']['DELIVERY_ID']
);
foreach ($orderDiscountData as $data)
{
if ((int)$data['DELIVERY_ID'] == (int)$orderDiscountItem['RESULT']['DELIVERY']['DELIVERY_ID'])
$resultData['SHIPMENTS_ID'][] = (int)$data['SHIPMENT_ID'];
}
break;
}
$orderDiscountLink[$orderDiscountId] = $orderDiscountItem;
unset($ruleItem, $orderDiscountId);
}
else
{
if ($rule['ENTITY_ID'] <= 0 || $rule['ENTITY_TYPE'] != InternalsOrderRulesTable::ENTITY_TYPE_BASKET_ITEM)
continue;
$index = $rule['ENTITY_ID'];
$ruleResult = array(
'BASKET_ID' => $rule['ENTITY_ID'],
'RULE_ID' => $rule['ID'],
'ORDER_ID' => $rule['ORDER_ID'],
'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'],
'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'],
'COUPON_ID' => ($rule['ORDER_COUPON_ID'] > 0 ? $rule['COUPON_ID'] : ''),
'RESULT' => array(
'APPLY' => $rule['APPLY']
),
'RULE_DESCR_ID' => $rule['RULE_DESCR_ID'],
'ACTION_BLOCK_LIST' => (isset($rule['ACTION_BLOCK_LIST']) ? $rule['ACTION_BLOCK_LIST'] : null)
);
if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR']))
{
$ruleResult['RESULT']['DESCR_DATA'] = $rule['RULE_DESCR'];
$ruleResult['RESULT']['DESCR'] = SaleOrderDiscountManager::formatArrayDescription($rule['RULE_DESCR']);
$ruleResult['DESCR_ID'] = $rule['RULE_DESCR_ID'];
}
if (!isset($appliedBlocks[$blockCounter]['BASKET'][$index]))
$appliedBlocks[$blockCounter]['BASKET'][$index] = array();
$appliedBlocks[$blockCounter]['BASKET'][$index][] = $ruleResult;
$discountResultList['BASKET'][$index][] = array(
'DISCOUNT_ID' => $ruleResult['DISCOUNT_ID'],
'COUPON_ID' => $ruleResult['COUPON_ID'],
'APPLY' => $ruleResult['RESULT']['APPLY'],
'DESCR' => $ruleResult['RESULT']['DESCR']
);
unset($ruleResult);
}
}
$resultData['APPLY_BLOCKS'] = $appliedBlocks;
$resultData['COUPON_LIST'] = is_array($discountData['COUPON_LIST']) ? $discountData['COUPON_LIST'] : [];
foreach ($resultData['COUPON_LIST'] as &$coupon)
{
if (in_array((int)$coupon['ID'], $couponAppliedList))
{
$coupon['APPLY'] = 'Y';
$coupon['JS_STATUS'] = 'APPLYED';
}
}
$resultData['PRICES'] = $this->prepareDiscountPrices();
$resultData['RESULT'] = $this->prepareDiscountResult($discountResultList);
if (!empty($discountList))
{
$resultData['DISCOUNT_LIST'] = $this->prepareDiscountList($discountList, $resultData['RESULT']);
}
$this->order->setDiscountData($resultData);
return;
}