События связанные с корзиной
[OnBeforeAddPosition] Событие перед добавлением позиции в корзину заказа МС
Событие вызывается перед добавлением товара в массив позиций МС для отправки. Можно модифицировать добавляемую позицию в МС. Вызывается каждый раз на создание / изменение заказа из БУС в МС.
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
order | \Bitrix\Sale\Order | Объект заказа Битрикс |
basketItem | \Bitrix\Sale\BasketItem | Объект позиции корзины в БУС |
currXmlId | string | Внешний код (XML_ID) добавляемой позиции |
positionParams | array | Массив параметров позиции для отправки в МС |
productObj | object | Объект товара в МойСклад |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом $positionParams. Массив заменит параметры позиции перед добавлением в заказ МС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $positionParams);
//Пример кода нужно вставить в файл 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 — массив параметров позиции для МС
// [
// 'quantity' => 2.0, // float — количество товара
// 'reserve' => 0.0, // float — количество в резерве
// 'price' => 150000, // float — цена в копейках (BASE_PRICE * 100)
// 'discount' => 10.0, // float — скидка в процентах
// 'assortment' => (object)[ // object — ссылка на товар в МС
// 'meta' => (object)[
// 'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/product/...',
// 'type' => 'product',
// 'mediaType' => 'application/json'
// ]
// ],
// 'vat' => 20, // int — ставка НДС (0, 10, 20)
// 'vatEnabled' => true // bool — НДС включён в цену
// ]
$positionParams = $eventParams['positionParams']; //массив параметров позиции, который можно модифицировать перед отправкой
// $productObj — объект товара из МС (результат поиска по externalCode)
// (object)[
// 'id' => '...',
// 'name' => 'Название товара',
// 'externalCode' => '...',
// 'meta' => (object)['href' => '...', 'type' => 'product']
// ]
$productObj = $eventParams['productObj']; //объект товара в МС
// $basketItem — стандартный объект Bitrix, доступные методы:
// $basketItem->getField('NAME') — название
// $basketItem->getField('QUANTITY') — количество
// $basketItem->getField('PRICE') — цена
// $basketItem->getField('BASE_PRICE') — базовая цена
// $basketItem->getField('PRODUCT_ID') — ID товара
// $basketItem->getField('PRODUCT_XML_ID') — XML_ID товара
//Например прибавим количество товара в позиции:
//$positionParams['quantity'] += 2;
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять параметры позиции
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $positionParams);
}
[OnAfterSetBasketPositions] Событие после обработки всех позиций
Событие вызывается после обработки всех позиций (событие выше) и перед отправкой их в МС. Можно использовать для добавления / удаления / изменения позиций корзины перед отправкой в МС.
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderId | int | ID заказа в БУС |
order | \Bitrix\Sale\Order | Объект заказа Битрикс |
positions | array|null | Массив всех позиций корзины для отправки в МС |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом позиций. Массив заменит все позиции перед отправкой в МС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $positions);
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnAfterSetBasketPositions',
'OnAfterSetBasketPositionsHandler'
);
function OnAfterSetBasketPositionsHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
// $positions — массив всех позиций, подготовленных для отправки в МС
// Ключ массива — externalCode товара (или числовой индекс при включённых дублях)
// [
// 'XML_ID_ТОВАРА_1' => [
// 'quantity' => 2.0,
// 'reserve' => 0.0,
// 'price' => 150000, // цена в копейках
// 'discount' => 10.0,
// 'assortment' => (object)['meta' => (object)[...]],
// 'vat' => 20,
// 'vatEnabled' => true
// ],
// 'XML_ID_ТОВАРА_2' => [
// 'quantity' => 1.0,
// 'reserve' => 1.0,
// 'price' => 50000,
// 'discount' => 0.0,
// 'assortment' => (object)['meta' => (object)[...]],
// 'vat' => 0
// ],
// ]
$positions = $eventParams['positions']; //массив всех позиций корзины для отправки в МС
//Например удалим последнюю позицию перед отправкой:
//array_pop($positions);
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять параметры позиции
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $positions);
}
[OnBeforeCreateProductMs] Событие перед созданием товара на стороне МС
Событие вызывается перед созданием товара в МС. Необходимо для модификации создаваемых позиций в МС. Товар создаётся, когда он не найден в МС по внешнему коду и в настройках модуля включена опция создания товаров.
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
entityType | string | Тип создаваемого объекта (на данный момент только product) |
basketItem | \Bitrix\Sale\BasketItem | Объект позиции корзины в БУС |
currXmlId | string | Внешний код добавляемой позиции |
createItemArray | array | Массив параметров для создания товара в МС |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом $createItemArray. Массив заменит данные товара перед отправкой в МС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $createItemArray);
//Пример кода нужно вставить в файл 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']; //внешний код добавляемой позиции
$entityType = $eventParams['entityType']; //тип добавляемого объека (на данный момент только product)
// $createItemArray — массив данных для создания товара в МС
// [
// 'name' => 'Название товара', // string — обязательное, название товара
// 'externalCode' => 'ABC123', // string — обязательное, внешний код (XML_ID из БУС)
// 'code' => 'ART-001', // string — код товара (опционально)
// 'article' => 'ART-001', // string — артикул (опционально)
// 'description' => 'Описание', // string — описание (опционально)
// 'images' => [ // array — изображения (опционально)
// (object)[
// 'filename' => 'image.jpg',
// 'content' => 'base64...'
// ]
// ],
// 'productFolder' => (object)[...], // object — группа товаров (опционально)
// 'salePrices' => [ // array — цены продажи (опционально)
// (object)[
// 'value' => 150000, // int — цена в копейках
// 'currency' => (object)[...],
// 'priceType' => (object)[...]
// ]
// ],
// 'attributes' => [ // array — дополнительные поля (опционально)
// ['id' => '...', 'value' => '...']
// ]
// ]
$createItemArray = $eventParams['createItemArray']; //массив параметров позиции, который можно модифицировать перед отправкой
//Например добавим в название добавляемой позиции постфикс в название
//$createItemArray['name'] .= ' (from site)';
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять параметры позиции
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $createItemArray);
}
[OnCreateMsBasket] Событие вывода корзины МС перед её изменением в БУС
Событие позволяет изменить массив позиций заказа МС перед тем, как этот массив будет записан в корзину БУС. Используется при импорте заказа из МС в Битрикс.
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
orderPositions | object | Объект позиций заказа из МС (с пагинацией) |
arMsBasket | array | Подготовленный массив корзины для записи в БУС |
msOrder | object | Объект заказа МойСклад |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом $arMsBasket. Массив заменит данные корзины для записи в БУС.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arMsBasket);
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnCreateMsBasket',
'OnCreateMsBasketHandler'
);
function OnCreateMsBasketHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
// $orderPositions — объект позиций заказа МС
// (object)[
// 'meta' => (object)[
// 'href' => 'https://api.moysklad.ru/api/remap/1.2/entity/customerorder/.../positions',
// 'size' => 5
// ],
// 'rows' => [
// (object)[
// 'quantity' => 2,
// 'price' => 150000,
// 'discount' => 10,
// 'reserve' => 0,
// 'vat' => 20,
// 'assortment' => (object)[
// 'name' => 'Название товара',
// 'externalCode' => 'XML_ID_ТОВАРА_1',
// 'meta' => (object)['type' => 'product']
// ]
// ]
// ]
// ]
$orderPositions = $eventParams['orderPositions'];
$customerOrder = $eventParams['msOrder'];
$vatIncluded = $customerOrder->{'vatIncluded'};
// $arMsBasket — массив позиций для записи в корзину БУС
// Ключ массива — externalCode товара
// [
// 'XML_ID_ТОВАРА_1' => [
// 'XML_ID' => 'XML_ID_ТОВАРА_1',
// 'NAME' => 'Название товара',
// 'BASE_PRICE' => 150000, // float — базовая цена в копейках
// 'PRICE' => 135000, // float — цена со скидкой в копейках
// 'DISCOUNT_PRICE' => 15000, // float — размер скидки в копейках
// 'QUANTITY' => 2.0,
// 'DISCOUNT_VALUE' => 10.0,
// 'VAT_RATE' => 20.0,
// 'VAT_INCLUDED' => 'Y',
// 'CURRENCY' => 'RUB',
// 'WEIGHT' => 500,
// 'RESERVE_QUANTITY' => 0.0
// ]
// ]
$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);
}
[OnBeforeFindBasketItemFromPosition] Событие перед поиском позиции корзины по позиции отгрузки МС
Событие вызывается при обработке отгрузок (demand) из МС. Позволяет вручную сопоставить позицию отгрузки МС с позицией корзины БУС, если стандартный алгоритм поиска по externalCode не подходит.
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
order | \Bitrix\Sale\Order | Объект заказа БУС |
orderMs | object | Объект заказа МойСклад |
basketItems | \Bitrix\Sale\BasketItemCollection | Коллекция позиций корзины заказа |
position | object | Объект позиции отгрузки из МС |
Возвращаемое значение
Верните EventResult::SUCCESS с массивом ['basket_item' => $basketItem], где $basketItem — объект \Bitrix\Sale\BasketItem. Если возвращена валидная позиция корзины, стандартный поиск будет пропущен.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['basket_item' => $basketItem]);
//Пример кода нужно вставить в файл init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moysklad',
'OnBeforeFindBasketItemFromPosition',
'OnBeforeFindBasketItemFromPositionHandler'
);
function OnBeforeFindBasketItemFromPositionHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
$order = $eventParams['order']; // объект заказа БУС
$basketItems = $eventParams['basketItems']; // коллекция позиций корзины
// $position — позиция из отгрузки (demand) МС
// (object)[
// 'quantity' => 1.0,
// 'price' => 150000,
// 'assortment' => (object)[
// 'name' => 'Название товара',
// 'externalCode' => 'XML_ID_ТОВАРА',
// 'meta' => (object)[
// 'type' => 'product', // или 'variant' для модификаций
// 'href' => '...'
// ]
// ]
// ]
$position = $eventParams['position']; // позиция из отгрузки МС
// Пример: поиск позиции корзины по ID товара вместо externalCode
// foreach ($basketItems as $basketItem) {
// if ($basketItem->getField('PRODUCT_ID') == $myCustomId) {
// return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, ['basket_item' => $basketItem]);
// }
// }
}