- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/discountbase.php
- Класс: BitrixSaleDiscountBase
- Вызов: DiscountBase::calculateApplyBasketAdditionalCoupons
protected function calculateApplyBasketAdditionalCoupons(array $applyCoupons)
{
$result = new Result;
if ($this->useOnlySaleDiscounts())
return $result;
if (empty($applyCoupons))
return $result;
/** @var DiscountCouponsManager $couponClassName */
$couponClassName = $this->getDiscountCouponClassName();
$applyBlock = &$this->discountResult['APPLY_BLOCKS'][$this->discountResultCounter]['BASKET'];
$applyExist = $this->isBasketApplyResultExist();
$basketCodeList = $this->getBasketCodes(false);
foreach ($basketCodeList as &$basketCode)
{
if (array_key_exists($basketCode, $applyBlock))
unset($applyBlock[$basketCode]);
if (empty($applyCoupons[$basketCode]))
continue;
$itemData = array(
'MODULE_ID' => $this->orderData['BASKET_ITEMS'][$basketCode]['MODULE'],
'PRODUCT_ID' => $this->orderData['BASKET_ITEMS'][$basketCode]['PRODUCT_ID'],
'BASKET_ID' => $basketCode
);
$this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE_TMP'] = $this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE'];
$this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE'] = $this->orderData['BASKET_ITEMS'][$basketCode]['PRICE'];
foreach ($applyCoupons[$basketCode] as $index => $discount)
{
$discountResult = $this->convertDiscount($discount);
if (!$discountResult->isSuccess())
{
$result->addErrors($discountResult->getErrors());
unset($discountResult);
return $result;
}
$orderDiscountId = $discountResult->getId();
$discountData = $discountResult->getData();
$applyCoupons[$basketCode][$index]['ORDER_DISCOUNT_ID'] = $orderDiscountId;
if (empty($discount['COUPON']))
{
$result->addError(new MainEntityEntityError(
Loc::getMessage('BX_SALE_DISCOUNT_ERR_DISCOUNT_WITHOUT_COUPON'),
self::ERROR_ID
));
return $result;
}
$couponResult = $this->convertCoupon($discount['COUPON'], $orderDiscountId);
if (!$couponResult->isSuccess())
{
$result->addErrors($couponResult->getErrors());
unset($couponResult);
return $result;
}
$orderCouponId = $couponResult->getId();
$couponClassName::setApplyByProduct($itemData, array($orderCouponId));
unset($couponResult);
unset($discountData, $discountResult);
if (!isset($applyBlock[$basketCode]))
$applyBlock[$basketCode] = array();
$applyBlock[$basketCode][$index] = array(
'DISCOUNT_ID' => $orderDiscountId,
'COUPON_ID' => $orderCouponId,
'RESULT' => array(
'APPLY' => 'Y',
'DESCR' => false,
'DESCR_DATA' => false
)
);
$currentProduct = $this->orderData['BASKET_ITEMS'][$basketCode];
$orderApplication = (
!empty($this->discountsCache[$orderDiscountId]['APPLICATION'])
? $this->discountsCache[$orderDiscountId]['APPLICATION']
: null
);
if (!empty($orderApplication))
{
$this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT'] = (
!empty($this->discountsCache[$orderDiscountId]['ACTIONS_DESCR_DATA'])
? $this->discountsCache[$orderDiscountId]['ACTIONS_DESCR_DATA']
: false
);
$applyProduct = null;
eval('$applyProduct='.$orderApplication.';');
if (is_callable($applyProduct))
$applyProduct($this->orderData['BASKET_ITEMS'][$basketCode]);
unset($applyProduct);
if (!empty($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']))
{
$applyBlock[$basketCode][$index]['RESULT']['DESCR_DATA'] = $this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']['BASKET'];
$applyBlock[$basketCode][$index]['RESULT']['DESCR'] = $this->formatDescription($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']);
}
unset($this->orderData['BASKET_ITEMS'][$basketCode]['DISCOUNT_RESULT']);
}
unset($orderApplication);
if ($applyExist && !$this->getStatusApplyBasketDiscount($basketCode, $orderDiscountId, $orderCouponId))
{
$this->orderData['BASKET_ITEMS'][$basketCode] = $currentProduct;
$applyBlock[$basketCode][$index]['RESULT']['APPLY'] = 'N';
}
unset($currentProduct);
if ($applyBlock[$basketCode][$index]['RESULT']['APPLY'] == 'Y')
$this->orderData['BASKET_ITEMS'][$basketCode]['ACTION_APPLIED'] = 'Y';
}
unset($discount, $index);
$this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE'] = $this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE_TMP'];
unset($this->orderData['BASKET_ITEMS'][$basketCode]['BASE_PRICE_TMP']);
}
unset($basketCode, $basketCodeList);
unset($applyBlock);
return $result;
}