События перед записью поля "Доступное количество"
События позволяют менять поля товара после полного рассчета остатков для него. В модуле используется для смены поля QUANTITY у товара. Фактически результат события записывается в товар следующим методом:
\Bitrix\Catalog\Model\Product::update($productId, $arUpdateProductFields);
[OnBeforeUpdateProductInStockRow] Для вкладки "Остатки"
Это событие стоит применять если используете вкладку "Остатки".
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
arUpdateProductFields | array | Поля товара для обновления (по умолчанию только QUANTITY) |
productBx | int | ID товара в Битрикс |
currentStocks | array | Текущие остатки на складах ДО изменения, ключи — ID склада |
productInfoStocks | array | Полный массив данных, влияющих на изменение остатков |
qtyByStocks | array | Рассчитанные количества по складам |
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом $arUpdateProductFields. Этот массив заменит тот, что передаёт модуль в \Bitrix\Catalog\Model\Product::update().
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);
Ключи ALL, ALL_MS, ALL_BX и ID складов присутствуют в зависимости от настроек синхронизации. qtyByStocks содержит рассчитанные значения, одно из которых выбирается для записи в QUANTITY.
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnBeforeUpdateProductInStockRow',
'OnBeforeUpdateProductInStockRowHandler'
);
function OnBeforeUpdateProductInStockRowHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
// $arUpdateProductFields — поля товара, можно изменять любые поля,
// но модуль здесь передает только рассчитанное доступное количество
// [
// 'QUANTITY' => 15.0 // рассчитанное доступное количество
// ]
$arUpdateProductFields = $eventParams['arUpdateProductFields'];
$productId = $eventParams['productBx']; //передается ID товара
// $currentStocks — текущие остатки ДО изменения, ключи массива — это ID склада
// [
// 1 => [ // ID склада Битрикс
// 'ID' => 456,
// 'PRODUCT_ID' => 1234,
// 'STORE_ID' => 1,
// 'AMOUNT' => 10.0
// ],
// 2 => [
// 'ID' => 457,
// 'PRODUCT_ID' => 1234,
// 'STORE_ID' => 2,
// 'AMOUNT' => 5.0
// ],
// // ... другие склады
// ]
$currentStocks = $eventParams['currentStocks'];
// $productInfoStocks — полный массив данных которые влияют на изменения остатков
// [
// 'MS_STOCKS' => [
// 'msStoreUUID1' => [ // UUID склада в МойСклад
// 'stock' => 10.0, // остаток
// 'reserve' => 2.0, // резерв
// 'inTransit' => 0.0, // в пути
// ],
// 'msStoreUUID2' => [
// 'stock' => 5.0,
// 'reserve' => 0.0,
// 'inTransit' => 3.0,
// ],
// 'all' => [ // суммарные остатки по всем складам МС
// 'stock' => 15.0,
// 'reserve' => 2.0,
// 'inTransit' => 3.0,
// ]
// ],
// 'BX_QUANTITY' => 12.0, // поле "доступное количество" ДО изменения
// 'BX_STOCKS' => [ // текущие остатки на складах Битрикс (то же, что currentStocks)
// 1 => ['ID' => 456, 'PRODUCT_ID' => 1234, 'STORE_ID' => 1, 'AMOUNT' => 10.0],
// 2 => ['ID' => 457, 'PRODUCT_ID' => 1234, 'STORE_ID' => 2, 'AMOUNT' => 5.0],
// ]
// ]
$productInfoStocks = $eventParams['productInfoStocks'];
// $qtyByStocks — рассчитанные количества по складам
// [
// 'ALL' => 15.0, // сумма по всем сопоставленным складам
// 'ALL_MS' => 15.0, // сумма из МС по всем складам (поле 'all')
// 'ALL_BX' => 15.0, // сумма по всем складам Битрикс (когда выбрана эта опция)
// 1 => 10.0, // количество для склада Битрикс с ID=1
// 2 => 5.0, // количество для склада Битрикс с ID=2
// ]
$qtyByStocks = $eventParams['qtyByStocks'];
$msStocks = $productInfoStocks['MS_STOCKS']; //актуальные остатки из МС
$bxQuantity = $productInfoStocks['BX_QUANTITY']; //поле "доступное количество" ДО изменения
$bxStocks = $productInfoStocks['BX_STOCKS']; //тоже самое что и в $currentStocks (для совместимости)
//возвращаем SUCCESS если нужно поменять массив полей товара, этот массив замениться тем, что передает модуль в товар
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);
}
[OnBeforeUpdateProductInCurrentStockRow] для вкладки "Быстрые остатки"
Событие полностью аналогично событию выше, но работает при передаче быстрых остатков.
- Описание события
- Пример вызова события
Параметры события
| Параметр | Тип | Описание |
|---|---|---|
arUpdateProductFields | array | Поля товара для обновления (по умолчанию только QUANTITY) |
productBx | int | ID товара в Битрикс |
currentStocks | array | Текущие остатки на складах ДО изменения, ключи — ID склада |
productInfoStocks | array | Полный массив данных, влияющих на изменение остатков |
В данном событии не передаётся параметр qtyByStocks. Структура productInfoStocks аналогична событию выше.
Возвращаемое значение
Верните EventResult::SUCCESS с модифицированным массивом $arUpdateProductFields.
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnBeforeUpdateProductInCurrentStockRow',
'OnBeforeUpdateProductInCurrentStockRowHandler'
);
function OnBeforeUpdateProductInCurrentStockRowHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
// $arUpdateProductFields — поля товара, можно изменять любые поля,
// но модуль здесь передает только рассчитанное доступное количество
// [
// 'QUANTITY' => 15.0 // рассчитанное доступное количество
// ]
$arUpdateProductFields = $eventParams['arUpdateProductFields'];
$productId = $eventParams['productBx']; //передается ID товара
// $currentStocks — текущие остатки ДО изменения, ключи массива — это ID склада
// [
// 1 => [ // ID склада Битрикс
// 'ID' => 456,
// 'PRODUCT_ID' => 1234,
// 'STORE_ID' => 1,
// 'AMOUNT' => 10.0
// ],
// 2 => [
// 'ID' => 457,
// 'PRODUCT_ID' => 1234,
// 'STORE_ID' => 2,
// 'AMOUNT' => 5.0
// ],
// // ... другие склады
// ]
$currentStocks = $eventParams['currentStocks'];
// $productInfoStocks — полный массив данных которые влияют на изменения остатков
// [
// 'MS_STOCKS' => [
// 'msStoreUUID1' => [ // UUID склада в МойСклад
// 'stock' => 10.0, // остаток
// 'reserve' => 2.0, // резерв
// 'inTransit' => 0.0, // в пути
// ],
// 'msStoreUUID2' => [
// 'stock' => 5.0,
// 'reserve' => 0.0,
// 'inTransit' => 3.0,
// ],
// 'all' => [ // суммарные остатки по всем складам МС
// 'stock' => 15.0,
// 'reserve' => 2.0,
// 'inTransit' => 3.0,
// ]
// ],
// 'BX_QUANTITY' => 12.0, // поле "доступное количество" ДО изменения
// 'BX_STOCKS' => [ // текущие остатки на складах Битрикс (то же, что currentStocks)
// 1 => ['ID' => 456, 'PRODUCT_ID' => 1234, 'STORE_ID' => 1, 'AMOUNT' => 10.0],
// 2 => ['ID' => 457, 'PRODUCT_ID' => 1234, 'STORE_ID' => 2, 'AMOUNT' => 5.0],
// ]
// ]
$productInfoStocks = $eventParams['productInfoStocks'];
$msStocks = $productInfoStocks['MS_STOCKS']; //актуальные остатки из МС
$bxQuantity = $productInfoStocks['BX_QUANTITY']; //поле "доступное количество" ДО изменения
$bxStocks = $productInfoStocks['BX_STOCKS']; //тоже самое что и в $currentStocks (для совместимости)
//возвращаем SUCCESS если нужно поменять массив полей товара, этот массив замениться тем, что передает модуль в товар
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arUpdateProductFields);
}