|
|
|
|
#!/usr/bin/php -Cq
|
|
|
|
|
<?php
|
|
|
|
|
/* * ***************************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* REGISTRO DE CHAMADAS ABANDONADAS
|
|
|
|
|
* Autor
|
|
|
|
|
* Amarildo Pereira
|
|
|
|
|
*
|
|
|
|
|
* ***************************************************************************************
|
|
|
|
|
* Defini<EFBFBD><EFBFBD>es do Projeto
|
|
|
|
|
* Nome: Registro de Abandonada
|
|
|
|
|
* Data in<EFBFBD>cio: 02/08/2018
|
|
|
|
|
* Equipe: Amarildo Pereira
|
|
|
|
|
* Descri<EFBFBD><EFBFBD>o:
|
|
|
|
|
* O objetivo do script <EFBFBD> registrar o abandono das chamadas na fila a fim de prover infor-
|
|
|
|
|
* ma<EFBFBD><EFBFBD>es para que sejam retornadas posteriormente e tenha seus status atualizados adequa-
|
|
|
|
|
* damente. No momento do abandono a tabela "pbx_abandonadas_semretorno" ser<EFBFBD> populada com
|
|
|
|
|
* as seguinte informa<EFBFBD><EFBFBD>es:
|
|
|
|
|
* 1 - abdsr_uniqueid: Identificador da chamada.
|
|
|
|
|
* 2 - abdsr_fila: Fila em que a chamada foi abandonada.
|
|
|
|
|
* 3 - abdsr_numero: O n<EFBFBD>mero do telefone que abandonou.
|
|
|
|
|
* 4 - abdsr_agt_logado: N<EFBFBD>mero de agentes logados no momento do abandono.
|
|
|
|
|
* 5 - abdsr_agt_pausa: N<EFBFBD>mero de agentes em pausa no momento do abandono.
|
|
|
|
|
* 6 - abdsr_agt_ocupado: N<EFBFBD>mero de agentes que estavam em atendimento no momento do
|
|
|
|
|
* abandono.
|
|
|
|
|
* 7 - abdsr_agt_indisponivel: N<EFBFBD>mero de agentes que estavam com a op<EFBFBD><EFBFBD>o indispon<EFBFBD>vel
|
|
|
|
|
* para fila marcada.
|
|
|
|
|
* 8 - abdsr_agt_nao_classificado: N<EFBFBD>mero de agentes que n<EFBFBD>o podiam receber chamadas
|
|
|
|
|
* porque n<EFBFBD>o classificaram a chamada quando a fila tem classifica<EFBFBD><EFBFBD>o obrigat<EFBFBD>ria.
|
|
|
|
|
*
|
|
|
|
|
* A tabela a tabela "pbx_abandonadas_status" ser<EFBFBD> populada com detalhes sobre os agentes
|
|
|
|
|
* logados na fila e conter<EFBFBD> as seguinte informa<EFBFBD><EFBFBD>es:
|
|
|
|
|
* 1 - uniqueid: Identificador da chamada usada para relacionamento com a tabela
|
|
|
|
|
* "pbx_abandonadas_semretorno"
|
|
|
|
|
* 2 - matricula: Identifica<EFBFBD><EFBFBD>o do agente no sistema.
|
|
|
|
|
* 3 - id_evt_agt: Id <EFBFBD>nico da tabela.
|
|
|
|
|
* 4 - status: Status do agente no momento do abandono.
|
|
|
|
|
* 5 - motivo_pausa: Se o agente estiver em pausa qual o motivo informado.
|
|
|
|
|
* 6 - ramal: O n<EFBFBD>mero do ramal que o agente usou no atendimento.
|
|
|
|
|
* 7 - disponivel: Indica se o agente estava com a op<EFBFBD><EFBFBD>o dispon<EFBFBD>vel para fila marcada.
|
|
|
|
|
* 8 - classificado: Indica que o agente n<EFBFBD>o est<EFBFBD> apto a receber chamadas, por n<EFBFBD>o ter
|
|
|
|
|
* classificado seu <EFBFBD>ltimo atendimento.
|
|
|
|
|
*
|
|
|
|
|
* Quando uma chamada <EFBFBD> retornada pelo processo autom<EFBFBD>tico ou manual por um agente loga-
|
|
|
|
|
* do na fila correspondente ou ainda pelo atendimento posterior realizado para o mesmo
|
|
|
|
|
* n<EFBFBD>mero a tabela "pbx_abandonadas_semretorno" <EFBFBD> atualizada para indicar que a chamada j<EFBFBD>
|
|
|
|
|
* foi retornada com os seguintes dados:
|
|
|
|
|
* 1 - abdsr_data_hora_retorno: Indica a data e hora do retorno.
|
|
|
|
|
* 2 - abdsr_data_retorno: Data d retorno.
|
|
|
|
|
* 3 - abdsr_ramal: Ramal do agente que realizou o atendimento.
|
|
|
|
|
* 4 - abdsr_agente: Matricula do agente que realizou o atendimento.
|
|
|
|
|
* 5 - abdsr_uniqueid_ret: Identificador da chamada que retornou.
|
|
|
|
|
*
|
|
|
|
|
* Quando ocorre um retorno consideramos a <EFBFBD>ltima chamada do n<EFBFBD>mero abandonado, entretanto
|
|
|
|
|
* caso haja outras chamadas do mesmo n<EFBFBD>mero abandonadas anteriormente estas tamb<EFBFBD>m s<EFBFBD>o
|
|
|
|
|
* marcadas como retornadas atualizando a tabela "pbx_abandonadas_semretorno" da seguinte
|
|
|
|
|
* maneira:
|
|
|
|
|
* 1 - abdsr_data_hora_retorno: Data e hora em que foi realizado o retorno.
|
|
|
|
|
* 2 - abdsr_data_retorno: Data do retorno.
|
|
|
|
|
* 3 - abdsr_ramal: Cont<EFBFBD>m a descri<EFBFBD><EFBFBD>o 'RET' indica um retorno indireto.
|
|
|
|
|
* 4 - abdsr_agente: Matr<EFBFBD>cula do agente que realizou o atendimento.
|
|
|
|
|
* 5 - abdsr_uniqueid_ret: Identificador da chamada que realizou o retorno.
|
|
|
|
|
* 6 - abdsr_log: Identificador da ultima chamada abandonada que serviu de refer<EFBFBD>ncia
|
|
|
|
|
* para o retorno.
|
|
|
|
|
* Para a atualiza<EFBFBD><EFBFBD>o das camadas anteriores s<EFBFBD>o considerados dois par<EFBFBD>metros:
|
|
|
|
|
* 1 - abdsr_numero: N<EFBFBD>mero do telefone que realizou o abandono.
|
|
|
|
|
* 2 - abdsr_data_hora_retorno: Indica que n<EFBFBD>o houve retorno para a chamada ent<EFBFBD>o
|
|
|
|
|
* consideramos todas as chamadas do mesmo n<EFBFBD>mero em que o valor deste campo <EFBFBD> null;
|
|
|
|
|
* ***************************************************************************************
|
|
|
|
|
* Copyright (c) 2018, Simples IP
|
|
|
|
|
* *************************************************************************************** */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
error_reporting(E_ERROR);
|
|
|
|
|
ini_set('display_errors', 0);
|
|
|
|
|
include 'util/util.php';
|
|
|
|
|
include 'funcoes/shared.php';
|
|
|
|
|
include("util/funcoesAgi.php");
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/serverFunctions.php';
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
include 'util/util.php';
|
|
|
|
|
include '/var/lib/asterisk/scripts/integracao/constServerIntegra.php';
|
|
|
|
|
include '/var/lib/asterisk/scripts/integracao/localDataBase.php';
|
|
|
|
|
include 'funcoes/shared.php';
|
|
|
|
|
include("util/funcoesAgi.php");
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
$debug = 1;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Caminho para o arquivo de log do script.
|
|
|
|
|
*/
|
|
|
|
|
$pathLog = sprintf('/var/log/asterisk/abd_agi-%s.log', date("Y-m-d"));
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Captura variaveis do asterisk.
|
|
|
|
|
*/
|
|
|
|
|
$agi = GetAgi();
|
|
|
|
|
|
|
|
|
|
$arg1 = isset($argv[1]) ? trim($argv[1]) : '';
|
|
|
|
|
$arg2 = isset($argv[2]) ? trim($argv[2]) : '';
|
|
|
|
|
$arg3 = isset($argv[3]) ? trim($argv[3]) : '';
|
|
|
|
|
$arg4 = isset($argv[4]) ? trim($argv[4]) : '';
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Nome do script em ececucao.
|
|
|
|
|
*/
|
|
|
|
|
$scrpt = trim($argv[0]);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Identificador gerado para chamda corrente na central.
|
|
|
|
|
*/
|
|
|
|
|
$uid = $arg1;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Identifica a fila de entrada para qual a chamada foi encaminhada.
|
|
|
|
|
*/
|
|
|
|
|
$dac = $arg2;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Configura<EFBFBD><EFBFBD>o do banco de dados. Deixe a vari<EFBFBD>vel $str para pegar o valor padrao
|
|
|
|
|
*/
|
|
|
|
|
$str = '';
|
|
|
|
|
if (!$str) {
|
|
|
|
|
$str = GetDefStrDb();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$direcao = $agi->get_variable('CDR(direcao)', true);
|
|
|
|
|
$evento = $agi->get_variable('EVENTO', true);
|
|
|
|
|
$atendidaFila = trim($agi->get_variable('ATENDIDA_FILA', true));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* * *************************************************************************
|
|
|
|
|
* ************* INICIO TRATAMENTO ABANDONADAS NA FILA **********************
|
|
|
|
|
* *********************************************************************** */
|
|
|
|
|
try {
|
|
|
|
|
$inTran = false;
|
|
|
|
|
/*
|
|
|
|
|
* Realiza a conexao ao banco de daodos.
|
|
|
|
|
*/
|
|
|
|
|
if (!$conAbd = pg_connect($str)) {
|
|
|
|
|
RaiseExcept("Erro ao conecatar ao banco de dados.[{$str}]", true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Retira possiveis inconssitencias do numero
|
|
|
|
|
*/
|
|
|
|
|
$numero = NormalizaNumero($arg3);
|
|
|
|
|
|
|
|
|
|
MonitoraAbdAgi($conAbd, $uid, $dac, $arg3, $arg4, $direcao, $evento, $atendidaFila);
|
|
|
|
|
GravaLogGlobal('Inicio');
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* CAPTURA CODIGOS DE PARAMETROS DE CHAMADA.
|
|
|
|
|
*/
|
|
|
|
|
$codigoparam = trim($agi->get_variable('CODIGOPARAM', true));
|
|
|
|
|
if ($codigoparam) {
|
|
|
|
|
atualizaCliente($conAbd, $uid, $codigoparam);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se a ligacao foi recebida na fila.
|
|
|
|
|
*/
|
|
|
|
|
if ($dac && $numero) {
|
|
|
|
|
/*
|
|
|
|
|
* Inicia uma transacao no banco de dados.
|
|
|
|
|
*/
|
|
|
|
|
if (!pg_query($conAbd, 'begin')) {
|
|
|
|
|
RaiseExcept("Erro ao Iniciar grava<EFBFBD><EFBFBD>o das abandonadas sem retorno.", true);
|
|
|
|
|
}
|
|
|
|
|
$inTran = true;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* RAMAL ABANDONO DA CHAMADA - CHAMADA RAMAL
|
|
|
|
|
*/
|
|
|
|
|
$ramal = $agi->get_variable('CDR(ramal_origem)', true);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Matricula do agente logado.
|
|
|
|
|
*/
|
|
|
|
|
$matricula = ValidaMatricula($conAbd, $arg4);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se a chamada <EFBFBD> sainte ou entrante.
|
|
|
|
|
*/
|
|
|
|
|
$direcao = trim($agi->get_variable('CDR(direcao)', true));
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Eventos da fila na chamada de saida.
|
|
|
|
|
*/
|
|
|
|
|
$evento = trim($agi->get_variable('EVENTO', true));
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Entrante na fila atendica.
|
|
|
|
|
*/
|
|
|
|
|
$atendidaFila = strtoupper(trim($agi->get_variable('ATENDIDA_FILA', true)));
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se a chamada foi atendida.
|
|
|
|
|
*/
|
|
|
|
|
if ($direcao == 'S') {
|
|
|
|
|
$chamadaAtendida = ($evento == 'COMPLETAAGENT') || ($evento == 'COMPLETACALLER') || ($evento == 'COMPLETACALLERRAMAL') || ($evento == 'COMPLETEAGENT') || ($evento == 'COMPLETEAGENTRAMAL') || ($evento == 'COMPLETECALLER') || ($evento == 'COMPLETECALLERRAMAL') || ($evento == 'ATENDIDA');
|
|
|
|
|
} else {
|
|
|
|
|
$chamadaAtendida = ($atendidaFila == 'SIM') || ($evento == 'COMPLETEAGENT') || ($evento == 'COMPLETECALLER') || ($evento == 'COMPLETAAGENT') || ($evento == 'COMPLETACALLER');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Marca o inicio da execucao do script.
|
|
|
|
|
* GravaLog(sprintf(": %s\n", $ ,date('Y-m-d H:i:s')), $pathLog);
|
|
|
|
|
*/
|
|
|
|
|
GravaLogGlobal('Inicio Registra Abandon');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//if ((!$chamadaAtendida) && (($direcao == 'I') || ($direcao == 'E'))) {
|
|
|
|
|
if ((!$chamadaAtendida) && ($direcao == 'E')) {
|
|
|
|
|
/*
|
|
|
|
|
* Inicio do tratamento para chamadas abandonadas.
|
|
|
|
|
* Recuperando informacoes da fila.
|
|
|
|
|
*/
|
|
|
|
|
$query = "select sum(1) as logado,
|
|
|
|
|
SUM(case when( a.status in('OCUPADO', 'CHAMANDO'))then 1 else 0 end) as ocupado,
|
|
|
|
|
SUM(case when( a.status = 'LIVRE')then 1 else 0 end) as livre,
|
|
|
|
|
SUM(case when( a.status = 'PAUSA')then 1 else 0 end) as pausa,
|
|
|
|
|
SUM(case when( a.disponivel_atendimento = 0)then 1 else 0 end) as indisponivel,
|
|
|
|
|
SUM(case when( b.exige_classificacao = 0)then 0 else case when(a.chamada_classificado = 1)then 0 else 1 end end) as nao_classificado
|
|
|
|
|
from pbx_supervisor_agentes a, pbx_queues_grupos b
|
|
|
|
|
where b.nome = a.dac
|
|
|
|
|
and a.dac = '$dac'";
|
|
|
|
|
$result = pg_query($conAbd, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
RaiseExcept("Erro ao obter informacoes sobre a fila.", true);
|
|
|
|
|
}
|
|
|
|
|
$infoFila = pg_fetch_array($result, null, PGSQL_ASSOC);
|
|
|
|
|
GravaLogGlobal('Informacoes da Fila');
|
|
|
|
|
/*
|
|
|
|
|
* Inserindo informacoes sobre a chamada e a fila no momento do abandono.
|
|
|
|
|
*/
|
|
|
|
|
if ($numero) {
|
|
|
|
|
$query = "insert into pbx_abandonadas_semretorno(abdsr_uniqueid,abdsr_fila,abdsr_numero,abdsr_agt_logado,abdsr_agt_pausa,abdsr_agt_ocupado,abdsr_agt_indisponivel,abdsr_agt_nao_classificado)"
|
|
|
|
|
. "values(%s,%s,%s,%s,%s,%s,%s,%s)";
|
|
|
|
|
$query = sprintf($query, QuotedStr($uid), QuotedStr($dac), QuotedStr($numero), QuotedStr(($infoFila['logado'] ? $infoFila['logado'] : '0')), QuotedStr(($infoFila['pausa'] ? $infoFila['pausa'] : '0')), QuotedStr(($infoFila['ocupado'] ? $infoFila['ocupado'] : '0')), QuotedStr(($infoFila['indisponivel'] ? $infoFila['indisponivel'] : '0')), QuotedStr(($infoFila['nao_classificado']) ? $infoFila['nao_classificado'] : '0'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$result = pg_query($conAbd, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
RaiseExcept("Erro ao gravar informacoes sobre a chamada.", true);
|
|
|
|
|
}
|
|
|
|
|
GravaLogGlobal('Insere Abandonadas');
|
|
|
|
|
} else {
|
|
|
|
|
GravaLog(sprintf("[ PROCESS ]\n", 'Nao foi possivel encontrar o numero passado pela central', date('Y-m-d H:i:s')), $pathLog);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Obtendo informacoes sobre os agentes no momento do abandono.
|
|
|
|
|
* a.chamada_classificad = 2 -> Indica o status inicial quando a classifica<EFBFBD><EFBFBD>o <EFBFBD> obgrigat<EFBFBD>ria
|
|
|
|
|
* tendo portato o mesmo efeito que 1 que <EFBFBD> classificado.
|
|
|
|
|
*/
|
|
|
|
|
$query = "select a.matricula,
|
|
|
|
|
a.ramal,
|
|
|
|
|
case when( a.status in('OCUPADO', 'CHAMANDO'))then 'OCUPADO' else a.status end as status,
|
|
|
|
|
case when( b.exige_classificacao = 0)then -1 else a.chamada_classificado end as chamada_classificado,
|
|
|
|
|
a.disponivel_atendimento, c.id as id_evt_agente, c.login, c.logoff, case when( a.status = 'PAUSA')then a.motivo_pausa else '-' end as motivo_pausa
|
|
|
|
|
from pbx_supervisor_agentes a, pbx_queues_grupos b, pbx_eventos_agentes c
|
|
|
|
|
where b.nome = a.dac
|
|
|
|
|
and c.id_dac = b.id
|
|
|
|
|
and c.matricula = a.matricula
|
|
|
|
|
and c.login = (select max(login) from pbx_eventos_agentes where matricula = a.matricula)
|
|
|
|
|
and a.dac = '$dac' order by a.matricula;";
|
|
|
|
|
$result = pg_query($conAbd, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
RaiseExcept("Erro ao obter informacoes sobre os agentes.", true);
|
|
|
|
|
}
|
|
|
|
|
GravaLogGlobal('Informacoes Agentes');
|
|
|
|
|
/* /var/lib/asterisk/scripts/integracao/abdAgi.php,1531320618.20,FINANCEIRO,4002,
|
|
|
|
|
* Inserindo informacoes sobre os agentes no momento da chamada.
|
|
|
|
|
*/
|
|
|
|
|
if (pg_num_rows($result)) {
|
|
|
|
|
while ($infoAgente = pg_fetch_array($result, null, PGSQL_ASSOC)) {
|
|
|
|
|
$query = "insert into pbx_abandonadas_status(uniqueid, fila, matricula,id_evt_agt,status, motivo_pausa,ramal,disponivel,classificado)"
|
|
|
|
|
. "values(%s,%s,%s,%s,%s,%s,%s,%s,%s)";
|
|
|
|
|
$query = sprintf($query, QuotedStr($uid), QuotedStr($dac), QuotedStr($infoAgente['matricula']), QuotedStr($infoAgente['id_evt_agente']), QuotedStr($infoAgente['status']), QuotedStr($infoAgente['motivo_pausa']), QuotedStr($infoAgente['ramal']), QuotedStr($infoAgente['disponivel_atendimento']), QuotedStr($infoAgente['chamada_classificado'])
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (!pg_query($conAbd, $query)) {
|
|
|
|
|
RaiseExcept("Erro ao gravar informacoes sobre os agentes no momento da chamada.", true);
|
|
|
|
|
}
|
|
|
|
|
GravaLogGlobal('Informacoes Agentes Logados');
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
/* Sem agente logado na fila */
|
|
|
|
|
$query = "insert into pbx_abandonadas_status(uniqueid,fila, matricula,id_evt_agt,status, motivo_pausa,ramal,disponivel,classificado)values(%s,%s,%s,'0','0','0','0','0','0')";
|
|
|
|
|
$query = sprintf($query, QuotedStr($uid), QuotedStr($dac), QuotedStr($infoAgente['matricula']));
|
|
|
|
|
|
|
|
|
|
if (!pg_query($conAbd, $query)) {
|
|
|
|
|
RaiseExcept("Erro ao gravar informacoes sobre os agentes no momento da chamada.", true);
|
|
|
|
|
}
|
|
|
|
|
GravaLogGlobal('Sem agente');
|
|
|
|
|
}
|
|
|
|
|
} else if ($chamadaAtendida) {
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se ja existe uma abandono para o numero.
|
|
|
|
|
*/
|
|
|
|
|
$diasAbandon = GetDiasAbandonada($conAbd);
|
|
|
|
|
$query = "SELECT abdsr_uniqueid, abdsr_fila
|
|
|
|
|
FROM pbx_abandonadas_semretorno
|
|
|
|
|
WHERE abdsr_data_hora_retorno IS NULL
|
|
|
|
|
AND abdsr_numero = '$numero'
|
|
|
|
|
AND abdsr_data >= (now()::date - $diasAbandon)
|
|
|
|
|
AND abdsr_data_hora_inicio =
|
|
|
|
|
(SELECT max(abdsr_data_hora_inicio)
|
|
|
|
|
FROM pbx_abandonadas_semretorno
|
|
|
|
|
WHERE abdsr_data >= (now()::date - $diasAbandon)
|
|
|
|
|
and abdsr_fila = '$dac'
|
|
|
|
|
AND abdsr_numero = '$numero'
|
|
|
|
|
AND abdsr_data_hora_retorno IS NULL)";
|
|
|
|
|
|
|
|
|
|
$res = pg_query($conAbd, $query);
|
|
|
|
|
|
|
|
|
|
GravaLogGlobal('Informacoes de retorno');
|
|
|
|
|
if (!$res) {
|
|
|
|
|
RaiseExcept("Erro ao consultar informacoes sobre a chamada abandonada", true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Se o numero tiver registro de chamda sem retorno atualiza as informacoes.
|
|
|
|
|
*/
|
|
|
|
|
if (pg_num_rows($res)) {
|
|
|
|
|
$infoChamada = pg_fetch_array($res, null, PGSQL_ASSOC);
|
|
|
|
|
$uidAbandon = $infoChamada['abdsr_uniqueid'];
|
|
|
|
|
$filaAbandon = $infoChamada['abdsr_fila'];
|
|
|
|
|
$agenteMatricula = $matricula;
|
|
|
|
|
|
|
|
|
|
$query = "update pbx_abandonadas_semretorno
|
|
|
|
|
set abdsr_data_hora_retorno = now(),
|
|
|
|
|
abdsr_data_retorno = now()::date,
|
|
|
|
|
abdsr_ramal = '$ramal',
|
|
|
|
|
abdsr_agente = '$agenteMatricula',
|
|
|
|
|
abdsr_uniqueid_ret = '$uid'
|
|
|
|
|
where abdsr_uniqueid = '$uidAbandon' and abdsr_fila = '{$filaAbandon}'";
|
|
|
|
|
$result = pg_query($conAbd, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
RaiseExcept("Erro ao atualizar informacoes sobre a chamada abandonada", true);
|
|
|
|
|
}
|
|
|
|
|
GravaLogGlobal('Atualiza retorno');
|
|
|
|
|
/*
|
|
|
|
|
* Atualiza chamdas anteriores para o mesmo numero marcando como retornada
|
|
|
|
|
*/
|
|
|
|
|
$query = "update pbx_abandonadas_semretorno
|
|
|
|
|
set abdsr_data_hora_retorno = now(),
|
|
|
|
|
abdsr_data_retorno = now()::date,
|
|
|
|
|
abdsr_ramal = 'RET',
|
|
|
|
|
abdsr_agente = '$agenteMatricula',
|
|
|
|
|
abdsr_uniqueid_ret = '$uid',
|
|
|
|
|
abdsr_log = '$uidAbandon'
|
|
|
|
|
where abdsr_numero = '$numero'
|
|
|
|
|
and abdsr_data_hora_retorno is null
|
|
|
|
|
and abdsr_fila = '{$filaAbandon}'";
|
|
|
|
|
$result = pg_query($conAbd, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
RaiseExcept("Erro ao atualizar informacoes sobre a chamada abandonada anteriores a atual", true);
|
|
|
|
|
}
|
|
|
|
|
GravaLogGlobal('Atauliza status retorno');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!pg_query($conAbd, 'commit')) {
|
|
|
|
|
RaiseExcept("Erro ao finalizar grava<EFBFBD><EFBFBD>o das abandonadas sem retorno.", true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
if ($inTran) {
|
|
|
|
|
pg_query($conAbd, 'rollback');
|
|
|
|
|
}
|
|
|
|
|
/*
|
|
|
|
|
* 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);
|
|
|
|
|
GravaLogGlobal('Capltura erro');
|
|
|
|
|
}
|
|
|
|
|
/* * *************************************************************************
|
|
|
|
|
* *************** FIM TRATAMENTO ABANDONADAS NA FILA ***********************
|
|
|
|
|
* ************************************************************************* */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Marca o fim da execucao do script.
|
|
|
|
|
*/
|
|
|
|
|
GravaLogGlobal('Fim Execucao');
|
|
|
|
|
pg_close($conAbd);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Realiza a conexao ao banco de daodos.
|
|
|
|
|
*/
|
|
|
|
|
$conn = pg_connect($str);
|
|
|
|
|
$inTran = false;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Cria um controle para retorno de chamadas abandonadas,
|
|
|
|
|
* as chamadas v<EFBFBD>o sendo inseridas na tabela e removidas
|
|
|
|
|
* conformem forem sendo retornadas pelos agentes da fila
|
|
|
|
|
* aonde foram abandonadas.
|
|
|
|
|
|
|
|
|
|
-- Table: pbx_abandonadas_semretorno
|
|
|
|
|
-- DROP TABLE pbx_abandonadas_semretorno;
|
|
|
|
|
|
|
|
|
|
CREATE TABLE pbx_abandonadas_semretorno
|
|
|
|
|
(
|
|
|
|
|
abdsr_uniqueid character varying(32) not null primary key,
|
|
|
|
|
abdsr_data date NOT NULL default now()::date,
|
|
|
|
|
abdsr_fila character varying(64),
|
|
|
|
|
abdsr_numero character varying(32) NOT NULL,
|
|
|
|
|
abdsr_data_hora_inicio timestamp without time zone NOT NULL default now(),
|
|
|
|
|
abdsr_data_hora_retorno timestamp without time zone,
|
|
|
|
|
abdsr_data_retorno date,
|
|
|
|
|
abdsr_ramal character varying(32),
|
|
|
|
|
abdsr_agente character varying(32),
|
|
|
|
|
abdsr_agt_logado int,
|
|
|
|
|
abdsr_agt_pausa int,
|
|
|
|
|
abdsr_agt_ocupado int,
|
|
|
|
|
abdsr_agt_indisponivel int,
|
|
|
|
|
abdsr_agt_nao_classificado int,
|
|
|
|
|
abdsr_uniqueid_ret character varying(32)
|
|
|
|
|
);
|
|
|
|
|
-- Index: "idxPbxAbdsrDataNumero"
|
|
|
|
|
-- DROP INDEX "idxPbxAbdsrDataNumero";
|
|
|
|
|
CREATE INDEX "idxPbxAbdsrDataNumero"
|
|
|
|
|
ON pbx_abandonadas_semretorno
|
|
|
|
|
USING btree
|
|
|
|
|
(abdsr_data, abdsr_fila, abdsr_numero);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX "idxPbxAbdsrUid"
|
|
|
|
|
ON pbx_abandonadas_semretorno
|
|
|
|
|
USING btree
|
|
|
|
|
(abdsr_uniqueid);
|
|
|
|
|
|
|
|
|
|
-- DROP TABLE pbx_abandonadas_status;
|
|
|
|
|
CREATE TABLE pbx_abandonadas_status
|
|
|
|
|
(
|
|
|
|
|
uniqueid character varying(32) not null,
|
|
|
|
|
matricula character varying(16) not null,
|
|
|
|
|
id_evt_agt int,
|
|
|
|
|
status varchar(32),
|
|
|
|
|
ramal varchar(32),
|
|
|
|
|
disponivel int,
|
|
|
|
|
classificado int,
|
|
|
|
|
constraint "pkPbxAbandonadasStatus" primary key(uniqueid, matricula)
|
|
|
|
|
);
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Fun<EFBFBD><EFBFBD>o Chamada Ramal da API.
|
|
|
|
|
*/
|
|
|
|
|
include_once '/var/lib/asterisk/scripts/integracao/constServerIntegra.php';
|
|
|
|
|
include_once '/var/lib/asterisk/scripts/integracao/localDataBase.php';
|
|
|
|
|
|
|
|
|
|
$scrpt = $argv[0];
|
|
|
|
|
$UNIQUEID = $arg1;
|
|
|
|
|
|
|
|
|
|
$userfield = $agi->get_variable('MONITOR_FILENAME', true);
|
|
|
|
|
$userfield = trim($userfield) ? $userfield : 'AUDIO.WAV';
|
|
|
|
|
|
|
|
|
|
$path = '/var/log/asterisk/encerra_chamada_satelitenorte.log';
|
|
|
|
|
$query = sprintf("select a.chdr_id from pbx_chamada_ramal a where a.uniqueid = '%s' and a.chdr_fim is null", $UNIQUEID);
|
|
|
|
|
$result = pg_query($conn, $query);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (pg_num_rows($result)) {
|
|
|
|
|
GravaLog($query . "\n AUDIO: " . $userfield . "\n", $path);
|
|
|
|
|
$dados = pg_fetch_array($result, null, PGSQL_ASSOC);
|
|
|
|
|
$chdr_id = $dados['chdr_id'];
|
|
|
|
|
$audio = str_ireplace('.WAV', '.MP3', $userfield);
|
|
|
|
|
|
|
|
|
|
$token = '026d3a4b331078aa09d096d11e495215';
|
|
|
|
|
$parametros = array('method' => 'terminachamada', 'audio' => $audio, 'id_chamada' => $UNIQUEID, 'token' => $token, 'login' => 'admin', 'senha' => 'SiP1029384756', 'tipoRetorno' => 'JSON');
|
|
|
|
|
//$parametros = array('audio' => $audio, 'id_chamada' => $UNIQUEID, 'token' => $token);
|
|
|
|
|
|
|
|
|
|
$ch = curl_init();
|
|
|
|
|
curl_setopt($ch, CURLOPT_URL, "http://satelitenorte.xpro.me/gestaodeleads/terminachamada");
|
|
|
|
|
//curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1/aplicativo/integracao/index.php");
|
|
|
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
|
|
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $parametros);
|
|
|
|
|
$content = trim(curl_exec($ch));
|
|
|
|
|
curl_close($ch);
|
|
|
|
|
$retorno = json_decode($content, true);
|
|
|
|
|
|
|
|
|
|
$log = sprintf("Status: %s Msg: %s", $retorno["status"], $retorno["mensagem"]);
|
|
|
|
|
$query = sprintf("update pbx_chamada_ramal set chdr_fim = now(), chdr_log = %s where chdr_id = '%s'", QuotedStr($log), $chdr_id);
|
|
|
|
|
GravaLog($query . "\n", $path);
|
|
|
|
|
$result = pg_query($conn, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
GravaLog($query . "\n", $path);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$integra = $agi->get_variable('INTEGRA-SAIDA', true);
|
|
|
|
|
if ($integra == 'SAIDA') {
|
|
|
|
|
|
|
|
|
|
$intMetodo = $agi->get_variable('INTEGRA-METODO', true);
|
|
|
|
|
$intUniqueid = $agi->get_variable('UNIQUEID', true);
|
|
|
|
|
$intTelefone = $agi->get_variable('INTEGRA-FONE', true);
|
|
|
|
|
$intFone = str_replace('@', '|', $intTelefone);
|
|
|
|
|
$intRegIni = $agi->get_variable('INTEGRA-REGINI', true);
|
|
|
|
|
$intRegFim = $agi->get_variable('INTEGRA-REGFIM', true);
|
|
|
|
|
$intRetCliente = $agi->get_variable('INTEGRA-RETCLI', true);
|
|
|
|
|
$intRetCli = str_replace('@', '|', $intRetCliente);
|
|
|
|
|
$intRamal = $agi->get_variable('INTEGRA-RAMAL', true);
|
|
|
|
|
$intUra = $agi->get_variable('INTEGRA-URA', true);
|
|
|
|
|
|
|
|
|
|
$sql = "INSERT INTO pbx_integracao_reg("
|
|
|
|
|
. "reg_id_metodo,"
|
|
|
|
|
. "reg_uniqueid,"
|
|
|
|
|
. "reg_uniqueid_old,"
|
|
|
|
|
. "reg_fone,"
|
|
|
|
|
. "reg_retorno,"
|
|
|
|
|
. "reg_inicio,"
|
|
|
|
|
. "reg_fim,"
|
|
|
|
|
. "reg_msg,"
|
|
|
|
|
. "reg_status_exec,"
|
|
|
|
|
. "reg_status,"
|
|
|
|
|
. "retorno_cliente,"
|
|
|
|
|
. "reg_ramal,"
|
|
|
|
|
. "reg_ura) "
|
|
|
|
|
. "VALUES($intMetodo,'$intUniqueid','$intUniqueid','$intFone','$intFone','$intRegIni','$intRegFim','INTEGRACAO-ATIVO-SAIDA',"
|
|
|
|
|
. "1,0,'$intRetCli','$intRamal','$intUra');";
|
|
|
|
|
@pg_query($conn, $sql);
|
|
|
|
|
$pgError = pg_last_error();
|
|
|
|
|
if ($pgError) {
|
|
|
|
|
GravaLog($sql, '/var/log/asterisk/integracao_ativa_sainte.log');
|
|
|
|
|
GravaLog($pgError, '/var/log/asterisk/integracao_ativa_sainte.log');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ligueme = $agi->get_variable('LIGUE-ME', true);
|
|
|
|
|
if ($ligueme) {
|
|
|
|
|
$ligueUniq = $agi->get_variable('UNIQUEID', true);
|
|
|
|
|
$sipid = GetSIPIDCall();
|
|
|
|
|
$sqligueme = sprintf("UPDATE pbx_ligueme_gratis SET uid_contato = %s WHERE sipid_contato = '%s'", $ligueUniq, GetSIPIDCall());
|
|
|
|
|
$sqligueme .= $sipid ? "sipid_contato = '$sipid'" : "telefone_contato = '$ligueme'";
|
|
|
|
|
@pg_query($conn, $sqligueme);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
############################################################################
|
|
|
|
|
#### INTEGRACAO ENCERRAMENTO DO ABDAGI ####
|
|
|
|
|
############################################################################
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica se o tipo de execu<EFBFBD><EFBFBD>o <EFBFBD> custom, se for desvia a execu<EFBFBD><EFBFBD>o
|
|
|
|
|
* para um script customizado para integra<EFBFBD><EFBFBD>o, capturando antes os
|
|
|
|
|
* parametros de entrada. O programas ou scripts ficam localizados
|
|
|
|
|
* no diretorio /var/lib/asterisk/scripts/integracao/custom.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
if ($agi->get_variable('MEMBERINTERFACE', true) || $evento == 'ABANDON') {
|
|
|
|
|
$query = "SELECT itgm_id FROM pbx_integracao_reg a, pbx_integracao_metodo b WHERE b.itgm_id_pai = a.reg_id_metodo AND b.evento = 2 AND a.reg_uniqueid = '{$arg1}'";
|
|
|
|
|
$result = pg_query($query);
|
|
|
|
|
$idMetodo = pg_fetch_assoc($result)['itgm_id'];
|
|
|
|
|
|
|
|
|
|
$pathIntegra = "/var/lib/asterisk/scripts/integracao/custom/";
|
|
|
|
|
|
|
|
|
|
if ($idMetodo && ExecuteCustom($idMetodo, $nomeMetodo)) {
|
|
|
|
|
__logStr("ExecuteCustom", $nomeMetodo, 'serverAgi', true);
|
|
|
|
|
|
|
|
|
|
/** Movidesk * */
|
|
|
|
|
if (file_exists($pathIntegra . "Movidesk.php") && $evento == 'ABANDON') {
|
|
|
|
|
include $pathIntegra . "abandonadaChamada.php";
|
|
|
|
|
} else {
|
|
|
|
|
include($nomeMetodo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function GetVarFila() {
|
|
|
|
|
$varFila = array('QUEUESTATUS', 'QUEUESRVLEVELPERF', 'QUEUESRVLEVEL', 'QUEUEABANDONED', 'QUEUECOMPLETED', 'QUEUETALKTIME', 'QUEUEHOLDTIME', 'QUEUECALLS', 'QUEUESTRATEGY', 'QUEUEMAX', 'QUEUENAME', 'QEORIGINALPOS', 'QEHOLDTIME', 'MEMBERREALTIME', 'MEMBERDYNAMIC', 'MEMBERPENALTY', 'MEMBERLASTCALL', 'MEMBERCALLS', 'MEMBERNAME', 'MEMBERINTERFACE');
|
|
|
|
|
$vars = array();
|
|
|
|
|
foreach ($varFila as $varName) {
|
|
|
|
|
$vars[$varName] = AgiGetVariable($varName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $vars;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function AcrescentaDDD($str) {
|
|
|
|
|
$numero = ltrim($str, '0');
|
|
|
|
|
$tam = strlen($numero);
|
|
|
|
|
|
|
|
|
|
if (($tam == 8) || (($tam == 9) && (substr($numero, 0, 1) == '9'))) {
|
|
|
|
|
return GetDddPadrao($numero);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $numero;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ValidaMatricula($conn, $matricula) {
|
|
|
|
|
$query = "select matricula from pbx_usuarios where matricula = '$matricula'";
|
|
|
|
|
$result = pg_query($conn, $query);
|
|
|
|
|
return pg_num_rows($result) ? $matricula : '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function MonitoraAbdAgi($conn, $uid, $dac, $numero, $matricula, $direcao, $evento, $atendidaFila) {
|
|
|
|
|
$pathLog = '/var/log/asterisk/monitora_abdagi.log';
|
|
|
|
|
try {
|
|
|
|
|
$query = sprintf("insert into pbx_monitora_abdagi(uid,dac,numero,matricula,direcao,evento,atendidaFila )values(%s,%s,%s,%s,%s,%s,%s)", QuotedStr($uid), QuotedStr($dac), QuotedStr($numero), QuotedStr($matricula), QuotedStr($direcao), QuotedStr($evento), QuotedStr($atendidaFila));
|
|
|
|
|
if (!pg_query($query)) {
|
|
|
|
|
GeraExcept($query);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($dac && ($atendidaFila != 'SIM')) {
|
|
|
|
|
|
|
|
|
|
$query = sprintf("select matricula, ramal, status, motivo_pausa, disponivel_atendimento, chamada_classificado, status_discador from pbx_supervisor_agentes where dac = %s", QuotedStr($dac));
|
|
|
|
|
if (!$result = pg_query($conn, $query)) {
|
|
|
|
|
GeraExcept('consulta agt');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!pg_num_rows($result)) {
|
|
|
|
|
$query = sprintf("insert into pbx_monitora_abdagi(uid,dac,numero,matricula,direcao,evento,atendidaFila, ramal, motivo_pausa, disponivel_atendimento, chamada_classificado, status_discador, uid_pai )values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", QuotedStr('agt'), QuotedStr($dac), QuotedStr($numero), QuotedStr($matricula), QuotedStr($direcao), QuotedStr($evento), QuotedStr($atendidaFila), QuotedStr($ramal), QuotedStr('0'), QuotedStr('0'), QuotedStr('0'), QuotedStr('0'), QuotedStr($uid));
|
|
|
|
|
if (!pg_query($conn, $query)) {
|
|
|
|
|
GeraExcept($query);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
|
|
|
|
|
$ramal = $dados['ramal'];
|
|
|
|
|
$motivo_pausa = $dados['motivo_pausa'];
|
|
|
|
|
$disponivel_atendimento = $dados['disponivel_atendimento'];
|
|
|
|
|
$chamada_classificado = $dados['chamada_classificado'];
|
|
|
|
|
$status_discador = $dados['status_discador'];
|
|
|
|
|
|
|
|
|
|
$query = sprintf("insert into pbx_monitora_abdagi(uid,dac,numero,matricula,direcao,evento,atendidaFila, ramal, motivo_pausa, disponivel_atendimento, chamada_classificado, status_discador, uid_pai )values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)", QuotedStr('agt'), QuotedStr($dac), QuotedStr($numero), QuotedStr($matricula), QuotedStr($direcao), QuotedStr($evento), QuotedStr($atendidaFila), QuotedStr($ramal), QuotedStr($motivo_pausa), QuotedStr($disponivel_atendimento), QuotedStr($chamada_classificado), QuotedStr($status_discador), QuotedStr($uid));
|
|
|
|
|
if (!pg_query($conn, $query)) {
|
|
|
|
|
GeraExcept($query);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
|
$log = sprintf("%s@@%s@@%s", date("Y-m-d H:i:s"), $ex->getMessage(), serialize(array($uid, $dac, $numero, $matricula, $direcao, $evento, $atendidaFila)));
|
|
|
|
|
WriteLog($log, $pathLog);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function NormalizaNumero($numeroOrig) {
|
|
|
|
|
|
|
|
|
|
$numero = ltrim($numeroOrig, "0, 00, 55");
|
|
|
|
|
$tam = strlen($numero);
|
|
|
|
|
return (($tam == 8) || ($tam == 9)) ? GetDddPadrao($numero) : $numero;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function atualizaCliente($conn, $uniqueid, $id) {
|
|
|
|
|
$query = "SELECT client_id FROM pbx_cliente WHERE client_id = {$id};";
|
|
|
|
|
$r = pg_query($conn, $query);
|
|
|
|
|
$rs = pg_fetch_assoc($r);
|
|
|
|
|
if ($rs) {
|
|
|
|
|
$query = "UPDATE pbx_cliente SET client_data_contato = now(), client_ref_id = {$uniqueid} WHERE client_id = {$id}; ";
|
|
|
|
|
$query .= " INSERT INTO pbx_cliente_audio (client_id, uid) VALUES('{$id}', '{$uniqueid}');";
|
|
|
|
|
pg_query($conn, $query);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
?>
|