#!/usr/bin/php -q 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; } ?>