OrigemDestinoHoraDuraçãoStatusCanal"; try { GetRamaisOrganizacao(); /* * Botão para desconectar do servidor */ if ($ajax == "desconnect") { $_SESSION['SSMonitorServer'] = null; $_SESSION['SSMonitorVersao'] = null; $_SESSION['SSMonitorUsuario'] = null; $_SESSION['SSMonitorSenha'] = null; responseJSON(array('status' => 'DESCONNECT')); } ___GetVariavel($server, $usuario, $senha, $versao); if (!$_SESSION['SSMonitorServer']) { /* * Atribui o servidor para manter em sessão do usuário */ $select = ___GetServidores(); if ($server && isset($_POST['btConectar'])) { $_SESSION['SSMonitorServer'] = $server; $_SESSION['SSMonitorUsuario'] = $usuario; $_SESSION['SSMonitorSenha'] = $senha; $_SESSION['SSMonitorVersao'] = $versao; } } else { $row = ___GetMonitoramento($ajax, $api); if (!$row) { echo "Não foi possivel conectar ao manager, por favor verifique sua conexão ou informações as de acesso!"; } } $jsJQuery[] = "$('#message b').text('$mensagem');"; } catch (Exception $ex) { $mensagem = $ex->getMessage(); } /* * CHAMADA DO METODO DE ATUALIZAÇÃO REAL TIME */ $jsJQuery[] = 'AtualizaChamdas();'; /* * Variaveis para o template */ $smarty->assign('select', $select); $smarty->assign('server', $_SESSION['SSMonitorServer']); $smarty->assign('mensagem', $mensagem); /* * Chamada do template do monitor. */ GetTemplate($smarty, 'admin/monitorChamadas.tpl'); //************************************************************************** //* FUNÇÕES PARA FORNECER DADOS AO APLICATIVO * //* ***************************************** * //************************************************************************** /* * Função para tratar e montar os dados na grid */ function ___GetMonitoramento($ajax, $api) { global $mensagem; $socket = ConectaAmi($_SESSION['SSMonitorServer'], '', $_SESSION['SSMonitorUsuario'], $_SESSION['SSMonitorSenha']); /* * Verifica a conexão do socket */ if (!$socket) { $_SESSION['SSMonitorServer'] = null; return null; } /* * Desliga chamada no Hangup de acordo com a channel. */ if ($ajax == 'hangup') { $ret = DesligarAmi($socket, $api); $mensagem = $ret == 'ok' ? "Chamada foi encerrada com sucesso! [ " . $api . " ]" : "Não foi possível encerrar a chamada!"; echo $mensagem; exit; } if ($ajax == 'ramais') { header('Content-type: application/json'); responseJSON(___GetRamaisChamadas($socket)); } } /* * Busca todos os servidores cadastrados na tabela de sites, indiferente de * ativo ou inativo; */ function ___GetServidores() { global $dbcon; $query = "SELECT host, descricao, usuario, senha, basedados FROM pbx_sites"; $result = pg_query($dbcon, $query); $resp = pg_fetch_all($result); if (!$resp) { throw new Exception('Nenhum servidor cadastrado!'); } $select = ""; return $select; } function GetRamaisOrganizacao() { global $dbcon; $org_id = GetOrganizacao(); $query = "SELECT nome FROM pbx_ramais WHERE org_id = $org_id;"; $result = pg_query($dbcon, $query); $resp = pg_fetch_all($result); if ($resp) { $_SESSION['SSRamaisMesa'] = []; foreach ($resp as $v) { $_SESSION['SSRamaisMesa'][] = $v['nome']; } } } function SecondsToStrTime($seconds) { $conv_time = convertSecondsToArrayTime($seconds); $conv_time['minutes'] = strlen($conv_time['minutes']) == 1 ? '0' . $conv_time['minutes'] : $conv_time['minutes']; $conv_time['seconds'] = strlen($conv_time['seconds']) == 1 ? '0' . $conv_time['seconds'] : $conv_time['seconds']; return $conv_time['hours'] . ':' . $conv_time['minutes'] . ':' . $conv_time['seconds']; } function convertSecondsToArrayTime($seconds) { $conv_time = array(); $conv_time['days'] = floor($seconds / 86400); $conv_time['hours'] = floor(($seconds - ($conv_time['days'] * 86400)) / 3600); $conv_time['minutes'] = floor(($seconds - (($conv_time['days'] * 86400) + ($conv_time['hours'] * 3600))) / 60); $conv_time['seconds'] = floor(($seconds - (($conv_time['days'] * 86400) + ($conv_time['hours'] * 3600) + ($conv_time['minutes'] * 60)))); return $conv_time; } function ___GetVariavel(&$server, &$usuario, &$senha, &$versao) { if ($server) { $serv = explode("||", $server); $server = $serv[0]; $usuario = $serv[1]; $senha = $serv[2]; $versao = $serv[3]; } } //************************************************************************** //* FUNÇÕES PARA OBTER DADOS DO MANAGER * //* *********************************** * //************************************************************************** function ___GetMonitoramentoChamadas($socket) { /* * Inicialização das váriaveis. */ $versao = $_SESSION['SSMonitorVersao']; /* * Parametros de leitura do manager */ $params = array('action' => 'command', 'command' => 'core show channels concise'); $result = GetAmi($socket, $params); $res = ___GetConcise($result); if ($versao == "1.4") { $chamadas = ___GetChannels($res); } else if ($versao == "13") { $chamadas = ___GetChannels13($res); } return $chamadas; } function ___GetRamaisChamadas($socket) { $ramais = ___GetMonitoramentoRamais($socket); $chamadas = ___GetMonitoramentoChamadas($socket); foreach ($ramais as $k => $rm) { $ramais[$k]['Duration'] = ' '; if (!in_array($rm['ObjectName'], $_SESSION['SSRamaisMesa'])) { unset($ramais[$k]); } foreach ($chamadas as $cm) { if (trim($rm['ObjectName']) == trim($cm[8])) { $ramais[$k]['CallInput'] = $cm[7]; $ramais[$k]['Duration'] = SecondsToStrTime($cm[10]); $ramais[$k]['StatusCall'] = 'E'; $ramais[$k]['CallChannel'] = $cm[0]; } if (trim($rm['ObjectName']) == trim($cm[7])) { $ramais[$k]['CallOutput'] = $cm[8]; $ramais[$k]['Duration'] = SecondsToStrTime($cm[10]); $ramais[$k]['StatusCall'] = 'S'; $ramais[$k]['CallChannel'] = $cm[0]; } } } return $ramais; } function ___GetMonitoramentoRamais($socket) { $rand = rand(000000000, 9999999999); $end = 'PeerlistComplete'; $write = 0; $params = [ 'action' => 'sippeers', 'ActionID' => $rand ]; foreach ($params as $key => $value) { $write = fwrite($socket, "$key: $value\r\n"); if (!$write) { return false; } } fwrite($socket, "ActionID: $rand\r\n\r\n"); if (!$write) { return false; } $result = array(); $x = 0; while (!feof($socket)) { $line = trim(fgets($socket)); if ($line) { $var = explode(": ", $line); $result[$x][$var[0]] = trim($var[1]); } else { $x++; } if (stripos($line, $end) !== false) { break; } } $ar = array_map(function ($z) { if ($z['Event'] == 'PeerEntry') { return $z; } }, $result); return array_filter($ar); } function ___GetConcise($result) { $count = count($result) - 1; unset($result[$count]); for ($a = 0; $a < 3; $a++) { unset($result[$a]); } foreach ($result as $key => $chm) { $result[$key] = explode('!', $chm); } return $result; } function ___GetChannels($chamadas) { $arChamadas = array(); $x = 0; foreach ($chamadas as $chn) { $cham = explode('/', $chn[0]); if ($chn[11] != '(None)') { $ramal = explode('/', $chn[0]); $ramal = explode('-', $ramal[1]); $chann = explode('/', $chn[11]); $chann = explode('@', $chann[1]); $chann = explode('-', $chann[0]); } else { $chann[0] = 'Em Espera'; } if ($cham[0] != 'Local' && $cham[0] != 'Agent') { $arChamadas[$x] = $chn; $arChamadas[$x][8] = $chann[0]; } if ($ramal[0] == $chann[0]) { unset($arChamadas[$x]); } $x++; } foreach ($arChamadas as $key => $val) { foreach ($arChamadas as $rm) { if ($val[0] == $rm[11] || $val[7] == $val[8]) { unset($arChamadas[$key]); } } } return $arChamadas; } function ___GetChannels13($chamadas) { $arChamadas = array(); /* * CLASSIFICA O TIPO DE CHAMADA */ foreach ($chamadas as $key => $chnl) { $arChamadas[$key] = $chnl; if ($chnl[1] != "ext-transferencia") { foreach ($chamadas as $chave => $chn) { if ($chn[12] == $chnl[12] && $chn[0] != $chnl[0] && $chn[5] == "AppDial") { $arChamadas[$key][9] = $chn[7]; unset($arChamadas[$chave]); } } } else if ($chnl[1] == "ext-transferencia") { if ($chnl[2] == $chnl[7]) { unset($arChamadas[$key]); } } } /* * LIMPA OS DADOS QUE ESTÁ FORA DE CONTEXTO COM AS CHAMADAS CORRENTES */ foreach ($arChamadas as $chv => $chamada) { if ($chamada[5] == "AppDial" && empty($chamada[9]) && $chamada[3] > 1) { unset($arChamadas[$chv]); } if ($chamada[5] == "Dial" && empty($chamada[9]) && $chamada[3] < 18) { unset($arChamadas[$chv]); } if ($chamada[1] == "ext-transferencia") { unset($arChamadas[$chv]); } } /* * LIMPA OS DADOS QUE NÃO ESTÃO SENDO UTILIZADOS */ foreach ($arChamadas as $sc => $cham) { foreach ($arChamadas as $ky => $chm) { if ($chm[0] != $cham[0] && $cham[12] == $chm[12] && $chm[5] == "AppDial") { unset($arChamadas[$ky]); } if ($chm[0] != $cham[0] && $cham[7] == $chm[7] && $chm[5] == "AppDial") { unset($arChamadas[$ky]); } if ($chm[0] != $cham[0] && $cham[7] == $chm[7] && $chm[5] == "Dial") { unset($arChamadas[$sc]); } $chamadaChn = explode(';', $chm[0]); $chamadaChn2 = explode(';', $cham[0]); if ($chamadaChn[0] == $chamadaChn2[0] && $cham[5] == "AppQueue") { unset($arChamadas[$sc]); } } } /* * MONTA O ARRAY DE ACORDO COM A GRID NO MONITOR */ foreach ($arChamadas as $map => $app) { if (strpos($app[9], ".") !== false) { $arChamadas[$map][8] = "Em espera"; } else if ($app[9]) { $arChamadas[$map][8] = $app[9]; } else { $arChamadas[$map][8] = "Em espera"; } $arChamadas[$map][10] = $app[11]; } return $arChamadas; } function responseJSON($data) { header('Content-type: application/json'); echo json_encode($data); exit; }