Пример #1
0
 public static function GetQueue($params)
 {
     $loadQueue = !isset($params['LOAD_QUEUE']) || $params['LOAD_QUEUE'] == 'Y';
     $sendInvite = !isset($params['SEND_INVITE']) || $params['SEND_INVITE'] == 'Y';
     // TODO check $params
     $result = array('COMMAND' => CVoxImplantIncoming::RULE_HUNGUP);
     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'], 'MARK' => 'timeout_inc_3'));
     }
     $res = CVoxImplantUser::QueuedGetList(array('select' => array('ID', 'USER_ID', 'IS_ONLINE_CUSTOM', 'UF_VI_PHONE' => 'USER.UF_VI_PHONE', 'ACTIVE' => 'USER.ACTIVE'), 'filter' => array('=CONFIG_ID' => $config['ID']), 'order' => array('LAST_ACTIVITY_DATE' => 'asc')));
     $findUserId = 0;
     if ($loadQueue) {
         CModule::IncludeModule('pull');
         while ($queueUser = $res->fetch()) {
             $orm = \Bitrix\Pull\PushTable::getList(array('select' => array('ID'), 'filter' => array('=USER_ID' => $queueUser['USER_ID'])));
             $queueUser['USER_HAVE_MOBILE'] = $orm->fetch() ? 'Y' : 'N';
             if ($queueUser['IS_ONLINE_CUSTOM'] != 'Y' && $queueUser['UF_VI_PHONE'] != 'Y' && $queueUser['USER_HAVE_MOBILE'] != 'Y' || $queueUser['ACTIVE'] != 'Y') {
                 continue;
             }
             if ($config['TIMEMAN'] == "Y" && !CVoxImplantUser::GetActiveStatusByTimeman($queueUser['USER_ID'])) {
                 continue;
             } else {
                 if (!$findUserId) {
                     VI\QueueTable::update($queueUser['ID'], array('LAST_ACTIVITY_DATE' => new FieldType\DateTime()));
                     $findUserId = $queueUser['ID'];
                     $result['USER_ID'] = $queueUser['USER_ID'];
                 }
                 $result['COMMAND'] = CVoxImplantIncoming::RULE_WAIT;
                 $result['TYPE_CONNECT'] = self::TYPE_CONNECT_QUEUE;
                 $result['USERS'][] = array('USER_ID' => $queueUser['USER_ID'], 'USER_HAVE_PHONE' => $queueUser['UF_VI_PHONE'] == 'Y' ? 'Y' : 'N', 'USER_HAVE_MOBILE' => $queueUser['USER_HAVE_MOBILE']);
             }
         }
     } else {
         while ($queueUser = $res->fetch()) {
             if (intval($params['LAST_USER_ID']) == $queueUser['USER_ID']) {
                 continue;
             } else {
                 self::SendPullEvent(array('COMMAND' => 'timeout', 'USER_ID' => $queueUser['USER_ID'], 'CALL_ID' => $params['CALL_ID'], 'MARK' => 'timeout_inc_4'));
             }
         }
     }
     if ($findUserId) {
         if ($sendInvite) {
             $crmData = array();
             foreach ($result['USERS'] as $queueUser) {
                 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'], 'TYPE_CONNECT' => $result['TYPE_CONNECT'], 'CONFIG' => array('RECORDING' => $config['RECORDING']), 'CRM' => $crmData));
             }
         }
     } else {
         $userId = 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_PSTN_SPECIFIC) {
             if (strlen($config['FORWARD_NUMBER']) > 0) {
                 $result['COMMAND'] = CVoxImplantIncoming::RULE_PSTN;
                 $result['PHONE_NUMBER'] = NormalizePhone($config['FORWARD_NUMBER'], 1);
                 $result['USER_ID'] = $userId;
             }
         } else {
             if ($config['NO_ANSWER_RULE'] != CVoxImplantIncoming::RULE_HUNGUP) {
                 $result['COMMAND'] = CVoxImplantIncoming::RULE_VOICEMAIL;
                 $result['USER_ID'] = $userId;
                 if ($config['NO_ANSWER_RULE'] == CVoxImplantIncoming::RULE_PSTN && $userId > 0) {
                     $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;
 }
Пример #2
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;
 }