Example #1
0
 public static function GetConfigBySearchId($searchId)
 {
     if (strlen($searchId) <= 0) {
         return array('ERROR' => 'Config is`t found for undefined number');
     }
     $orm = VI\ConfigTable::getList(array('filter' => array('=SEARCH_ID' => (string) $searchId)));
     $config = $orm->fetch();
     if (!$config) {
         $result = array('ERROR' => 'Config is`t found for number: ' . $searchId);
     } 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_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']);
     }
     return $result;
 }
Example #2
0
 public static function normalizePhoneNumber($phone)
 {
     $phone = preg_replace('/[^\\d]/', '', $phone);
     $cleanPhone = \NormalizePhone($phone, 6);
     if (strlen($cleanPhone) == 10) {
         $cleanPhone = '7' . $cleanPhone;
     }
     return $cleanPhone;
 }
Example #3
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;
 }
Example #4
0
 public static function PrepareEntityInfoBatch($typeID, $entityID, array &$entityInfos, array $options = null)
 {
     global $DB;
     if (empty($entityInfos)) {
         return;
     }
     $enableNormalization = is_array($options) && isset($options['ENABLE_NORMALIZATION']) && $options['ENABLE_NORMALIZATION'];
     $elementIDs = array_keys($entityInfos);
     $elementSql = implode(',', $elementIDs);
     $sql = "SELECT m1.ELEMENT_ID AS ELEMENT_ID, m1.VALUE AS VALUE, m2.CNT AS CNT FROM b_crm_field_multi m1 INNER JOIN (SELECT MIN(ID) AS MIN_ID, COUNT(*) AS CNT FROM b_crm_field_multi m0 WHERE ENTITY_ID = '{$entityID}' AND ELEMENT_ID IN ({$elementSql}) AND TYPE_ID = '{$typeID}' GROUP BY ENTITY_ID, ELEMENT_ID) m2 ON m1.ID = m2.MIN_ID";
     $err_mess = self::err_mess() . '<br />Function: GetInfoBatch<br>Line: ';
     $dbResult = $DB->Query($sql, false, $err_mess . __LINE__);
     if (is_object($dbResult)) {
         while ($fields = $dbResult->Fetch()) {
             $elementID = (int) $fields['ELEMENT_ID'];
             if (isset($entityInfos[$elementID])) {
                 $value = $fields['VALUE'];
                 if ($enableNormalization && $typeID === 'PHONE') {
                     $value = NormalizePhone($value, 1);
                 }
                 $entityInfos[$elementID][$typeID] = array('FIRST_VALUE' => $value, 'TOTAL' => (int) $fields['CNT']);
             }
         }
     }
 }
 public static function normalizePhone($value)
 {
     if (!is_string($value) || $value === '') {
         return '';
     }
     $result = \NormalizePhone($value, 1);
     if (is_string($result) && $result !== '') {
         return $result;
     }
     // Is not valid phone - just clear value
     $result = preg_replace("/[^0-9\\#\\*]/i", "", $value);
     return is_string($result) ? $result : '';
 }
Example #6
0
 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;
 }