Ноябрь 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;
}
}