|
|
|
|
#!/usr/bin/php -Cq
|
|
|
|
|
<?php
|
|
|
|
|
error_reporting(E_ERROR);
|
|
|
|
|
ini_set('display_errors', 0);
|
|
|
|
|
ini_set("memory_limit", "512M");
|
|
|
|
|
|
|
|
|
|
include('util/util.php');
|
|
|
|
|
include '/var/lib/asterisk/scripts/integracao/constServerIntegra.php';
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/localDataBase.php';
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/serverFunctions.php';
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/dbAbstract.php';
|
|
|
|
|
require '/var/lib/asterisk/scripts/integracao/shm.php';
|
|
|
|
|
|
|
|
|
|
$scrpt = $argv[0];
|
|
|
|
|
$nivelLog = LOG_MSG_DISPLAY;
|
|
|
|
|
$dadosEncerra = array();
|
|
|
|
|
$gravaLogReporcessa = false;
|
|
|
|
|
/*
|
|
|
|
|
* 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<EFBFBD>o encerradas na base de dados dos clientes, visando concluir corretamente
|
|
|
|
|
* a chamada na integra<EFBFBD><EFBFBD>o. S<EFBFBD>o listadas todas as chamadas que foram registradas na tabela pbx_integracao_reg e
|
|
|
|
|
* que anida n<EFBFBD>o forma encerradas corretamente verificando a coluna "reg_encerrada = 0" da tabela
|
|
|
|
|
* "pbx_integracao_reg", todo metodo de intgra<EFBFBD><EFBFBD>o cadastrado na tabela "pbx_integracao_metodo" pode ter um meto-
|
|
|
|
|
* do finalizador auto relacionado na coluna "itgm_id_pai" que <EFBFBD> uma chave estrangeira que aponta para "itgm_id".
|
|
|
|
|
*/
|
|
|
|
|
$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";
|
|
|
|
|
|
|
|
|
|
$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<EFBFBD><EFBFBD>o e deve ser unico neste contexto.
|
|
|
|
|
*/
|
|
|
|
|
$uid = $dadosIntegracao['reg_uniqueid'];
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* M<EFBFBD>todo chamadado na integra<EFBFBD><EFBFBD>o.
|
|
|
|
|
*/
|
|
|
|
|
$idMetodo = $dadosIntegracao['reg_id_metodo'];
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Representa o n<EFBFBD>mero do servi<EFBFBD>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 <EFBFBD> passada por um array como se fosse argv,
|
|
|
|
|
* pois <EFBFBD> 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<EFBFBD><EFBFBD>o.
|
|
|
|
|
*/
|
|
|
|
|
$query = "update pbx_integracao_reg set reg_encerrada = '1', reg_msg = '$regEvento' where reg_uniqueid = '$uid'";
|
|
|
|
|
$result = pg_query($connPG, $query);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Verifica processos que n<EFBFBD>o foram encerrados corretamente.
|
|
|
|
|
*/
|
|
|
|
|
$shmSystemKey = ShmGetId(SHM_IPC_FILE);
|
|
|
|
|
$memoryAllocated = Malloc();
|
|
|
|
|
|
|
|
|
|
$shmKey = ShmExist($shmSystemKey);
|
|
|
|
|
if (!$shmKey) {
|
|
|
|
|
$msg = "N<EFBFBD>o existe memoria criada para o servidor";
|
|
|
|
|
__logStr("LiberaProcessos", $msg, $scrpt, true);
|
|
|
|
|
exit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* A memoria j<EFBFBD> foi criada tenta abrir o bloco previamente alocado.
|
|
|
|
|
*/
|
|
|
|
|
$shmKey = ShmOpen($shmSystemKey, SHM_ACESS_MODE, SHM_ACESS_PERMISSION, $memoryAllocated);
|
|
|
|
|
if (!$shmKey) {
|
|
|
|
|
$msg = "N<EFBFBD>o foi poss<EFBFBD>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<EFBFBD> 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);
|
|
|
|
|
$blocoNull = (trim($dados[0]) == '');
|
|
|
|
|
if (!$blocoNull) {
|
|
|
|
|
$query = sprintf('select count(*) as num_reg from pbx_bilhetes where uniqueid = %s', QuotedStr(trim($dados[0])));
|
|
|
|
|
$result = pg_query($connPG, $query);
|
|
|
|
|
if (!$result) {
|
|
|
|
|
$msg = sprintf("Erro ao consultar o processo! %s", $query);
|
|
|
|
|
__logStr("LiberaProcessos", $msg, $scrpt, true);
|
|
|
|
|
exit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$row = pg_fetch_row($result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($blocoNull || $row[0]) {
|
|
|
|
|
if (!ShmWrite($shmKey, PROCESSESS_WAIT, $i)) {
|
|
|
|
|
$msg = sprintf("N<EFBFBD>o foi poss<EFBFBD>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<EFBFBD>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)
|
|
|
|
|
);
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
?>
|