#!/usr/bin/php -Cq 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); /** * 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çã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 é 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); */ if ((!$chamadaAtendida) && (($direcao == 'I') || ($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); /* * 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); } } 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ção é obgrigatória * tendo portato o mesmo efeito que 1 que é 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); } /* /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); } } } 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); } } } 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); 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); } /* * 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); } } } if (!pg_query($conAbd, 'commit')) { RaiseExcept("Erro ao finalizar gravaçã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); } /* * ************************************************************************* * *************** FIM TRATAMENTO ABANDONADAS NA FILA *********************** * ************************************************************************* */ /* * Marca o fim da execucao do script. */ pg_close($conAbd); /* * Realiza a conexao ao banco de daodos. */ $conn = pg_connect($str); $inTran = false; /* * Função Chamada Ramal da API. */ include_once '/var/lib/asterisk/scripts/integracao/constServerIntegra.php'; include_once '/var/lib/asterisk/scripts/integracao/localDataBase.php'; $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ção é custom, se for desvia a execução * para um script customizado para integraçã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($conn, $query); $idMetodo = pg_fetch_assoc($result)['itgm_id']; $nomeMetodo = ''; $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); } } ?>