Example #1
0
 public static function Init($params)
 {
     CModule::IncludeModule('pull');
     // TODO check $params
     $result = array('COMMAND' => CVoxImplantIncoming::RULE_QUEUE);
     $firstUserId = 0;
     $excludeUsers = array();
     $config = self::GetConfigBySearchId($params['SEARCH_ID']);
     if (!$config) {
         $result['COMMAND'] = CVoxImplantIncoming::RULE_HUNGUP;
         return $result;
     }
     if ($config['DIRECT_CODE'] == 'Y' && isset($params['DIRECT_CODE']) && intval($params['DIRECT_CODE']) > 0) {
         $res = CVoxImplantUser::GetList(array('select' => array('ID', 'IS_ONLINE_CUSTOM', 'UF_VI_PHONE', 'ACTIVE'), 'filter' => array('=UF_PHONE_INNER' => intval($params['DIRECT_CODE']), '=ACTIVE' => 'Y')));
         if ($userData = $res->fetch()) {
             $orm = \Bitrix\Pull\PushTable::getList(array('select' => array('ID'), 'filter' => array('=USER_ID' => $userData['ID'])));
             $userData['USER_HAVE_MOBILE'] = $orm->fetch() ? 'Y' : 'N';
             if ($userData['IS_ONLINE_CUSTOM'] == 'Y' || $userData['UF_VI_PHONE'] == 'Y' || $userData['USER_HAVE_MOBILE'] == 'Y') {
                 $result['COMMAND'] = CVoxImplantIncoming::RULE_WAIT;
                 $result['TYPE_CONNECT'] = self::TYPE_CONNECT_DIRECT;
                 $result['USER_ID'] = $userData['ID'];
                 $result['USER_HAVE_PHONE'] = $userData['UF_VI_PHONE'] == 'Y' ? 'Y' : 'N';
                 $result['USER_HAVE_MOBILE'] = $userData['USER_HAVE_MOBILE'];
             } else {
                 if ($config['DIRECT_CODE_RULE'] == CVoxImplantIncoming::RULE_VOICEMAIL) {
                     $result['COMMAND'] = CVoxImplantIncoming::RULE_VOICEMAIL;
                     $result['USER_ID'] = $userData['ID'];
                     return $result;
                 } else {
                     if ($config['DIRECT_CODE_RULE'] == CVoxImplantIncoming::RULE_PSTN) {
                         $userPhone = CVoxImplantPhone::GetUserPhone($userData['ID']);
                         if ($userPhone) {
                             $result['COMMAND'] = CVoxImplantIncoming::RULE_PSTN;
                             $result['PHONE_NUMBER'] = $userPhone;
                             $result['USER_ID'] = $userData['ID'];
                         } else {
                             $result['COMMAND'] = CVoxImplantIncoming::RULE_VOICEMAIL;
                             $result['USER_ID'] = $userData['ID'];
                         }
                         return $result;
                     } else {
                         $firstUserId = $userData['ID'];
                     }
                 }
             }
         }
     }
     $crmData = array();
     $crmCreate = CVoxImplantConfig::CRM_CREATE_NONE;
     if ($config['CRM'] == 'Y') {
         $crmData = CVoxImplantCrmHelper::GetDataForPopup($params['CALL_ID'], $params['CALLER_ID']);
         if ($config['CRM_FORWARD'] == "Y" && $result['COMMAND'] == CVoxImplantIncoming::RULE_QUEUE && isset($crmData['RESPONSIBILITY']['ID']) && $crmData['RESPONSIBILITY']['ID'] > 0) {
             $skipByTimeman = false;
             if ($config['TIMEMAN'] == "Y") {
                 $skipByTimeman = !CVoxImplantUser::GetActiveStatusByTimeman($crmData['RESPONSIBILITY']['ID']);
                 if ($skipByTimeman) {
                     $excludeUsers[] = $crmData['RESPONSIBILITY']['ID'];
                 }
             }
             if (!$skipByTimeman) {
                 $res = CVoxImplantUser::GetList(array('select' => array('ID', 'IS_ONLINE_CUSTOM', 'UF_VI_PHONE', 'ACTIVE'), 'filter' => array('=ID' => intval($crmData['RESPONSIBILITY']['ID']))));
                 $userData = $res->fetch();
                 if ($userData && $userData['ACTIVE'] == 'Y') {
                     $orm = \Bitrix\Pull\PushTable::getList(array('select' => array('ID'), 'filter' => array('=USER_ID' => $userData['ID'])));
                     $userData['USER_HAVE_MOBILE'] = $orm->fetch() ? 'Y' : 'N';
                     if ($userData['IS_ONLINE_CUSTOM'] == 'Y' || $userData['UF_VI_PHONE'] == 'Y' || $userData['USER_HAVE_MOBILE'] == 'Y') {
                         $result['COMMAND'] = CVoxImplantIncoming::RULE_WAIT;
                         $result['TYPE_CONNECT'] = self::TYPE_CONNECT_CRM;
                         $result['USER_ID'] = $userData['ID'];
                         $result['USER_HAVE_PHONE'] = $userData['UF_VI_PHONE'] == 'Y' ? 'Y' : 'N';
                         $result['USER_HAVE_MOBILE'] = $userData['USER_HAVE_MOBILE'];
                     } else {
                         if ($config['CRM_RULE'] == CVoxImplantIncoming::RULE_VOICEMAIL) {
                             $result['COMMAND'] = CVoxImplantIncoming::RULE_VOICEMAIL;
                             $result['USER_ID'] = $userData['ID'];
                             return $result;
                         } else {
                             if ($config['CRM_RULE'] == CVoxImplantIncoming::RULE_PSTN) {
                                 $userPhone = CVoxImplantPhone::GetUserPhone($userData['ID']);
                                 if ($userPhone) {
                                     $result['COMMAND'] = CVoxImplantIncoming::RULE_PSTN;
                                     $result['PHONE_NUMBER'] = $userPhone;
                                     $result['USER_ID'] = $userData['ID'];
                                 } else {
                                     $result['COMMAND'] = CVoxImplantIncoming::RULE_VOICEMAIL;
                                     $result['USER_ID'] = $userData['ID'];
                                 }
                                 return $result;
                             } else {
                                 if ($firstUserId <= 0) {
                                     $firstUserId = $userData['ID'];
                                 }
                             }
                         }
                     }
                 }
             }
         } else {
             if ($crmData['FOUND'] == 'N' && $config['CRM_CREATE'] == CVoxImplantConfig::CRM_CREATE_LEAD) {
                 $crmCreate = CVoxImplantConfig::CRM_CREATE_LEAD;
             }
         }
         $crmData = array();
     }
     if ($result['COMMAND'] == CVoxImplantIncoming::RULE_QUEUE) {
         if ($config['QUEUE_TYPE'] == CVoxImplantConfig::QUEUE_TYPE_ALL) {
             $result = self::GetQueue(array('SEARCH_ID' => $params['SEARCH_ID'], 'CALL_ID' => $params['CALL_ID'], 'CALLER_ID' => $params['CALLER_ID'], 'LAST_TYPE_CONNECT' => self::TYPE_CONNECT_QUEUE, 'SEND_INVITE' => 'N', 'CONFIG' => $config));
         } else {
             $result = self::GetNextInQueue(array('SEARCH_ID' => $params['SEARCH_ID'], 'CALL_ID' => $params['CALL_ID'], 'CALLER_ID' => $params['CALLER_ID'], 'LAST_USER_ID' => 0, 'LAST_TYPE_CONNECT' => self::TYPE_CONNECT_QUEUE, 'LAST_ANSWER_USER_ID' => 0, 'EXCLUDE_USERS' => $excludeUsers, 'FIRST_EXEC' => 'Y', 'SEND_INVITE' => 'N', 'CONFIG' => $config));
         }
     }
     if ($result['USER_ID'] > 0) {
         if ($crmCreate == CVoxImplantConfig::CRM_CREATE_LEAD) {
             $leadId = CVoxImplantCrmHelper::AddLead(array('USER_ID' => $result['USER_ID'], 'PHONE_NUMBER' => $params['CALLER_ID'], 'SEARCH_ID' => $params['SEARCH_ID'], 'CRM_SOURCE' => $config['CRM_SOURCE'], 'INCOMING' => true));
             if ($leadId) {
                 $res = VI\CallTable::getList(array('select' => array('ID'), 'filter' => array('=CALL_ID' => $params['CALL_ID'])));
                 if ($call = $res->fetch()) {
                     VI\CallTable::update($call['ID'], array('CRM_LEAD' => $leadId));
                 }
             }
         }
         if ($config['CRM'] == 'Y') {
             CVoxImplantCrmHelper::AddCall(array('CALL_ID' => $params['CALL_ID'], 'PHONE_NUMBER' => $params['CALLER_ID'], 'INCOMING' => CVoxImplantMain::CALL_INCOMING, 'USER_ID' => $result['USER_ID'], 'DATE_CREATE' => new FieldType\DateTime()));
         }
     }
     if ($result['COMMAND'] == CVoxImplantIncoming::RULE_WAIT) {
         if ($result['USER_ID'] > 0 || count($result['USERS']) > 0) {
             $res = VI\CallTable::getList(array('select' => array('ID'), 'filter' => array('=CALL_ID' => $params['CALL_ID'])));
             if ($call = $res->fetch()) {
                 VI\CallTable::update($call['ID'], array('USER_ID' => $result['USER_ID']));
             }
             $inviteList = array();
             if ($result['TYPE_CONNECT'] == CVoxImplantIncoming::RULE_QUEUE && $config['QUEUE_TYPE'] == CVoxImplantConfig::QUEUE_TYPE_ALL) {
                 $inviteList = $result['USERS'];
             } else {
                 $inviteList[] = array('USER_ID' => $result['USER_ID']);
             }
             foreach ($inviteList 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_CREATE' => $config['CRM_CREATE']), 'CRM' => $crmData));
             }
             $pullResult = true;
         } else {
             $pullResult = false;
         }
         if (!$pullResult) {
             $result['COMMAND'] = CVoxImplantIncoming::RULE_HUNGUP;
         }
     }
     if ($firstUserId > 0) {
         $result['FIRST_USER_ID'] = $firstUserId;
     }
     return $result;
 }
