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; }
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; }