PABX da Simples IP
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.
 
 
 
 
 
 

316 lines
14 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;
$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ã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".
*/
$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çã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($connPG, $query);
}
}
}
/*
* 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);
$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ã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)
);
*
*/
?>