Редактировать

Итоговая стоимость корзины с учетом скидок

Задача

Получить стоимость корзины с учетом скидок

Проблема

С какогото момента $basket->getPrice() стало возвращать стоимость корзины БЕЗ учета скидок, по этому понадобился иной метод, он создает фейковый заказ без сохранения и актуальная цена берется уже из заказа, а не из корзины.

Данный подход описан по следующим ссылкам:

Решение

<?php
class Basket
{
    public function __construct()
    {
        Loader::includeModule('iblock');
        Loader::includeModule('sale');
        $this->siteId = \Bitrix\Main\Context::getCurrent()->getSite();
        $this->fuserId = Sale\Fuser::getId();
    }

    /**
     * Получение стоимости корзины с учетом скидок
     *
     * @return float
     * @throws \Bitrix\Main\ArgumentException
     * @throws \Bitrix\Main\ArgumentNullException
     * @throws \Bitrix\Main\ArgumentOutOfRangeException
     * @throws \Bitrix\Main\NotImplementedException
     * @throws \Bitrix\Main\NotSupportedException
     * @throws \Bitrix\Main\ObjectException
     * @throws \Bitrix\Main\ObjectNotFoundException
     */
    public function getBasketPrice()
    {
        $basket = Sale\Basket::loadItemsForFUser($this->fuserId, $this->siteId);
        $order = Sale\Order::create($this->siteId, $this->fuserId);
        $order->setPersonTypeId(1);
        $order->setBasket($basket);

        $discounts = $order->getDiscount();
        $discounts->getApplyResult();
    
        return $order->getPrice();
    }
}