|
|
|
|
#!/usr/bin/php -Cq
|
|
|
|
|
<?php
|
|
|
|
|
/* * ***************************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* RETORNO AUTOM<EFBFBD>TICO PARA CHAMADAS ABANDONADAS
|
|
|
|
|
* Autor
|
|
|
|
|
* Amarildo Pereira
|
|
|
|
|
*
|
|
|
|
|
* ***************************************************************************************
|
|
|
|
|
* Defini<EFBFBD><EFBFBD>es do Projeto
|
|
|
|
|
* Nome: Retorno de Abandonada
|
|
|
|
|
* Data in<EFBFBD>cio: 02/08/2018
|
|
|
|
|
* Equipe: Amarildo Pereira
|
|
|
|
|
* Descri<EFBFBD><EFBFBD>o:
|
|
|
|
|
* O objetivo do script <EFBFBD> processar e retornar chamadas que foram abandonadas na fila
|
|
|
|
|
* de atendimento de maneira autom<EFBFBD>tica, as mesmas s<EFBFBD>o gravadas pela central telef<EFBFBD>nica
|
|
|
|
|
* quando ocorre o abandono nas tabelas: pbx_abandonadas_semretorno e
|
|
|
|
|
* pbx_abandonadas_status, a primeira traz informa<EFBFBD><EFBFBD>es sobre a chamada e a opera<EFBFBD><EFBFBD>o
|
|
|
|
|
* no momento do abandono e a segunda informa<EFBFBD><EFBFBD>es detalhadas sobre cada agente logado. O
|
|
|
|
|
* processamento das chamadas ser<EFBFBD> realizada sob as seguintes regras:
|
|
|
|
|
* 1 - A op<EFBFBD><EFBFBD>o retornar abandonadas deve estar marcada como sim na fila de atendimento.
|
|
|
|
|
* 2 - O campo "abdsr_data_hora_retorno" da tabela "pbx_abandonadas_semretorno" deve
|
|
|
|
|
* ser null
|
|
|
|
|
* 3 - O campo "abdsr_callback" da tabela "pbx_abandonadas_semretorno" deve estar com
|
|
|
|
|
* valor 0(zero) quando uma tentativa de retorno <EFBFBD> feito esta campo <EFBFBD> atualizado para 1
|
|
|
|
|
* mesmo que esta chamada n<EFBFBD>o tenha sido completada com sucesso.
|
|
|
|
|
* 4 - O n<EFBFBD>mero de chamadas na espera deve ser 0.
|
|
|
|
|
* 5 - A op<EFBFBD><EFBFBD>o dispon<EFBFBD>vel para discador deve estar desmarcada no agente.
|
|
|
|
|
* 6 - A op<EFBFBD><EFBFBD>o ind<EFBFBD>sponivel para fila deve estar desmarcada no agente.
|
|
|
|
|
* 7 - O status dos agentes devem estar como "LIVRE".
|
|
|
|
|
* 8 - Ser<EFBFBD>o processadas chamadas com refer<EFBFBD>ncia na configura<EFBFBD><EFBFBD>o do sistema
|
|
|
|
|
* "Abandonadas Sem Retorno" onde <EFBFBD> indicado o n<EFBFBD>mero de dias que o processamento
|
|
|
|
|
* ser<EFBFBD> feito, se indicado 0(zero) por exemplo ser<EFBFBD>o processadas chamadas apenas do
|
|
|
|
|
* dia atual, se 1(um) for indicado ser<EFBFBD>o processadas chamadas d-1 e assim sucessiva-
|
|
|
|
|
* mente.
|
|
|
|
|
* **************************************************************************************
|
|
|
|
|
* Copyright (c) 2018, Simples IP
|
|
|
|
|
* ************************************************************************************* */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Habilita debug para linha de comanado.
|
|
|
|
|
*/
|
|
|
|
|
$debugLocal = 1;
|
|
|
|
|
$serverDebug = "127.0.0.1";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
error_reporting($debugLocal ? E_ALL : E_ERROR);
|
|
|
|
|
ini_set('display_errors', $debugLocal);
|
|
|
|
|
require("util/constantes.php");
|
|
|
|
|
include 'util/util.php';
|
|
|
|
|
include 'funcoes/shared.php';
|
|
|
|
|
include("util/funcoesAmi.php");
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Define o numero de tentativas que o servi<EFBFBD>o ira tentar retornar a liga<EFBFBD><EFBFBD>o em
|
|
|
|
|
* caso de falha na discagem.
|
|
|
|
|
*/
|
|
|
|
|
define("RTABD_TENTATIVAS_RETORNO", 3);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Para o loop do servi<EFBFBD>o para um teste local.
|
|
|
|
|
*/
|
|
|
|
|
define("MAX_CLICLO_DEBUG", 3);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Tempo entre uma tentativa de retorno e outra
|
|
|
|
|
*/
|
|
|
|
|
define("RTABD_TEMPO_RETORNO", 180);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Ativa Debug.
|
|
|
|
|
*/
|
|
|
|
|
$debugAmi = 1;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Habilita o lancamento de erros nas funcoes ami.
|
|
|
|
|
*/
|
|
|
|
|
$errorMode = true;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Para rodar como um processo normal <EFBFBD> preciso passar "N" como primeiro parametro.
|
|
|
|
|
*/
|
|
|
|
|
$notDaemon = true; //isset($argv[1]) && ( strtoupper($argv[1]) === 'N');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Mostra o help quando passodo --help no primeiro argumento.
|
|
|
|
|
*/
|
|
|
|
|
GetRadHelp();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Inicializa o daemom quando N n<EFBFBD>o for informado.
|
|
|
|
|
*/
|
|
|
|
|
if (!$debugLocal) {
|
|
|
|
|
GetDaemon($notDaemon);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Caminho para o arquivo de log do script.
|
|
|
|
|
*/
|
|
|
|
|
$pathLog = sprintf('/var/log/asterisk/rad.log', date("Y-m-d"));
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Configura<EFBFBD><EFBFBD>o do banco de dados. Deixe a vari<EFBFBD>vel $str em branco para pegar o valor padrao
|
|
|
|
|
*/
|
|
|
|
|
if ($debugLocal) {
|
|
|
|
|
$str = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", $serverDebug, "5432", "pbx", "contacte", "ctepgSQL");
|
|
|
|
|
} else {
|
|
|
|
|
$str = EchoLog([GetDefStrDb()]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Realiza a conexao ao banco de daodos.
|
|
|
|
|
*/
|
|
|
|
|
$conn = pg_connect($str);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Realiza a conex<EFBFBD>o com o manager do asterisk.
|
|
|
|
|
*/
|
|
|
|
|
list($host, $porta, $usuario, $senha) = EchoLog([(!$debugLocal ? GetSckConnect() : array($serverDebug, "5038", "manager", "manager007"))]);
|
|
|
|
|
$socket = ConectaAmi($host, $porta, $usuario, $senha);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Tempo em segundos que a aplica<EFBFBD><EFBFBD>o espera para iniciar outro ciclo, buscando
|
|
|
|
|
* chamadas abandonadas sem retorno.
|
|
|
|
|
*/
|
|
|
|
|
$wait = !$debugLocal ? 10 : 1;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Ddd padrao da localidade;
|
|
|
|
|
*/
|
|
|
|
|
$dddPadrao = '';
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Marca o inicio da execucao do script.
|
|
|
|
|
*/
|
|
|
|
|
GravaLog(sprintf("Inicia Execucao: %s\n", date('Y-m-d H:i:s')), $pathLog);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
declare(ticks = 1);
|
|
|
|
|
$statusSignal = 0;
|
|
|
|
|
if (!$debugLocal) {
|
|
|
|
|
pcntl_signal(SIGTERM, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGHUP, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGUSR1, "sig_handler");
|
|
|
|
|
pcntl_signal(SIGINT, "sig_handler");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Checa se a conex<EFBFBD>o com o banco de dados esta ok.
|
|
|
|
|
*/
|
|
|
|
|
if (!$conn) {
|
|
|
|
|
if (!$conn = pg_connect($str)) {
|
|
|
|
|
RaiseExcept("N<EFBFBD>o foi poss<EFBFBD>vel conectar ao banco de dados!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Checa a conex<EFBFBD>o com o manager esta ok.
|
|
|
|
|
*/
|
|
|
|
|
if (!$socket) {
|
|
|
|
|
if (!$socket = ConectaAmi($host, $porta, $usuario, $senha)) {
|
|
|
|
|
RaiseExcept("N<EFBFBD>o foi poss<EFBFBD>vel conectar ao manager!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!$dddPadrao) {
|
|
|
|
|
$dddPadrao = GetDddPadrao();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica o numero de agentes livres.
|
|
|
|
|
*/
|
|
|
|
|
$agentesLivres = __GetAgentesLivresRad();
|
|
|
|
|
if ($agentesLivres) {
|
|
|
|
|
/*
|
|
|
|
|
* Quantidade de dias que a em que ser<EFBFBD> tratada as abandonadas.
|
|
|
|
|
*/
|
|
|
|
|
$diasAbandon = GetDiasAbandonada();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Lista as chamadas abandonadas.
|
|
|
|
|
*/
|
|
|
|
|
$result = pg_query(__GetQueryRad($agentesLivres, $diasAbandon));
|
|
|
|
|
while ($dadosRetorno = pg_fetch_array($result, null, PGSQL_ASSOC)) {
|
|
|
|
|
/*
|
|
|
|
|
* Pega valores necessarios para discagem.
|
|
|
|
|
*/
|
|
|
|
|
list($channelAgente, $matricula, $numDisc, $ramal, $uid, $fila, $horaAbd, $tentativa) = array_values($dadosRetorno);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Log do que esta sendo discado.
|
|
|
|
|
*/
|
|
|
|
|
GravaLog(sprintf("Dados da Discagem: [Uid: %s Dac: %s Num: %s Mat: %s Hora: %s] %s\n", $uid, $fila, $numDisc, $matricula, $horaAbd, date('Y-m-d H:i:s')), $pathLog);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Realiza a discagem.
|
|
|
|
|
*/
|
|
|
|
|
if (DiscarCallAmi($socket, $channelAgente, $matricula, RemoveDddPadrao($numDisc, $dddPadrao), $ramal) == "ok") {
|
|
|
|
|
/*
|
|
|
|
|
* Marca a chamada com retornada pelo callback.
|
|
|
|
|
*/
|
|
|
|
|
$query = sprintf("update pbx_abandonadas_semretorno set abdsr_callback = (coalesce(abdsr_callback,0) + 1), abdsr_callback_data = now() where abdsr_uniqueid = '%s'", $uid);
|
|
|
|
|
if (!pg_query($query)) {
|
|
|
|
|
/*
|
|
|
|
|
* Se a chamada nao for realizada registra o erro e segue com os demais numeros.
|
|
|
|
|
*/
|
|
|
|
|
GravaLog(sprintf("Erro: %s File: %s Line: %s \ncmd: %s\n", GetLasterror(), 'rad.php', '91', $query), $pathLog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Sincroniza informacoes com o agente.
|
|
|
|
|
*/
|
|
|
|
|
SincronizaAgente($matricula, $numDisc, $horaAbd, ++$tentativa);
|
|
|
|
|
} else {
|
|
|
|
|
RaiseExcept("N<EFBFBD>o foi poss<EFBFBD>vel realizar a discagem!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
/*
|
|
|
|
|
* Grava erros gerados durante a execucao.
|
|
|
|
|
*/
|
|
|
|
|
GravaLog(sprintf("Erro:%s File: %s Line: %s \ncmd: %s\n %s\n", $ex->getMessage(), $ex->getFile(), $ex->getLine(), $query, date('Y-m-d H:i:s')), $pathLog);
|
|
|
|
|
@pg_close();
|
|
|
|
|
$conn = false;
|
|
|
|
|
socket_close($socket);
|
|
|
|
|
$socket = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se o processo deve ser encerrado
|
|
|
|
|
*/
|
|
|
|
|
if (sig_status()) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if ($debugLocal) {
|
|
|
|
|
if (++$debugLocal == MAX_CLICLO_DEBUG) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
sleep($wait);
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* Marca o fim da execucao do script.
|
|
|
|
|
*/
|
|
|
|
|
GravaLog(sprintf("Finaliza Execucao: %s\n\n", date('Y-m-d H:i:s')), $pathLog);
|
|
|
|
|
|
|
|
|
|
function __GetAgentesLivresRad() {
|
|
|
|
|
$query = "select count(*)
|
|
|
|
|
from pbx_supervisor_agentes b, pbx_supervisor_dacs c, pbx_queues_grupos d
|
|
|
|
|
where c.dac = b.dac
|
|
|
|
|
and d.nome = c.dac
|
|
|
|
|
and b.status = 'LIVRE'
|
|
|
|
|
and b.status_discador = 0
|
|
|
|
|
and b.disponivel_atendimento = 1
|
|
|
|
|
and strtoint(c.espera) = 0
|
|
|
|
|
and d.retornar_abandonadas = 1";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!$result = pg_query($query)) {
|
|
|
|
|
RaiseExcept("N<EFBFBD>o foi poss<EFBFBD>vel consultar agentes livres!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!pg_num_rows($result)) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$rows = pg_fetch_row($result);
|
|
|
|
|
return $rows[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function __GetQueryRad($agentesLivres, $diasAbandon) {
|
|
|
|
|
|
|
|
|
|
$tentativasRetorno = RTABD_TENTATIVAS_RETORNO;
|
|
|
|
|
$tempoRetorno = RTABD_TEMPO_RETORNO;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return " select case when(upper(b.modo_atendimento) = 'MANUAL')then
|
|
|
|
|
case when( upper(e.tipo_ramal) = 'KHOMP')then
|
|
|
|
|
upper(e.tipo_ramal) || '/r' || e.nome
|
|
|
|
|
else
|
|
|
|
|
e.dispositivo end
|
|
|
|
|
else
|
|
|
|
|
'Local/' || b.ramal || '@app-callcenter/n' end as canal_agente,
|
|
|
|
|
b.matricula,
|
|
|
|
|
abdsr_numero,
|
|
|
|
|
b.ramal,
|
|
|
|
|
abdsr_uniqueid,
|
|
|
|
|
abdsr_fila,
|
|
|
|
|
abdsr_data_hora_inicio,
|
|
|
|
|
a.abdsr_callback
|
|
|
|
|
from pbx_abandonadas_semretorno a, pbx_supervisor_agentes b, pbx_supervisor_dacs c, pbx_queues_grupos d, pbx_ramais e
|
|
|
|
|
where b.dac = a.abdsr_fila
|
|
|
|
|
and c.dac = b.dac
|
|
|
|
|
and d.nome = c.dac
|
|
|
|
|
and e.nome = b.ramal
|
|
|
|
|
and a.abdsr_data_hora_retorno is null
|
|
|
|
|
and length(a.abdsr_numero) >= 8
|
|
|
|
|
and ((a.abdsr_callback < $tentativasRetorno) and (extract(epoch from (now() - coalesce(abdsr_callback_data, now())))::int > $tempoRetorno) or (a.abdsr_callback = 0))
|
|
|
|
|
and b.status = 'LIVRE'
|
|
|
|
|
and b.status_discador = 0
|
|
|
|
|
and b.disponivel_atendimento = 1
|
|
|
|
|
and strtoint(c.espera) = 0
|
|
|
|
|
and d.retornar_abandonadas = 1
|
|
|
|
|
and a.abdsr_data >= (now()::date - $diasAbandon)
|
|
|
|
|
order by a.abdsr_data_hora_inicio desc limit $agentesLivres";
|
|
|
|
|
|
|
|
|
|
// and ((a.abdsr_callback <= $tentativasRetorno) and (extract(epoch from (now() - coalesce(abdsr_callback_data, now())))::int > $tempoRetorno) or (a.abdsr_callback = 0))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function SincronizaAgente($matricula, $numero, $dataAbd, $tentativa) {
|
|
|
|
|
global $pathLog;
|
|
|
|
|
|
|
|
|
|
$dataAbd = str_replace(':', '.', FormataDBDataHora($dataAbd));
|
|
|
|
|
$contId = sprintf("%s|%s|%s%s", 0, $numero, 0, "|Retorno ABD:$numero|Data:$dataAbd|Tentativa:$tentativa");
|
|
|
|
|
$query = sprintf("update pbx_supervisor_agentes set cont_identificador = %s where matricula = '%s'", QuotedStr($contId), $matricula);
|
|
|
|
|
if (!pg_query($query)) {
|
|
|
|
|
/*
|
|
|
|
|
* Registra chamada.
|
|
|
|
|
*/
|
|
|
|
|
GravaLog(sprintf("Erro: %s File: %s Line: %s \ncmd: %s\n", GetLasterror(), 'rad.php', '193', $query), $pathLog);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetDaemon($notDaemon) {
|
|
|
|
|
/*
|
|
|
|
|
* Se o script n<EFBFBD>o for chamado com daemon sai sem executar nada.
|
|
|
|
|
*/
|
|
|
|
|
if ($notDaemon) {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$pid = pcntl_fork();
|
|
|
|
|
if ($pid) {
|
|
|
|
|
exit(0); //success
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// posix_setsid();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetRadHelp() {
|
|
|
|
|
global $argc, $argv;
|
|
|
|
|
|
|
|
|
|
$arg = isset($argv[1]) ? $argv[1] : '';
|
|
|
|
|
|
|
|
|
|
if ($argc && ((stripos($arg, '--h') !== false) || (stripos($arg, '-h') !== false) || (stripos($arg, '/h') !== false))) {
|
|
|
|
|
return displayUsage();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function displayUsage() {
|
|
|
|
|
echo "--------------------------------------------------------------------------------------------------------\n";
|
|
|
|
|
echo "- Servico de sincronizacao de dados para retorno de abandonadas -\n";
|
|
|
|
|
echo "--------------------------------------------------------------------------------------------------------\n";
|
|
|
|
|
echo "- Para rodar como um processo normal passe \"N\" como primeiro argumento:\"./retornoAbandonada.php N\"!-\n";
|
|
|
|
|
echo "- Para rodar como Daemon nao passe nenhum argumemento argumento:\"./retornoAbandonada.php \"! -\n";
|
|
|
|
|
echo "--------------------------------------------------------------------------------------------------------\n";
|
|
|
|
|
echo "\n";
|
|
|
|
|
exit(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sig_handler($signo) {
|
|
|
|
|
global $statusSignal;
|
|
|
|
|
//echo "\n This signal is called. [$signo] \n";
|
|
|
|
|
$statusSignal = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sig_status() {
|
|
|
|
|
global $statusSignal;
|
|
|
|
|
pcntl_signal_dispatch();
|
|
|
|
|
return $statusSignal;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function __GetAgenteDiscagem($dados) {
|
|
|
|
|
$dadosDiscagem = array();
|
|
|
|
|
/*
|
|
|
|
|
* pega sempre o agente que recebeu uma chamda a mais tempo.
|
|
|
|
|
*/
|
|
|
|
|
$query = "select distinct case when(upper(b.modo_atendimento) = 'MANUAL')then
|
|
|
|
|
case when( upper(e.tipo_ramal) = 'KHOMP')then
|
|
|
|
|
upper(e.tipo_ramal) || '/r' || e.nome
|
|
|
|
|
else
|
|
|
|
|
e.dispositivo end
|
|
|
|
|
else
|
|
|
|
|
'Agent/' || b.matricula end as canal_agente,
|
|
|
|
|
b.matricula, b.ramal, b.duracao
|
|
|
|
|
from pbx_abandonadas_semretorno a, pbx_supervisor_agentes b, pbx_supervisor_dacs c, pbx_queues_grupos d, pbx_ramais e
|
|
|
|
|
where b.dac = a.abdsr_fila
|
|
|
|
|
and c.dac = b.dac
|
|
|
|
|
and d.nome = c.dac
|
|
|
|
|
and e.nome = b.ramal
|
|
|
|
|
and a.abdsr_data_hora_retorno is null
|
|
|
|
|
and a.abdsr_callback = 0
|
|
|
|
|
and b.status = 'LIVRE'
|
|
|
|
|
and b.status_discador = 0
|
|
|
|
|
and b.disponivel_atendimento = 1
|
|
|
|
|
and strtoint(c.espera) = 0
|
|
|
|
|
and d.retornar_abandonadas = 1
|
|
|
|
|
and a.abdsr_data >= (now()::date - 1)
|
|
|
|
|
order by b.duracao desc limit 1";
|
|
|
|
|
|
|
|
|
|
$result = pg_query($query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
GeraExcept("Erro ao consultar \"Agente Livre\"!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pg_num_rows($result)) {
|
|
|
|
|
$row = pg_fetch_array($result, null, PGSQL_ASSOC);
|
|
|
|
|
$dadosDiscagem[] = $row['canal_agente'];
|
|
|
|
|
$dadosDiscagem[] = $row['matricula'];
|
|
|
|
|
$dadosDiscagem[] = $dados['abdsr_numero'];
|
|
|
|
|
$dadosDiscagem[] = $row['ramal'];
|
|
|
|
|
$dadosDiscagem[] = $dados['abdsr_uniqueid'];
|
|
|
|
|
$dadosDiscagem[] = $dados['abdsr_fila'];
|
|
|
|
|
$dadosDiscagem[] = $dados['abdsr_data_hora_inicio'];
|
|
|
|
|
return $dadosDiscagem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $dadosDiscagem;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* __GetQueryRad ---> abdsr_numero, abdsr_uniqueid, abdsr_fila, abdsr_data_hora_inicio
|
|
|
|
|
$result = pg_query(__GetQueryRad($agentesLivres, $diasAbandon));
|
|
|
|
|
while ($rows = pg_fetch_array($result, null, PGSQL_ASSOC)) {
|
|
|
|
|
$rows = __GetAgenteDiscagem($rows);
|
|
|
|
|
list($channelAgente, $matricula, $numDisc, $ramal, $uid, $fila, $horaAbd) = array_values($rows);
|
|
|
|
|
*/
|
|
|
|
|
}
|