1С-Битрикс — отмена скидки пользователя в корзине

Кейс - при оформлении заказа пользователь выбирает тот или иной способ доставки, при этом у некоторых способов доставки имеются дополнительные условия.
Одним из условий является отмена скидок на товар.

И все бы ничего, но штатного метода для локальной отмены скидки пользователя я не нашел, Yandex и Google тоже не помогли.

Нельзя просто так взять и отменить скидки!

Решение - очередной ВелоГовноКод

Уже традиционно решение находится в событиях системы, в данном случае нам поможет событие "OnGetDiscountResult" модуля "catalog", оно вызывается после того как для пользователя рассчитаны все возможные скидки.
После регистрации события и передачи данных в кастомную функцию мы можем получить доступ к массиву рассчитанных скидок пользователя. Данные передаются по ссылке в переменной, следовательно массив можно прочитать и изменить на свой вкус.

Дело за малым, в кастомной функции обработчике ограничиваем выполнение кода любым удобным/доступным способом, я перехватываю данные из $_REQUEST, т.к. в корзине у меня имеются определенные ключи доступные на всех нужных этапах оформления заказа. Далее читаем $arFields переданный по ссылке, обнуляем скидку и радуемся результату.

Да! Чтобы понять какие именно скидки нужно убрать, не плохо бы иметь отфильтрованный список неугодных скидок. Достаточно сделать ::GetList(); но как выяснилось их два =)

Bitrix\Catalog\DiscountTable::getList(); Bitrix\Sale\Internals\DiscountTable::getList();

Первый выберет скидки модуля "каталог", это непосредственно скидки в общем понимании. Второй же выберет скидки модуля "интернет магазин", в админке они называются правилами работы с корзиной.

Если у кого есть решение получше - пишите в комменты, мне этот велосипед тоже не нравится!


P.S.

Перед тем как найти решение, я направил запрос в саппорт Битрикс.

Ответ правда оказался совершенно бесполезным - (screenshot 1).

Screenshot 1
Бесполезный ответ саппорта на вопрос об отмене скидок в битрикс

Комментарии (2)

  1. Алевтина 16.09.2016 Ответить
    Здравствуйте, могли вы скинуть код вашего решения по отмене скидки на товар в корзине?
  2. Дмитрий
    Дмитрий 16.09.2016 Ответить
    Добрый день Алевтина.
    Я напишу пример кода, полный думаю ни к чему, т.к. фактически обвес будет сводиться к проверкам типа - "а можно ли удалить у этого пользователя, эту скидку?".

    В init.php добавляем следующий код:
    \Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog','OnGetDiscountResult',array('#ВАШ_КЛАСС#','OnGetUserDiscount'));

    В файл где у вас хранятся хэндлеры (функции вызываемые событиями) добавляем код:
    public static function OnGetUserDiscount(&$arFields){
    $arFields=array();
    }

    Ваша задача получить в функции OnGetUserDiscount() массив рассчитанных скидок и удалить те которые вам не нужны, или все удалить, тут уже зависит от задачи.
    Ну как-то так.

Оставить комментарий