forked from SimplesIP/pabx-app
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
332 lines
15 KiB
332 lines
15 KiB
#!/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; |
|
$gravaLogReporcessa = true; |
|
|
|
$arMesAtualiza = array('01' => '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) |
|
); |
|
* |
|
*/ |
|
?>
|
|
|