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.
 
 
 
 
 
 

349 lines
16 KiB

#!/usr/bin/php -q
<?php
error_reporting(E_ERROR);
ini_set('display_errors', 0);
include("util/util.php");
include("funcoes/shared.php");
include("util/Pid.php");
/*
* Realiza a conexao com o banco de dados.
*/
$dbcon = impGetConnection();
/*
* Variavel indica uma transacao em curso.
*/
$inTran = 0;
$numDacs = 0;
$numBilhetes = 0;
$numDuplic = 0;
/*
* Log do sistema
*/
$pathLog = "/var/log/asterisk/importa_bilhetes.log";
/*
* Garante apenas uma instancia do script.
*/
$pid = new Pid(false);
try {
/*
* verifica se a conexao foi criada com sucesso.
*/
if (pg_connection_status($dbcon) === PGSQL_CONNECTION_BAD) {
ibRaiseExcept("Nao foi possivel conecta com o banco de dados!");
}
//@AtualizaPreVenda($dbcon); //desativado, não estamos usando o sistema.
@CorrigeNumeroDestino($dbcon);
@ApagaBilheteDuplTransfer($dbcon);
@CorrigeAbandonTransbordo($dbcon);
/*
* Inicia uma transacao com o banco de dados
*/
if (!pg_query($dbcon, 'begin')) {
ibRaiseExcept("Nao foi possivel iniciar uma transacao com o banco de dados!");
}
$inTran++;
ImportaAstEventosDacs($dbcon);
ImportaAstBilhetes($dbcon);
ImportaAstBilhetesComplemento($dbcon);
if (!pg_query($dbcon, 'commit')) {
ibRaiseExcept("Nao foi possivel finalizar a transacao com o banco de dados!");
}
$log = sprintf("Importados Dacs: %s Bilhetes: %s Excluidos %s Registros Duplicados %s OK\n", $numDacs, $numBilhetes, $numDuplic, date('Y-m-d H:i:s'));
WriteLog($log, $pathLog);
} catch (Exception $ex) {
if ($inTran) {
@pg_query($dbcon, 'rollback');
}
$log = sprintf("Erro:%s File: %s Line: %s \ncmd: %s\n %s\n", $ex->getMessage(), $ex->getFile(), $ex->getLine(), (isset($log) ? $log : ''), date('Y-m-d H:i:s'));
WriteLog($log, $pathLog);
}
$pid->PidRemove();
function ibRaiseExcept($msg, $dbError = true) {
if ($dbError) {
$msg .= " DB: " . pg_last_error();
}
GeraExcept($msg);
}
function AtualizaFlagFila($minutes, $status = 'I') {
/*
* Atualiza flag_fila pendente.Observe que o "status = 'I'" indica
* que o registro esta pendende de verificação, a consulta é feita
* com base na hora atual menos o tempo em minutos indicado na variavel
* $minutes, podemos chamar a funcao mantendo o status 'I' pois a
* sincronizacao das tabelas envolvidas é assincrona e pode estar presente
* na pbx_bilhetes algum tempo antes de ser inserido na pbx_eventos_dacs
* devido que a primeira é gravado pela central enquanto a outra é levantada
* do log por um script que roda de 1 em 1 minuto.
*
*/
$sql = sprintf("select id_bilhetes, uniqueid from pbx_bilhetes where calldate < (now() - (interval '%s minutes')) and flag_fila = 'I'", StrToIntDef($minutes));
$result = pg_query($sql);
if (!$result) {
ibRaiseExcept("Nao possivel selecionar registros com flag_fila pendente!");
}
while ($row = pg_fetch_array($result)) {
$id = $row['id_bilhetes'];
/*
* Marca a chamda com entrante na fila, para facilitar a emissao de relatorios e
* atualiza o biillsec caso verdadeiro. O campo flag_fila contera 'S' quando identificado
* na importa bilhetes ou 'I' caso nao identificado, devido a informacoes entre a dacs e
* a bilhetes serem tratadas de forma assincrona outro procedimento fara novamente a
* checagem pars os registros onde flag_fila = 'I' atulizando para 'S' se a chamada
* pertencer a uma fila ou 'N' caso contrario.
*/
$conFlag = ChamadaFila($row['uniqueid'], 0);
$flagFila = !$conFlag ? "flag_fila = '$status'" : sprintf("flag_fila = 'S', billsec = '%s'", $conFlag);
$sql = sprintf("update pbx_bilhetes set %s where id_bilhetes = '%s' ", $flagFila, $id);
$resultUpd = pg_query($sql);
if (!$resultUpd) {
ibRaiseExcept("Nao possivel alterar a identificacao do registro!");
}
}
}
function impGetConnection() {
/*
* Se precisar de uma conexão diferente da padrão, espcifique sua propria connection string.
* $connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '127.0.0.1', '5432', 'pbx', 'contacte', 'ctepgSQL');
*/
$connStr = '';
$connStr = !$connStr ? GetDefStrDb() : $connStr;
$conn = pg_connect($connStr);
if (!$conn) {
GeraExcept("Não foi possível estabelecer uma conexão com o banco de dados!");
}
return $conn;
}
function ImportaAstEventosDacs($dbcon) {
global $numDacs;
/*
* Importa a tabela ast_eventos_dacs.
*/
$sql = "insert
into pbx_eventos_dacs (id,uid1, uid2, fila, agente, evento, param1, param2, param3, param4)
select id, uid1, uid2, fila, agente, evento, param1, param2, param3, param4
from ast_eventos_dacs a
where not exists(select '' from pbx_eventos_dacs where id = a.id)";
if (!$result = pg_query($dbcon, $sql)) {
ibRaiseExcept("Nao possivel importar a tabela ast_eventos_dacs!");
}
$numDacs = pg_affected_rows($result);
}
function ImportaAstBilhetes($dbcon) {
global $numBilhetes;
$query = "drop table if exists tb_parametros;
create temporary table tb_parametros as
select (select min(id) mun_padrao from pbx_municipios where to_ascii(nome_localidade) = (select to_ascii(prm_mun_padrao) from pbx_parametros) and uf = (select prm_uf_padrao from pbx_parametros)) as mun_padrao, (select prm_ddd_padrao from pbx_parametros) as prm_ddd_padrao;
-- MELHOR DESEMPENHO EM PESQUISA DE MUNICIPIO PARA CELULAR
drop table if exists tb_municipios; create temporary table tb_municipios as select min(id) as id, codigo_ddd from pbx_municipios group by codigo_ddd;
drop table if exists tb_tipo_ligacao; create temporary table tb_tipo_ligacao as
select id_bilhetes, uniqueid, dst, tipo_chamada, flag_fila, case when(ast.prefixo = 0)then 0 else
case ast.tipo_chamada
when(21)then (select mun_padrao from tb_parametros)
when(22)then (select min(id) from pbx_municipios where prefixo = ast.prefixo and ast.sufixo >= faixa_inicial and ast.sufixo <= faixa_final)
when(23)then (select mun_padrao from tb_parametros)
when(24)then (select min(id) from tb_municipios where codigo_ddd = ast.prefixo)
when(31)then (select mun_padrao from tb_parametros)
when(32)then (select min(id) from pbx_municipios where prefixo = ast.prefixo and ast.sufixo >= faixa_inicial and ast.sufixo <= faixa_final)
when(33)then (select mun_padrao from tb_parametros)
when(34)then (select min(id) from tb_municipios where codigo_ddd = ast.prefixo)
else 0 end
end as id_municipio
from (
select *,
case prf.tipo_chamada
when(21)then strtoint(((select prm_ddd_padrao::text from tb_parametros) || substring(prf.dst,1,4)))
when(22)then strtoint(substring(substring(prf.dst,'..........$'), 1,6))
when(23)then (select prm_ddd_padrao from tb_parametros)
when(24)then strtoint(substring(substring(prf.dst,'...........$'), 1,2))
when(31)then strtoint(((select prm_ddd_padrao::text from tb_parametros) || substring(prf.dst,1,4)))
when(32)then strtoint(substring(substring(prf.dst,'..........$'), 1,6))
when(33)then (select prm_ddd_padrao from tb_parametros)
when(34)then strtoint(substring(substring(prf.dst,'...........$'), 1,2))
else
0
end as prefixo,
strtoint(substring(prf.dst,'....$')) as sufixo, case when(exists(select '' from ast_eventos_dacs where uid2 = prf.uniqueid))then 'S' else 'N' end as flag_fila
from (
select id_bilhetes, direcao,
case direcao
when('E')then sonumero(src)
when('S')then sonumero(dst)
else
'-'
end as dst,
uniqueid,
case when(direcao = 'I')then 1
else
tipoligacao(trim(case when(direcao = 'E')then sonumero(src) else sonumero(dst) end), case when(direcao = 'E')then true else false end)
end as tipo_chamada
from ast_bilhetes a
where not exists(select '' from pbx_bilhetes where id_bilhetes = a.id_bilhetes)
) as prf
) as ast;
create index \"tb_tipo_ligacaoIdBilhetes\" on tb_tipo_ligacao(id_bilhetes);
insert
into pbx_bilhetes(
id_bilhetes, calldate, clid, dst, dcontext, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, tipo_chamada, accountcode, uniqueid, userfield, data_bilhete, id_municipio, ramal_origem, fora_horario, flag_fila, src)
select a.id_bilhetes, calldate, clid, a.dst, dcontext, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, b.tipo_chamada, accountcode, a.uniqueid, userfield, calldate::date, b.id_municipio, ramal_origem, fora_horario, b.flag_fila, CASE WHEN(direcao = 'S')THEN coalesce(ramal_origem, src) ELSE src END AS src
from ast_bilhetes a, tb_tipo_ligacao b
where b.id_bilhetes = a.id_bilhetes;
update ast_bilhetes a
set tipo_chamada = b.tipo_chamada,
flag_fila = b.flag_fila,
id_municipio = b.id_municipio
from tb_tipo_ligacao b
where b.id_bilhetes = a.id_bilhetes;";
if (!$result = pg_query($dbcon, $query)) {
ibRaiseExcept("Nao possivel importar a tabela ast_bilhetes!");
}
$numBilhetes = pg_affected_rows($result);
}
function ImportaAstBilhetesComplemento($dbcon) {
/*
* INICIO DA IM?ORTACAO DA TABELA "ast_bilhetes_complemento".
*/
$sql = "select coalesce(max(id),0) from pbx_bilhetes_complemento";
$result = pg_query($dbcon, $sql);
if (!$result) {
ibRaiseExcept("Nao possivel consultar o id na tabela pbx_eventos_dacs!");
}
$row = pg_fetch_row($result);
$maxIdComplemento = $row[0];
/*
* Importa a tabela ast_bilhetes_complemento.
*/
$sql = "insert
into pbx_bilhetes_complemento (uniqueid2,direcao,id,conta,fone,destino,data_registro,id_usuario,agente,dac)
select uniqueid2,direcao,id,conta,fone,destino,data_registro,id_usuario,agente,dac
from ast_bilhetes_complemento
where id > $maxIdComplemento";
if (!$result = pg_query($dbcon, $sql)) {
ibRaiseExcept("Nao possivel importar a tabela ast_bilhetes_complemento!");
}
}
function CorrigeNumeroDestino($dbcon) {
$query = "DROP TABLE IF EXISTS ast_corrige_destino;
CREATE TEMPORARY TABLE ast_corrige_destino(uid VARCHAR(32) NOT NULL PRIMARY KEY, dst VARCHAR(80));
INSERT INTO ast_corrige_destino
SELECT DISTINCT uniqueid, MIN(destino) FROM (
select a.uniqueid, case when(POSITION('/' IN b.agente) > 0)then SUBSTRING(b.agente, POSITION('/' IN b.agente) + 1) else sonumero(b.agente) end AS destino
from ast_bilhetes a, ast_eventos_dacs b
where b.uid2 = a.uniqueid
AND a.amaflags <> 99
and b.evento in('COMPLETEAGENT','COMPLETECALLER','TRANSFER')
AND POSITION('Agent/' IN b.agente) = 0
UNION
select a.uniqueid, case when(position( 'Local' in a.dstchannel) > 0)then
substring(a.dstchannel,7, position( '@' in a.dstchannel) -7 )
when(position( 'SIP' in a.dstchannel) > 0)then
substring(a.dstchannel,5, position( '-' in a.dstchannel) -5 )
else soNumero(a.dstchannel) end as destino
from ast_bilhetes a, ast_eventos_dacs b
where b.uid2 = a.uniqueid
AND a.amaflags <> 99
and b.evento in('COMPLETEAGENT','COMPLETECALLER','TRANSFER')
AND POSITION('Agent/' IN b.agente) > 0
) AS bilhetes_bilhetes GROUP BY uniqueid;
UPDATE ast_bilhetes
SET dst = ast_corrige_destino.dst, amaflags = 99
FROM ast_corrige_destino
WHERE ast_bilhetes.uniqueid = ast_corrige_destino.uid
AND coalesce(ast_corrige_destino.dst, '') <> '';";
if (!$result = pg_query($dbcon, $query)) {
ibRaiseExcept("Nao possivel importar a tabela ast_bilhetes_complemento!");
}
}
function AtualizaPreVenda($dbcon) {
$pathLog = '/var/log/asterisk/atrualiza_prevenda.log';
/*
* Lista os contatos que estao sendo discados na campanha de pre-venda e sincroniza com a
* base de clientes
*/
$sql = "select d.cmp_id, d.list_id, d.cont_id, d.conf_id, a.client_id as cont_identificador,d.conf_id, d.conf_uid, d.conf_status
from pbx_cliente a, pbx_campanha_contato_fone d
where d.cmp_id = a.cmp_id
and d.list_id = a.list_id
and d.cont_id = a.cont_id
and d.conf_discado = 1
and strtoint(d.conf_status) > 0
and d.conf_protocolo is null";
$result = pg_query($dbcon, $sql);
if (!$result) {
ibRaiseExcept("Nao possivel consultar contatos discados no pre-venda!");
}
WriteLog($sql, $pathLog);
while ($row = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$clientId = $row["cont_identificador"];
$clientStatus = $row["conf_status"];
$clientStatus = $row["conf_status"];
$confId = $row["conf_id"];
$inTran = 0;
try {
if (!pg_query($dbcon, 'begin')) {
ibRaiseExcept("Nao possíveliniciar a transacao para atualizar o registro do contato.");
}
$inTran++;
/*
* Atualiza o status dos contatos na tabela pbx_cliente
*/
$sql = "update pbx_cliente set client_status = '{$clientStatus}' where client_id = '{$clientId}'\n";
if (!pg_query($dbcon, $sql)) {
ibRaiseExcept("Nao possível atualizar o registro do contato.");
}
WriteLog($sql, $pathLog);
$sql = "update pbx_campanha_contato_fone set conf_protocolo = '1' where conf_id = '{$confId}'\n";
if (!pg_query($dbcon, $sql)) {
ibRaiseExcept("Nao possível atualizar o registro do contato.");
}
WriteLog($sql, $pathLog);
if (!pg_query($dbcon, 'commit')) {
ibRaiseExcept("Nao possível finalizar a transacao para atualizar o registro do contato.");
}
} catch (Exception $ex) {
if ($inTran) {
@pg_query($dbcon, 'rollback');
}
$log = sprintf("Erro:%s File: %s Line: %s \ncmd: %s\n %s\n", $ex->getMessage(), $ex->getFile(), $ex->getLine(), $sql, date('Y-m-d H:i:s'));
WriteLog($log, $pathLog);
}
}
}
?>