Пример #1
0
 public static function execute()
 {
     global $USER;
     $result = array();
     $error = false;
     if (!CModule::IncludeModule('voximplant')) {
         $error = 'Module voximplant is not installed.';
     } else {
         if (!is_object($USER) || !$USER->IsAuthorized()) {
             $error = GetMessage('ACCESS_DENIED');
         } else {
             if (!CVoxImplantMain::CheckAccess()) {
                 $error = GetMessage('ACCESS_DENIED');
             } else {
                 if (!check_bitrix_sessid()) {
                     $error = GetMessage('ACCESS_DENIED');
                 } else {
                     if ($_REQUEST["act"] == "edit") {
                         $result = self::executeEditPhones($error);
                     } else {
                         if ($_REQUEST["act"] == "getInfo") {
                             $result = self::executeGetInfo($error);
                         } else {
                             if ($_REQUEST["act"] == "option") {
                                 $result = self::executeSaveOption($error);
                             }
                         }
                     }
                 }
             }
         }
     }
     self::returnJson(array_merge(array('result' => $error === false ? 'ok' : 'error', 'error' => CharsetConverter::ConvertCharset($error, SITE_CHARSET, 'UTF-8')), $result));
 }
Пример #2
0
 public static function checkPhoneNumber($number)
 {
     if (!self::isEnabled()) {
         return false;
     }
     return CVoxImplantMain::Enable($number);
 }
Пример #3
0
 public static function GetNoticeOldConfigOfficePbx()
 {
     $result = false;
     if (COption::GetOptionString("voximplant", "notice_old_config_office_pbx") == 'Y' && CVoxImplantMain::CheckAccess()) {
         $result = true;
     }
     return $result;
 }
Пример #4
0
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
    die;
}
?>
<div class="bx-vi-phones-title"><?php 
echo GetMessage('VI_PHONES_TITLE');
?>
</div>
<div class="bx-vi-phones-block-1"><?php 
echo GetMessage('VI_PHONES_HELP_1');
?>
</div>
<div class="bx-vi-phones-block-2"><?php 
echo GetMessage('VI_PHONES_HELP_2', array('#LINK_USERS_START#' => '<a href="' . CVoxImplantMain::GetPublicFolder() . 'users.php">', '#LINK_COURSE_1_START#' => '<a href="' . $arResult['LINK_TO_DOC'] . '" target="_blank">', '#LINK_COURSE_2_START#' => '<a href="' . $arResult['LINK_TO_DOC'] . '" target="_blank">', '#LINK_END#' => '</a>', '#IMAGE_CONNECT#' => '<div class="bx-vi-phones-connect bx-vi-phones-connect-' . LANGUAGE_ID . '"></div>', '#IMAGE_CALL_WITHOUT_BROWER#' => '<div class="bx-vi-phones-call-without-browser bx-vi-phones-call-without-browser-' . LANGUAGE_ID . '"></div>'));
?>
</div>
Пример #5
0
<?php