Example #2
0
 public static function Timeout($callId)
 {
     $res = VI\CallTable::getList(array('select' => array('ID', 'CALL_ID', 'USER_ID', 'TRANSFER_USER_ID', 'ACCESS_URL'), 'filter' => array('=CALL_ID' => $callId)));
     $call = $res->fetch();
     if (!$call) {
         return false;
     }
     VI\CallTable::update($call['ID'], array('TRANSFER_USER_ID' => 0));
     self::SendPullEvent(array('COMMAND' => 'timeoutTransfer', 'USER_ID' => $call['TRANSFER_USER_ID'], 'CALL_ID' => $call['CALL_ID']));
     return true;
 }
Example #3
0
 public static function StartCall($userId, $phoneNumber)
 {
     $phoneNormalized = CVoxImplantPhone::Normalize($phoneNumber);
     $userId = intval($userId);
     if ($userId <= 0 || !$phoneNormalized) {
         return false;
     }
     $call = VI\CallTable::add(array('CALL_ID' => 'temp.' . md5($userId . $phoneNumber) . time(), 'USER_ID' => $userId, 'CALLER_ID' => $phoneNormalized, 'STATUS' => VI\CallTable::STATUS_CONNECTING, 'DATE_CREATE' => new FieldType\DateTime()));
     $viHttp = new CVoxImplantHttp();
     $result = $viHttp->StartOutgoingCall($userId, $phoneNumber);
     VI\CallTable::update($call->GetId(), array('CALL_ID' => $result->call_id, 'ACCESS_URL' => $result->access_url, 'DATE_CREATE' => new FieldType\DateTime()));
     self::SendPullEvent(array('COMMAND' => 'outgoing', 'USER_ID' => $userId, 'PHONE_NUMBER' => $phoneNormalized, 'CALL_ID' => $result->call_id, 'CALL_DEVICE' => 'PHONE', 'EXTERNAL' => true));
     return $result ? true : false;
 }