Столкнулся со своеобразной проблемой при работе с купонами: переставали применяться и пересчитываться суммы в корзине, если делать ограничение на применение, по группе, например, сделать купон "только для администраторов".
В AJAX запросе на применение купона, где использовалась функция CSaleDiscount::DoProcessOrder(), помогла просто передача ID пользователя
....
if($USER->IsAuthorized()) {
$arOrder['USER_ID'] = $USER->GetID();
}
CSaleDiscount::DoProcessOrder($arOrder, array(), $arErrors);
|
В другом AJAX запросе, возвращающем сумму корзины с учётом скидок (но без учёта доставки) с помощью техподдержки удалось успешно решить задачу применением следующего кода:
if (\Bitrix\Main\Loader::includeModule('sale')) {
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(
\CSaleBasket::GetBasketUserID(), "s1")->getOrderableItems();
$discounts = \Bitrix\Sale\Discount::buildFromBasket($basket, new \Bitrix\Sale\Discount\Context\Fuser($basket->getFUserId(true)));
$discounts->calculate();
$arBasketDiscounts = $discounts->getApplyResult(true);
$sum = 0;
// массив объектов \Bitrix\Sale\BasketItem
$basketItems = $basket->getBasketItems();
/** @var \Bitrix\Sale\BasketItem $basketItem */
foreach ($basketItems as $basketItem ) {
// чтоб в этом цикле их вывести
$basketCode = $basketItem->getBasketCode();
if (isset($arBasketDiscounts["PRICES"]['BASKET'][$basketCode]))
{
$sum += $arBasketDiscounts["PRICES"]['BASKET'][$basketCode]["PRICE"]*$basketItem->getQuantity();
} else {
$sum += $basketItem->getFinalPrice();
}
}
echo number_format($sum, '2', ',', ' ') . ' руб.';
} |