define("PUBLIC_AJAX_MODE", true);
define("NO_KEEP_STATISTIC", "Y");
define("NO_AGENT_STATISTIC", "Y");
define("NOT_CHECK_PERMISSIONS", true);
define("DisableEventsCheck", true);
define("NO_AGENT_CHECK", true);
require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php";
header('Content-Type: application/x-javascript; charset=' . LANG_CHARSET);
if (!CModule::IncludeModule("voximplant")) {
    echo CUtil::PhpToJsObject(array('ERROR' => 'VI_MODULE_NOT_INSTALLED'));
    require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php";
    die;
}
if (!CVoxImplantMain::CheckAccess()) {
    echo CUtil::PhpToJsObject(array('ERROR' => 'AUTHORIZE_ERROR'));
    require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php";
    die;
}
if (check_bitrix_sessid()) {
    if ($_POST['VI_ADD']) {
        $arSend['ERROR'] = '';
        CUtil::decodeURIComponent($_POST);
        $viSip = new CVoxImplantSip();
        $result = $viSip->Add(array('TYPE' => strtolower($_POST['TYPE']), 'PHONE_NAME' => $_POST['TITLE'], 'SERVER' => $_POST['SERVER'], 'LOGIN' => $_POST['LOGIN'], 'PASSWORD' => $_POST['PASSWORD']));
        if ($result) {
            $arSend['RESULT'] = $result;
        } else {
            $arSend['ERROR'] = $viSip->GetError()->msg;
        }
Пример #6
0
 public static function Answer($callId)
 {
     $res = VI\CallTable::getList(array('select' => array('ID', 'ACCESS_URL'), 'filter' => array('=CALL_ID' => $callId)));
     $call = $res->fetch();
     if (!$call) {
         return false;
     }
     global $USER;
     $ViMain = new CVoxImplantMain($USER->GetId());
     $result = $ViMain->GetDialogInfo($_POST['NUMBER']);
     if ($result) {
         echo CUtil::PhpToJsObject(array('DIALOG_ID' => $result['DIALOG_ID'], 'HR_PHOTO' => $result['HR_PHOTO'], 'ERROR' => ''));
     } else {
         echo CUtil::PhpToJsObject(array('CODE' => $ViMain->GetError()->code, 'ERROR' => $ViMain->GetError()->msg));
     }
 }
Пример #7
0
        }
    }
    if ($skipSaving) {
        $error = $viSip->GetError()->msg;
    } else {
        if (($res = Bitrix\Voximplant\ConfigTable::update($arParams["ID"], $arFields)) && $res->isSuccess()) {
            // TODO We should work with other socialnetwork entities
            $toDrop = array_diff($arResult["~QUEUE"], $queue["U"]);
            $toAdd = array_diff($queue["U"], array_keys($arResult["QUEUE"]));
            foreach ($toDrop as $primary => $id) {
                Bitrix\Voximplant\QueueTable::delete($primary);
            }
            foreach ($toAdd as $k) {
                Bitrix\Voximplant\QueueTable::add(array("CONFIG_ID" => $arParams["ID"], "USER_ID" => $k, "STATUS" => "OFFLINE"));
            }
            LocalRedirect(CVoxImplantMain::GetPublicFolder() . 'lines.php?MODE=' . $arResult["ITEM"]["PORTAL_MODE"]);
        }
        $error = $res->getErrorMessages();
    }
    $arResult = array("ERROR" => $error, "ITEM" => array_merge($arResult["ITEM"], $arFields), "QUEUE" => array_flip($queue["U"]), "SIP_CONFIG" => array_merge($arResult["SIP_CONFIG"], $arFieldsSip));
}
foreach (array("MELODY_WELCOME", "MELODY_WAIT", "MELODY_HOLD", "MELODY_VOICEMAIL", "WORKTIME_DAYOFF_MELODY") as $id) {
    if ($arResult["ITEM"][$id] > 0) {
        $res = CFile::GetFileArray($arResult["ITEM"][$id]);
        if ($res) {
            $arResult["ITEM"]["~" . $id] = $res;
        } else {
            $arResult["ITEM"][$id] = 0;
        }
    }
}
Пример #8
0
 public static function SendMessageToChat($userId, $phoneNumber, $incomingType, $message)
 {
     $ViMain = new CVoxImplantMain($userId);
     $dialogInfo = $ViMain->GetDialogInfo($phoneNumber, "", false);
     $ViMain->SendChatMessage($dialogInfo['DIALOG_ID'], $incomingType, $message);
     return true;
 }
Пример #9
0
			</tr>
		</table>', 'UF_PHONE_INNER' => '<span id="innerphone_' . $user['ID'] . '">' . $user["UF_PHONE_INNER"] . '</span>', 'UF_VI_BACKPHONE' => '<span id="backphone_' . $user['ID'] . '">' . (array_key_exists($user["UF_VI_BACKPHONE"], $numbers) ? $numbers[$user["UF_VI_BACKPHONE"]] : GetMessage('VI_NUMBERS_DEFAULT')) . '</span>' . '<span id="backphone_' . $user['ID'] . '_value" style="display:none;">' . $user["UF_VI_BACKPHONE"] . '</span>');
    $arCols['UF_VI_PHONE'] = '<span id="vi_phone_' . $user['ID'] . '"' . ($user["UF_VI_PHONE"] == "Y" ? ' class="bx-vi-phone-enable"' : '') . '>' . ($user["UF_VI_PHONE"] == "Y" ? GetMessage('VI_NUMBERS_PHONE_DEVICE_ENABLE') : GetMessage('VI_NUMBERS_PHONE_DEVICE_DISABLE')) . '</span>' . '<span style="display:none" id="vi_phone_enable_' . $user['ID'] . '">' . ($user["UF_VI_PHONE"] == "Y" ? 'Y' : 'N') . '</span>';
    $arCols['EDIT'] = '<span id="create_' . $user['ID'] . '">' . '<a href="#" onclick="BX.Voximplant.Numbers.edit(' . $user['ID'] . '); return false; ">' . GetMessage('VI_NUMBERS_EDIT') . '</a>' . '</span>';
    $arRows[$user['ID']] = array('data' => $user, 'columns' => $arCols);
}
$arResult['ROWS'] = $arRows;
$arHeaders = array(array('id' => 'NAME', 'name' => GetMessage('VI_NUMBERS_GRID_NAME'), 'sort' => 'name', 'default' => true, 'editable' => false), array('id' => 'UF_PHONE_INNER', 'name' => GetMessage('VI_NUMBERS_GRID_CODE'), 'default' => true, 'editable' => false), array('id' => 'UF_VI_BACKPHONE', 'name' => GetMessage('VI_NUMBERS_GRID_PHONE'), 'default' => true, 'editable' => false));
$arHeaders[] = array('id' => 'UF_VI_PHONE', 'name' => GetMessage('VI_NUMBERS_GRID_PHONE_DEVICE'), 'default' => true, 'editable' => false);
$arHeaders[] = array('id' => 'EDIT', 'name' => '', 'default' => true, 'editable' => false);
$APPLICATION->IncludeComponent('bitrix:main.interface.grid', '', array('GRID_ID' => $arResult['GRID_ID'], 'HEADERS' => $arHeaders, 'ROWS' => $arResult['ROWS'], 'NAV_OBJECT' => $arResult['NAV_OBJECT']));
?>
<div style="padding-top: 30px;">
	<div class="tel-set-item-alert">
		<?php 
