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.
 
 
 
 
 
 

436 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;
write("GET VARIABLE ORG_ID");
$org_id = substr(strrchr(read(), "("), 1, -1);
/*
* 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);$org_id
$conn = GetConnection(GetDefStrDb());
//$conn = GetConnection($constr);
if ($fila && $uidTransbordo) {
$filaTransbordo = ($opcTransbordo == 'filas') ? GetFilaFromNumero($conn, $acaTransbordo, $org_id) : "$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', $org_id, 'EXITWITHTIMEOUT');
if ($opcTransbordo == 'filas') {
InfoTransbordoReg($conn, $filaTransbordo, $opcTransbordo, $fila, $uidTransbordo, 'E', $org_id, '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, $org_id)) {
foreach ($monitorFila as $fila => $infoFila) {
if (GetChamadasEspera($conn, $fila, $org_id) && RecebeTransbordo($conn, $infoFila['fila_transbordo'], $org_id)) {
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', $org_id);
InfoTransbordoReg($conn, $infoFila['fila_transbordo'], 'filas', $fila, $infoEspera['uniqueid'], 'E', $org_id);
} 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, $org_id, $apl = 'ASSISTIDO') {
$query = sprintf("insert into pbx_eventos_transbordo(fila, trbd_origem_destino_tipo, trbd_origem_destino, uniqueid, trbd_tipo, trbd_aplicacao, org_id) values(%s, %s, %s, %s, %s, %s, %d);", QuotedStr($fila), QuotedStr($tipoDestino), QuotedStr($destino), QuotedStr($uniqueid), QuotedStr($tipo), QuotedStr($apl), $org_id);
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, $org_id) {
$query = "select (strtoint(a.espera) - ( select count(*) from pbx_supervisor_agentes b where b.org_id = $org_id and b.dac = a.dac and b.status = 'LIVRE' and b.disponivel_atendimento = 1 )) as espera and org_id = $org_id
from pbx_supervisor_dacs a
where a.dac = '{$fila}'
and a.org_id = $org_id ";
/*
* 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, $org_id) {
$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 and a.org_id = $org_id
and b.org_id = $org_id";
/*
* 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, $org_id) {
$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' and a.org_id = $org_id and b.org_id = a.org_id";
/*
* 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;
}
?>