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

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

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

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

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

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

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

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

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

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

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


P.S.

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

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

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

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

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

  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() массив рассчитанных скидок и удалить те которые вам не нужны, или все удалить, тут уже зависит от задачи.
    Ну как-то так.
  3. Антон 21.04.2018 Ответить
    Дмитрий, а не могли бы прислать полную версию кода? Задача такая, что надо отменить скидки при выборе определенной платежной системы... Заранее спасибо
  4. Дмитрий
    Дмитрий 24.04.2018 Ответить
    Антон, полную версию кода не пришлю по двум причинам:
    1) это собственность заказчика который заплатил за решение его проблемы.
    2) в посте есть вся необходимая информация для решения задачи, нужно напрячься и разобрать вопрос иначе не вырастите.
    Спасибо за понимание
  5. Кирилл 07.07.2018 Ответить
    Я решил вопрос так:
    Правила работы корзиной-> Действия и условия-> в дополнительных условиях ставил условие которое мне не надо.
    Например я не хочу чтобы применялась скидка при оплате картой рассрочки, или при доставке почтой.
  6. Дмитрий
    Дмитрий 09.07.2018 Ответить
    Да, теперь это доступно в штатном функционале.
  7. Кирилл 16.08.2019 Ответить
    Добрый день. Можете подробнее описать ваши действия по настройке?
    Тоже нужно отменять скидку в корзине при выборе платежной системы (карта рассрочки).
  8. Юлиана 16.12.2018 Ответить
    Спасибо. у меня вот задача стоит превратить оплату подарочным купоном в оплату внутренним счетом, и думаю событие найденное вами мне поможет.
  9. Megamosk 06.01.2019 Ответить
    По-моему используется DiscountCouponsManager::clear(true);
  10. Кирилл 16.08.2019 Ответить
    Подскажите, как штатным методом можно отметить скидку при выборе определенной платежной системы?

    При создании правила работы с корзиной есть выбор действий среди которых подходящее только "Изменить стоимость товаров в корзине", но там можно только применить: скидку, наценку или установить фикс. Но нет возможности отменить скидку.


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