- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/discountbase.php
- Класс: BitrixSaleDiscountBase
- Вызов: DiscountBase::calculateApplySaleDiscountResult
protected function calculateApplySaleDiscountResult()
{
$result = new Result;
/** @var DiscountCouponsManager $couponClassName */
$couponClassName = $this->getDiscountCouponClassName();
$this->orderData['DISCOUNT_RESULT'] = DiscountActions::getActionResult();
if (!empty($this->orderData['DISCOUNT_RESULT']) && is_array($this->orderData['DISCOUNT_RESULT']))
$stepResult = $this->getStepResult($this->orderData);
else
$stepResult = DiscountResultCompatibleFormat::getStepResult(
$this->orderData, $this->currentStep['oldData']
);
$applied = !empty($stepResult);
$orderDiscountId = 0;
$orderCouponId = '';
if ($applied)
{
$this->correctStepResult($stepResult, $this->discountsCache[$this->currentStep['discountId']]);
$orderDiscountId = $this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['DISCOUNT_ID'];
$orderCouponId = $this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['COUPON_ID'];
}
unset($this->orderData['DISCOUNT_RESULT']);
if ($applied)
{
if (
(
!empty($this->applyResult['DISCOUNT_LIST'][$orderDiscountId])
&& $this->applyResult['DISCOUNT_LIST'][$orderDiscountId] == 'N'
)
||
(
$orderCouponId != ''
&& !empty($this->applyResult['COUPON_LIST'][$orderCouponId])
&& $this->applyResult['COUPON_LIST'][$orderCouponId] == 'N'
)
)
{
$this->orderData = $this->currentStep['oldData'];
if (!empty($stepResult['BASKET']))
{
foreach ($stepResult['BASKET'] as &$basketItem)
$basketItem['APPLY'] = 'N';
unset($basketItem);
}
if (!empty($stepResult['DELIVERY']))
$stepResult['DELIVERY']['APPLY'] = 'N';
}
else
{
if (!empty($this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['RESULT']))
{
$existDiscountResult = $this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['RESULT'];
if (!empty($existDiscountResult['BASKET']))
{
$basketCodeList = $this->getBasketCodes(false);
if (!empty($basketCodeList))
{
foreach ($basketCodeList as &$basketCode)
{
if ($this->isCustomPriceByCode($basketCode))
continue;
if (isset($existDiscountResult['BASKET'][$basketCode]))
{
$disable = ($existDiscountResult['BASKET'][$basketCode]['APPLY'] == 'N');
if (isset($this->applyResult['BASKET'][$basketCode][$orderDiscountId]))
{
$applyDisable = ($this->applyResult['BASKET'][$basketCode][$orderDiscountId] == 'N');
if ($disable != $applyDisable)
$disable = $applyDisable;
unset($applyDisable);
}
if ($disable)
{
$stepResult['BASKET'][$basketCode]['APPLY'] = 'N';
$this->orderData['BASKET_ITEMS'][$basketCode] = $this->currentStep['oldData']['BASKET_ITEMS'][$basketCode];
}
else
{
$stepResult['BASKET'][$basketCode]['APPLY'] = 'Y';
$this->orderData['BASKET_ITEMS'][$basketCode]['ACTION_APPLIED'] = 'Y';
}
}
}
unset($disable, $basketCode);
}
}
if (!empty($existDiscountResult['DELIVERY']))
{
$disable = ($existDiscountResult['DELIVERY']['APPLY'] == 'N');
if (!empty($this->applyResult['DELIVERY'][$orderDiscountId]))
{
$applyDisable = ($this->applyResult['DELIVERY'][$orderDiscountId] == 'N');
if ($disable != $applyDisable)
$disable = $applyDisable;
unset($applyDisable);
}
if ($disable)
{
$this->orderData['PRICE_DELIVERY'] = $this->currentStep['oldData']['PRICE_DELIVERY'];
$this->orderData['PRICE_DELIVERY_DIFF'] = $this->currentStep['oldData']['PRICE_DELIVERY_DIFF'];
$stepResult['DELIVERY']['APPLY'] = 'N';
}
else
{
$stepResult['DELIVERY']['APPLY'] = 'Y';
}
unset($disable);
}
}
}
}
if ($applied && $orderCouponId != '')
{
$couponApply = $couponClassName::setApply($this->couponsCache[$orderCouponId]['COUPON'], $stepResult);
unset($couponApply);
}
if ($applied)
{
$this->mergeDiscountActionResult($this->currentStep['discountIndex'], $stepResult);
}
else
{
if (!empty($this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]))
$this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['ORDER'][$this->currentStep['discountIndex']]['RESULT'] = array();
}
return $result;
}