[OnBeforeAddPosition] Событие перед добавлением позиции в корзину заказа МС
Событие вызывается перед добавлением товара в массив позиций МС для отправки. Можно модифицировать добавляемую позицию в МС. Вызывается каждый раз на создание \ изменение заказа из БУС в МС
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeAddPosition',
'OnBeforeAddPositionHandler'
);
function OnBeforeAddPositionHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$basketItem= $eventParams['basketItem']; //объект позиции корзины в БУС
$currXmlId= $eventParams['currXmlId']; //внешний код добавляемой позиции
$positionParams = $eventParams['positionParams']; //массив параметров позиции, который можно модифицировать перед отправкой
$productObj= $eventParams['productObj']; //объект товара в МС
//Например прибавим количество товара в позиции:
//$positionParams['quantity'] += 2;
// \Rbs\Moysklad\Logger::debugMsg($positionParams, 'OnBeforeAddPositionHandler.txt'); // записываем логи в папку /bitrix/modules/rbs.moysklad/logs/
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять параметры позиции
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $positionParams);
}
[OnAfterSetBasketPositions] Событие после обработки всех позиций
Событие вызывается после обработки всех позиций (событие выше) и перед отправкой их в МС. Можно использовать для добавления \ удаления \ изменения позиций корзины перед отправкой в МС.
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnAfterSetBasketPositions',
'OnAfterSetBasketPositionsHandler'
);
function OnAfterSetBasketPositionsHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$positions = $eventParams['positions']; //массив всех позиций корзины для отправки в МС
//Например удалим последнюю позицию перед отправкой:
//array_pop($positions);
// \Rbs\Moysklad\Logger::debugMsg($positions, 'OnAfterSetBasketPositionsHandler.txt'); // записываем логи в папку /bitrix/modules/rbs.moysklad/logs/
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять параметры позиции
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $positions);
}
[OnBeforeCreateProductMs] Событие перед созданием товара на стороне МС
Событие вызывается перед созданием товара в МС. Необходимо для модификации создаваемых позиций в МС.
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeCreateProductMs',
'OnBeforeCreateProductMsHandler'
);
function OnBeforeCreateProductMsHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$basketItem = $eventParams['basketItem']; //объект позиции корзины в БУС
$currXmlId = $eventParams['currXmlId']; //внешний код добавляемой позиции
$createItemArray = $eventParams['createItemArray']; //массив параметров позиции, который можно модифицировать перед отправкой
$entityType = $eventParams['entityType']; //тип добавляемого объека (на данный момент только product)
//Например добавим в название добавляемой позиции постфикс в название
//$createItemArray['name'] .= ' (from site)';
// \Rbs\Moysklad\Logger::debugMsg($createItemArray, 'OnBeforeCreateProductMsHandler.txt'); // записываем логи в папку /bitrix/modules/rbs.moysklad/logs/
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять параметры позиции
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $createItemArray);
}
[OnCreateMsBasket] Событие вывода корзины МС перед ее изменением в БУС
Событие позволяет изменить массив позиций заказа МС перед тем, как этот массив будет записан в корзину БУС.
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnCreateMsBasket',
'OnCreateMsBasketHandler'
);
function OnCreateMsBasketHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$orderPositions = $eventParams['orderPositions'];
$customerOrder = $eventParams['msOrder'];
$vatIncluded = $customerOrder->{'order'}->{'vatIncluded'};
$arMsBasket = [];
//шаблон нижже показывает универсальный способ обработки массива позиций корзины из МС и записи из в $arMsBasket
foreach ($orderPositions->{'rows'} as $positionRow) {
$assortmentItem = $positionRow->{'assortment'};
if (!empty($assortmentItem->{'externalCode'})) {
//универсальная формула рассчета конечной цены с учетом скидки
$finalPrice = $positionRow->{'price'} * $positionRow->{'quantity'} - (($positionRow->{'price'} * $positionRow->{'quantity'} * ($positionRow->{'discount'} / 100)));
//далее рассчитываем финальную цену на 1 позицию
if ($positionRow->{'quantity'} > 0) {
$finalDiscountPrice = $finalPrice / $positionRow->{'quantity'};
} else {
$finalDiscountPrice = $finalPrice;
}
//в этом месте можно как-то редактировать данные для записи их в $arMsBasket
$arMsBasket[$assortmentItem->{'externalCode'}] = [
'XML_ID' => $assortmentItem->{'externalCode'},
'NAME' => $assortmentItem->{'name'},
'BASE_PRICE' => $positionRow->{'price'}, //пишем базовую цену
'PRICE' => $finalDiscountPrice, //пишем финальную цену на 1 позицию со скидками
'DISCOUNT_PRICE' => $positionRow->{'price'} - $finalDiscountPrice, // пишем разницу цен
'QUANTITY' => $positionRow->{'quantity'},
'DISCOUNT_VALUE' => $positionRow->{'discount'},
'VAT_RATE' => $positionRow->{'vat'},
'VAT_INCLUDED' => $vatIncluded ? 'Y' : 'N'
];
}
}
//возвращаем массив $arMsBasket для дальнейшей обрабткой модулем если нужно
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arMsBasket);
}