예제 #1
0
 public function SetVerifyResult($params)
 {
     if ($params['STATUS'] == 'VERIFIED') {
         $phoneVerified = array();
         $orm = VI\ConfigTable::getList(array('filter' => array('=PHONE_COUNTRY_CODE' => $params['REGION'])));
         while ($config = $orm->fetch()) {
             VI\ConfigTable::update($config['ID'], array('PHONE_VERIFIED' => 'Y'));
             $phoneVerified[] = $config['PHONE_NAME'];
         }
         if (!empty($phoneVerified)) {
             CVoxImplantHistory::WriteToLog($phoneVerified, 'VERIFY PHONES');
         }
     }
     return true;
 }
예제 #2
0
 public static function Ready($callId)
 {
     $res = VI\CallTable::getList(array('select' => array('ID', 'CALL_ID', 'CALLER_ID', 'USER_ID', 'TRANSFER_USER_ID', 'ACCESS_URL'), 'filter' => array('=CALL_ID' => $callId)));
     $call = $res->fetch();
     if (!$call) {
         return false;
     }
     $answer['COMMAND'] = 'transfer';
     $answer['OPERATOR_ID'] = $call['USER_ID'];
     $answer['TRANSFER_USER_ID'] = $call['TRANSFER_USER_ID'];
     $http = new \Bitrix\Main\Web\HttpClient();
     $http->waitResponse(false);
     $http->post($call['ACCESS_URL'], json_encode($answer));
     VI\CallTable::update($call['ID'], array('USER_ID' => $call['TRANSFER_USER_ID'], 'TRANSFER_USER_ID' => 0));
     CVoxImplantHistory::TransferMessage($call['USER_ID'], $call['TRANSFER_USER_ID'], $call['CALLER_ID']);
     self::SendPullEvent(array('COMMAND' => 'answerTransfer', 'USER_ID' => $call['USER_ID'], 'CALL_ID' => $call['CALL_ID']));
     return true;
 }
예제 #3
0
 public static function Complete($callId, $device = 'WEBRTC')
 {
     $res = VI\CallTable::getList(array('select' => array('ID', 'CALL_ID', 'CRM_LEAD', 'CALLER_ID', 'USER_ID', 'TRANSFER_USER_ID', 'ACCESS_URL', 'CRM', 'CONFIG_ID'), 'filter' => array('=CALL_ID' => $callId)));
     $call = $res->fetch();
     if (!$call) {
         return false;
     }
     VI\CallTable::update($call['ID'], array('USER_ID' => $call['TRANSFER_USER_ID'], 'TRANSFER_USER_ID' => 0));
     CVoxImplantHistory::TransferMessage($call['USER_ID'], $call['TRANSFER_USER_ID'], $call['CALLER_ID']);
     self::SendPullEvent(array('COMMAND' => 'completeTransfer', 'USER_ID' => $call['USER_ID'], 'TRANSFER_USER_ID' => $call['TRANSFER_USER_ID'], 'CALL_ID' => $call['CALL_ID']));
     $crmDataSend = false;
     if ($call['CRM'] == 'Y' && $call['CONFIG_ID'] > 0) {
         $config = CVoxImplantConfig::GetConfig($call['CONFIG_ID']);
         if (isset($config['CRM_TRANSFER_CHANGE']) && $config['CRM_TRANSFER_CHANGE'] == 'Y') {
             if ($call['CRM_LEAD'] > 0) {
                 $crmData = array('LEAD_DATA' => array('ID' => $call['CRM_LEAD'], 'ASSIGNED_BY_ID' => 0));
             } else {
                 $crmData = CVoxImplantCrmHelper::GetDataForPopup($call['CALL_ID'], $call['CALLER_ID']);
             }
             if (isset($crmData['LEAD_DATA']) && $crmData['LEAD_DATA']['ASSIGNED_BY_ID'] >= 0 && $call['TRANSFER_USER_ID'] > 0 && $crmData['LEAD_DATA']['ASSIGNED_BY_ID'] != $call['TRANSFER_USER_ID']) {
                 CVoxImplantCrmHelper::UpdateLead($crmData['LEAD_DATA']['ID'], array('ASSIGNED_BY_ID' => $call['TRANSFER_USER_ID']));
                 $crmDataSend = CVoxImplantCrmHelper::GetDataForPopup($call['CALL_ID'], $call['CALLER_ID'], $call['TRANSFER_USER_ID']);
             }
         }
     }
     self::SendPullEvent(array('COMMAND' => 'completeTransfer', 'USER_ID' => $call['TRANSFER_USER_ID'], 'TRANSFER_USER_ID' => $call['TRANSFER_USER_ID'], 'CALL_DEVICE' => $device, 'CALL_ID' => $call['CALL_ID'], 'CRM' => $crmDataSend));
     return true;
 }
예제 #4
0
 private function Query($command, $params = array())
 {
     if (strlen($command) <= 0 || !is_array($params)) {
         return false;
     }
     $params['BX_COMMAND'] = $command;
     $params['BX_LICENCE'] = $this->licenceCode;
     $params['BX_DOMAIN'] = $this->domain;
     $params['BX_TYPE'] = $this->type;
     $params['BX_VERSION'] = $this->version;
     $params["BX_HASH"] = $this->RequestSign($this->type, md5(implode("|", $params)));
     $CHTTP = new CHTTP();
     $arUrl = $CHTTP->ParseURL($this->controllerUrl);
     if ($CHTTP->Query('POST', $arUrl['host'], $arUrl['port'], $arUrl['path_query'], CHTTP::PrepareData($params), $arUrl['proto'])) {
         $result = json_decode($CHTTP->result);
         if (!$result) {
             CVoxImplantHistory::WriteToLog($CHTTP->result, 'ERROR QUERY EXECUTE');
         }
     } else {
         $result = json_decode(json_encode(array('error' => array('code' => 'CONNECT_ERROR', 'msg' => 'Parse error or connect error from server'))));
     }
     return $result;
 }
