#!/usr/bin/php -Cq '31', '02' => 28); /* * Representa o percurso da chamada, pode ter sido atendida por um agente, abandonada na fila ou * desligada antes de entrar na fila. */ $eventos = array('ATENDIDA', 'ABANDONADA', 'DESLIGADA', 'NAOPROCESSDA'); /* * Esta query traz as chamadas ainda não encerradas na base de dados dos clientes, visando concluir corretamente * a chamada na integração. São listadas todas as chamadas que foram registradas na tabela pbx_integracao_reg e * que anida não forma encerradas corretamente verificando a coluna "reg_encerrada = 0" da tabela * "pbx_integracao_reg", todo metodo de intgração cadastrado na tabela "pbx_integracao_metodo" pode ter um meto- * do finalizador auto relacionado na coluna "itgm_id_pai" que é uma chave estrangeira que aponta para "itgm_id". */ foreach ($arMesAtualiza as $key => $value) { $dataMesIni = sprintf('2018-%s-01', $key); $dataMesFim = sprintf('2018-%s-%s', $key, $value); $query = "select a.reg_uniqueid, b.itgm_id as reg_id_metodo, a.reg_tronco, a.reg_ramal, a.reg_ura from pbx_integracao_reg a inner join pbx_integracao_metodo b on b.itgm_id_pai = a.reg_id_metodo and b.evento = 2 and b.itgm_comando <> 'NOEXEC' where reg_encerrada = 0 and reg_data >= '$dataMesIni' and reg_data <= '$dataMesFim'"; echo "Iniciando Alteração do Periodo de: $dataMesIni ate: $dataMesFim\n\n"; $dadosEncerra = array(); $rIntegracaoReg = pg_query($connPG, $query); while ($dados = pg_fetch_array($rIntegracaoReg)) { $dadosEncerra[] = $dados; } if (count($dadosEncerra)) { foreach ($dadosEncerra as $dadosIntegracao) { /* * Campo usado como chave na integração e deve ser unico neste contexto. */ $uid = $dadosIntegracao['reg_uniqueid']; /* * Método chamadado na integração. */ $idMetodo = $dadosIntegracao['reg_id_metodo']; /* * Representa o número do serviço relacionado a rota de entrada. */ $tronco = $dadosIntegracao['reg_tronco']; /* * Normalmente representa o ramal ao qual um atendente esta conecatado a uma fila. */ $ramal = soNumero($dadosIntegracao['reg_ramal']); /* * Valores informados pelo usuario em uma ura. */ $ura = $dadosIntegracao['reg_ura']; $integrada = false; $regEvento = ''; /* * Verifica em que evento as chmada esta classificada. */ foreach ($eventos as $evento) { $regEvento = $evento; /* * Seleciona as chamadas atendidas. */ if ($evento == 'ATENDIDA') { $query = "select a.calldate, a.src, a.dst, a.duration, a.billsec, a.disposition, a.lastapp, a.calldate + (duration* interval '1 second') as end_date, coalesce(c.id,0) as fila_id, b.fila as fila_nome, substring(b.agente,7,4) as matricula, b.evento, b.param1, b.param2, b.param3, b.param4 from pbx_bilhetes a inner join pbx_eventos_dacs b on b.uid2 = a.uniqueid and b.evento in('COMPLETEAGENT','COMPLETECALLER', 'TRANSFER') inner join pbx_dacs c on c.nome = b.fila where a.uniqueid = '$uid' and a.lastapp <> 'Transferred Call' "; $rChamadas = pg_query($connPG, $query); if ($dadosChamada = pg_fetch_array($rChamadas)) { $integrada = true; $dataBilhete = substr($dadosChamada['calldate'], 0, 19); $src = soNumero($dadosChamada['src']); $dst = soNumero($dadosChamada['dst']); $tempoAtendimento = $dadosChamada['duration']; $tempoConversaocao = $dadosChamada['param2']; $tempoEspera = $dadosChamada['param1'] > 3 ? $dadosChamada['param1'] : 0; $tempoAbandono = 'NULL'; $posAbandono = 'NULL'; $posChegada = 0; $dataEncerramento = substr($dadosChamada['end_date'], 0, 19); $proto = __GetNumeroProto($connPG, $uid); $matricula = $dadosChamada['matricula']; $filaId = $dadosChamada['fila_id']; $fila = $dadosChamada['fila_nome']; break; } } if ($evento == 'ABANDONADA') { $query = "select a.calldate, a.src, a.dst, a.duration, a.billsec, a.disposition, a.lastapp, a.calldate + (duration* interval '1 second') as end_date, coalesce(c.id,0) as fila_id, b.fila as fila_nome, substring(b.agente,7,4) as matricula, b.evento, b.param1, b.param2, b.param3, b.param4 from pbx_bilhetes a, pbx_eventos_dacs b, pbx_dacs c where b.uid2 = a.uniqueid and c.nome = b.fila and b.evento in('ABANDON') and a.uniqueid = '$uid' and a.lastapp <> 'Transferred Call' "; $rChamadas = pg_query($connPG, $query); if ($dadosChamada = pg_fetch_array($rChamadas)) { $ramal = 'NULL'; $integrada = true; $dataBilhete = substr($dadosChamada['calldate'], 0, 19); $src = soNumero($dadosChamada['src']); $dst = soNumero($dadosChamada['dst']); $tempoAtendimento = 'NULL'; $tempoConversaocao = 'NULL'; $tempoEspera = 'NULL'; $tempoAbandono = $dadosChamada['param3']; $posAbandono = $dadosChamada['param2']; $posChegada = $dadosChamada['param1']; $dataEncerramento = substr($dadosChamada['end_date'], 0, 19); $proto = 'NULL'; $matricula = 'NULL'; $filaId = $dadosChamada['fila_id']; $fila = $dadosChamada['fila_nome']; break; } } if ($evento == 'DESLIGADA') { $query = "select a.calldate, a.src, a.dst, a.duration, a.billsec, a.disposition, a.lastapp, a.calldate + (duration* interval '1 second') as end_date, 0 as fila_id, '' as fila_nome, '' as matricula, '' as evento, '' as param1, '' as param2, '' as param3, '' as param4 from pbx_bilhetes a where a.uniqueid = '$uid' and a.data_bilhete < now()::date and a.lastapp <> 'Transferred Call' and not exists( select '' from pbx_eventos_dacs where uid2 = a.uniqueid ) "; $rChamadas = pg_query($connPG, $query); if ($dadosChamada = pg_fetch_array($rChamadas)) { $ramal = 'NULL'; $integrada = true; $dataBilhete = substr($dadosChamada['calldate'], 0, 19); $src = soNumero($dadosChamada['src']); $dst = soNumero($dadosChamada['dst']); $tempoAtendimento = 'NULL'; $tempoConversaocao = 'NULL'; $tempoEspera = 'NULL'; $tempoAbandono = 'NULL'; $posAbandono = 'NULL'; $posChegada = 'NULL'; $dataEncerramento = substr($dadosChamada['end_date'], 0, 19); $proto = 'NULL'; $matricula = 'NULL'; $filaId = 'NULL'; $fila = 'NULL'; break; } } if ($evento == 'NAOPROCESSDA') { $query = "select a.reg_inicio as calldate, a.reg_fone as src, '' as dst, round( EXTRACT(epoch from ( a.reg_fim - reg_inicio))) as duration, 0 as billsec, '' as disposition, '' as lastapp, a.reg_fim as end_date, 0 as fila_id, '' as fila_nome, '' as matricula, '' as evento, '' as param1, '' as param2, '' as param3, '' as param4 from pbx_integracao_reg a where a.reg_uniqueid = '$uid' and a.reg_data < now()::date and not exists( select '' from pbx_bilhetes where uniqueid = a.reg_uniqueid ) "; $rChamadas = pg_query($connPG, $query); if ($dadosChamada = pg_fetch_array($rChamadas)) { $ramal = 'NULL'; $integrada = true; $dataBilhete = substr($dadosChamada['calldate'], 0, 19); $src = soNumero($dadosChamada['src']); $dst = soNumero($dadosChamada['dst']); $tempoAtendimento = 'NULL'; $tempoConversaocao = 'NULL'; $tempoEspera = 'NULL'; $tempoAbandono = 'NULL'; $posAbandono = 'NULL'; $posChegada = 'NULL'; $dataEncerramento = substr($dadosChamada['end_date'], 0, 19); $proto = 'NULL'; $matricula = 'NULL'; $filaId = 'NULL'; $fila = 'NULL'; break; } } } if ($integrada) { /* * A passagem de valores para rotinasEventos.php é passada por um array como se fosse argv, * pois é assim que recebe os dados de outras fontes. */ $arDados = array('encerraChamada.php', $idMetodo, $uid, $matricula, $ramal, $src, $tronco, $fila, $proto, $ura, $dataBilhete, $tempoAtendimento, $tempoConversaocao, $tempoAbandono, $tempoEspera, $dataEncerramento, $posAbandono, $posChegada); // siosp.prc_integra_simplesip_chamadas (@UID, @FONE, @DATA, @TRONCO, @MAT, @RAMAL, @TMP_ATD, @TMP_CONV, @TMP_ESP, @TMP_ABD, @END ); /* * Mapeamento entre os parametros da integracao e $argv baseado no array $pI declarado ConstServerIntegra. */ $paramMapa = array($pI['uniqueid'] => 2, $pI['telefone'] => 5, $pI['transbordo'] => 8, $pI['ura'] => 9, $pI['matricula'] => 3, $pI['ramal'] => 4, $pI['fone'] => 5, $pI['tronco'] => 6, $pI['fila'] => 7, $pI['protocolo'] => 8, $pI['data'] => 10, $pI['tmp_adtendimento'] => 11, $pI['tmp_conversacao'] => 12, $pI['tmp_abandono'] => 13, $pI['tmp_espera'] => 14, $pI['data_encerramento'] => 15, $pI['posicao_abandono'] => 16, $pI['posicao_chagada'] => 17); /* * Executa os procedimentos configurados para encerramento de chamadas. */ include('/var/lib/asterisk/scripts/integracao/rotinasEventos.php'); /* * Registra a atualização. */ $query = "update pbx_integracao_reg set reg_encerrada = '1', reg_msg = '$regEvento' where reg_uniqueid = '$uid'"; $result = pg_query($query); usleep(300000); } } } // Reinicia a conexao com o banco pg_close($connPG); $connPG = pg_connect($conStr); if (!$connPG) { echo "Nao foi possivel reiniciar a conexao com o banco de dados!!\n"; exit(); } } exit(); /* * Verifica processos que não foram encerrados corretamente. */ $shmSystemKey = ShmGetId(SHM_IPC_FILE); $memoryAllocated = Malloc(); $shmKey = ShmExist($shmSystemKey); if (!$shmKey) { $msg = "Não existe memoria criada para o servidor"; __logStr("LiberaProcessos", $msg, $scrpt, true); exit(); } /* * A memoria já foi criada tenta abrir o bloco previamente alocado. */ $shmKey = ShmOpen($shmSystemKey, SHM_ACESS_MODE, SHM_ACESS_PERMISSION, $memoryAllocated); if (!$shmKey) { $msg = "Não foi possível abrir a memoria do servidor"; __logStr("LiberaProcessos", $msg, $scrpt, true); exit(); } /* * Percorre processos verificando os status, se estiverem * diferentes de PROCESSESS_WAIT verifica se esta gravado * na tabela ast_bilhetes indicando que o processo já foi * encerrado e deve ser liberado. */ for ($i = 0; $i < MEMORY_SEGMENT_COUNT; $i++) { $status = ShmRead($shmKey, $i, 1); if ($status != PROCESSESS_WAIT) { $data = trim(ShmRead($shmKey, GetOffSet($i), MEMORY_SEGMENT_WITH)); $dados = explode('|', $data); $query = sprintf('select count(*) as num_reg from pbx_bilhetes where uniqueid = %s', QuotedStr(trim($dados[0]))); $result = pg_query($query); if (!$result) { $msg = sprintf("Erro ao consultar o processo! %s", $query); __logStr("LiberaProcessos", $msg, $scrpt, true); exit; } $row = pg_fetch_row($result); if ($row[0]) { if (!ShmWrite($shmKey, PROCESSESS_WAIT, $i)) { $msg = sprintf("Não foi possível liberar a memoria do servidor! id: %s Uid: %s", $i, $dados[0]); __logStr("LiberaProcessos", $msg, $scrpt, true); } } } } function __GetNumeroProto($db, $uniqueId) { $query = "select protocolo from pbx_protocolo_reg where uniqueid = '$uniqueId'"; $result = pg_query($db, $query); $row = pg_fetch_row($result); return $row[0]; } /* * Cria um controle para retorno de chamadas abandonadas, * as chamadas vão sendo inseridas na tabela e removidas * conformem forem sendo retornadas pelos agentes da fila * aonde foram abandonadas. pbx_abandonadas_semretorno ( abdsr_id bigserial not null primary key, abdsr_data date not null, abdsr_numero varchar(32) not null, abdsr_data_hora_inicio timestamp not null, abdsr_data_hora_retorno timestamp, abdsr_fila varchar(64), abdsr_ramal varchar(32), abdsr_agente varchar(32) ); * */ ?>