Изменение единиц измерения на сайте при использовании интеграции с iiko

Модуль расширенного управления меню для битрикс

Сентябрь 8, 2022

Теги: События, Модули grain, Интеграция с iiko

В данном примере килограммы конвертируются в граммы при загрузке товаров на сайт, и обратно в килограммы - при отправке заказа в iiko. Для модуля Интеграция с iiko. Используются события "OnBeforeDishesSync", "OnAfterSyncElementAsProductPropertyUpdate", "OnBuildOrderParamsArray".


<?php

    
namespace Partner;

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'grain.iiko'
    
'OnBeforeDishesSync'
    
'\Partner\DishesUnitFix::onBeforeDishesSync'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'grain.iiko'
    
'OnAfterSyncElementAsProductPropertyUpdate'
    
'\Partner\DishesUnitFix::onAfterSyncElementAsProductPropertyUpdate'
); 

\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'grain.iiko'
    
'OnBuildOrderParamsArray'
    
'\Partner\DishesUnitFix::onBuildOrderParamsArray'
); 


class 
DishesUnitFix
{
    static 
$changedUnitIds = array();
    
    public static function 
onBeforeDishesSync(\Bitrix\Main\Event $event
    {

        
$restaurant $event->getParameter('RESTAURANT'); // массив с данными ресторана, может быть изменен и возвращен
        
$dishesIblockId $event->getParameter('DISHES_IBLOCK_ID'); // ID текущего обновляемого инфоблока с блюдами, может быть изменен и возвращен
        
$dishes $event->getParameter('DISHES'); // массив данных номенклатуры из iiko, может быть изменен и возвращен
        
$stopList $event->getParameter('STOP_LIST'); // массив данных стоп-листа из iiko, может быть изменен и возвращен

        // изменяем массив данных из iiko и заносим id измененных товаров в $changedUnitIds
        
        
foreach($dishes['result']['products'] as &$product)
        {
            if(
$product['type']=='Modifier' || $product['type']=='Service')
                continue;
            if(
$product['measureUnit']!='кг')
                continue;
            
$xmlId $product['id'];
            
$product['measureUnit'] = 'г';
            foreach(
$product['sizePrices'] as &$price)
            {
                if(!isset(
$price['price']['currentPrice']))
                    continue;
                
$price['price']['currentPrice'] /= 1000;
            }
            unset(
$price);
            if(isset(
$product['weight']) && $product['weight']>0)
                
$product['weight'] /= 1000;
            
// не забываем изменить стоп-лист
            
if(isset($stopList[$xmlId]['items']))
            {
                foreach(
$stopList[$xmlId]['items'] as $terminalGroupId=>&$stopListItem)
                {
                    
$stopListItem['balance'] *= 1000;
                }
                unset(
$stopListItem);
                if(isset(
$stopList[$xmlId]['totalQuantity']))
                    
$stopList[$xmlId]['totalQuantity'] *= 1000;
                if(isset(
$stopList[$xmlId]['minimalQuantity']))
                    
$stopList[$xmlId]['minimalQuantity'] *= 1000;
            }
            
// /не забываем изменить стоп-лист
            
static::$changedUnitIds[] = $xmlId;    
        }
        unset(
$product);
        
        
// /изменяем массив данных из iiko и заносим id измененных товаров в $changedUnitIds

        
$changedData = array();
        foreach (
$event->getResults() as $eventResult// получение данных после другого обработчика, если он был
        
{
            if(
$eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
                continue;
            if(
$eventResult->getParameters())
                
$changedData $eventResult->getParameters();
        }
        
$changedData['DISHES'] = $dishes;
        
$changedData['STOP_LIST'] = $stopList;

        
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS$changedData);
        return 
$result;
    }

    public static function 
onAfterSyncElementAsProductPropertyUpdate(\Bitrix\Main\Event $event
    {
        
// на этапе вызова события элемент инфоблока создан или обновлен, также обновлены данные товара и свойства
        
$restaurant $event->getParameter('RESTAURANT'); // массив с данными ресторана
        
$fields $event->getParameter('PROP_TO_PRODUCT'); // соответствие название свойств и полей товара из iiko
        
$id $event->getParameter('ID'); // ID элемента инфоблока
        
$product $event->getParameter('PRODUCT'); // данные товара из iiko

        // проставляем в элементах инфоблока свойство-флаг изменения единиц измерения

        
$xmlId $product['id'];
        
\CIBlockElement::SetPropertyValueCode($id'converted_to_grams'in_array($xmlId,static::$changedUnitIds)?1:0);

        
// /проставляем в элементах инфоблока свойство-флаг изменения единиц измерения
    
}

    public static function 
onBuildOrderParamsArray(\Bitrix\Main\Event $event
    {
        
$restaurant $event->getParameter('RESTAURANT'); // массив с данными ресторана
        
$order $event->getParameter('ORDER'); // объект заказа модуля интернет-магазина
        
$params $event->getParameter('PARAMS'); // массив подготовленных параметров для передачи в iiko (не результирующий массив), может быть изменен и возвращен
        
foreach ($event->getResults() as $eventResult// получение данных после другого обработчика, если он был
        
{
            if(
$eventResult->getType() == \Bitrix\Main\EventResult::ERROR)
                continue;
            if(
$eventResult->getParameters())
                
$params $eventResult->getParameters();
        }
        
$check $event->getParameter('CHECK'); // флаг проверки перед добавлением заказа

        // изменяем массив $params

        
$basket $order->getBasket();
        foreach (
$basket as $basketItem
        {
            
$productId intval($basketItem->getProductId());
            if(
$productId<=0)
                continue;
            
$rsElements \CIBlockElement::GetList(
                array(),
                array(
"=ID"=>$productId),
                
false,
                array(
"nTopCount"=>1),
                array(
"ID","IBLOCK_ID","XML_ID","NAME","PROPERTY_converted_to_grams")
            );
            
            if(!
$ob=$rsElements->GetNextElement()) 
                continue;
            
$element $ob->GetFields();
            
$element['PROPERTIES'] = array(
                
'converted_to_grams'=>$ob->GetProperty('converted_to_grams'),
            );
            if(!
$element['PROPERTIES']['converted_to_grams']['~VALUE'])
                continue;

            foreach(
$params['items'] as &$item)
            {
                if(
$item['id']!=$element['XML_ID'])
                    continue;
                
$item['price'] *= 1000;
                
$item['amount'] /= 1000;
            }
            unset(
$item);
        }
        
        
// /изменяем массив $params

        
$result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS$params);
        return 
$result;
    }
}

← Переход к списку