forked from SimplesIP/pabx-app
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.
431 lines
14 KiB
431 lines
14 KiB
#!/usr/bin/php -q |
|
<?php |
|
/* * ************************************************************************************ |
|
* |
|
* TRANSBORDO AUTOMATICO |
|
* Autores |
|
* Amarildo Pereira/Alan Pablo |
|
* |
|
* ************************************************************************************* |
|
* Definicoes do Projeto |
|
* Nome: Transbordo Automatico |
|
* Data Incio: 23/02/2012 |
|
* Equipe: Amarildo Pereira, Alan Pablo |
|
* Descrição: |
|
* O objetivo do sistema é monitorar "Dacs" que possuam filas de atendimento |
|
* realizando a transferencia(transbordo) dessas chamadas para outro Dac pre- |
|
* viamente cadastrado. |
|
* Regras: |
|
* O transbordo sera realizado mediante a observacao das seguintes regras: |
|
* 1 -> Dever existir chamadas em fila no Dac monitorado. Chamadas em Fila > 0. |
|
* 2 -> Chamadas em espera for maior que o numero de agentes livres no dac monitorado. |
|
* 3 -> Nao pode exitir fila no Dac de transbordo. Chamadas em Fila no Transbordo = 0. |
|
* 4 -> Pelo menos um agente disponivel no dac de transbordo. Agentes transbordo > 0. |
|
* ************************************************************************************* |
|
* Copyright (c) 2012, Simples IP |
|
* ************************************************************************************ */ |
|
$versao = '1.0.0'; |
|
/* |
|
* Estabelece conexao com os servidores de socket e dados |
|
*/ |
|
|
|
require "util/util.php"; |
|
//trim($dados['nome']), $dados['numero'], $dados['opcao'], $dados['acao'], '${UNIQUEID}') |
|
$fila = isset($argv[1]) ? trim($argv[1]) : null; |
|
$filaNumero = isset($argv[2]) ? trim($argv[2]) : null; |
|
$opcTransbordo = isset($argv[3]) ? trim($argv[3]) : null; |
|
$acaTransbordo = isset($argv[4]) ? trim($argv[4]) : null; |
|
$uidTransbordo = isset($argv[5]) ? trim($argv[5]) : null; |
|
|
|
/* |
|
* Arquivo de log |
|
*/ |
|
$pathLog = "/var/log/asterisk/ast_transbordo.log"; |
|
// |
|
//$constr = "host='192.168.115.2' port='5432' dbname='pbx' user='contacte' password='ctepgSQL'"; |
|
//$conn = GetConnection($constr); |
|
$conn = GetConnection(GetDefStrDb()); |
|
|
|
//$conn = GetConnection($constr); |
|
|
|
if ($fila && $uidTransbordo) { |
|
$filaTransbordo = ($opcTransbordo == 'filas') ? GetFilaFromNumero($conn, $acaTransbordo) : "$acaTransbordo"; |
|
$dataTransbordo = date('Y-m-d H:i:s'); |
|
WriteLog("Transbordo Asterisk Data:{$dataTransbordo} Fila: {$fila}-{$filaNumero} Opcao: {$opcTransbordo} Acao: {$filaTransbordo}-{$acaTransbordo} Uid: {$uidTransbordo}\n", $pathLog); |
|
|
|
InfoTransbordoReg($conn, $fila, $opcTransbordo, $filaTransbordo, $uidTransbordo, 'S', 'EXITWITHTIMEOUT'); |
|
if ($opcTransbordo == 'filas') { |
|
InfoTransbordoReg($conn, $filaTransbordo, $opcTransbordo, $fila, $uidTransbordo, 'E', 'EXITWITHTIMEOUT'); |
|
} |
|
pg_close($conn); |
|
exit; |
|
} |
|
|
|
/* |
|
* Armazena dados das filas retornados pelo socket |
|
*/ |
|
$dadosFilas = array(); |
|
|
|
/* |
|
* Filas a monitorar originadas do banco de dados |
|
*/ |
|
$monitorFila = array(); |
|
|
|
|
|
/* |
|
* Arquivo de log |
|
*/ |
|
$pathLog = "/var/log/asterisk/transbordo.log"; |
|
|
|
|
|
$socket = ConectaManager(GetSckConnect()); |
|
//$socket = ConectaManager(array('192.168.115.2', '5038', 'manager', 'manager007')); |
|
|
|
|
|
/* |
|
* Valor: |
|
* 0 - grava apenas mensagens de erro |
|
* 1 - grava todas as mensagens |
|
* 2 - grava todas as mensagens e imprime para saida padrao |
|
*/ |
|
$gravaLog = 2; |
|
|
|
define("MAX_TENTATIVA_RETORNO", 50); |
|
|
|
|
|
|
|
try { |
|
if (!($socket && $conn)) { |
|
GeraExcept('Teste de conexao com os servidores', "Conexao aos servidores realizada com sucesso!"); |
|
} |
|
|
|
/* |
|
* Lista as filas com transbordo configurado. |
|
*/ |
|
if ($monitorFila = GetFilasMonitorar($conn)) { |
|
foreach ($monitorFila as $fila => $infoFila) { |
|
if (GetChamadasEspera($conn, $fila) && RecebeTransbordo($conn, $infoFila['fila_transbordo'])) { |
|
if (!empty($infoEsperas = GetInfoEspera($socket, $fila))) { |
|
foreach ($infoEsperas as $infoEspera) { |
|
try { |
|
if (!Transbordo($socket, $fila, $infoFila['fila_transbordo'], $infoEspera['channel'], $infoFila['numero_transbordo'])) { |
|
GeraExcept(sprintf("Não foi possivel transbordar a chamada Fila: %s Fila Transbordo: %s Channel: %s Numero: %s\n", $fila, $infoFila['fila_transbordo'], $infoEspera['channel'], $infoFila['numero_transbordo'])); |
|
} |
|
$dataTransbordo = date('Y-m-d H:i:s'); |
|
WriteLog("Transbordo Assitido Data:{$dataTransbordo} Fila: {$fila} Destino: {$infoFila['fila_transbordo']} Numero: {$infoFila['calleridnum']} Uid: {$infoEspera['uniqueid']}\n", $pathLog); |
|
InfoTransbordoReg($conn, $fila, 'filas', $infoFila['fila_transbordo'], $infoEspera['uniqueid'], 'S'); |
|
InfoTransbordoReg($conn, $infoFila['fila_transbordo'], 'filas', $fila, $infoEspera['uniqueid'], 'E'); |
|
} catch (Exception $ex) { |
|
WriteLog($ex->getMessage(), $pathLog); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
pg_close($conn); |
|
fclose($socket); |
|
} catch (Exception $ex) { |
|
|
|
WriteLog($ex->getMessage(), $pathLog); |
|
} |
|
|
|
function InfoTransbordoReg($conn, $fila, $tipoDestino, $destino, $uniqueid, $tipo, $apl = 'ASSISTIDO') { |
|
|
|
$query = sprintf("insert into pbx_eventos_transbordo(fila, trbd_origem_destino_tipo, trbd_origem_destino, uniqueid, trbd_tipo, trbd_aplicacao) values(%s, %s, %s, %s, %s, %s);", QuotedStr($fila), QuotedStr($tipoDestino), QuotedStr($destino), QuotedStr($uniqueid), QuotedStr($tipo), QuotedStr($apl)); |
|
if (!pg_query($conn, $query)) { |
|
$erro = GetLasterror(); |
|
WriteLog("{$fila};{$tipoDestino};{$destino};{$uniqueid};{$tipo};{$apl},[{$erro}]\n", "/var/log/asterisk/transbordo.csv"); |
|
} |
|
|
|
/* insert into pbx_eventos_transbordo(fila, trbd_destino_tipo, trbd_destino, uniqueid, trbd_tipo) values(%s, %s, %s, %s, %s); |
|
Event: QueueEntry |
|
Queue: DEVEL |
|
Position: 1 |
|
Channel: SIP/4016-00000032 |
|
Uniqueid: 1569662762.461 |
|
CallerIDNum: 4016 |
|
CallerIDName: 4016 |
|
ConnectedLineNum: unknown |
|
ConnectedLineName: unknown |
|
Wait: 41 |
|
Priority: 0 |
|
ActionID: 56dd6666374747 |
|
* |
|
*/ |
|
} |
|
|
|
function GetChamadasEspera($conn, $fila) { |
|
$query = "select (strtoint(a.espera) - ( select count(*) from pbx_supervisor_agentes b where b.dac = a.dac and b.status = 'LIVRE' and b.disponivel_atendimento = 1 )) as espera |
|
from pbx_supervisor_dacs a |
|
where a.dac = '{$fila}'; "; |
|
|
|
/* |
|
* Recupera as filas a monitoras |
|
*/ |
|
if (!$result = pg_query($conn, $query)) { |
|
RaiseExcept("Não foi possivel consultar as chamadas em espera para a fila: {$fila}!", true); |
|
} |
|
|
|
return pg_fetch_row($result)[0]; |
|
} |
|
|
|
function RecebeTransbordo($conn, $fila) { |
|
|
|
$query = "select count(*) as livre |
|
from pbx_supervisor_dacs a, pbx_supervisor_agentes b |
|
where b.dac = a.dac |
|
and a.dac = '{$fila}' |
|
and b.status = 'LIVRE' |
|
and strtoint(a.espera) = 0 "; |
|
|
|
/* |
|
* Recupera as filas a monitoras |
|
*/ |
|
if (!$result = pg_query($conn, $query)) { |
|
RaiseExcept("Não foi possivel consultar as chamadas em espera para a fila: {$fila}!", true); |
|
} |
|
|
|
return pg_fetch_row($result)[0]; |
|
} |
|
|
|
function GetInfoEspera($socket, $fila) { |
|
$actionid = rand(000000000, 9999999999); |
|
fwrite($socket, "action: queuestatus\r\n"); |
|
fwrite($socket, "ActionID: " . $actionid . "\r\n\r\n"); |
|
$start = 0; |
|
$filas = array(); |
|
$params = array(); |
|
$dadosFila = array(); |
|
$filaMonitorada = ''; |
|
while (!feof($socket)) { |
|
$buffer = trim(fgets($socket)); |
|
|
|
|
|
if ($start && !$buffer) { |
|
$start = 0; |
|
$dadosFila[] = $params; |
|
$params = array(); |
|
} |
|
|
|
|
|
/* |
|
* Obtem os valores retornados |
|
*/ |
|
if ($start && $buffer) { |
|
list($param, $value) = explode(":", $buffer); |
|
$params[strtolower(trim($param))] = trim($value); |
|
} |
|
|
|
|
|
/* |
|
* Inicio da leitura dos dados |
|
*/ |
|
if (stripos($buffer, "QueueEntry") !== false) { |
|
$start++; |
|
$params = array(); |
|
} |
|
|
|
/* |
|
* Verifica se a requisição chegou ao final |
|
*/ |
|
if (stripos($buffer, "QueueStatusComplete") !== false) { |
|
break; |
|
} |
|
|
|
/* |
|
* Garante que o socket não vai procurar para sempre |
|
*/ |
|
if ($buffer === false) { |
|
break; |
|
} |
|
} |
|
|
|
if (empty($dadosFila)) { |
|
return false; |
|
} |
|
|
|
foreach ($dadosFila as $infoFila) { |
|
if (array_search($fila, $infoFila) !== false) { |
|
$infoFilas[] = $infoFila; |
|
} |
|
} |
|
|
|
return !empty($infoFilas) ? $infoFilas : false; |
|
} |
|
|
|
function DadosFila($socket) { |
|
$actionid = rand(000000000, 9999999999); |
|
fwrite($socket, "action: queuestatus\r\n"); |
|
fwrite($socket, "ActionID: " . $actionid . "\r\n\r\n"); |
|
$start = false; |
|
$filas = array(); |
|
$params = array(); |
|
$dados = array(); |
|
|
|
while (!feof($socket)) { |
|
$buffer = fgets($socket); |
|
/* |
|
* Obtem os valores retornados |
|
*/ |
|
if ($start && (trim($buffer) != '')) { |
|
list($param, $value) = explode(":", $buffer); |
|
$params[trim($param)] = trim($value); |
|
} |
|
|
|
if ($start && (trim($buffer) == '') && count($params)) { |
|
$dados[] = $params; |
|
$params = array(); |
|
} |
|
/* |
|
* Inicio da leitura dos dados |
|
*/ |
|
if (stristr($buffer, "Queue status will follow")) { |
|
$start = true; |
|
} |
|
|
|
/* |
|
* Verifica se a requisição chegou ao final |
|
*/ |
|
if (stristr($buffer, "QueueStatusComplete")) { |
|
break; |
|
} |
|
|
|
/* |
|
* Garante que o socket não vai procurar para sempre |
|
*/ |
|
if ($buffer === false) { |
|
break; |
|
} |
|
} |
|
|
|
return count($dados) ? $dados : false; |
|
} |
|
|
|
function GetConnection($conStr) { |
|
if (!$ret = pg_connect($conStr)) { |
|
RaiseExcept("Func.: GetConnection, Erro ao executar conexao no banco", true); |
|
} |
|
return $ret; |
|
} |
|
|
|
function GetFilasMonitorar($conn) { |
|
$dadosFila = array(); |
|
/* |
|
* Query para recuperar as filas para transbordo, cadastradas no db |
|
*/ |
|
$query = "select a.id, a.nome as nome_fila, a.id_transbordo, b.nome as fila_transbordo, b.numero as numero_transbordo |
|
from pbx_queues_grupos a, pbx_queues_grupos b |
|
where b.id = a.id_transbordo |
|
and a.id_transbordo > 0 and a.status = 'A' and b.status = 'A'"; |
|
|
|
/* |
|
* Recupera as filas a monitoras |
|
*/ |
|
$result = pg_query($conn, $query); |
|
|
|
if (!$result) { |
|
RaiseExcept("Func.: GetFilasMonitorar , Recupera as filas que tem transbordo cofigurado", true); |
|
} |
|
|
|
if (!pg_num_rows($result)) { |
|
return array(); |
|
} |
|
|
|
while ($row = pg_fetch_array($result)) { |
|
$dadosFila[$row["nome_fila"]] = $row; |
|
} |
|
|
|
return $dadosFila; |
|
} |
|
|
|
function GetChamadasFila($arFilas, $fila) { |
|
foreach ($arFilas as $infoFila) { |
|
if (($infoFila["Queue"] == $fila) && ($infoFila["Event"] == 'QueueParams')) { |
|
return trim($infoFila['Calls']); |
|
} |
|
} |
|
} |
|
|
|
function GetAgentesLivre($arFilas, $fila) { |
|
$arAgt = array(); |
|
|
|
foreach ($arFilas as $infoFila) { |
|
if (($infoFila["Queue"] == $fila) && ($infoFila["Event"] == 'QueueMember') && ($infoFila["Status"] == '1') && ($infoFila["Paused"] == '0')) { |
|
$arAgt[$infoFila["Name"]] = $infoFila["Location"]; |
|
} |
|
} |
|
return $arAgt; |
|
} |
|
|
|
function Transbordo($socket, $filaMonitorada, $filaTransbordo, $channelTransf, $numeroFila) { |
|
if (!$ret = SetFila($socket, $filaMonitorada, $filaTransbordo, $channelTransf)) { |
|
GeraExcept('Transbordo', "Func.: Transbordo Falha na chamada a funcao SetFila Fila Monitorada: $filaMonitorada FilaTransbordo: $filaTransbordo Canal: $channelTransf Dac: $numeroFila"); |
|
} |
|
|
|
$actionid = rand(000000000, 9999999999); |
|
fwrite($socket, "action: redirect\r\n"); |
|
fwrite($socket, "Channel: $channelTransf\r\n"); |
|
fwrite($socket, "Context: ext-transbordo\r\n"); |
|
fwrite($socket, "Exten: $numeroFila\r\n"); |
|
fwrite($socket, "Priority: 1\r\n"); |
|
fwrite($socket, "ActionID: " . $actionid . "\r\n\r\n"); |
|
return VerificaRetornoSocket($socket, "Success", "Error"); |
|
} |
|
|
|
function VerificaRetornoSocket($socket, $sucess, $erro) { |
|
$i = 0; |
|
while (!feof($socket)) { |
|
$bufer = fgets($socket); |
|
|
|
if (stristr($bufer, $sucess)) { |
|
return true; |
|
} else if (stristr($bufer, $erro)) { |
|
return false; |
|
} |
|
|
|
if ($bufer === false) |
|
break; |
|
|
|
if ($i++ > MAX_TENTATIVA_RETORNO) |
|
break; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
function SetFila($socket, $fila, $filaTransbordo, $channelTransf) { |
|
$actionid = rand(000000000, 9999999999); |
|
fwrite($socket, "action: SetVar\r\n"); |
|
fwrite($socket, "Channel: $channelTransf\r\n"); |
|
fwrite($socket, "variable: FILA1\r\n"); |
|
fwrite($socket, "value: $fila\r\n"); |
|
fwrite($socket, "ActionID: " . $actionid . "\r\n\r\n"); |
|
|
|
$ret = VerificaRetornoSocket($socket, "Success", "Error"); |
|
if (!$ret) |
|
return $ret; |
|
|
|
$actionid = rand(000000000, 9999999999); |
|
fwrite($socket, "action: SetVar\r\n"); |
|
fwrite($socket, "Channel: $channelTransf\r\n"); |
|
fwrite($socket, "variable: FILA2\r\n"); |
|
fwrite($socket, "value: $filaTransbordo\r\n"); |
|
fwrite($socket, "ActionID: " . $actionid . "\r\n\r\n"); |
|
|
|
$ret = VerificaRetornoSocket($socket, "Success", "Error"); |
|
if (!$ret) |
|
return $ret; |
|
|
|
$actionid = rand(000000000, 9999999999); |
|
fwrite($socket, "action: SetVar\r\n"); |
|
fwrite($socket, "Channel: $channelTransf\r\n"); |
|
fwrite($socket, "variable: ANUNCIO\r\n"); |
|
fwrite($socket, "value: customizados/transbordo\r\n"); |
|
fwrite($socket, "ActionID: " . $actionid . "\r\n\r\n"); |
|
|
|
$ret = VerificaRetornoSocket($socket, "Success", "Error"); |
|
|
|
return $ret; |
|
} |
|
?>
|
|
|