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.
 
 
 
 
 
 

874 lines
32 KiB

#!/usr/bin/php -q
<?php
error_reporting(E_ERROR);
ini_set('display_errors', 0);
ini_set("memory_limit", "512M");
/*
* Inclui funçoes genéricas.
*/
/*
* Registra ocorrências na aplicação.
*/
$patLog = "/var/log/asterisk/reprocessaVendas.log";
/*
* Parametros para importacao por range de data.
*/
$dataIni = '';
$dataFim = '';
$MAX_LIMIT_IMPORTA = 1000;
/*
* Para ambientes compartilhados os dados sao segmentados por filas,
* aqui devem ser informadas as filas ligadas ao cnpj em questao.
*/
$filas = isset($argv[1]) ? trim($argv[1]) : false;
/*
* Cnpj do cliente, a partir desse parametros iremos capturar o seu id na base remota.
* KNET -> '07980651000134'; IP -> 180
* NEW TELECOM -> "21843508000121"; IP -> 181
* MARTECC CELULAR -> "12324775000100"; IP -> 183
* SAICON-TEL -> "05029136000300"; IP -> 194
* PRIME TELECOM -> "18731324000165"; IP -> 198
*/
$cnpjCliente = isset($argv[2]) ? trim($argv[2]) : '15619300000120';
/*
* Id do cliente cadastrado na base remota, este parametro é importante para
* não haver conflito na base.
*/
$idCliente = 0;
/*
* Simples flag para o arquivo de pid nao ser apagado antes do inicios da execucao do script.
*/
$encerra = 0;
/*
* Arquivo para impedir a execução de dois scripts ao mesmo tempo.
*/
$dataFile = date("Y-m-d");
$fileProcess = "/tmp/reprocvendas_{$dataFile}_$cnpjCliente.pid";
//$fileProcess = '';
try {
/*
* Impede duas instancias do mesmo arquivo.
*
*/
// */30 * * * * root /var/lib/asterisk/scripts/vendas/consolidaVendas.php
if (vdsEmExecucao($fileProcess)) {
__GeraExcept__("Script já em execução!");
}
@vdsIniciaExec($fileProcess);
$encerra = true;
/*
* Aguarda um tempo aleatório para iniciar.
*/
//$tmp = rand(0, 120);
//sleep($tmp);
/*
* Realiza a conexao com o banco de dados remoto;
*/
/*
* Modifique esses valores antes da chamada para as funções de conexao para forçar uma
* conexao diferente da padrao.
*/
$dbServer = 'algar.simplesip.com.br';
$dbBase = '';
$dbPorta = '';
$userDb = '';
$dbPass = '';
$userApi = "sinccontasenha";
$senhaApi = "s3ncC0nt@S2nh@";
$connR = vdsGetConnectionR();
$revendasReproc = RevendasReproc($connR);
foreach ($revendasReproc as $cnpjCliente => $vpn) {
try {
/*
* Realiza a conexao com o banco de dados local;
*/
/*
* Modifique esses valores antes da chamada para as funções de conexao para forçar uma
* conexao diferente da padrao.
*/
echo "IP cliente: $vpn\n";
$dbServer = $vpn;
$dbBase = '';
$dbPorta = '';
$userDb = '';
$dbPass = '';
/*
* Configurações do servidor de banco de dados, as informações omitidas serão
* retornadas pela função padrão;
*/
$connL = vdsGetConnectionL();
/*
* Valida as filas passadas para base compartilhada.
$filasValidas = ValidaFilas($connL, $filas);
*/
/*
* Recupera o id do cliente na base remota.
*/
$idCliente = GetIdCliente($connR, $cnpjCliente);
VerificaReproc($connR, $connL, $idCliente);
/*
* Importação dos dados.
*/
ImportaUsuarios($connL, $connR, $filasValidas);
/*
* Importação das classificações.
*/
Importaclassificacoes($connL, $connR, $filasValidas);
/*
* Importação dos protocolos.
*/
ImportaProtocolos($connL, $connR, $filasValidas);
/*
* Importa as chamadas.
*/
ImportaChamadas($connL, $connR, $filasValidas);
/*
* Grava a data da ultima atualização no cloud;
*
*/
RegistraAtualizacao($connR, $idCliente);
} catch (Exception $ex) {
$log = sprintf("%s\n[%s]\n", __RemoveAcentos__($ex->getMessage()), __RemoveAcentos__(__GetLasterror__()));
@__WriteLog__($log, $patLog);
}
/*
* Libera a execuçaõ para uma nova instancia.
*/
@vdsEncerraExec($fileProcess);
}
} catch (Exception $ex) {
$log = sprintf("%s\n[%s]\n", __RemoveAcentos__($ex->getMessage()), __RemoveAcentos__(__GetLasterror__()));
@__WriteLog__($log, $patLog);
/*
* Libera a execuçaõ para uma nova instancia.
*/
if ($encerra) {
@vdsEncerraExec($fileProcess);
}
}
function GravaPacote($pacote, $nome) {
$result = CreateDir('/var/log/asterisk/vendas/rejeitados/');
if ($result) {
$result = file_put_contents($dir . $nome, $pacote);
}
if (!$result) {
__WriteLog__("Erro ao gravar pacote rejeitado: $nome \n [$pacote]\n", $patLog);
}
}
function GetIdCliente($conn, $cnpjCliente) {
$query = sprintf("select emp_id from vds_empresas where emp_cnpj = %s", __QuotedStr__($cnpjCliente));
$result = pg_query($conn, $query);
if (!$result) {
__GeraExcept__("Erro ao consultar o cliente na base remota!");
}
if (!pg_num_rows($result)) {
__GeraExcept__("Cliente não cadastrado na base remota!");
}
$dadosR = pg_fetch_row($result);
return $dadosR[0];
}
function VerificaReproc($connR, $connL, $idCliente) {
$query = sprintf("select '' from vds_empresas where emp_id = %s and emp_reproc = 9", __QuotedStr__($idCliente));
$result = pg_query($connR, $query);
if (!$result) {
__GeraExcept__("Erro ao consultar o cliente na base remota!");
}
if (pg_num_rows($result)) {
$query = " update pbx_bilhetes set integra_vendas = 0 where integra_vendas = 1;
update pbx_usuarios set integra_vendas = 0 where integra_vendas = 1;
update pbx_classifica_reg set integra_vendas = 0 where integra_vendas = 1;
update pbx_protocolo_reg set integra_vendas = 0 where integra_vendas = 1;";
try {
if (!pg_query($connL, 'begin')) {
__GeraExcept__("Erro ao iniciar o reprocessamento da base local!");
}
if (!pg_query($connL, $query)) {
__GeraExcept__("Erro ao reprocessar base local!");
}
$query = "update vds_empresas set emp_reproc = 2 where emp_id = '{$idCliente}'";
if (!pg_query($connR, $query)) {
__GeraExcept__("Erro ao confirmar reprocessamento na base remota!!!!!");
}
if (!pg_query($connL, 'commit')) {
__GeraExcept__("Erro ao finalizar o reprocessamento da base local!");
}
} catch (Exception $ex) {
$log = sprintf("%s\n[%s]\n", __RemoveAcentos__($ex->getMessage()), __RemoveAcentos__(__GetLasterror__()));
@__WriteLog__($log, $patLog);
}
}
}
function RevendasReproc($connR) {
$revendasReproc = array();
$query = "select emp_cnpj, emp_vpn from vds_empresas where emp_reproc = 9";
$result = pg_query($connR, $query);
if (!$result) {
__GeraExcept__("Erro ao consultar revendas para reprocessamento!");
}
if (!pg_num_rows($result)) {
return $revendasReproc;
}
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$revendasReproc[$dados['emp_cnpj']] = $dados['emp_vpn'];
}
return $revendasReproc;
}
function RegistraAtualizacao($connR, $idCliente) {
$query = "update vds_empresas set emp_ult_atualizacao = now() where emp_id = '{$idCliente}'";
@pg_query($connR, $query);
}
function ValidaFilas($connL, $filas) {
if (!$filas) {
return false;
}
$aFilas = preg_split('/[,;|]/', $filas);
$filasValidas = '';
/*
* Valida a fila individualmente.
*/
foreach ($aFilas as $fila) {
if (!is_numeric($fila)) {
$query = sprintf("select id from pbx_dacs where nome = %s and status = 'A'", __QuotedStr__($fila));
} else {
$query = sprintf("select id from pbx_dacs where id = %s and status = 'A'", __QuotedStr__($fila));
}
$result = pg_query($connL, $query);
if (!pg_num_rows($result)) {
__GeraExcept__(sprintf("A fila \"%s\" informada é inválida!", $fila));
}
$dados = pg_fetch_row($result);
$filasValidas .= !$filasValidas ? $dados[0] : ',' . $dados[0];
}
return $filasValidas;
}
function RegistraVendedor($conn, $apelido) {
global $idCliente;
$query = sprintf("select '' from vds_vendedores where emp_id = %s and vdr_apelido = %s", __QuotedStr__($idCliente), __QuotedStr__($apelido));
$result = pg_query($conn, $query);
if (!$result) {
__GeraExcept__("Erro ao consultar o vendedor na base remota!");
}
/*
* Registra o vendedor caso ele não exista.
*/
if (!pg_num_rows($result)) {
return true;
}
/*
* Vendeor já existe na base remota segue para o próximo registro.
*/
return false;
}
function DirDados($dirDados) {
if (!file_exists($dirDados)) {
exec("mkdir -p {$dirDados}");
exec("chown -R postgres:postgres {$dirDados}");
}
}
function ImportaNaoPerturbe($connL) {
global $idCliente, $dbServer, $userApi, $senhaApi;
$dirDados = "/dados/nao_perturbe/";
DirDados($dirDados);
$inTran = 0;
try {
$url = "http://{$dbServer}/integracao/?method=ListaNaoPerturbe&info=1&id={$idCliente}&login={$userApi}&senha={$senhaApi}&SIPID=&tipoRetorno=JSON/STREAM";
if (!$dadosLista = json_decode(file_get_contents($url), true)) {
__GeraExcept__("Nao foi possivel acessar a API: [{$url}]");
}
$Status = $dadosLista["result"] == 'true';
if ($Status) {
$npId = $dadosLista["np_id"];
$npMd5 = $dadosLista["np_md5"];
$fileName = __DIR__ . "/" . $dadosLista["np_name"];
$destName = $dirDados . str_replace(".tar.gz", ".npb", basename($fileName));
$md5 = $dadosLista["np_name"];
/*
* Quando $npIdeh maior que zero indica que tem um arquivo a ser baixado.
*/
if ($npId && !ConNpbLocal($connL, $npId)) {
$url = "http://{$dbServer}/integracao/?method=ListaNaoPerturbe&info=0&id={$npId}&login={$userApi}&senha={$senhaApi}&SIPID=&tipoRetorno=JSON/STREAM";
file_put_contents($fileName, file_get_contents($url));
if (!file_exists($fileName)) {
__GeraExcept__("Erro ao baixar o arquivo: [{$dadosLista['np_name']}]");
}
$md5 = md5_file($fileName);
if ($npMd5 !== $md5) {
__GeraExcept__("O arquivo baixado não esta integro [{$dadosLista['np_name']}]");
}
UnTar($fileName, dirname($destName));
if (!file_exists($destName)) {
__GeraExcept__("Erro ao descompactar o arquivo: [{$destName}]");
}
if (!pg_query($connL, "begin")) {
__GeraExcept__("Nao foi possivel iniciar uma transacao com o banco de dados!");
}
$inTran = 1;
/*
* Apaga a base de dados atual.
*/
if (!pg_query($connL, "truncate table pbx_nao_perturbe;")) {
__GeraExcept__("Nao foi possivel limpara a base nao perturbe!");
}
/*
* Apaga a base de dados atual.
*/
if (!pg_query($connL, "COPY pbx_nao_perturbe FROM '{$destName}'")) {
__GeraExcept__("Nao foi possivel importar a base nao perturbe!");
}
/*
* Apaga o arquivo descompactado.
*/
unlink($destName);
/*
* Registra a atualização da lista no servidor;
*/
if (!RegNpbRemoto($npId)) {
RegNpbLocal($connL, $npId);
}
if (!pg_query($connL, "commit")) {
__GeraExcept__("Nao foi possivel finalizr uma transacao com o banco de dados!");
}
/*
* Cria a lista negra;
*/
ListaNegraNaoPerturbe($connL);
}
}
return true;
} catch (Exception $ex) {
if ($inTran) {
pg_query($connL, "rollback");
}
$log = sprintf("%s\n[%s]\n", __RemoveAcentos__($ex->getMessage()), __RemoveAcentos__(__GetLasterror__()));
@__WriteLog__($log, $patLog);
return false;
}
}
function ConNpbLocal($connL, $npId) {
global $idCliente;
/*
* Em caso de falha ao registrar o arquivo no servidor o mesmo eh registrado localmente.
*/
$query = "select '' from pbx_nao_perturbe_cliente where emp_id = '{$idCliente}' and np_id = {$npId} ";
$result = (($result = pg_query($connL, $query)) && pg_num_rows($result));
/*
* Se o arquivo esta registrado localmente, tenta novamente o registro no servidor antes de retornar.
*/
if ($result) {
RegNpbRemoto($npId);
}
return $result;
}
function RegNpbLocal($connL, $npId) {
global $idCliente;
/*
* Em caso de falha ao registrar o arquivo no servidor o mesmo eh registrado localmente.
*/
$query = sprintf("insert into pbx_nao_perturbe_cliente(np_id, emp_id)values(%s, %s);", __QuotedStr__($npId), __QuotedStr__($idCliente));
$result = pg_query($connL, $query);
return $result;
}
function RegNpbRemoto($npId) {
global $idCliente, $dbServer, $userApi, $senhaApi;
$url = "http://{$dbServer}/integracao?method=RegNaoPerturbe&idCliente={$idCliente}&npId={$npId}&login={$userApi}&senha={$senhaApi}&SIPID=&tipoRetorno=JSON/STREAM";
return file_get_contents($url) == 'OK';
}
function ImportaUsuarios($connL, $connR, $filas = '') {
global $idCliente;
if ($filas) {
$query = "select nome, apelido, matricula, email from pbx_usuarios a where integra_vendas = 0 and apelido not in('admin', 'sinccontasenha') and exists(select '' from pbx_eventos_agentes where matricula = a.matricula and id_dac in($filas));";
} else {
$query = "select nome, apelido, matricula, email from pbx_usuarios where integra_vendas = 0 and apelido not in('admin', 'sinccontasenha');";
}
$result = pg_query($connL, $query);
if (!$result) {
__GeraExcept__("Não foi possível consultar os vendedores!");
}
if (!pg_num_rows($result)) {
return false;
}
$integrar = array();
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$nome = $dados['nome'];
$apelido = $dados['apelido'];
$matricula = $dados['matricula'];
$email = $dados['email'];
if (RegistraVendedor($connR, $apelido)) {
$cmd = sprintf("insert into vds_vendedores(emp_id, vdr_nome, vdr_apelido, vdr_matricula, vdr_email)values(%s,%s,%s,%s,%s);", __QuotedStr__($idCliente), __QuotedStr__($nome), __QuotedStr__($apelido), __QuotedStr__($matricula), __QuotedStr__($email));
$cmdResult = pg_query($connR, $cmd);
if ($cmdResult && pg_affected_rows($cmdResult)) {
/*
* Guarda o registro para alterar o status para integrado;
*/
$integrar[] = $apelido;
}
} else {
/*
* Aplido já existe na base porem seu status esta com não importado.
*/
$integrar[] = $apelido;
}
}
/*
* Marca os registros com integrado na base de dados.
*/
foreach ($integrar as $apelido) {
$query = sprintf("update pbx_usuarios set integra_vendas = 1 where apelido = %s;", __QuotedStr__($apelido));
@pg_query($connL, $query);
}
}
function Importaclassificacoes($connL, $connR, $filas = '') {
global $idCliente, $dataIni, $dataFim;
$fltData = ($dataIni && $dataFim) ? sprintf(" and data_reg::date >= '%s' and data_reg::date <= '%s' ", $dataIni, $dataFim) : '';
$setFilas = $filas ? "and d.id in($filas)" : "";
$query = "select a.id_bilhetes, a.matricula, b.clas_descricao, c.clit_descricao, a.data_reg, d.nome as id_dac, a.clas_id,a. clit_id
from pbx_classifica_reg a, pbx_classifica_atendimento b, pbx_classifica_item c, pbx_dacs d
where b.clas_id = a.clas_id
and c.clit_id = a.clit_id
and d.id = a.id_dac
and integra_vendas = 0 $setFilas $fltData limit {$MAX_LIMIT_IMPORTA};";
/*
* Vai integrando 100 registros por vez até terminar;
*/
$limit = 0;
while (true) {
$result = pg_query($connL, $query);
if (!$result) {
__GeraExcept__("Não foi possível consultar as classificações![Importaclassificacoes]");
}
if (!pg_num_rows($result)) {
return true;
}
$linhasInsertR = '';
$insertR = "insert into vds_classificacoes(emp_id, uid, clas_matricula, clas_descricao, clas_descricao_item, clas_reg, clas_dac)values(%s,%s,%s,%s,%s,%s,%s);\n";
$linhasUpdateL = '';
$updateL = "update pbx_classifica_reg set integra_vendas = 1 where id_bilhetes = %s and clas_id = %s and clit_id = %s;\n";
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$uid = $dados['id_bilhetes'];
$matricula = $dados['matricula'];
$clas_descricao = $dados['clas_descricao'];
$clit_descricao = $dados['clit_descricao'];
$data_reg = $dados['data_reg'];
$id_dac = $dados['id_dac'];
$clas_id = $dados['clas_id'];
$clit_id = $dados['clit_id'];
/*
* Monta o pacore de registro para inserir no servidor remoto.
*/
$linhasInsertR .= sprintf($insertR, __QuotedStr__($idCliente), __QuotedStr__($uid), __QuotedStr__($matricula), __QuotedStr__($clas_descricao), __QuotedStr__($clit_descricao), __QuotedStr__($data_reg), __QuotedStr__($id_dac));
/*
* Monta o pacote para marcar os registros locais como atualizado.
*/
$linhasUpdateL .= sprintf($updateL, __QuotedStr__($uid), __QuotedStr__($clas_id), __QuotedStr__($clit_id));
usleep(30);
}
/*
* Inicia uma transação com o servidor remoto.
*/
$resultR = pg_query($connR, 'begin');
if (!$resultR) {
__GeraExcept__("Não foi possível iniciar uma transação com o servidor remoto![Importaclassificacoes]");
}
/*
* Executa o pacote de dados;
*/
$resultR = pg_query($connR, $linhasInsertR);
if (!$resultR) {
@pg_query($connR, 'rollback');
__GeraExcept__("Não foi possível inserir dados no servidor remoto![Importaclassificacoes]");
}
/*
* Atualiza o pacote de dados local.
*/
$result = pg_query($connL, $linhasUpdateL);
if (!$result) {
@pg_query($connR, 'rollback');
__GeraExcept__("Não foi possível atualizar os registros no servidor local![Importaclassificacoes]");
}
$resultR = pg_query($connR, 'commit');
if (!$resultR) {
$pct = sprintf("%s%s.pct", "dadosClassificacao", date("Y-m-d-His"));
GravaPacote($linhasInsertR, $pct);
__GeraExcept__("Não foi possível iniciar uma transação com o servidor remoto![Importaclassificacoes]");
}
}
return true;
}
function ImportaProtocolos($connL, $connR, $filas = '') {
global $idCliente, $dataIni, $dataFim;
$fltData = ($dataIni && $dataFim) ? sprintf(" and \"dataReg\"::date >= '%s' and \"dataReg\"::date <= '%s' ", $dataIni, $dataFim) : '';
if ($filas) {
$query = "select uniqueid, ano, numproto, protocolo, protoparceiro, \"dataReg\" as data_reg from pbx_protocolo_reg a where integra_vendas = 0 and exists(select '' from pbx_eventos_dacs b, pbx_dacs c where c.nome = b.fila and b.uid2 = a.uniqueid and c.id in($filas)) limit {$MAX_LIMIT_IMPORTA};";
} else {
$query = "select uniqueid, ano, numproto, protocolo, protoparceiro, \"dataReg\" as data_reg from pbx_protocolo_reg where integra_vendas = 0 and exists(select '' from pbx_bilhetes where uniqueid = pbx_protocolo_reg.uniqueid) $fltData limit {$MAX_LIMIT_IMPORTA};";
}
/*
* Vai integrando 100 registros por vez até terminar;
*/
$limit = 0;
while (true) {
$result = pg_query($connL, $query);
if (!$result) {
__GeraExcept__("Não foi possível consultar protocolos![ImportaProtocolos]");
}
if (!pg_num_rows($result)) {
return true;
}
$linhasInsertR = '';
$insertR = "insert into vds_protcolos( emp_id, uid, prt_ano, prt_numproto, prt_protocolo, prt_proto_parceiro, data_protocolo)values(%s,%s,%s,%s,%s,%s,%s);\n";
$linhasUpdateL = '';
$updateL = "update pbx_protocolo_reg set integra_vendas = 1 where protocolo = %s;\n";
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$uid = $dados['uniqueid'];
$ano = $dados['ano'];
$numproto = $dados['numproto'];
$protocolo = $dados['protocolo'];
$protoparceiro = $dados['protoparceiro'];
$dataReg = $dados['data_reg'];
/*
* Monta o pacore de registro para inserir no servidor remoto.
*/
$linhasInsertR .= sprintf($insertR, __QuotedStr__($idCliente), __QuotedStr__($uid), __QuotedStr__($ano), __QuotedStr__($numproto), __QuotedStr__($protocolo), __QuotedStr__($protoparceiro), __QuotedStr__($dataReg));
/*
* Monta o pacote para marcar os registros locais como atualizado.
*/
$linhasUpdateL .= sprintf($updateL, __QuotedStr__($protocolo));
usleep(30);
}
/*
* Inicia uma transação com o servidor remoto.
*/
$resultR = pg_query($connR, 'begin');
if (!$resultR) {
__GeraExcept__("Não foi possível iniciar uma transação com o servidor remoto![ImportaProtocolos]");
}
/*
* Executa o pacote de dados;
*/
$resultR = pg_query($connR, $linhasInsertR);
if (!$resultR) {
@pg_query($connR, 'rollback');
__GeraExcept__("Não foi possível inserir dados no servidor remoto![ImportaProtocolos]");
}
/*
* Atualiza o pacote de dados local.
*/
$result = pg_query($connL, $linhasUpdateL);
if (!$result) {
@pg_query($connR, 'rollback');
__GeraExcept__("Não foi possível atualizar os registros no servidor local![ImportaProtocolos]");
}
$resultR = pg_query($connR, 'commit');
if (!$resultR) {
$pct = sprintf("%s%s.pct", "dadosProtocolo", date("Y-m-d-His"));
GravaPacote($linhasInsertR, $pct);
__GeraExcept__("Não foi possível iniciar uma transação com o servidor remoto![ImportaProtocolos]");
}
}
return true;
}
function ImportaChamadas($connL, $connR, $filas = '') {
global $idCliente, $dataIni, $dataFim;
$fltData = ($dataIni && $dataFim) ? sprintf(" and a.data_bilhete >= '%s' and a.data_bilhete <= '%s' ", $dataIni, $dataFim) : '';
$setFila = $filas ? "and exists(select '' from pbx_dacs where nome = b.fila and id in($filas))" : "";
$query = "select min(a.id_bilhetes) as id_bilhetes, a.uniqueid, a.data_bilhete, min(a.calldate) as calldate, a.src, min(case when(not isnumeric(sonumero(a.dst)))then '0' else sonumero(a.dst) end) as dst, sum(a.duration) as duration
, sum(case b.evento when 'COMPLETAAGENT' then billsec
when 'COMPLETACALLER' then a.billsec
when 'COMPLETEAGENT' then strtoint(b.param2)
when 'COMPLETECALLER' then strtoint(b.param2)
when 'TRANSFER' then a.billsec
when 'NOANSWERS' then 0 else a.billsec end) as billsec , a.userfield, b.fila, sonumero(b.agente) as matricula, b.evento
from pbx_bilhetes a, pbx_eventos_dacs b
where b.uid2 = a.uniqueid
and b.evento in ('COMPLETEAGENT','COMPLETECALLER','COMPLETAAGENT','COMPLETACALLER', 'TRANSFER', 'NOANSWERS')
and a.lastapp <> 'Transferred Call'
and integra_vendas = 0 $setFila $fltData
group by a.uniqueid, a.data_bilhete, a.src, a.userfield, b.fila, sonumero(b.agente), b.evento
order by id_bilhetes limit {$MAX_LIMIT_IMPORTA};";
/*
select a.id_bilhetes, a.uniqueid, a.data_bilhete, a.calldate, a.src, a.dst, a.duration
,case b.evento when 'COMPLETAAGENT' then billsec
when 'COMPLETACALLER' then a.billsec
when 'COMPLETEAGENT' then strtoint(b.param2)
when 'COMPLETECALLER' then strtoint(b.param2)
when 'TRANSFER' then a.billsec
when 'NOANSWERS' then 0 else a.billsec end as billsec , a.userfield, b.fila, sonumero(b.agente) as matricula, b.evento
from pbx_bilhetes a, pbx_eventos_dacs b
where b.uid2 = a.uniqueid
and b.evento in ('COMPLETEAGENT','COMPLETECALLER','COMPLETAAGENT','COMPLETACALLER', 'TRANSFER', 'NOANSWERS')
and integra_vendas = 0 order by id_bilhetes limit 100;
*/
/*
* Vai integrando 100 registros por vez até terminar;
*/
$limit = 0;
while (true) {
$result = pg_query($connL, $query);
if (!$result) {
__GeraExcept__("Não foi possível consultar protocolos![ImportaChamadas]");
}
if (!pg_num_rows($result)) {
return true;
}
$linhasInsertR = '';
$insertR = "insert into vds_chamadas(emp_id, uid, chm_data_bilhete, chm_calldate, chm_src, chm_dst, chm_duration, chm_billsec, chm_userfield, chm_fila, chm_matricula, chm_evento)values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);\n";
$linhasUpdateL = '';
$updateL = "update pbx_bilhetes set integra_vendas = 1 where id_bilhetes = %s;\n";
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
$uid = $dados['uniqueid'];
$id_bilhetes = $dados['id_bilhetes'];
$data_bilhete = $dados['data_bilhete'];
$calldate = $dados['calldate'];
$src = $dados['src'];
$dst = $dados['dst'];
$duration = $dados['duration'];
$billsec = $dados['billsec'];
$userfield = $dados['userfield'];
$fila = $dados['fila'];
$matricula = $dados['matricula'];
$evento = $dados['evento'];
/*
* Monta o pacore de registro para inserir no servidor remoto.
*/
$linhasInsertR .= sprintf($insertR, __QuotedStr__($idCliente), __QuotedStr__($uid), __QuotedStr__($data_bilhete), __QuotedStr__($calldate), __QuotedStr__($src), __QuotedStr__($dst), __QuotedStr__($duration), __QuotedStr__($billsec), __QuotedStr__($userfield), __QuotedStr__($fila), __QuotedStr__($matricula), __QuotedStr__($evento));
/*
* Monta o pacote para marcar os registros locais como atualizado.
*/
$linhasUpdateL .= sprintf($updateL, __QuotedStr__($id_bilhetes));
usleep(30);
}
/*
* Inicia uma transação com o servidor remoto.
*/
$resultR = pg_query($connR, 'begin');
if (!$resultR) {
__GeraExcept__("Não foi possível iniciar uma transação com o servidor remoto![ImportaChamadas]");
}
/*
* Executa o pacote de dados;
*/
$resultR = pg_query($connR, $linhasInsertR);
if (!$resultR) {
@pg_query($connR, 'rollback');
__GeraExcept__("Não foi possível inserir dados no servidor remoto![ImportaChamadas]");
}
/*
* Atualiza o pacote de dados local.
*/
$result = pg_query($connL, $linhasUpdateL);
if (!$result) {
@pg_query($connR, 'rollback');
__GeraExcept__("Não foi possível atualizar os registros no servidor local![ImportaChamadas]");
}
$resultR = pg_query($connR, 'commit');
if (!$resultR) {
$pct = sprintf("%s%s.pct", "dadosChamadas", date("Y-m-d-His"));
GravaPacote($linhasInsertR, $pct);
__GeraExcept__("Não foi possível iniciar uma transação com o servidor remoto![ImportaChamadas]");
}
}
return true;
}
function vdsGetConnectionL() {
global $dbServer, $dbBase, $dbPorta, $userDb, $dbPass;
include "configBd.php";
$connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", ($dbServer ? $dbServer : $dbHost), ($dbPorta ? $dbPorta : $dbPort), ($dbBase ? $dbBase : $dbName), ($userDb ? $userDb : $dbUser), ($dbPass ? $dbPass : $dbPassword));
/*
* Esta função retorna informações default para parametros omitidos.
*/
$conn = pg_connect($connStr);
/*
* Verifica se a conexão foi realizada.
*/
if (!$conn) {
__GeraExcept__("Não foi possível estabelecer uma conexão com o banco de dados!");
}
return $conn;
}
function vdsGetConnectionR() {
global $dbServer, $dbBase, $dbPorta, $userDb, $dbPass;
/*
* Esta função retorna informações default para parametros omitidos.
*/
$conn = __GetAlernativeDB__($dbServer, $dbPorta, $dbBase, $userDb, $dbPass);
/*
* Verifica se a conexão foi realizada.
*/
if (!$conn) {
__GeraExcept__("Não foi possível estabelecer uma conexão com o banco de dados!");
}
return $conn;
}
function vdsIniciaExec($filename) {
@file_put_contents($filename, "xxxxxxx\n");
}
function vdsEmExecucao($filename) {
return file_exists($filename);
}
function vdsEncerraExec($filename) {
@unlink($filename);
}
function __GeraExcept__($msg) {
throw new Exception($msg);
}
function __RaiseExcept__($msg, $dbError = false) {
if ($dbError) {
$msg .= " DB: " . pg_last_error();
}
GeraExcept($msg . "\n");
}
function __WriteLog__($log, $path = '') {
if (!$path) {
$path = '/var/log/asterisk/log_geral.log';
}
$arq = fopen($path, 'a');
fwrite($arq, $log);
fclose($arq);
}
function __GetAlernativeDB__($hostDb = '', $portDb = '', $nameDb = '', $userDb = '', $passDb = '') {
include "configBd.php";
$portDb = $portDb ? $dbPort : $dbPort;
$hostDb = $hostDb ? $hostDb : $dbHost;
$nameDb = $nameDb ? $nameDb : $dbName;
$userDb = $userDb ? $userDb : $dbUser;
$passDb = $passDb ? $passDb : $dbPassword;
$str = "host='$hostDb' port='$portDb' dbname='$nameDb' user='$userDb' password='$passDb'";
return @pg_connect($str, PGSQL_CONNECT_FORCE_NEW);
}
function __QuotedStr__($str) {
return sprintf("'%s'", pg_escape_string(trim($str)));
}
function __RemoveAcentos__($str, $upper = False) {
$text = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý');
$subs = array('A', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'U', 'P', 'B', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y');
for ($i = 0; $i < strlen($str); $i++) {
$j = array_search($str[$i], $text);
if ($j)
$str[$i] = $subs[$j];
}
if ($upper)
$str = strtoupper($str);
return($str);
}
function __GetLasterror__() {
$erro = error_get_last();
return trim($erro['message']);
}