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

События связанные с корзиной

[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);
}