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; }
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; }
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; }
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; }
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; }
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; } }
$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;
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; }
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; }
public static function GetNextInQueue($params) { CVoxImplantHistory::WriteToLog($params, '!!!GetNextInQueue'); $fistInQueue = isset($params['FIRST_IN_QUEUE']) && $params['FIRST_IN_QUEUE'] == 'Y'; // TODO check $params $result = array('COMMAND' => CVoxImplantIncoming::RULE_HUNGUP); if (!$fistInQueue) { $res = VI\CallTable::getList(array('select' => array('ID', 'STATUS'), 'filter' => array('=CALL_ID' => $params['CALL_ID']))); $call = $res->fetch(); if ($call['STATUS'] == VI\CallTable::STATUS_CONNECTED) { $result['COMMAND'] = CVoxImplantIncoming::RULE_TALK; return $result; } } if (isset($params['CONFIG'])) { $config = $params['CONFIG']; } else { $config = self::GetConfigBySearchId($params['SEARCH_ID']); if (!$config) { $result['COMMAND'] = CVoxImplantIncoming::RULE_HUNGUP; return $result; } $params['CONFIG'] = $config; } if (isset($params['LAST_USER_ID']) && $params['LAST_USER_ID'] > 0) { self::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => intval($params['LAST_USER_ID']), 'CALL_ID' => $params['CALL_ID'])); } $filter = array('=CONFIG_ID' => $config['ID']); if (isset($params['EXCLUDE_USERS'])) { $excludeUsers = $params['EXCLUDE_USERS']; if (!empty($excludeUsers)) { $filter['!=USER_ID'] = $excludeUsers; } } $res = CVoxImplantUser::QueuedGetList(array('select' => array('ID', 'USER_ID', 'IS_ONLINE_CUSTOM', 'UF_VI_PHONE' => 'USER.UF_VI_PHONE', 'ACTIVE' => 'USER.ACTIVE'), 'filter' => $filter, 'order' => array('LAST_ACTIVITY_DATE' => 'asc'))); $findActiveUser = false; while ($queueUser = $res->fetch()) { if ($queueUser['IS_ONLINE_CUSTOM'] != 'Y' && $queueUser['UF_VI_PHONE'] != 'Y' || $queueUser['ACTIVE'] != 'Y') { continue; } $findActiveUser = true; if ($config['TIMEMAN'] == "Y" && !CVoxImplantUser::GetActiveStatusByTimeman($queueUser['USER_ID'])) { $params['EXCLUDE_USERS'][] = $queueUser['USER_ID']; $params['LAST_USER_ID'] = 0; $result = self::GetNextInQueue($params); } else { VI\QueueTable::update($queueUser['ID'], array('LAST_ACTIVITY_DATE' => new FieldType\DateTime())); $result['COMMAND'] = CVoxImplantIncoming::RULE_WAIT; $result['TYPE_CONNECT'] = self::TYPE_CONNECT_QUEUE; $result['USER_ID'] = $queueUser['USER_ID']; $result['USER_HAVE_PHONE'] = $queueUser['UF_VI_PHONE'] == 'Y' ? 'Y' : 'N'; if (!$fistInQueue) { $crmData = array(); if ($config['CRM'] == 'Y') { $crmData = CVoxImplantCrmHelper::GetDataForPopup($params['CALL_ID'], $params['CALLER_ID'], $queueUser['USER_ID']); } self::SendPullEvent(array('COMMAND' => 'invite', 'USER_ID' => $queueUser['USER_ID'], 'CALL_ID' => $params['CALL_ID'], 'CALLER_ID' => $params['CALLER_ID'], 'PHONE_NAME' => $config['PHONE_TITLE'], 'CRM' => $crmData)); } } break; } if (!$findActiveUser) { $userId = intval($params['LAST_ANSWER_USER_ID']) > 0 ? intval($params['LAST_ANSWER_USER_ID']) : intval($params['LAST_USER_ID']); if ($userId <= 0) { $res = VI\QueueTable::getList(array('select' => array('ID', 'USER_ID', 'ACTIVE' => 'USER.ACTIVE'), 'order' => array('LAST_ACTIVITY_DATE' => 'asc'), 'filter' => array('=CONFIG_ID' => $config['ID']), 'limit' => 1)); $queueUser = $res->fetch(); if ($queueUser && $queueUser['ACTIVE']) { VI\QueueTable::update($queueUser['ID'], array('LAST_ACTIVITY_DATE' => new FieldType\DateTime())); $userId = $queueUser['USER_ID']; } } if ($config['NO_ANSWER_RULE'] != CVoxImplantIncoming::RULE_HUNGUP && (isset($params['LAST_ANSWER_USER_ID']) || isset($params['LAST_USER_ID']))) { $result['COMMAND'] = CVoxImplantIncoming::RULE_VOICEMAIL; $result['USER_ID'] = $userId; if ($config['NO_ANSWER_RULE'] == CVoxImplantIncoming::RULE_PSTN_SPECIFIC) { if (strlen($config['FORWARD_NUMBER']) <= 0) { $config['NO_ANSWER_RULE'] == CVoxImplantIncoming::RULE_PSTN; } else { $result['COMMAND'] = CVoxImplantIncoming::RULE_PSTN; $result['PHONE_NUMBER'] = NormalizePhone($config['FORWARD_NUMBER'], 1); $result['USER_ID'] = $userId; } } if ($config['NO_ANSWER_RULE'] == CVoxImplantIncoming::RULE_PSTN) { $userPhone = CVoxImplantPhone::GetUserPhone($userId); if ($userPhone) { $result['COMMAND'] = CVoxImplantIncoming::RULE_PSTN; $result['PHONE_NUMBER'] = $userPhone; $result['USER_ID'] = $userId; } } } else { $result['COMMAND'] = CVoxImplantIncoming::RULE_HUNGUP; } } return $result; }
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; }