echo GetMessage('VI_CONFIG_NOTICE_2', array('#LINK#' => '<a href="' . CVoxImplantMain::GetPublicFolder() . 'configs.php">' . GetMessage('VI_CONFIG_PAGE_CONFIGS') . '</a>'));
?>
	</div>
</div>
<script type="text/javascript">
BX.message({
	VI_NUMBERS_CREATE_TITLE : '<?php 
echo GetMessageJS("VI_NUMBERS_CREATE_TITLE");
?>
',
	VI_NUMBERS_ERR_AJAX : '<?php 
echo GetMessageJS("VI_NUMBERS_ERR_AJAX");
?>
',
	VI_NUMBERS_GRID_CODE : '<?php 
echo GetMessageJS("VI_NUMBERS_GRID_CODE");
Пример #10
0
if (is_array($arResult["UserFieldsContact"]["DATA"])) {
    foreach ($arResult["UserFieldsContact"]["DATA"] as $field => $arUserField) {
        if (is_array($arUserField["VALUE"]) && count($arUserField["VALUE"]) > 0 || !is_array($arUserField["VALUE"]) && StrLen($arUserField["VALUE"]) > 0) {
            ?>
<tr>
							<td class="user-profile-nowrap"><?php 
            echo $arUserField["NAME"] . ":";
            ?>
</td>
							<td><?php 
            switch ($field) {
                case "PERSONAL_MOBILE":
                case "WORK_PHONE":
                case "PERSONAL_PNONE":
                    echo $arUserField["VALUE"];
                    if (CModule::IncludeModule('voximplant') && CVoxImplantMain::Enable($arResult["User"][$field])) {
                        ?>
											<span class="sonet_call_btn" onclick="BXIM.phoneTo('<?php 
                        echo CUtil::JSEscape($arResult["User"][$field]);
                        ?>
');"></span>
										<?php 
                    }
                    break;
                default:
                    echo $arUserField["VALUE"];
            }
            ?>
</td>
						</tr><?php 
        }
Пример #11
0
 public static function lineOutgoingGet()
 {
     if (!CVoxImplantMain::CheckAccess()) {
         throw new \Bitrix\Rest\AccessException();
     }
     return CVoximplantConfig::GetPortalNumber();
 }
Пример #12
0
    die;
}
$APPLICATION->SetAdditionalCSS("/bitrix/components/bitrix/voximplant.main/templates/.default/telephony.css");
/*$APPLICATION->IncludeComponent(
	'bitrix:main.interface.filter',
	'',
	array(
		'GRID_ID'=>$arResult["GRID_ID"],
		'FILTER'=> $arResult["FILTER"],
		//"FILTER_PRESETS"=>$arParams["~FILTER_PRESETS"],
		'FILTER_ROWS'=>array("PHONE_NUMBER"=>1, "CALL_DURATION" => 1, "CALL_START_DATE" => 1),//$arParams['~FILTER_ROWS'],
		//'FILTER_FIELDS'=>$arResult["FILTER"],
		//'OPTIONS'=>$arParams['~OPTIONS'],
		//'FILTER_INFO'=>$arResult['FILTER_INFO'],
		//'RENDER_FILTER_INTO_VIEW'=>isset($arParams['~RENDER_FILTER_INTO_VIEW']) ? $arParams['~RENDER_FILTER_INTO_VIEW'] : '',
		//'HIDE_FILTER'=>"Y"//isset($arParams['~HIDE_FILTER']) ? $arParams['~HIDE_FILTER'] : false
	),
	$component,
	array('HIDE_ICONS'=>true)
);*/
$buttons = array(array("TEXT" => GetMessage("TEL_STAT_BACK"), "TITLE" => GetMessage("TEL_STAT_BACK_TITLE"), "LINK" => CVoxImplantMain::GetPublicFolder(), "ICON" => "go-back"));
if ($_GET['USER_ID'] || $_GET['CODE']) {
    $buttons[] = array("TEXT" => GetMessage("TEL_STAT_FILTER_CANCEL"), "TITLE" => GetMessage("TEL_STAT_FILTER_CANCEL_TITLE"), "LINK" => CVoxImplantMain::GetPublicFolder() . 'detail.php', "ICON" => "btn-unlock");
}
$APPLICATION->IncludeComponent("bitrix:main.interface.toolbar", "", array("BUTTONS" => $buttons), $component);
?>
<div class="tel-stat-grid-wrap">
<?php 
$APPLICATION->IncludeComponent("bitrix:main.interface.grid", "", array("GRID_ID" => $arResult["GRID_ID"], "HEADERS" => $arResult["HEADERS"], "ROWS" => $arResult["ELEMENTS_ROWS"], "NAV_OBJECT" => $arResult["NAV_OBJECT"], "FOOTER" => array(array("title" => GetMessage("CT_BLL_SELECTED"), "value" => $arResult["ROWS_COUNT"])), "AJAX_MODE" => "Y"), $component, array("HIDE_ICONS" => "Y"));
?>
</div>
Пример #13
0
>
				<div class="tel-set-inner">
					<?php 
$APPLICATION->IncludeComponent("bitrix:voximplant.config.sip", "", array());
?>
				</div>
			</div>
			<div id="tel-set-corner" class="tel-set-corner"></div>
		</div>
	</div>
</div>

<div class="tel-set-phone-numbers">
	<div class="tel-set-item-alert">
		<?php 
echo GetMessage('VI_CONFIG_NOTICE_NEW', array('#LINK_CONFIG#' => '<a href="' . CVoxImplantMain::GetPublicFolder() . 'configs.php">' . GetMessage('VI_CONFIG_PAGE_CONFIG') . '</a>', '#LINK_USERS#' => '<a href="' . CVoxImplantMain::GetPublicFolder() . 'users.php">' . GetMessage('VI_CONFIG_PAGE_CONFIG_USERS') . '</a>'));
?>
	</div>
</div>

<script type="text/javascript">
	var setPost = {
		corner : BX('tel-set-corner'),
		anim_block : null,
		btn : null,
		wrap_block : BX('tel-set-block'),
		block_list : null,
		table : BX('tel-block-table'),
		active_cell_num : null,
		over_cell_num : null,
Пример #14
0
             $userTimeout[$queue['USER_ID']] = true;
             CVoxImplantMain::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => $queue['USER_ID'], 'CALL_ID' => $call['CALL_ID'], 'MARK' => 'timeout_hit_3'));
         }
         if ($call['TRANSFER_USER_ID'] > 0) {
             $userTimeout[$call['TRANSFER_USER_ID']] = true;
             CVoxImplantTransfer::SendPullEvent(array('COMMAND' => 'timeoutTransfer', 'USER_ID' => $call['TRANSFER_USER_ID'], 'CALL_ID' => $call['CALL_ID']));
         }
         if ($call['PORTAL_USER_ID'] > 0 && !$userTimeout[$call['PORTAL_USER_ID']]) {
             $userTimeout[$call['PORTAL_USER_ID']] = true;
             CVoxImplantMain::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => $call['PORTAL_USER_ID'], 'CALL_ID' => $call['CALL_ID'], 'MARK' => 'timeout_hit_4'));
         }
         if ($call['USER_ID'] > 0 && !$userTimeout[$call['USER_ID']]) {
             CVoxImplantMain::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => $call['USER_ID'], 'CALL_ID' => $call['CALL_ID'], 'MARK' => 'timeout_hit_5'));
         }
     } else {
         CVoxImplantMain::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => $params['USER_ID'], 'CALL_ID' => $params['CALL_ID'], 'MARK' => 'timeout_hit_6'));
     }
     CVoxImplantHistory::WriteToLog($call, 'PORTAL HANGUP');
     echo json_encode(array('result' => 'OK'));
 } else {
     if ($params["COMMAND"] == "GetNextAction") {
         if ($params['QUEUE_TYPE'] == CVoxImplantConfig::QUEUE_TYPE_ALL) {
             $result = CVoxImplantIncoming::GetQueue(array('SEARCH_ID' => $params['PHONE_NUMBER'], 'CALL_ID' => $params['CALL_ID'], 'CALLER_ID' => $params['CALLER_ID'], 'LAST_TYPE_CONNECT' => $params['LAST_TYPE_CONNECT'], 'LOAD_QUEUE' => 'N', 'SEND_INVITE' => 'N'));
             CVoxImplantHistory::WriteToLog($result, 'GET NEXT ACTION - QUEUE');
         } else {
             $result = CVoxImplantIncoming::GetNextAction(array('SEARCH_ID' => $params['PHONE_NUMBER'], 'CALL_ID' => $params['CALL_ID'], 'CALLER_ID' => $params['CALLER_ID'], 'LAST_USER_ID' => $params['LAST_USER_ID'], 'LAST_TYPE_CONNECT' => $params['LAST_TYPE_CONNECT'], 'LAST_ANSWER_USER_ID' => $params['LAST_ANSWER_USER_ID'], 'EXCLUDE_USERS' => $excludeUsers));
             CVoxImplantHistory::WriteToLog($result, 'GET NEXT ACTION');
         }
         echo json_encode($result);
     } else {
         if ($params["COMMAND"] == "GetNextInQueue") {
Пример #15
0
 if ($_POST['COMMAND'] == 'onetimekey') {
     $ViMain = new CVoxImplantMain($userId);
     $result = $ViMain->GetOneTimeKey($_POST['KEY']);
     if (!$result) {
         echo CUtil::PhpToJsObject(array('CODE' => $ViMain->GetError()->code, 'ERROR' => $ViMain->GetError()->msg));
     } else {
         echo CUtil::PhpToJsObject(array('HASH' => $result, 'ERROR' => ''));
     }
 } else {
     if ($_POST['COMMAND'] == 'authorize_error') {
         $ViMain = new CVoxImplantMain($userId);
         $ViMain->ClearUserInfo();
         $ViMain->ClearAccountInfo();
     } else {
         if ($_POST['COMMAND'] == 'init') {
             $ViMain = new CVoxImplantMain($userId);
             $result = $ViMain->GetDialogInfo($_POST['NUMBER']);
             if ($result) {
                 echo CUtil::PhpToJsObject(array('DIALOG_ID' => $result['DIALOG_ID'], 'HR_PHOTO' => $result['HR_PHOTO'], 'ERROR' => ''));
             } else {
                 echo CUtil::PhpToJsObject(array('CODE' => $ViMain->GetError()->code, 'ERROR' => $ViMain->GetError()->msg));
             }
         } else {
             if ($_POST['COMMAND'] == 'deviceStartCall') {
                 $_POST['PARAMS'] = CUtil::JsObjectToPhp($_POST['PARAMS']);
                 if (CVoxImplantUser::GetPhoneActive($USER->GetId())) {
                     CVoxImplantOutgoing::StartCall($USER->GetId(), $_POST['PARAMS']['NUMBER']);
                 }
             } else {
                 if ($_POST['COMMAND'] == 'deviceHungup') {
                     $_POST['PARAMS'] = CUtil::JsObjectToPhp($_POST['PARAMS']);
Пример #16
0
', '<?php 
        echo CUtil::JSEscape($arItem["PHONE_NUMBER"]);
        ?>
', this.parentNode);"></span>
			</div>
		<?php 
    }
    ?>
	<?php 
}
?>
	</div>

	<div class="tel-set-item-alert" style="margin-top: 25px">
		<?php 
echo GetMessage('BLACKLIST_ABOUT_2', array('#LINK#' => '<a href="' . CVoxImplantMain::GetPublicFolder() . 'detail.php?CODE=423">' . GetMessage('BLACKLIST_ABOUT_LINK') . '</a>'));
?>
	</div>
</div>

<script>
	BX.message({
		BLACKLIST_DELETE_ERROR: '<?php 
echo GetMessageJS('BLACKLIST_DELETE_ERROR');
?>
',
		BLACKLIST_DELETE_CONFIRM : '<?php 
echo GetMessageJS("BLACKLIST_DELETE_CONFIRM");
?>
'
	});
Пример #17
0
<?php 
}
?>

<div class="tel-set-main-wrap tel-set-main-wrap-white" id="vi_rent_options_div" style="display: none; margin-top: 15px;">
	<div class="tel-set-inner-wrap">
		<div class="tel-set-select-block" id="rent-select-placeholder">
			<div class="tel-set-item-select-wrap">
				<select class="tel-set-item-select">
					<option style="color: #888888"><?php 
echo GetMessage('VI_CONFIG_RENT_COUNTRY');
?>
</option>
					<option style="color: #888888">...</option>
				</select>
			</div>
		</div>
		<div id="rent-numbers-placeholder"></div>
	</div>
</div>
<script type="text/javascript">
	BX.VoxImplant.rentPhone.init({
		'selectPlaceholder': BX('rent-select-placeholder'),
		'numbersPlaceholder': BX('rent-numbers-placeholder'),
		'location': BX.message('LANGUAGE_ID').toUpperCase(),
		'publicFolder': '<?php 
echo CVoxImplantMain::GetPublicFolder();
?>
'
	})
</script>
Пример #18
0
     if (isset($params['CALLER_ID']) && isset($params['ACCOUNT_SEARCH_ID'])) {
         $params['CALLER_ID'] = $params['ACCOUNT_SEARCH_ID'];
     }
     $result = CVoxImplantOutgoing::Init(array('CONFIG_ID' => $params['CONFIG_ID'], 'USER_ID' => $params['USER_ID'], 'PHONE_NUMBER' => $params['PHONE_NUMBER'], 'CALL_ID' => $params['CALL_ID'], 'CALL_ID_TMP' => $params['CALL_ID_TMP'] ? $params['CALL_ID_TMP'] : '', 'CALL_DEVICE' => $params['CALL_DEVICE'], 'CALLER_ID' => $params['CALLER_ID'], 'ACCESS_URL' => $params['ACCESS_URL'], 'CRM' => $params['CRM']));
     foreach (GetModuleEvents("voximplant", "onCallInit", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array(array('CALL_ID' => $params['CALL_ID'], 'CALL_ID_TMP' => $params['CALL_ID_TMP'] ? $params['CALL_ID_TMP'] : '', 'CALL_TYPE' => 1, 'ACCOUNT_SEARCH_ID' => $params['ACCOUNT_SEARCH_ID'], 'PHONE_NUMBER' => $params['PHONE_NUMBER'], 'CALLER_ID' => $params['CALLER_ID'])));
     }
     echo 'OK';
 } else {
     if ($params["COMMAND"] == "IncomingInvite") {
         $result = CVoxImplantIncoming::Init(array('SEARCH_ID' => $params['PHONE_NUMBER'], 'CALL_ID' => $params['CALL_ID'], 'CALLER_ID' => $params['CALLER_ID'], 'DIRECT_CODE' => $params['DIRECT_CODE'], 'ACCESS_URL' => $params['ACCESS_URL']));
         CVoxImplantHistory::WriteToLog($result, 'PORTAL ANSWER');
         echo json_encode($result);
     } else {
         if ($params["COMMAND"] == "StartCall") {
             CVoxImplantMain::CallStart($params['CALL_ID'], $params['USER_ID'], $params['CALL_DEVICE'], $params['EXTERNAL'] == 'Y');
             echo json_encode(array('result' => 'OK'));
         } else {
             if ($params["COMMAND"] == "HangupCall") {
                 $res = Bitrix\Voximplant\CallTable::getList(array('filter' => array('=CALL_ID' => $params['CALL_ID'])));
                 $userTimeout = array();
                 if ($call = $res->fetch()) {
                     $res = Bitrix\Voximplant\QueueTable::getList(array('filter' => array('=CONFIG_ID' => $call['CONFIG_ID'])));
                     while ($queue = $res->fetch()) {
                         if ($call['TRANSFER_USER_ID'] == $queue['USER_ID']) {
                             continue;
                         }
                         $userTimeout[$queue['USER_ID']] = true;
                         CVoxImplantIncoming::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => $queue['USER_ID'], 'CALL_ID' => $call['CALL_ID']));
                     }
                     if ($call['TRANSFER_USER_ID'] > 0 && !isset($userTimeout[$call['TRANSFER_USER_ID']])) {