예제 #5
0
				$arResult['USERS'] = isset($ar['users'])? $ar['users']: Array();
				$arResult['USER_IN_GROUP'] = isset($ar['userInGroup'])? $ar['userInGroup']: Array();
				$arResult['WO_USER_IN_GROUP'] = isset($ar['woUserInGroup'])? $ar['woUserInGroup']: Array();
				$arResult['PHONES'] = isset($ar['phones'])? $ar['phones']: Array();
			}
			else
			{
				$arResult['ERROR'] = 'ACCESS_DENIED';
			}
		}
		else if ($_POST['TYPE'] == 'phoneCallHistory')
		{
			if (CModule::IncludeModule('voximplant'))
			{
				$arResult['HISTORY_ID'] = intval($_POST['HISTORY_ID']);
				$history = CVoxImplantHistory::GetForPopup($arResult['HISTORY_ID']);
				if ($history && $history['PORTAL_USER_ID'] == $USER->GetId())
				{
					if (strlen($history['CALL_RECORD_HREF']) > 0)
					{
						ob_start();
						$APPLICATION->IncludeComponent(
							"bitrix:player",
							"",
							Array(
								"PLAYER_TYPE" => "flv",
								"CHECK_FILE" => "N",
								"USE_PLAYLIST" => "N",
								"PATH" => $history["CALL_RECORD_HREF"],
								"WIDTH" => 233,
								"HEIGHT" => 24,
예제 #6
0
 public static function CheckNumberForBlackList($number)
 {
     $blackListTime = Bitrix\Main\Config\Option::get("voximplant", "blacklist_time", 5);
     $blackListCount = Bitrix\Main\Config\Option::get("voximplant", "blacklist_count", 5);
     $minTime = new Bitrix\Main\Type\DateTime();
     $minTime->add('-' . $blackListTime . ' minutes');
     $dbData = VI\StatisticTable::getList(array('filter' => array("PHONE_NUMBER" => $number, '>CALL_START_DATE' => $minTime), 'select' => array('ID')));
     $callsCount = 0;
     while ($dbData->fetch()) {
         $callsCount++;
         if ($callsCount >= $blackListCount) {
             $number = substr($number, 0, 20);
             VI\BlacklistTable::add(array("PHONE_NUMBER" => $number));
             $messageUserId = Bitrix\Main\Config\Option::get("voximplant", "blacklist_user_id", "");
             CVoxImplantHistory::SendMessageToChat($messageUserId, $number, CVoxImplantMain::CALL_INCOMING, GetMessage("BLACKLIST_NUMBER"));
             return true;
         }
     }
     return false;
 }
예제 #7
0
 public static function Init($params)
 {
     $result['STATUS'] = 'OK';
     $result['PORTAL_CALL'] = 'N';
     if (strlen($params['PHONE_NUMBER']) > 0 && strlen($params['PHONE_NUMBER']) <= 4) {
         $res = CVoxImplantUser::GetList(array('select' => array('ID', 'IS_ONLINE_CUSTOM', 'UF_VI_PHONE', 'ACTIVE'), 'filter' => array('=UF_PHONE_INNER' => intval($params['PHONE_NUMBER']), '=ACTIVE' => 'Y')));
         if ($userData = $res->fetch()) {
             $result['PORTAL_CALL'] = 'Y';
             $result['USER_ID'] = $userData['ID'];
             $result['COMMAND'] = CVoxImplantIncoming::RULE_HUNGUP;
             if (CModule::IncludeModule('pull')) {
                 $orm = \Bitrix\Pull\PushTable::getList(array('select' => array('ID'), 'filter' => array('=USER_ID' => $userData['ID'])));
                 $userData['USER_HAVE_MOBILE'] = $orm->fetch() ? 'Y' : 'N';
             } else {
                 $userData['USER_HAVE_MOBILE'] = 'N';
             }
             if ($userData['ID'] == $params['USER_ID']) {
                 $result['COMMAND'] = CVoxImplantIncoming::RULE_HUNGUP;
             } else {
                 if ($userData['IS_ONLINE_CUSTOM'] == 'Y' || $userData['UF_VI_PHONE'] == 'Y' || $userData['USER_HAVE_MOBILE'] == 'Y') {
                     $result['COMMAND'] = CVoxImplantIncoming::RULE_WAIT;
                     $result['TYPE_CONNECT'] = CVoxImplantIncoming::TYPE_CONNECT_DIRECT;
                     $result['USER_HAVE_PHONE'] = $userData['UF_VI_PHONE'] == 'Y' ? 'Y' : 'N';
                     $result['USER_HAVE_MOBILE'] = $userData['USER_HAVE_MOBILE'];
                     $result['USER_SHORT_NAME'] = '';
                 }
             }
         }
     }
     $callAdd = true;
     if ($params['CALL_ID_TMP']) {
         $res = VI\CallTable::getList(array('filter' => array('=CALL_ID' => $params['CALL_ID_TMP'])));
         if ($call = $res->fetch()) {
             $res = VI\CallTable::update($call['ID'], array('CONFIG_ID' => $params['CONFIG_ID'], 'CALL_ID' => $params['CALL_ID'], 'CRM' => $params['CRM'], 'USER_ID' => $params['USER_ID'], 'CALLER_ID' => $params['PHONE_NUMBER'], 'STATUS' => VI\CallTable::STATUS_CONNECTING, 'ACCESS_URL' => $params['ACCESS_URL'], 'PORTAL_USER_ID' => $result['PORTAL_CALL'] == 'Y' ? $result['USER_ID'] : 0));
             if ($res) {
                 $callAdd = false;
             }
         }
     }
     if ($callAdd) {
         VI\CallTable::add(array('CONFIG_ID' => $params['CONFIG_ID'], 'CALL_ID' => $params['CALL_ID'], 'CRM' => $params['CRM'], 'USER_ID' => $params['USER_ID'], 'CALLER_ID' => $params['PHONE_NUMBER'], 'STATUS' => VI\CallTable::STATUS_CONNECTING, 'ACCESS_URL' => $params['ACCESS_URL'], 'PORTAL_USER_ID' => $result['PORTAL_CALL'] == 'Y' ? $result['USER_ID'] : 0, 'DATE_CREATE' => new FieldType\DateTime()));
     }
     $config = self::GetConfigByUserId($params['USER_ID']);
     if ($params['CRM'] == 'Y' && $result['PORTAL_CALL'] == 'N') {
         if ($config['CRM_CREATE'] == CVoxImplantConfig::CRM_CREATE_LEAD) {
             $crmData = CVoxImplantCrmHelper::GetDataForPopup($params['CALL_ID'], $params['PHONE_NUMBER']);
             if ($crmData['FOUND'] == 'N') {
                 CVoxImplantCrmHelper::AddLead(array('USER_ID' => $params['USER_ID'], 'PHONE_NUMBER' => $params['PHONE_NUMBER'], 'SEARCH_ID' => $config['SEARCH_ID'], 'CRM_SOURCE' => $config['CRM_SOURCE'], 'INCOMING' => false));
             }
         }
         CVoxImplantCrmHelper::AddCall(array('CALL_ID' => $params['CALL_ID'], 'PHONE_NUMBER' => $params['PHONE_NUMBER'], 'INCOMING' => CVoxImplantMain::CALL_OUTGOING, 'USER_ID' => $params['USER_ID'], 'DATE_CREATE' => new FieldType\DateTime()));
         $crmData = CVoxImplantCrmHelper::GetDataForPopup($params['CALL_ID'], $params['PHONE_NUMBER'], $params['USER_ID']);
     } else {
         $crmData = array();
     }
     CVoxImplantHistory::WriteToLog(array('COMMAND' => 'outgoing', 'USER_ID' => $params['USER_ID'], 'CALL_ID' => $params['CALL_ID'], 'CALL_ID_TMP' => $params['CALL_ID_TMP'], 'CALL_DEVICE' => $params['CALL_DEVICE'], 'PHONE_NUMBER' => $params['PHONE_NUMBER'], 'EXTERNAL' => $params['CALL_ID_TMP'] ? true : false, 'PORTAL_CALL' => $result['PORTAL_CALL'], 'PORTAL_CALL_USER_ID' => $params['USER_ID'], 'CRM' => $crmData));
     $portalUser = array();
     if ($result['PORTAL_CALL'] == 'Y') {
         if (CModule::IncludeModule('im')) {
             $portalUser = CIMContactList::GetUserData(array('ID' => array($params['USER_ID'], $result['USER_ID']), 'DEPARTMENT' => 'N', 'HR_PHOTO' => 'Y'));
         } else {
             $portalUser = array();
         }
     }
     self::SendPullEvent(array('COMMAND' => 'outgoing', 'USER_ID' => $params['USER_ID'], 'CALL_ID' => $params['CALL_ID'], 'CALL_ID_TMP' => $params['CALL_ID_TMP'], 'CALL_DEVICE' => $params['CALL_DEVICE'], 'PHONE_NUMBER' => $params['PHONE_NUMBER'], 'EXTERNAL' => $params['CALL_ID_TMP'] ? true : false, 'PORTAL_CALL' => $result['PORTAL_CALL'], 'PORTAL_CALL_USER_ID' => $result['USER_ID'], 'PORTAL_CALL_DATA' => $portalUser, 'CONFIG' => array('RECORDING' => $config['RECORDING'], 'CRM_CREATE' => $config['CRM_CREATE']), 'CRM' => $crmData));
     if ($result['PORTAL_CALL'] == 'Y' && $result['USER_ID'] > 0) {
         CVoxImplantIncoming::SendPullEvent(array('COMMAND' => 'invite', 'USER_ID' => $result['USER_ID'], 'CALL_ID' => $params['CALL_ID'], 'CALLER_ID' => $params['USER_DIRECT_CODE'], 'PHONE_NAME' => $params['CALLER_ID'], 'PORTAL_CALL' => 'Y', 'PORTAL_CALL_USER_ID' => $params['USER_ID'], 'PORTAL_CALL_DATA' => $portalUser, 'CONFIG' => array('RECORDING' => $config['RECORDING'], 'CRM_CREATE' => $config['CRM_CREATE'])));
     }
     return $result;
 }
예제 #8
0
 public static function AddLead($params)
 {
     if (!CModule::IncludeModule('crm')) {
         return false;
     }
     if (strlen($params['PHONE_NUMBER']) <= 0 || intval($params['USER_ID']) <= 0) {
         return false;
     }
     $result = VI\PhoneTable::getList(array('select' => array('USER_ID', 'PHONE_MNEMONIC'), 'filter' => array('=PHONE_NUMBER' => $params['PHONE_NUMBER'])));
     if ($row = $result->fetch()) {
         return false;
     }
     $title = GetMessage($params['INCOMING'] ? 'VI_CRM_CALL_INCOMING' : 'VI_CRM_CALL_OUTGOING');
     $arFields = array('TITLE' => $params['PHONE_NUMBER'] . ' - ' . $title, 'OPENED' => 'Y', 'PHONE_WORK' => $params['PHONE_NUMBER']);
     $statuses = CCrmStatus::GetStatusList("SOURCE");
     if (isset($statuses[$params['CRM_SOURCE']])) {
         $arFields['SOURCE_ID'] = $params['CRM_SOURCE'];
     } else {
         if (isset($statuses['CALL'])) {
             $arFields['SOURCE_ID'] = 'CALL';
         } else {
             if (isset($statuses['OTHER'])) {
                 $arFields['SOURCE_ID'] = 'OTHER';
             }
         }
     }
     $portalNumbers = CVoxImplantConfig::GetPortalNumbers();
     $portalNumber = isset($portalNumbers[$params['SEARCH_ID']]) ? $portalNumbers[$params['SEARCH_ID']] : '';
     if ($portalNumber) {
         $arFields['SOURCE_DESCRIPTION'] = GetMessage('VI_CRM_CALL_TO_PORTAL_NUMBER', array('#PORTAL_NUMBER#' => $portalNumber));
     }
     $arFields['FM'] = CCrmFieldMulti::PrepareFields($arFields);
     $CCrmLead = new CCrmLead(false);
     $ID = $CCrmLead->Add($arFields, true, array('CURRENT_USER' => $params['USER_ID'], 'DISABLE_USER_FIELD_CHECK' => true));
     $arErrors = array();
     CCrmBizProcHelper::AutoStartWorkflows(CCrmOwnerType::Lead, $ID, CCrmBizProcEventType::Create, $arErrors);
     CVoxImplantHistory::WriteToLog($arFields, 'LEAD CREATED');
     return $ID;
 }
예제 #9
0
 public function OnBeforeUserAdd(&$arFields)
 {
     global $APPLICATION;
     $error = false;
     if (is_set($arFields, "WORK_PHONE")) {
         if (strlen($arFields["WORK_PHONE"]) > 0) {
             $arCorrectPhones["WORK_PHONE"] = CVoxImplantPhone::Normalize($arFields["WORK_PHONE"]);
             if (!$arCorrectPhones["WORK_PHONE"]) {
                 $APPLICATION->throwException(GetMessage('ERROR_WORK_PHONE') . ' ' . GetMessage('ERROR_NUMBER'));
                 $error = true;
             }
         } else {
             $arCorrectPhones["WORK_PHONE"] = '';
         }
     }
     if (is_set($arFields, "PERSONAL_PHONE")) {
         if (strlen($arFields["PERSONAL_PHONE"]) > 0) {
             $arCorrectPhones["PERSONAL_PHONE"] = CVoxImplantPhone::Normalize($arFields["PERSONAL_PHONE"]);
             if (!$arCorrectPhones["PERSONAL_PHONE"]) {
                 $APPLICATION->throwException(GetMessage('ERROR_PERSONAL_PHONE') . ' ' . GetMessage('ERROR_NUMBER'));
                 $error = true;
             }
         } else {
             $arCorrectPhones["PERSONAL_PHONE"] = '';
         }
     }
     if (is_set($arFields, "PERSONAL_MOBILE")) {
         if (strlen($arFields["PERSONAL_MOBILE"]) > 0) {
             $arCorrectPhones["PERSONAL_MOBILE"] = CVoxImplantPhone::Normalize($arFields["PERSONAL_MOBILE"]);
             if (!$arCorrectPhones["PERSONAL_MOBILE"]) {
                 $APPLICATION->throwException(GetMessage('ERROR_PERSONAL_MOBILE') . ' ' . GetMessage('ERROR_NUMBER'));
                 $error = true;
             }
         } else {
             $arCorrectPhones["PERSONAL_MOBILE"] = '';
         }
     }
     if (is_set($arFields, "UF_PHONE_INNER")) {
         if (strlen($arFields["UF_PHONE_INNER"]) > 0) {
             $phoneInner = intval(preg_replace("/[^0-9]/i", "", $arFields["UF_PHONE_INNER"]));
             if ($phoneInner > 0 && $phoneInner < 10000) {
                 $result = \Bitrix\Main\UserTable::getList(array('select' => array('COUNT'), 'filter' => array('!=ID' => intval($arFields['ID']), '=UF_PHONE_INNER' => $phoneInner, '=ACTIVE' => 'Y'), 'runtime' => array('COUNT' => array('data_type' => 'integer', 'expression' => array('COUNT(1)')))));
                 $data = $result->fetch();
                 CVoxImplantHistory::WriteToLog($data);
                 if ($data['COUNT'] > 0) {
                     $APPLICATION->throwException(GetMessage('ERROR_PHONE_INNER'));
                     $error = true;
                 } else {
                     $arFields["UF_PHONE_INNER"] = $phoneInner;
                 }
             } else {
                 $APPLICATION->throwException(GetMessage('ERROR_PHONE_INNER_2'));
                 $error = true;
             }
         }
         $arCorrectPhones["UF_PHONE_INNER"] = '';
     }
     if ($error) {
         return false;
     }
 }
예제 #10
0
 public static function AddLead($params)
 {
     if (!CModule::IncludeModule('crm')) {
         return false;
     }
     if (strlen($params['PHONE_NUMBER']) <= 0 || intval($params['USER_ID']) <= 0) {
         return false;
     }
     $dateNow = new Bitrix\Main\Type\DateTime();
     $title = GetMessage($params['INCOMING'] ? 'VI_CRM_CALL_INCOMING' : 'VI_CRM_CALL_OUTGOING');
     $arFields = array('TITLE' => $title . ' ' . $dateNow->format('H:i d.m.Y'), 'OPENED' => 'Y', 'PHONE_WORK' => $params['PHONE_NUMBER']);
     $statuses = CCrmStatus::GetStatusList("SOURCE");
     if (isset($statuses['CALL'])) {
         $arFields['SOURCE_ID'] = 'CALL';
     }
     $portalNumbers = CVoxImplantConfig::GetPortalNumbers();
     $portalNumber = isset($portalNumbers[$params['SEARCH_ID']]) ? $portalNumbers[$params['SEARCH_ID']] : '';
     if ($portalNumber) {
         $arFields['SOURCE_DESCRIPTION'] = GetMessage('VI_CRM_CALL_TO_PORTAL_NUMBER', array('#PORTAL_NUMBER#' => $portalNumber));
     }
     $arFields['FM'] = CCrmFieldMulti::PrepareFields($arFields);
     $CCrmLead = new CCrmLead(false);
     $ID = $CCrmLead->Add($arFields, true, array('CURRENT_USER' => $params['USER_ID'], 'DISABLE_USER_FIELD_CHECK' => true));
     $arErrors = array();
     CCrmBizProcHelper::AutoStartWorkflows(CCrmOwnerType::Lead, $ID, CCrmBizProcEventType::Create, $arErrors);
     CVoxImplantHistory::WriteToLog($arFields, 'LEAD CREATED');
     return $ID;
 }
예제 #11
0
            $result = CVoxImplantConfig::DeleteConfigBySearchId($params['PHONE_NUMBER']);
            CVoxImplantHistory::WriteToLog($result, 'CONTROLLER UNLINK EXPIRE PHONE NUMBER');
            echo json_encode($result);
        } elseif ($params["COMMAND"] == "UpdateOperatorRequest") {
            $params['OPERATOR_CONTRACT'] = \Bitrix\Main\Text\Encoding::convertEncodingToCurrent($params['OPERATOR_CONTRACT']);
            CVoxImplantPhoneOrder::Update($params);
            $result = array('RESULT' => 'OK');
            CVoxImplantHistory::WriteToLog($result, 'UPDATE OPERATOR REQUEST');
            echo json_encode($result);
        } else {
            if ($params["COMMAND"] == "ExternalHungup") {
                $res = Bitrix\Voximplant\CallTable::getList(array('filter' => array('=CALL_ID' => $params['CALL_ID_TMP'])));
                if ($call = $res->fetch()) {
                    Bitrix\Voximplant\CallTable::delete($call['ID']);
                    CVoxImplantOutgoing::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => $call['USER_ID'], 'CALL_ID' => $call['CALL_ID'], 'FAILED_CODE' => intval($params['CALL_FAILED_CODE']), 'MARK' => 'timeout_hit_7'));
                    CVoxImplantHistory::WriteToLog($call, 'EXTERNAL CALL HANGUP');
                }
            } else {
                if ($params["COMMAND"] == "VerifyResult") {
                    $params['REVIEWER_COMMENT'] = \Bitrix\Main\Text\Encoding::convertEncodingToCurrent($params['REVIEWER_COMMENT']);
                    $ViDocs = new CVoxImplantDocuments();
                    $ViDocs->SetVerifyResult($params);
                }
            }
        }
    } else {
        echo "You don't have access to this page.";
    }
}
CMain::FinalActions();
die;
예제 #12
0
}
$result->NavRecordCount = $totalCount;
$result->NavPageCount = $totalPage;
$result->NavPageNomer = $page;
$arResult["NAV_OBJECT"] = $result;
$arResult["ROWS_COUNT"] = $result->SelectedRowsCount();
$arResult["ELEMENTS_ROWS"] = array();
$arAvailableStatuses = array("200", "304", "603", "404", "486", "503", "480", "402", "1", "2", "3");
$bModuleCatalog = false;
if (CModule::IncludeModule("catalog")) {
    $bModuleCatalog = true;
}
$arUserIds = array();
$portalNumbers = CVoxImplantConfig::GetPortalNumbers();
while ($data = $result->fetch()) {
    $data = CVoxImplantHistory::PrepereData($data);
    if ($data["PORTAL_USER_ID"] > 0 && !in_array($data["PORTAL_USER_ID"], $arUserIds)) {
        $arUserIds[] = $data["PORTAL_USER_ID"];
    }
    if (in_array($data["CALL_FAILED_CODE"], array(1, 2, 3, 409))) {
        $data["CALL_FAILED_REASON"] = GetMessage("TELEPHONY_STATUS_" . $data["CALL_FAILED_CODE"]);
    }
    if (isset($portalNumbers[$data["PORTAL_NUMBER"]])) {
        $data["PORTAL_NUMBER"] = $portalNumbers[$data["PORTAL_NUMBER"]];
    } else {
        if (substr($data["PORTAL_NUMBER"], 0, 3) == 'sip') {
            $data["PORTAL_NUMBER"] = GetMessage("TELEPHONY_PORTAL_PHONE_SIP_OFFICE", array('#ID#' => substr($data["PORTAL_NUMBER"], 3)));
        } else {
            if (substr($data["PORTAL_NUMBER"], 0, 3) == 'reg') {
                $data["PORTAL_NUMBER"] = GetMessage("TELEPHONY_PORTAL_PHONE_SIP_CLOUD", array('#ID#' => substr($data["PORTAL_NUMBER"], 3)));
            } else {
예제 #13
0
 public static function Add($params)
 {
     if (strlen($params["CALL_ID"]) > 0) {
         $res = VI\CallTable::getList(array('select' => array('ID', 'DATE_CREATE', 'CRM', 'CONFIG_ID', 'USER_ID', 'TRANSFER_USER_ID'), 'filter' => array('=CALL_ID' => $params["CALL_ID"])));
         if ($call = $res->fetch()) {
             VI\CallTable::delete($call['ID']);
         }
     }
     $arFields = array("ACCOUNT_ID" => $params["ACCOUNT_ID"], "APPLICATION_ID" => $params["APPLICATION_ID"], "APPLICATION_NAME" => $params["APPLICATION_NAME"], "INCOMING" => $params["INCOMING"], "CALL_START_DATE" => $call ? $call['DATE_CREATE'] : new Bitrix\Main\Type\DateTime(), "CALL_DURATION" => $params["CALL_DURATION"], "CALL_STATUS" => $params["CALL_STATUS"], "CALL_FAILED_CODE" => $params["CALL_FAILED_CODE"], "CALL_FAILED_REASON" => $params["CALL_FAILED_REASON"], "COST" => $params["COST_FINAL"], "COST_CURRENCY" => $params["COST_CURRENCY"], "CALL_VOTE" => intval($params["CALL_VOTE"]), "CALL_ID" => $params["CALL_ID"], "CALL_CATEGORY" => $params["CALL_CATEGORY"]);
     if (intval($params["PORTAL_USER_ID"]) > 0) {
         $arFields["PORTAL_USER_ID"] = intval($params["PORTAL_USER_ID"]);
     }
     if (strlen($params["PHONE_NUMBER"]) > 0) {
         $arFields["PHONE_NUMBER"] = $params["PHONE_NUMBER"];
     }
     if (strlen($params["CALL_DIRECTION"]) > 0) {
         $arFields["CALL_DIRECTION"] = $params["CALL_DIRECTION"];
     }
     if (strlen($params["PORTAL_NUMBER"]) > 0) {
         $arFields["PORTAL_NUMBER"] = $params["PORTAL_NUMBER"];
     }
     if (strlen($params["ACCOUNT_SEARCH_ID"]) > 0) {
         $arFields["PORTAL_NUMBER"] = $params["ACCOUNT_SEARCH_ID"];
     }
     if (strlen($params["CALL_LOG"]) > 0) {
         $arFields["CALL_LOG"] = $params["CALL_LOG"];
     }
     $orm = Bitrix\VoxImplant\StatisticTable::add($arFields);
     if (!$orm) {
         return false;
     }
     if ($call && intval($arFields["PORTAL_USER_ID"]) <= 0) {
         $res = VI\QueueTable::getList(array('select' => array('ID', 'USER_ID'), 'order' => array('LAST_ACTIVITY_DATE' => 'asc'), 'filter' => array('=CONFIG_ID' => $call['CONFIG_ID']), 'limit' => 1));
         $queueUser = $res->fetch();
         if ($queueUser) {
             $arFields["PORTAL_USER_ID"] = $queueUser['USER_ID'];
         }
     }
     if (strlen($arFields["PHONE_NUMBER"]) > 0 && $arFields["PORTAL_USER_ID"] > 0 && $params["CALL_FAILED_CODE"] != 423) {
         $plusSymbol = strlen($arFields["PHONE_NUMBER"]) >= 10 ? '+' : '';
         if ($arFields["INCOMING"] == CVoxImplantMain::CALL_OUTGOING) {
             if ($arFields['CALL_FAILED_CODE'] == '603-S') {
                 $message = GetMessage('VI_OUT_CALL_DECLINE_SELF', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"]));
             } else {
                 if ($arFields['CALL_FAILED_CODE'] == 603) {
                     $message = GetMessage('VI_OUT_CALL_DECLINE', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"]));
                 } else {
                     if ($arFields['CALL_FAILED_CODE'] == 486) {
                         $message = GetMessage('VI_OUT_CALL_BUSY', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"]));
                     } else {
                         if ($arFields['CALL_FAILED_CODE'] == 480) {
                             $message = GetMessage('VI_OUT_CALL_UNAVAILABLE', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"]));
                         } else {
                             if ($arFields['CALL_FAILED_CODE'] == 404 || $arFields['CALL_FAILED_CODE'] == 484) {
                                 $message = GetMessage('VI_OUT_CALL_ERROR_NUMBER', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"]));
                             } else {
                                 if ($arFields['CALL_FAILED_CODE'] == 402) {
                                     $message = GetMessage('VI_OUT_CALL_NO_MONEY', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"]));
                                 } else {
                                     $message = GetMessage('VI_OUT_CALL_END', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"], '#INFO#' => '[PCH=' . $orm->getId() . ']' . GetMessage('VI_CALL_INFO') . '[/PCH]'));
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             if ($arFields['CALL_FAILED_CODE'] == 304) {
                 if (strlen($params['URL']) > 0) {
                     $subMessage = GetMessage('VI_CALL_VOICEMAIL', array('#LINK_START#' => '[PCH=' . $orm->getId() . ']', '#LINK_END#' => '[/PCH]'));
                 } else {
                     $subMessage = '[PCH=' . $orm->getId() . ']' . GetMessage('VI_CALL_INFO') . '[/PCH]';
                 }
                 $message = GetMessage('VI_IN_CALL_SKIP', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"], '#INFO#' => $subMessage));
             } else {
                 $message = GetMessage('VI_IN_CALL_END', array('#NUMBER#' => $plusSymbol . $arFields["PHONE_NUMBER"], '#INFO#' => '[PCH=' . $orm->getId() . ']' . GetMessage('VI_CALL_INFO') . '[/PCH]'));
             }
         }
         self::SendMessageToChat($arFields["PORTAL_USER_ID"], $arFields["PHONE_NUMBER"], $arFields["INCOMING"], $message);
     }
     if ($call['CRM'] == 'Y') {
         CVoxImplantCrmHelper::UpdateCall($arFields);
     }
     if (strlen($params['URL']) > 0) {
         $attachToCrm = $call['CRM'] == 'Y';
         $startDownloadAgent = false;
         $recordLimit = COption::GetOptionInt("voximplant", "record_limit");
         if ($recordLimit > 0 && !CVoxImplantAccount::IsPro()) {
             $sipConnectorActive = CVoxImplantConfig::GetModeStatus(CVoxImplantConfig::MODE_SIP);
             if ($params['PORTAL_TYPE'] == CVoxImplantConfig::MODE_SIP && $sipConnectorActive) {
                 $startDownloadAgent = true;
             } else {
                 $recordMonth = COption::GetOptionInt("voximplant", "record_month");
                 if (!$recordMonth) {
                     $recordMonth = date('Ym');
                     COption::SetOptionInt("voximplant", "record_month", $recordMonth);
                 }
                 $recordCount = CGlobalCounter::GetValue('vi_records', CGlobalCounter::ALL_SITES);
                 if ($recordCount < $recordLimit) {
                     CGlobalCounter::Increment('vi_records', CGlobalCounter::ALL_SITES, false);
                     $startDownloadAgent = true;
                 } else {
                     if ($recordMonth < date('Ym')) {
                         COption::SetOptionInt("voximplant", "record_month", date('Ym'));
                         CGlobalCounter::Set('vi_records', 1, CGlobalCounter::ALL_SITES, false);
                         CGlobalCounter::Set('vi_records_skipped', 0, CGlobalCounter::ALL_SITES, false);
                         $startDownloadAgent = true;
                     } else {
                         CGlobalCounter::Increment('vi_records_skipped', CGlobalCounter::ALL_SITES, false);
                     }
                 }
                 CVoxImplantHistory::WriteToLog(array('limit' => $recordLimit, 'saved' => CGlobalCounter::GetValue('vi_records', CGlobalCounter::ALL_SITES), 'skipped' => CGlobalCounter::GetValue('vi_records_skipped', CGlobalCounter::ALL_SITES), 'save to portal' => $startDownloadAgent ? 'Y' : 'N'), 'STATUS OF RECORD LIMIT');
             }
         } else {
             $startDownloadAgent = true;
         }
         if ($startDownloadAgent) {
             self::DownloadAgent($orm->getId(), $params['URL'], $attachToCrm);
         }
     }
     if (strlen($params["ACCOUNT_PAYED"]) > 0 && in_array($params["ACCOUNT_PAYED"], array('Y', 'N'))) {
         CVoxImplantAccount::SetPayedFlag($params["ACCOUNT_PAYED"]);
     }
     foreach (GetModuleEvents("voximplant", "onCallEnd", true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array(array('CALL_ID' => $arFields['CALL_ID'], 'CALL_TYPE' => $arFields['INCOMING'], 'PHONE_NUMBER' => $arFields['PHONE_NUMBER'], 'PORTAL_NUMBER' => $arFields['PORTAL_NUMBER'], 'PORTAL_USER_ID' => $arFields['PORTAL_USER_ID'], 'CALL_DURATION' => $arFields['CALL_DURATION'], 'CALL_START_DATE' => $arFields['CALL_START_DATE'], 'COST' => $arFields['COST'], 'COST_CURRENCY' => $arFields['COST_CURRENCY'], 'CALL_FAILED_CODE' => $arFields['CALL_FAILED_CODE'], 'CALL_FAILED_REASON' => $arFields['CALL_FAILED_REASON'])));
     }
     return true;
 }
예제 #14
0
 public static function GetConfig($id, $type = self::GET_BY_ID)
 {
     if (strlen($id) <= 0) {
         return array('ERROR' => 'Config is`t found for undefined id/number');
     }
     if ($type == self::GET_BY_SEARCH_ID) {
         $orm = VI\ConfigTable::getList(array('filter' => array('=SEARCH_ID' => (string) $id)));
     } else {
         $orm = VI\ConfigTable::getList(array('filter' => array('=ID' => intval($id))));
     }
     $config = $orm->fetch();
     if (!$config) {
         $result = array('ERROR' => $type == self::GET_BY_SEARCH_ID ? 'Config is`t found for number: ' . $id : 'Config is`t found for id: ' . $id);
     } else {
         $result = $config;
         $result['PHONE_TITLE'] = $result['PHONE_NAME'];
         if ($result['PORTAL_MODE'] == self::MODE_SIP) {
             $viSip = new CVoxImplantSip();
             $sipResult = $viSip->Get($config["ID"]);
             $result['PHONE_NAME'] = preg_replace("/[^0-9\\#\\*]/i", "", $result['PHONE_NAME']);
             $result['PHONE_NAME'] = strlen($result['PHONE_NAME']) >= 4 ? $result['PHONE_NAME'] : '';
             $result['SIP_SERVER'] = $sipResult ? $sipResult['SERVER'] : '';
             $result['SIP_LOGIN'] = $sipResult ? $sipResult['LOGIN'] : '';
             $result['SIP_PASSWORD'] = $sipResult ? $sipResult['PASSWORD'] : '';
         }
         if (strlen($result['FORWARD_LINE']) > 0 && $result['FORWARD_LINE'] != self::FORWARD_LINE_DEFAULT) {
             if ($result['FORWARD_LINE'] == CVoxImplantPhone::GetLinkNumber() || $result['FORWARD_LINE'] == CVoxImplantConfig::LINK_BASE_NUMBER) {
                 $result['FORWARD_LINE_TYPE'] = 'LINK';
                 if ($result['FORWARD_LINE_NUMBER'] == CVoxImplantConfig::LINK_BASE_NUMBER) {
                     $result['FORWARD_LINE_NUMBER'] = '';
                 } else {
                     $result['FORWARD_LINE_NUMBER'] = CVoxImplantPhone::GetLinkNumber();
                 }
             } else {
                 $ormForward = VI\ConfigTable::getList(array('filter' => array('=SEARCH_ID' => (string) $result['FORWARD_LINE'])));
                 $configForward = $ormForward->fetch();
                 CVoxImplantHistory::WriteToLog($configForward);
                 if ($configForward) {
                     $result['FORWARD_LINE_TYPE'] = $configForward['PORTAL_MODE'];
                     if ($result['FORWARD_LINE_TYPE'] == self::MODE_SIP) {
                         $viForwardSip = new CVoxImplantSip();
                         $forwardSipResult = $viForwardSip->Get($configForward["ID"]);
                         $result['FORWARD_LINE_SIP_SERVER'] = $forwardSipResult ? $forwardSipResult['SERVER'] : '';
                         $result['FORWARD_LINE_SIP_LOGIN'] = $forwardSipResult ? $forwardSipResult['LOGIN'] : '';
                         $result['FORWARD_LINE_SIP_PASSWORD'] = $forwardSipResult ? $forwardSipResult['PASSWORD'] : '';
                     } else {
                         $result['FORWARD_LINE_NUMBER'] = $configForward['SEARCH_ID'];
                     }
                 } else {
                     $result['FORWARD_LINE'] = self::FORWARD_LINE_DEFAULT;
                 }
             }
         }
         if (strlen($result['FORWARD_NUMBER']) > 0) {
             $result["FORWARD_NUMBER"] = NormalizePhone($result['FORWARD_NUMBER'], 1);
         }
         if (strlen($result['WORKTIME_DAYOFF_NUMBER']) > 0) {
             $result["WORKTIME_DAYOFF_NUMBER"] = NormalizePhone($result['WORKTIME_DAYOFF_NUMBER'], 1);
         }
         // check work time
         $result['WORKTIME_SKIP_CALL'] = 'N';
         if ($config['WORKTIME_ENABLE'] == 'Y') {
             $timezone = !empty($config["WORKTIME_TIMEZONE"]) ? new DateTimeZone($config["WORKTIME_TIMEZONE"]) : null;
             $numberDate = new Bitrix\Main\Type\DateTime(null, null, $timezone);
             if (!empty($config['WORKTIME_DAYOFF'])) {
                 $daysOff = explode(",", $config['WORKTIME_DAYOFF']);
                 $allWeekDays = array('MO' => 1, 'TU' => 2, 'WE' => 3, 'TH' => 4, 'FR' => 5, 'SA' => 6, 'SU' => 7);
                 $currentWeekDay = $numberDate->format('N');
                 foreach ($daysOff as $day) {
                     if ($currentWeekDay == $allWeekDays[$day]) {
                         $result['WORKTIME_SKIP_CALL'] = "Y";
                     }
                 }
             }
             if ($result['WORKTIME_SKIP_CALL'] !== "Y" && !empty($config['WORKTIME_HOLIDAYS'])) {
                 $holidays = explode(",", $config['WORKTIME_HOLIDAYS']);
                 $currentDay = $numberDate->format('d.m');
                 foreach ($holidays as $holiday) {
                     if ($currentDay == $holiday) {
                         $result['WORKTIME_SKIP_CALL'] = "Y";
                     }
                 }
             }
             if ($result['WORKTIME_SKIP_CALL'] !== "Y" && !empty($config['WORKTIME_FROM']) && !empty($config['WORKTIME_TO'])) {
                 $currentTime = $numberDate->format('G.i');
                 if (!($currentTime >= $config['WORKTIME_FROM'] && $currentTime <= $config['WORKTIME_TO'])) {
                     $result['WORKTIME_SKIP_CALL'] = "Y";
                 }
             }
             if ($result['WORKTIME_SKIP_CALL'] === "Y") {
                 $result['WORKTIME_DAYOFF_MELODY'] = CVoxImplantConfig::GetMelody('WORKTIME_DAYOFF_MELODY', $config['MELODY_LANG'], $config['WORKTIME_DAYOFF_MELODY']);
             }
         }
         if (CVoxImplantHttp::GetPortalType() == CVoxImplantHttp::TYPE_BITRIX24) {
             $result['PORTAL_URL'] = CVoxImplantHttp::GetServerAddress() . '/settings/info_receiver.php?b24_action=phone&b24_direct=y';
         } else {
             $result['PORTAL_URL'] = CVoxImplantHttp::GetServerAddress() . '/services/telephony/info_receiver.php?b24_direct=y';
         }
         $result['PORTAL_SIGN'] = CVoxImplantHttp::GetPortalSign();
         $result['MELODY_WELCOME'] = CVoxImplantConfig::GetMelody('MELODY_WELCOME', $config['MELODY_LANG'], $config['MELODY_WELCOME']);
         $result['MELODY_VOICEMAIL'] = CVoxImplantConfig::GetMelody('MELODY_VOICEMAIL', $config['MELODY_LANG'], $config['MELODY_VOICEMAIL']);
         $result['MELODY_HOLD'] = CVoxImplantConfig::GetMelody('MELODY_HOLD', $config['MELODY_LANG'], $config['MELODY_HOLD']);
         $result['MELODY_WAIT'] = CVoxImplantConfig::GetMelody('MELODY_WAIT', $config['MELODY_LANG'], $config['MELODY_WAIT']);
         $result['MELODY_RECORDING'] = CVoxImplantConfig::GetMelody('MELODY_RECORDING', $config['MELODY_LANG'], $config['MELODY_RECORDING']);
         $result['MELODY_VOTE'] = CVoxImplantConfig::GetMelody('MELODY_VOTE', $config['MELODY_LANG'], $config['MELODY_VOTE']);
         $result['MELODY_VOTE_END'] = CVoxImplantConfig::GetMelody('MELODY_VOTE_END', $config['MELODY_LANG'], $config['MELODY_VOTE_END']);
     }
     return $result;
 }
예제 #15
0
 public static function AttachPhoneNumber($country, $regionId, $number = '', $countryState = '', $type = self::PHONE_TYPE_FIXED)
 {
     $arResult = array();
     if (!in_array($type, array(self::PHONE_TYPE_FIXED, self::PHONE_TYPE_TOLLFREE, self::PHONE_TYPE_TOLLFREE804, self::PHONE_TYPE_MOBILE, self::PHONE_TYPE_MOSCOW495))) {
         return $arResult;
     }
     if ($country == 'RU' && $regionId == '15') {
         $type = 'MOSCOW495';
     }
     $arPhones = array();
     $viHttp = new CVoxImplantHttp();
     $result = $viHttp->AttachPhoneNumber($type, $country, $regionId, $number, $countryState);
     if ($result->result && !empty($result->phone_numbers)) {
         foreach ($result->phone_numbers as $number) {
             $arPhones[$number->phone_number]['PHONE_NUMBER'] = '+' . $number->phone_number;
             $arPhones[$number->phone_number]['VERIFICATION_REGION'] = isset($number->required_verification) ? $number->required_verification : '';
             $arPhones[$number->phone_number]['VERIFICATION_STATUS'] = isset($number->verification_status) ? $number->verification_status : 'VERIFIED';
             $arPhones[$number->phone_number]['VERIFICATION_UNVERIFIED_HOLD_UNTIL'] = $arPhones[$number->phone_number]['VERIFICATION_STATUS'] != 'VERIFIED' && isset($number->unverified_hold_until) ? $number->unverified_hold_until : '';
         }
         CVoxImplantHistory::WriteToLog($arPhones, 'ATTACHED PHONES');
     } else {
         CVoxImplantHistory::WriteToLog($viHttp->GetError(), 'ERROR WHILE ATTACH');
     }
     foreach ($arPhones as $phone => $phoneObj) {
         $melodyLang = 'EN';
         if ($country == 'RU') {
             $melodyLang = 'RU';
         } else {
             if ($country == 'DE') {
                 $melodyLang = 'DE';
             } else {
                 if ($country == 'UA') {
                     $melodyLang = 'UA';
                 }
             }
         }
         $arFields = array('SEARCH_ID' => $phone, 'PHONE_NAME' => $phoneObj['PHONE_NUMBER'], 'PHONE_VERIFIED' => $phoneObj['VERIFICATION_STATUS'] == 'VERIFIED' ? 'Y' : 'N', 'PHONE_COUNTRY_CODE' => $country, 'MELODY_LANG' => $melodyLang);
         $result = VI\ConfigTable::add($arFields);
         if ($result) {
             $userId = $GLOBALS['USER']->GetId();
             if ($userId > 0) {
                 VI\QueueTable::add(array('CONFIG_ID' => $result->getId(), 'USER_ID' => $userId, 'STATUS' => 'OFFLINE'));
             }
             $arResult[] = array('ID' => $result->getId(), 'SEARCH_ID' => $phone);
             if (CVoxImplantConfig::GetPortalNumber() == CVoxImplantConfig::LINK_BASE_NUMBER) {
                 CVoxImplantConfig::SetPortalNumber($arFields['SEARCH_ID']);
             }
         }
     }
     if (!empty($arPhones)) {
         CVoxImplantConfig::SetModeStatus(CVoxImplantConfig::MODE_RENT, true);
     }
     return $arResult;
 }