Перейти к содержимому

Скидка не применилась в корзине - разбор причин

Покупатель ждёт обещанную скидку, а корзина упрямо считает товар по полной цене. Либо наоборот: в корзине сумма падает, а на витрине цена не перечёркнута. Разбираем причины по убыванию частоты, начиная с того, где именно скидки нет.

С чего начать

Первая проверка делит все причины пополам: скидки нет на витрине или нет в корзине. Витрину считает скидка каталога, корзину - правило корзины, и это два разных механизма с разными настройками.

Смотрим итоговую цену глазами покупателя:

global $USER;
$optimal = \CCatalogProduct::GetOptimalPrice($productId, 1,
$USER->GetUserGroupArray(), 'N', [], SITE_ID);
printf("база=%s итог=%s\n", $optimal['RESULT_PRICE']['BASE_PRICE'],
$optimal['RESULT_PRICE']['DISCOUNT_PRICE']);
// два одинаковых числа означают, что скидка каталога к товару не подошла
// проверяем из-под покупателя: у администратора набор групп совсем другой

Совпадение базовой и итоговой цены сразу закрывает половину версий: скидки каталога здесь нет.

Смотрим активные скидки каталога у товара:

$discounts = \CCatalogDiscount::GetDiscountByProduct(
$productId, $USER->GetUserGroupArray(), 'N', [$basePriceTypeId], SITE_ID
);
print_r(array_column($discounts ?: [], 'NAME'));
// пустой массив - скидок нет, false - товар заведён в каталоге некорректно
// выборка зависит от групп покупателя, доступных типов цен и сайта сразу

Пустой список при живой акции означает несовпадение по группе, типу цены или сайту.

Сравниваем расчёт цены с купоном и без него:

// седьмой аргумент false берёт купоны из менеджера, пустой массив исключает их
$withCoupon = \CCatalogProduct::GetOptimalPrice($productId, 1,
$USER->GetUserGroupArray(), 'N', [], SITE_ID, false);
$clean = \CCatalogProduct::GetOptimalPrice($productId, 1,
$USER->GetUserGroupArray(), 'N', [], SITE_ID, []);
printf("с купоном=%s без купона=%s\n", $withCoupon['RESULT_PRICE']['DISCOUNT_PRICE'],
$clean['RESULT_PRICE']['DISCOUNT_PRICE']);
// равные числа означают, что купон в расчёт цены не попал вовсе

Равный итог при живом купоне переводит разбор к самому купону и правам покупателя.

Проверяем купон отдельно от скидки:

\Bitrix\Sale\DiscountCouponsManager::init();
$added = \Bitrix\Sale\DiscountCouponsManager::add($code);
printf("код принят: %s\n", $added ? 'да' : 'нет');
print_r(\Bitrix\Sale\DiscountCouponsManager::get());
// принят - код существует и не сгорел, применён - условия скидки совпали

Принятый купон и сработавшая скидка - разные события, и жалобы почти всегда начинаются с их смешения.

Сбрасываем кэш каталога после окончания акции:

use Bitrix\Main\Application;
// акция кончилась по дате, а страницы каталога всё ещё отдаются из кэша
Application::getInstance()->getTaggedCache()->clearByTag('iblock_id_' . $iblockId);
// тег регистрируют компоненты каталога, сброс снимает все страницы инфоблока

По расписанию платформа страницы не пересобирает, и старая цена живёт до сброса тега.

Причины

  1. Акция заведена правилом корзины, а ждут её на витрине примерно 25% случаев

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

    ПроверкаСмотрим, где заведена акция: в скидках каталога или в правилах работы с корзиной.

    Что делатьДублируем условие скидкой каталога либо честно предупреждаем покупателя о пересчёте в корзине.

  2. Купон мёртв: истёк срок, чужая группа или израсходованный тип примерно 20% случаев

    ПризнакПоле ввода принимает код без ошибки, а итоговая сумма заказа остаётся прежней.

    ПроверкаСмотрим активность купона, дату окончания и группы покупателей у привязанной скидки.

    Что делатьВыпускаем новый код или правим группы: одноразовый купон после первого заказа мёртв.

  3. Показ скидки в каталоге выключен самой платформой примерно 20% случаев

    ПризнакЦена на витрине не перечёркнута, хотя в корзине скидка считается исправно.

    ПроверкаСмотрим условия правила: любое условие на состав корзины гасит показ в каталоге.

    Что делатьПереносим условие на свойства товара, иначе признак показа платформа включить не даст.

  4. Скидка назначена родителю, а не торговому предложению примерно 15% случаев

    ПризнакУ товара с вариантами скидки нет, а у обычных товаров та же акция работает.

    ПроверкаЗапрашиваем активные скидки по идентификатору предложения, а не по карточке родителя.

    Что делатьПереносим условие скидки на предложения или на раздел каталога вместо конкретной карточки.

  5. Пересчёт заказа в админке даёт другую сумму примерно 12% случаев

    ПризнакНа оформлении скидка была, а в карточке заказа она пропала или изменила величину.

    ПроверкаСравниваем сохранённый в заказе список скидок с результатом пересчёта на текущем составе.

    Что делатьПересчитываем осознанно: кнопка берёт действующие правила, а не те, что были при покупке.

  6. Кэш витрины отдаёт цену закончившейся акции примерно 8% случаев

    ПризнакКаталог показывает старую цену со скидкой, а в корзину товар падает по новой.

    ПроверкаСверяем дату окончания скидки со временем последнего сброса кэша страниц каталога.

    Что делатьСбрасываем тегированный кэш инфоблока: по расписанию платформа страницы сама не пересобирает.

Частые вопросы

Почему скидка есть в каталоге, а в корзине её нет?

Проверяют два места сразу: где заведена акция и каким группам покупателей она разрешена. Скидка каталога и правило корзины считаются разными модулями, и настройки доступа у них свои.

Купон принят, а скидка не применилась - почему?

Принятый код означает лишь, что он существует и не сгорел. Сработала ли скидка, показывает список применённых правил корзины, и разбор ведут по нему.

Почему у правила не включается показ в каталоге товаров?

Признак считается платформой автоматически. Условие по составу корзины делает показ невозможным: этих данных на витрине просто нет, и переключить признак руками нельзя.

Скидка перестала применяться после обновления, куда смотреть?

Сначала в версию модуля продаж и в журнал обновлений. Дальше сверяют сохранённый в заказе список скидок с пересчётом: расхождение показывает, что правило изменилось после оформления.

Почему скидка не применяется к товарам из нового инфоблока?

Скидка привязана к сайту и к условиям по каталогу. Новый инфоблок должен принадлежать тому же сайту и попадать под условия, иначе правило его не видит.

Смежное

Первоисточник