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

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

Last updated