Столкнулся с неприятной ситуацией переопределения скидок. Вроде все по мануалу, ан-нет, не так все просто 
Задача стояла следующая, для определенных клиентов отключить применение скидок, причем в правилах скидок это не получается применить, но это отдельная тема.
Что было сделано
И это работает, причем везде, кроме штатной компоненты bitrix:sale.order.ajax, которая не обращается к данному обработчику, и начинает применять скидки для этих пользователей. В результате продаже ниже захода.
Подскажите направление, куда копать, что-бы победить данную тему? И почему данное событие не отрабатывает данный компонет, это так задумано или это ошибка?

Задача стояла следующая, для определенных клиентов отключить применение скидок, причем в правилах скидок это не получается применить, но это отдельная тема.
Что было сделано
| Код |
|---|
// Решаем вопрос со скидками, т.е. не разрешаем применять скидки из разряда "для всех, в том числе неавторизованных" для оптовиков...
\Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog', 'OnGetDiscount', ['pitOnGetDiscount', 'OnGetDiscountHandler']);
\Bitrix\Main\EventManager::getInstance()->addEventHandler('catalog', 'OnGetDiscountResult', ['pitOnGetDiscount', 'OnGetDiscountResultHandler']);
class pitOnGetDiscount
{
//
static private $arCache = array();
static private $arUserGroups = false;
//
public function OnGetDiscountHandler($intProductID, $intIBlockID, $arCatalogGroups, $arUserGroups, $strRenewal, $siteID, $arDiscountCoupons, $boolSKU, $boolGetIDS)
{
self::$arUserGroups = $arUserGroups;
return true;
}
//
public function OnGetDiscountResultHandler(&$arResult)
{
$isOptUser = in_array(12, self::$arUserGroups) || in_array(25, self::$arUserGroups); // Опт, мелкий опт...
if($isOptUser) {
$connection = false;
foreach($arResult as $k => $a) {
if(!isset(self::$arCache[$k])) {
self::$arCache[$k] = array();
if(!$connection) $connection = \Bitrix\Main\Application::getConnection();
$res = $connection->query('SEL ECT `GROUP_ID` FR OM `b_sale_discount_group` WHERE `DISCOUNT_ID`='.$k);
while($ob = $res->fetch()) self::$arCache[$k][] = (int)$ob['GROUP_ID'];
}
// Проверяем, скидос имеет отношение к оптовому пользователю?...
if(
!in_array(12, self::$arCache[$k]) // Опт...
&& !in_array(25, self::$arCache[$k]) // Опт. Питер -15%...
) unset($arResult[$k]);
}
}
}
}
|
Подскажите направление, куда копать, что-бы победить данную тему? И почему данное событие не отрабатывает данный компонет, это так задумано или это ошибка?