Отправка результатов заполненных форм в iiko в виде заказа

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

Ноябрь 21, 2024

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

Отправка результатов заполненных форм (из модуля "Веб-формы") в iiko в виде заказа. Для модуля Интеграция с iiko.

Требует установки константы restaurantId значением ID ресторана (ID элемента инфоблока ресторанов). Т.к. нельзя отправить заказ без позиций в iiko, то отправляется заказ с самой дешевой позицией из инфоблока блюд.


namespace Partner;


use 
Bitrix\Main\Loader;
use 
Bitrix\Main\Config\Option;
use 
Grain\Iiko\Rest;
use 
Grain\Iiko\Restaurants;

\Bitrix\Main\EventManager::getInstance()->addEventHandlerCompatible
    
'form'
    
'onAfterResultAdd'
    
'\Partner\SendFormAsOrder::onAfterResultAdd'
); 


class 
SendFormAsOrder
{
    const 
restaurantId 35799;
    
    public static function 
onAfterResultAdd($webFormId$resultId
    {
        static::
sendOrder($resultId);
    }
    
    public static function 
getFormResultPrepared($resultId)
    {
        
$return = [
            
'text' => '',
        ];
        if(!
Loader::includeModule('form'))
            return 
$return;
        if(!
$formResult \CFormResult::GetDataByID($resultId, array(), $result$answer))
            return 
$return;
        if(!
$form \CForm::GetByID($result["FORM_ID"])->fetch())
            return 
$return;
            
        
$return['text'] .= 'Отправлено из формы "'.$form['NAME'].'".'."\n";
        
$return['phone'] = '+79999999999';

        foreach(
$formResult as $fieldName=>$field)
        {
            foreach(
$field as $answer)
            {
                if(
$fieldName=='PHONE')
                {
                    
$parsedPhone \Bitrix\Main\PhoneNumber\Parser::getInstance()->parse($answer['USER_TEXT']);
                    if(
$parsedPhone->isValid())
                        
$return['phone'] = $parsedPhone->format(\Bitrix\Main\PhoneNumber\Format::E164);
                }
                elseif(
$fieldName=='EMAIL')
                {
                    if(
$a=filter_var($answer['USER_TEXT'], FILTER_VALIDATE_EMAIL))
                        
$return['email'] = $a;
                }
                
$return['text'] .= $answer['TITLE'].': '.$answer['USER_TEXT']."\n";
            }
        }
        
        return 
$return;
    }
    
    public static function 
sendOrder($formResultId)
    {
        if(!
$formResultPrepared=static::getFormResultPrepared($formResultId))
            return;

        if(!
Loader::includeModule('grain.iiko'))
            return;
        
        if(!(
$account Rest::getAccount(static::restaurantId)) || !($restaurant=Restaurants::getRestaurantById(static::restaurantId)))
            return;
        
        if(!
$item=static::getItem($restaurant))
            return;
        
        
$order = array (
            
'phone' => $formResultPrepared['phone'],
            
'orderServiceType' => 'DeliveryByClient',
            
'items' => [$item],
            
'comment' => $formResultPrepared['text'],
        );
        if(
$formResultPrepared['email'])
            
$order['customer'] = ['email' => $formResultPrepared['email']];

        
$body = [
            
'organizationId' => $restaurant['XML_ID'],
            
'createOrderSettings' => [
                
'transportToFrontTimeout' => 60,
            ],
            
'order' => $order,
        ];

        
$result Rest::orderCreate($body,$restaurant['ID']);

        
\CEventLog::Add(array(
            
"SEVERITY" => "CUSTOM",
            
"AUDIT_TYPE_ID" => array_key_exists('error',$result)?"GRAIN_IIKO_ORDER_ERROR":"GRAIN_IIKO_ORDER_SUCCESS",
            
"MODULE_ID" => "grain.iiko",
            
"ITEM_ID" => 'form-result-'.$formResultId,
            
"DESCRIPTION" => "\$result = ".print_r($result,true)."\n\$body = ".print_r($body,true),
        ));
    }
    
    public static function 
getItem($restaurant)
    {
        if(!
Loader::includeModule('grain.iiko'))
            return;

        if(
intval($dishesIblockId=Option::get('grain.iiko','dishes_iblock_id_'.$restaurant['ID']))<=0)
            return;

        
$productResult \Bitrix\Catalog\PriceTable::getList([
            
'order' => [
                
'PRICE'=>'ASC'
            
],
            
'filter' => [
                
'ELEMENT.IBLOCK_ID' => $dishesIblockId,
                
'ELEMENT.ACTIVE' => 'Y',
            ],
            
'limit' => 1,
            
'select' => [
                
'*',
                
'NAME' => 'ELEMENT.NAME',
                
'XML_ID' => 'ELEMENT.XML_ID',
            ],
        ]);
        
        if(!
$product=$productResult->fetch())
            return;
        
        
$item = [
            
'productId' => $product['XML_ID'],
            
'amount' => 1,
            
'type' => 'Product',
            
'price' => $product['PRICE'],
        ];
        
        return 
$item;
    }
}
Интеграция с iiko и rkeeper, готовый сайт ресторана

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