PABX da Simples IP
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

419 lines
13 KiB

<?php
// error_reporting(E_ERROR);
// ini_set('display_errors', 0);
/*
* Limpar o buffer
*/
ob_flush();
/*
* Declaração de váriaveis
*/
$ajax = isset($_GET['ajax']) ? $_GET['ajax'] : '';
$server = isset($_POST['server']) ? $_POST['server'] : '';
$api = isset($_GET['f']) ? $_GET['f'] : '';
$versao = null;
$usuario = null;
$senha = null;
$row = '';
$mensagem = '';
$header = "<tr><th>Origem</th><th>Destino</th><th>Hora</th><th>Duração</th><th>Status</th><th>Canal</th><th></th></tr>";
try {
/*
* 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 "<tr><th style='background:#ff3333'>Não foi possivel conectar ao manager, por favor verifique sua conexão ou informações as de acesso!</th></tr>";
}
}
$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() {
$query = "SELECT host, descricao, usuario, senha, basedados FROM pbx_sites";
$result = pg_query($query);
$resp = pg_fetch_all($result);
if (!$resp) {
throw new Exception('Nenhum servidor cadastrado!');
}
$select = "<select name='server'>";
foreach ($resp as $server) {
$select .= "<option value='{$server['host']}||{$server['usuario']}||{$server['senha']}||{$server['basedados']}'>{$server['host']} - {$server['descricao']}</option>";
}
$select .= "</select>";
return $select;
}
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'] = ' ';
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) {
/*
* Limpando array do AMI.
*/
$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;
}
?>