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.
 
 
 
 
 
 

1037 lines
37 KiB

<?php
/*
* Constantes
*/
define("_LOG_MSG_ERROR", 1);
define("_LOG_MSG_ALL", 2);
define("_LOG_MSG_DISPLAY", 3);
/*
* funcoes compartilhadas
* - GetDddPadrao()($numero) -> Se passado um numero retorna concatenado com ddd padrao, se nao retorna somente o ddd.
* - GetSpid($numero) -> Faz pesquisa no banco de dadodos da portabilidade e retorna o sipid da operadora relacionada.
* - GetTipoChamada($destino, $dddPadao) -> verifica se a chamada e para fixo, movel, local ou interurbano pela analise do destino informado.
* Retorna um array contendo tipo dispositivo, tipo da chamada, numero da operadora.
*/
//Funcao verifica operadora - Amarildo Pereira 37 99669 7131
function GetSpid(&$numero) {
$flInter = substr($numero, 0, 2);
if (($flInter != '00') && (substr($numero, 0, 1) == '0'))
$numero = substr($numero, 1);
$tam = strlen($numero);
if (($tam == 8) || (($tam == 9) && (substr($numero, 0, 1) == '9'))) {
$numeroBusca = $numero;
$numeroBusca = GetDddPadrao($numeroBusca);
$tam = strlen($numeroBusca);
$prefixo = substr($numeroBusca, 0, ($tam - 4));
$sufixo = substr($numeroBusca, -4);
return GetSpidBd($numeroBusca, $prefixo, $sufixo);
} else {
/*
* Tenta achar o numero com 10 ou 11 digitos validos.
*/
$prefixo = substr($numero, 0, ($tam - 4));
$sufixo = substr($numero, -4);
$ret = GetSpidBd($numero, $prefixo, $sufixo);
if ($ret)
return $ret;
/*
* Numero fornecido com 11 digitros mas apenas os 10 ultimos seo validos.
*/
$numero = substr($numero, 1);
$tam = strlen($numero);
$prefixo = substr($numero, 0, ($tam - 4));
$sufixo = substr($numero, -4);
return GetSpidBd($numero, $prefixo, $sufixo);
}
}
function GetSpidBd($numero, $prefixo, $sufixo) {
$nonoDigito = (strlen($numero) == 11);
$numeroConsulta = $numero;
$numero_Consulta = $numero;
$ddd_ini = substr($numero, 0, 1);
if ($nonoDigito) {
$numeroConsulta = substr($numero, 0, 2) . substr($numero, 3, 8);
}
if ((strlen($numero) == 10) && (($ddd_ini != '4' ) || ($ddd_ini != '5' ))) {
$numero_Consulta = substr($numero, 0, 2) . '9' . substr($numero, 2, 8);
}
$query = "select spid from portabilidade where (tel_doadora = '$numeroConsulta' or tel_doadora = '$numero_Consulta' or tel_doadora = '$numero')";
$result = pg_query($query);
if (!$result || !pg_num_rows($result)) {
$oper = GetOperNumero($numero);
return $oper ? $oper : false;
}
$dados = pg_fetch_row($result);
return !pg_num_rows($result) ? false : $dados[0];
}
function GetOperadoraRelacionada($operadora) {
/*
* funcao busca por operadoras que se relacionam, ou seja, se a operadora
* passada estiver relacionada a outra e porque deve sair pelo tronco dessa,
* ex.: Em algumas localidades a TNL->331 dever sair pelo tronco OI->314.
* Este relacionamento deve ser configurado na aplicacao web menu:
* Ferramentas->Tarifacao/Portabilidade->Operadoras.
*/
$query = "select oper_spid from pbx_operadora_rel where oper_spid_rel = '$operadora'";
$result = pg_query($query);
$dados = pg_fetch_row($result);
/*
* Se nao encontrar uma operadora relacionada, retorna a mesma passada.
*/
return !pg_num_rows($result) ? $operadora : $dados[0];
}
function GetTipoChamada($destino, $dddPadrao = '0') {
/*
* ddd -> 65
* operadodra -> 021
* 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01
* | | | | | | | | | | | | | | | | | |
* 9 2 8 9 3 9 1 3 -> Movel Local 08 digitos iniciado em ['6','7','8','9'].
* 9 9 2 8 9 3 9 1 3 -> Movel Local 09 digitos.
* 6 5 9 9 2 8 9 3 9 1 3 -> Movel Local 11 digitos (ddd = padrao).
* 6 5 9 2 8 9 3 9 1 3 -> Movel Local 10 digitos (ddd = padrao) + numero iniciado em ['6','7','8','9'].
* 6 7 9 2 8 9 3 9 1 3 -> Movel Interurbano 10 digitos (ddd != padrao) + numero iniciado em ['6','7','8','9'].
* 0 2 1 6 7 9 2 8 9 3 9 1 3 -> Movel Interurbano 13 digitos operadora + (ddd != padrao) + numero iniciado em ['6','7','8','9'].
* 0 2 1 6 7 9 9 2 8 9 3 9 1 3 -> Movel Interurbano 14 digitos operadora + (ddd != padrao) + numero iniciado em ['6','7','8','9'].
* 6 7 9 9 2 8 9 3 9 1 3 -> Movel Interurbano 11 digitos (ddd != padrao).
* 3 6 1 4 3 9 1 3 -> Fixo Local 08 digitos iniciado em ['2','3','4','5'].
* 6 5 3 6 1 4 3 9 1 3 -> Fixo Local 10 digitos (ddd = padrao) + numero, iniciado em ['2','3','4','5'].
* 6 7 3 6 1 4 3 9 1 3 -> Fixo Interurbano 10 digitos (ddd != padrao) + numero, iniciado em ['2','3','4','5'].
* 0 2 1 6 7 3 6 1 4 3 9 1 3 -> Fixo Interurbano 13 digitos operadora + (ddd != padrao) + numero, iniciado em ['2','3','4','5'].
*/
$destino = trim($destino);
/*
* Chamadas iniciadas com "00" indicam uma ligacao internacional.
*/
$flInter = substr($destino, 0, 2);
/*
* Nao sendo uma chamada internacional, remove o "0" zero a esquerda.
*/
if (($flInter != '00') && (substr($destino, 0, 1) == '0')) {
$destino = substr($destino, 1);
}
$tam = strlen($destino);
$arMovel = array('6', '7', '8', '9');
$arEmergencia = array('100', '128', '190', '191', '192', '193', '194', '197', '198', '199');
if ($tam == 8) {
$ch = substr($destino, 0, 1);
return array('fixo', 'local', '0');
} else if (($tam > 8) && ($flInter == '00')) {
$oper = substr($destino, 2, 2);
return array('fixo', 'ddi', $oper);
} else if ($tam == 9) {
$ch = substr($destino, 0, 1);
if ($ch == '9') {
return array('movel', 'local');
}
return array('fixo', 'local', '0');
} else if ($tam == 10) {
$dddNum = substr($destino, 0, 2);
$ch = substr($destino, 2, 1);
if (($dddNum == $dddPadrao) && (array_search($ch, $arMovel)))
return array('movel', 'local', '0');
if (($dddNum != $dddPadrao) && (array_search($ch, $arMovel)))
return array('movel', 'inter', '0');
if ($dddNum == $dddPadrao)
return array('fixo', 'local', '0');
else
return array('fixo', 'inter', '0');
}
else if ($tam == 11) {
$dddNum = substr($destino, 0, 2);
$ch = substr($destino, -9, 1);
if ($dddNum == $dddPadrao) {
if ($ch == '9') {
return array('movel', 'local', '0');
}
return array('fixo', 'local', '0');
} else {
if ($ch == '9') {
return array('movel', 'inter', '0');
}
return array('fixo', 'inter', '0');
}
} else if ($tam == 13) {
$oper = substr($destino, 0, 2);
$dddNum = substr($destino, 2, 2);
$ch = substr($destino, 4, 1);
if (($dddNum == $dddPadrao) && (array_search($ch, $arMovel)))
return array('movel', 'local', $oper);
if (($dddNum != $dddPadrao) && (array_search($ch, $arMovel)))
return array('movel', 'inter', $oper);
if ($dddNum == $dddPadrao)
return array('fixo', 'local', '0');
else
return array('fixo', 'inter', $oper);
}
else if ($tam == 14) {
$oper = substr($destino, 0, 3);
$dddNum = substr($destino, 3, 2);
if ($dddNum == $dddPadrao)
return array('movel', 'local', $oper);
else
return array('movel', 'inter', $oper);
}
else {
if ((substr($destino, 0, 4) == '0800') || (array_search($destino, $arEmergencia)) || ($tam < 8))
return array('fixo', 'local', '0');
$dddNum = substr(substr($destino, -10), 0, 2);
$ch = substr(substr($destino, -8), 0, 1);
if (($dddNum == $dddPadrao) && (array_search($ch, $arMovel)))
return array('movel', 'local', '0');
if (($dddNum != $dddPadrao) && (array_search($ch, $arMovel)))
return array('movel', 'inter', '0');
if ($dddNum == $dddPadrao)
return array('fixo', 'local', '0');
else
return array('fixo', 'inter', '0');
}
}
function Ver0800($destino) {
$destino = trim($destino);
$str = substr($destino, -11);
return substr($str, 0, 4) == '0800' ? $str : $destino;
}
function GravaLogApl($mensagem, $nome_file = '', $login = '') {
$data = date('dmY');
if (!$nome_file) {
$nome_file = 'log_apl';
}
$file = sprintf("/var/log/asterisk/%s.log", $nome_file);
$arq = fopen($file, 'a');
if ($arq) {
$start = '';
foreach ($mensagem as $linha) {
$linha = trim($linha);
if (!$start) {
$start++;
fwrite($arq, sprintf("Inicio: %s%s\n", date('d/m/Y H:i:s'), ($login ? sprintf(" Login: %s", $login) : '')));
}
fwrite($arq, $linha . "\n");
}
fwrite($arq, "Final: $start\n\n");
fclose($arq);
}
}
function GetInfoTarifa($troncoId, $numOper, $destino, $dispositivo) {
global $log;
/*
* Informacoes do contrato relacionado ao tronco tronco
*/
$query = "select a.id, a.nome, b.contr_id, b.oper_id, c.oper_numero, b.contr_dia_fechamento, b.contr_bloq_franquia
from pbx_troncos a, pbx_tarif_contrato b, pbx_operadoras c
where b.contr_id = a.contrato
and c.oper_id = b.oper_id
and a.id = '$troncoId'";
$log[] = "GetInfoTarifa[\n.";
$log[] = "Query Contrato: $query";
$result = pg_query($query);
if (!pg_num_rows($result)) {
$info['oper_numero'] = (!$numOper) ? '0' : $numOper;
$info['contr_id'] = 0;
$info['oper_id'] = 0;
$info['trr_tipo_opera'] = 0;
$info['oper_numero_dest'] = $info['oper_numero'];
$info['trr_tarifa_zero'] = 0;
$info['oper_id_dest'] = 0;
$info['contr_id_dest'] = 0;
$info['contr_dia_fechamento'] = 0;
$info['contr_bloq_franquia'] = 0;
$info['prc_id'] = 0;
$info['trr_preco_tipo'] = 0;
$info['trr_vc1'] = 0;
$info['trr_vc2'] = 0;
$info['trr_vc3'] = 0;
$info['trr_vc4'] = 0;
$info['trr_vc5'] = 0;
$info['trr_vc6'] = 0;
$info['trr_vc1_cad'] = 0;
$info['trr_vc2_cad'] = 0;
$info['trr_vc3_cad'] = 0;
$info['trr_vc4_cad'] = 0;
$info['trr_vc5_cad'] = 0;
$info['trr_vc6_cad'] = 0;
$info['trr_vc1_ext'] = 0;
$info['trr_vc2_ext'] = 0;
$info['trr_vc3_ext'] = 0;
$info['trr_vc4_ext'] = 0;
$info['trr_vc5_ext'] = 0;
$info['trr_vc6_ext'] = 0;
$info['prc_franquia'] = 0;
} else {
$dados = pg_fetch_array($result);
$info = array();
$contrId = $dados['contr_id'];
$numOperContrato = $dados['oper_numero'];
$info['oper_numero'] = $dados['oper_numero'];
$info['contr_id'] = $dados['contr_id'];
$info['oper_id'] = $dados['oper_id'];
$tipoOpera = (!$numOper) || ($numOper == $numOperContrato) ? 0 : 1;
$info['trr_tipo_opera'] = $tipoOpera;
$info['oper_numero_dest'] = $tipoOpera ? $numOper : $dados['oper_numero'];
$info['contr_dia_fechamento'] = $dados['contr_dia_fechamento'];
$info['contr_bloq_franquia'] = $dados['contr_bloq_franquia'];
$query = "select count(*) from pbx_tarif_contrato_tarifa_zero where contr_id = '$contrId' and trz_numero = '$destino'";
$result = pg_query($query);
$dados = pg_fetch_row($result);
$info['trr_tarifa_zero'] = $dados[0];
$queryPrec = "select prc_id, prc_tipo, prc_franquia, prc_franquia_movel, prc_franquia_preco, prc_preco_vc1, prc_preco_vc2,
prc_preco_vc3,prc_preco_vc4, prc_preco_vc5, prc_preco_vc6, a.prc_preco_vc1_cad, a.prc_preco_vc2_cad, a.prc_preco_vc3_cad, a.prc_preco_vc4_cad, a.prc_preco_vc5_cad,a.prc_preco_vc6_cad, a.prc_preco_vc1_ext,
a.prc_preco_vc2_ext, a.prc_preco_vc3_ext, a.prc_preco_vc4_ext, a.prc_preco_vc5_ext,a.prc_preco_vc6_ext, b.oper_id, b.contr_id
from pbx_tarif_contrato_preco a, pbx_tarif_contrato b
where b.contr_id = a.contr_id
and a.prc_id = (
select max(prc_id) as prc_id from pbx_tarif_contrato_preco
where contr_id = %s
and prc_vigencia <= now()::date
)";
if ($tipoOpera) {
$queryCompl = sprintf('select b.contr_id from pbx_operadoras a, pbx_tarif_contrato b where b.oper_id = a.oper_id and b.contr_tipo = %s and a.oper_numero = %s', QuotedStr($dispositivo), QuotedStr($numOper));
$query = sprintf($queryPrec, "($queryCompl)");
$log[] = "Query preco: $query";
$result = pg_query($query);
$dados = pg_fetch_array($result);
}
if ((!$tipoOpera) || (($tipoOpera) && (!pg_num_rows($result)))) {
$query = sprintf($queryPrec, QuotedStr($contrId));
$log[] = "Query preco: $query";
$result = pg_query($query);
$dados = pg_fetch_array($result);
}
if (!$result) {
$erro = error_get_last();
$log[] = "Erro: " . $erro['message'] . " Cmd: $query";
}
$info['oper_id_dest'] = $dados['oper_id'];
$info['contr_id_dest'] = $dados['contr_id'];
$info['prc_id'] = $dados['prc_id'];
$info['trr_preco_tipo'] = trim($dados['prc_tipo']);
$info['trr_vc1'] = $dados['prc_preco_vc1'];
$info['trr_vc2'] = $dados['prc_preco_vc2'];
$info['trr_vc3'] = $dados['prc_preco_vc3'];
$info['trr_vc4'] = $dados['prc_preco_vc4'];
$info['trr_vc5'] = $dados['prc_preco_vc5'];
$info['trr_vc6'] = $dados['prc_preco_vc6'];
$info['trr_vc1_cad'] = $dados['prc_preco_vc1_cad'];
$info['trr_vc2_cad'] = $dados['prc_preco_vc2_cad'];
$info['trr_vc3_cad'] = $dados['prc_preco_vc3_cad'];
$info['trr_vc4_cad'] = $dados['prc_preco_vc4_cad'];
$info['trr_vc5_cad'] = $dados['prc_preco_vc5_cad'];
$info['trr_vc6_cad'] = $dados['prc_preco_vc6_cad'];
$info['trr_vc1_ext'] = $dados['prc_preco_vc1_ext'];
$info['trr_vc2_ext'] = $dados['prc_preco_vc2_ext'];
$info['trr_vc3_ext'] = $dados['prc_preco_vc3_ext'];
$info['trr_vc4_ext'] = $dados['prc_preco_vc4_ext'];
$info['trr_vc5_ext'] = $dados['prc_preco_vc5_ext'];
$info['trr_vc6_ext'] = $dados['prc_preco_vc6_ext'];
$info['prc_franquia'] = $dados['prc_franquia'];
}
return $info;
}
function GetTempoPrepago($db, $contaSenha, $origem, $destino, $tronco) {
/*
* Esta funcao havalia se a origem esta incluida no sistema de prepago.
* Retorna o tempo disponivel para conversacao conforme o destino.
* Retorna -1 se nao estiver habilitado, se nao existir.
* Retorna -2 se estiver incluido no tarifa 0.
* Retorna -3 se retornar erro.
*/
$query = "select habilita_prepago, saldo_prepago, (select prm_prepago from pbx_parametros limit 1) as pre_pago from pbx_prepago where tipo = '$contaSenha' and id = '$origem'";
$result = pg_query($db, $query);
/*
* Numero inexistente ou erro na consulta.
*/
if (!$result)
return -3;
if (!pg_num_rows($result))
return -1;
$dados = pg_fetch_array($result);
/*
* Nao esta habilitado nos parametros ou a origem nao esta habilitada.
*/
if (!$dados['pre_pago'] || !$dados['habilita_prepago'])
return -1;
/*
* Nao tem saldo.
*/
$saldoPrepago = $dados['saldo_prepago'];
if (!$saldoPrepago)
return 0;
$dddPadrao = GetDddPadrao();
$tpChamada = GetTipoChamada($destino, $dddPadrao);
$dispositivo = $tpChamada[0];
$tipoChamada = $tpChamada[1];
$numOper = $tpChamada[2];
/*
* Esta funcao retorna informacoes sobre o contrato e precos
*/
$infoContrato = GetInfoTarifa($tronco, $numOper, $origem, $dispositivo);
if (($dispositivo == 'fixo') && ($tipoChamada == 'local')) {
$info['trr_vc_cad'] = $infoContrato['trr_vc1_cad'];
$info['trr_vc_ext'] = $infoContrato['trr_vc1_ext'];
$info['trr_vc'] = 'vc1';
$info['trr_preco'] = $infoContrato['trr_vc1'];
}
if (($dispositivo == 'fixo') && ($tipoChamada == 'inter')) {
$info['trr_vc_cad'] = $infoContrato['trr_vc2_cad'];
$info['trr_vc_ext'] = $infoContrato['trr_vc2_ext'];
$info['trr_vc'] = 'vc2';
$info['trr_preco'] = $infoContrato['trr_vc2'];
}
if (($dispositivo == 'fixo') && ($tipoChamada == 'ddi')) {
$info['trr_vc_cad'] = $infoContrato['trr_vc5_cad'];
$info['trr_vc_ext'] = $infoContrato['trr_vc5_ext'];
$info['trr_vc'] = 'vc5';
$info['trr_preco'] = $infoContrato['trr_vc5'];
}
if (($dispositivo == 'movel') && ($tipoChamada == 'local')) {
$info['trr_vc_cad'] = $infoContrato['trr_vc3_cad'];
$info['trr_vc_ext'] = $infoContrato['trr_vc3_ext'];
$info['trr_vc'] = 'vc3';
$info['trr_preco'] = $infoContrato['trr_vc3'];
}
if (($dispositivo == 'movel') && ($tipoChamada == 'inter')) {
$info['trr_vc_cad'] = $infoContrato['trr_vc4_cad'];
$info['trr_vc_ext'] = $infoContrato['trr_vc4_ext'];
$info['trr_vc'] = 'vc4';
$info['trr_preco'] = $infoContrato['trr_vc4'];
}
if (($dispositivo == 'movel') && ($tipoChamada == 'ddi')) {
$info['trr_vc_cad'] = $infoContrato['trr_vc6_cad'];
$info['trr_vc_ext'] = $infoContrato['trr_vc6_ext'];
$info['trr_vc'] = 'vc6';
$info['trr_preco'] = $infoContrato['trr_vc6'];
}
//$log[] = print_r($infoContrato, true);
//@GravaLogApl($log, 'pre_pago_log');
/*
* Verifica se o destino esta incluido no tarifa 0.
*/
if ($infoContrato['trr_tarifa_zero']) {
return -2;
}
/*
* Tarifacao(trr_preco_tipo) 1 por minuto tipo, 2 por chamada.
* O preco esta indicado em trr_preco.
*/
$tipoPreco = (int) $infoContrato['trr_preco_tipo'];
$tipoMinuto = ($tipoPreco == 1);
$preco = $info['trr_preco'];
if ($tipoMinuto) {
$precoMinuto = $info['trr_preco'];
$cadencia = (int) $info['trr_vc'];
if (($cadencia < 60) && ($saldoPrepago < ($precoMinuto / 2.0)))
return 0;
if (($cadencia >= 60) && ($saldoPrepago < ($precoMinuto)))
return 0;
return ((int) (($saldoPrepago / $precoMinuto) * 60)) * 1000;
}
else {
return (int) ($saldoPrepago > $preco ? 99999999 : 0);
}
}
function logStr($msg, $metodo = "", $script = "", $pathLog = "", $logErro = false) {
$data = date("Y-m-d H:i:s");
/*
* Se o path do arquivo de log nao for fornecido em $pathLog e indicado o local padrao
* com o nome do script que esta executando.
*/
$script = $script ? $script : $argv[0];
$pathLog = !$pathLog ? sprintf("/var/log/asterisk/%s.log", basename($script, '.php')) : $pathLog;
/*
* Indica o tipo de mensagem que deva ser gravada no arquivo de log.
*/
$nivelLog = isset($GLOBALS["_nivelLog"]) ? $GLOBALS["_nivelLog"] : _LOG_MSG_ERROR;
/*
* Se o nome do metodo nao for informado tenta recuperalo a partir do array de mensagens.
*/
$msgs = $metodo ? $metodo : explode("#", $msg);
$metodo = $msgs[5];
$erroSys = sprintf("Type:%s File: %s Line: %s \nMsgSys: %s", $msgs[1], $msgs[3], $msgs[4], $msgs[2]);
/*
* Captura informacoes sobre erros no sistema
*/
$str = sprintf("Scrp: [%s] Funcao: [%s] Data: [%s] \nMsg: %s \nSys: %s\n\n", $script, $metodo, $data, $msgs[0], $erroSys);
/*
* Mostra as mensagens de log
*/
if ($nivelLog == _LOG_MSG_DISPLAY) {
echo $str . "\n";
}
/*
* Grava o log
*/
if ($logErro || ($nivelLog <> _LOG_MSG_ERROR)) {
GravaLog($str, $pathLog);
}
}
function GravaLog($log, $path) {
$arq = fopen($path, 'a');
fwrite($arq, $log);
fclose($arq);
}
function Excpt($msg, $metodo = "", $erro = '') {
//$erroSys = error_get_last();
//$msg = sprintf("%s#%s#%s#%s#%s#%s",$msg, $erroSys['type'], $erroSys['message'], $erroSys['file'], $erroSys['line'], $metodo);
$msg = sprintf("%s -> %s <- %s", (!empty($metodo)) ? "Motodo [{$metodo}] " : '', $msg, (!empty($erro)) ? "Erro: $erro" : "");
logBkp($msg);
throw new Exception($msg);
}
function logBkp($msg, $logDate = true, $echo = true) {
$log = $msg;
if ($logDate) {
$log = date('d/m/Y H:i:s') . ': ' . $msg . "\n";
if ($echo) {
echo $log;
}
}
GravaLog($log, BackupConfig::$logFile);
}
function KeyCrypt($key = '') {
return $key ? $key : "A32589Ba83F3aA5a8b1737339604B609";
}
function Encrypt($text, $key = '') {
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
$key = substr(hash('sha256', KeyCrypt($key)), 0, $keySize);
$encryptedData = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);
return base64_encode($iv . $encryptedData);
}
function Decrypt($text, $key = '') {
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$data = base64_decode($text, true);
$key = substr(hash('sha256', KeyCrypt($key)), 0, $keySize);
$iv = substr($data, 0, $ivSize);
$data = substr($data, $ivSize);
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
return rtrim($data, "\0");
}
function ErrorGetLast($type = "message") {
$erro = error_get_last();
return $erro[$type];
}
function GetAtualizacoes($db, $cliId) {
/*
* Esta consulta traz todos os arquivos que o cliente ainda nao atualizou na portabilidade.
*/
$query = "select idarquivo
from atualizacoes a
where erro = 0
and idarquivo > coalesce((select max(idarquivo) from clientes a, clientes_atualizacoes b where b.cli_id = a.cli_id and cli_idexterno = '$cliId'), 0)";
$result = pg_query($db, $query);
if (!$result)
throw new Exception(GetExcept("Erro ao buscar atualizacoes no servidor remoto!"));
if (!pg_num_rows($result)) {
return false;
}
$dados = array();
while ($row = pg_fetch_row($result)) {
$dados[] = $row[0];
}
return $dados;
}
function GetAtualizacoesDados($db, $idAtualiza, $limit, $offset) {
/*
* Esta consulta retorna todos o comandos que devem ser executados para atualizar a base
* da portabilidade no cliente.
*/
global $debug;
$query = "select comando from atualizacoes_itens where idarquivo = '$idAtualiza' limit $limit offset $offset";
if ($debug)
echo "Selecionando: $query\n";
$result = pg_query($db, $query);
/*
* Sinaliza que ocorreu algum erro ao consultar o banco de dados.
*/
if (!$result)
throw new Exception(GetExcept("Erro ao buscar dados de atualizacoes no servidor remoto!"));
/*
* Indica que nao exitem atualizacoes disponiveis.
*/
if (!pg_num_rows($result))
return false;
$dados = array();
while ($row = pg_fetch_row($result)) {
$dados[] = $row[0];
}
return $dados;
}
function GetNumRegAtaulizacao($dbRemoto, $idAtualiza) {
$query = "select count(*) as numero from atualizacoes_itens where idarquivo = '$idAtualiza'";
$result = pg_query($dbRemoto, $query);
if (!$result)
throw new Exception(GetExcept("Erro ao buscar numero de atualizacoes no servidor remoto! Id: $idAtualiza"));
if (!pg_num_rows($result))
return 0;
$dados = array();
$row = pg_fetch_row($result);
return $row[0];
}
function VerificaStatus($dbRemoto, $cliId) {
/*
* Verifica o status do cliente para executar a acao adequada.
* -1 -> Desativado ou excluido
* 1 -> Normal
* 2 -> Aguardando instalacao.
*/
$query = "select clie_status from clientes where cli_idexterno = '$cliId'";
$result = pg_query($dbRemoto, $query);
if (!$result)
throw new Exception(GetExcept("Nao foi possivel verificar o status do cliente!"));
$row = pg_fetch_row($result);
return $row[0];
return true;
}
function GetCliIdPorta($dbPorta, $idExt) {
$query = "select cli_id from clientes where cli_idexterno = '$idExt'";
$result = pg_query($dbPorta, $query);
/*
* Erro na consulta.
*/
if (!$result) {
return -1;
}
/*
* Nao encontrou o cliente.
*/
if (!pg_num_rows($result)) {
return 0;
}
/*
* Retorna o id do cliente cadastrado.
*/
$row = pg_fetch_array($result);
return $row[0];
}
function PortabAtualizando($db = null) {
if (!$db) {
$db = GetAlernativeDB($dbHost = '', $dbPort = '', $dbName = 'portabilidade', $dbUser = '', $dbPass = '');
}
try {
$query = "select '' as reg from atualizacoes_registro where atr_data = now()::date and atr_fim is null";
$result = @pg_query($db, $query);
if (!$result)
throw new Exception(GetExcept("IniciaAtualizacao: Nao foi possivel verifica se ha uma atualizacao em andamento!"));
return pg_num_rows($result) ? true : false;
} catch (Exception $ex) {
return false;
}
}
function PortabSolicitaConexao($db, $cliIdExterno) {
define("MAX_CONN_CLIENTE_PORTAB", 3);
if (!$db) {
$db = GetAlernativeDB($dbHost = '', $dbPort = '', $dbName = 'portabilidade', $dbUser = '', $dbPass = '');
}
try {
$query = "select count(*) as reg from controle_conexao where ctrc_data = now()::date and ctrc_fim is null";
$result = @pg_query($db, $query);
if (!$result)
throw new Exception(GetExcept("PortabSolicitaConexao: Nao foi possivel verifica se ha conexoes ativas!"));
$row = pg_fetch_row($result);
$connecta = MAX_CONN_CLIENTE_PORTAB > $row[0];
if ($connecta) {
$query = "insert into controle_conexao( ctrc_data, cli_id, ctrc_inicio)values(now()::date, '$cliIdExterno', now())";
$result = pg_query($db, $query);
if (!$result || !pg_affected_rows($result)) {
throw new Exception(GetExcept("PortabSolicitaConexao: Nao foi possivel registrar a conexao!"));
}
return true;
}
return false;
} catch (Exception $ex) {
return false;
}
}
function GetExcept($msg) {
$ex = error_get_last();
return sprintf("%s\nErro: %s\n", trim($msg), trim($ex['message']));
}
function GetTipoChamadaCod($destino, $dddPadrao, $tipo) {
/*
* fixo movel local inter ddi
* -- 1 -> Interna;
* -- 2 -> Entrada,
* 21 -> Entrada Fixo Local,
* 22 -> Entrada Fixo Interurbano,
* 23 -> Entrada Movel Local,
* 24 -> Entrada Movel Interurbano
* 25 -> Entrada Internacional;
* -- 3 -> Saida,
* 31 -> Saida Fixo Local,
* 32 -> Saida Fixo Interurbano,
* 33 -> Saida Movel local,
* 34 -> Saida Movel Interurbano,
* 35 -> Saida Internacional;
* -- 4 -> Emergencia;
* -- 5 -> Zero oitocentos
*
-- delete from pbx_tipo_ligacao
-- select * from pbx_tipo_ligacao
-- create table pbx_tipo_ligacao(tplg_codigo int not null primary key, tplg_descricao varchar(64) not null, tplg_tipo int not null);
insert into pbx_tipo_ligacao values( 1, 'Interna', 1);
insert into pbx_tipo_ligacao values( 2, 'Entrada', 2);
insert into pbx_tipo_ligacao values(21, 'Entrada Fixo Local', 2);
insert into pbx_tipo_ligacao values(22, 'Entrada Fixo Interurbano', 2);
insert into pbx_tipo_ligacao values(23, 'Entrada Movel Local', 2);
insert into pbx_tipo_ligacao values(24, 'Entrada Movel Interurbano', 2);
insert into pbx_tipo_ligacao values(25, 'Entrada Internacional', 2);
insert into pbx_tipo_ligacao values( 3, 'Saida', 3);
insert into pbx_tipo_ligacao values(31, 'Saida Fixo Local', 3);
insert into pbx_tipo_ligacao values(32, 'Saida Fixo Interurbano', 3);
insert into pbx_tipo_ligacao values(33, 'Saida Movel local', 3);
insert into pbx_tipo_ligacao values(34, 'Saida Movel Interurbano', 3);
insert into pbx_tipo_ligacao values(35, 'Saida Internacional', 3);
insert into pbx_tipo_ligacao values( 4, 'Emergencia', 4);
insert into pbx_tipo_ligacao values( 5, 'Zero Oitocentos', 5);
*/
/*
* $direcao -> I = Interna, E = Entrada, S = Saida.
*/
$direcao = strtoupper(trim($tipo));
if ($direcao === 'I') {
return 1;
}
/*
* Verifica chamadas de emergencia, nao tratadas adequadamente pela funcao GetTipoChamada.
*/
$arEmergencia = array('100', '128', '190', '191', '192', '193', '194', '197', '198', '199');
if (array_search($destino, $arEmergencia) !== false) {
return 4;
}
/*
* Verifica chamadas 0800, nao tratadas adequadamente pela funcao GetTipoChamada.
*/
if (substr($destino, 0, 4) == '0800') {
return 5;
}
/*
* Funcao analisa o tipo de chamada
*/
list($tpFone, $tpChamada) = GetTipoChamada($destino, $dddPadrao);
if ($direcao === 'E') {
if (($tpFone === 'fixo') && ($tpChamada === 'local')) {
return 21;
} else if (($tpFone === 'fixo') && ($tpChamada === 'inter')) {
return 22;
} else if (($tpFone === 'movel') && ($tpChamada === 'local')) {
return 23;
} else if (($tpFone === 'movel') && ($tpChamada === 'inter')) {
return 24;
} else if (($tpFone === 'fixo') && ($tpChamada === 'ddi')) {
return 25;
}
}
if ($direcao === 'S') {
if (($tpFone === 'fixo') && ($tpChamada === 'local')) {
return 31;
} else if (($tpFone === 'fixo') && ($tpChamada === 'inter')) {
return 32;
} else if (($tpFone === 'movel') && ($tpChamada === 'local')) {
return 33;
} else if (($tpFone === 'movel') && ($tpChamada === 'inter')) {
return 34;
} else if (($tpFone === 'fixo') && ($tpChamada === 'ddi')) {
return 35;
}
}
return 0;
}
function GetTipoChamadaDesc($cod) {
/*
* fixo movel local inter ddi
* -- 1 -> Interna;
* -- 2 -> Entrada,
* 21 -> Entrada Fixo Local,
* 22 -> Entrada Fixo Interurbano,
* 23 -> Entrada Movel Local,
* 24 -> Entrada Movel Interurbano
* 25 -> Entrada Internacional;
* -- 3 -> Saida,
* 31 -> Saida Fixo Local,
* 32 -> Saida Fixo Interurbano,
* 33 -> Saida Movel local,
* 34 -> Saida Movel Interurbano,
* 35 -> Saida Internacional;
* -- 4 -> Emergencia;
* -- 5 -> Zero oitocentos
*/
switch ($cod) {
case 1: return 'Interna';
case 4: return 'Emergencia';
case 5: return 'Gratuita';
case 21: return 'Local Fixo';
case 22: return 'Interurbano Fixo';
case 23: return 'Local Movel';
case 24: return 'Interurbano Movel';
case 25: return 'Internacional';
case 31: return 'Local Fixo';
case 32: return 'Interurbano Fixo';
case 33: return 'Local Movel';
case 34: return 'Interurbano Movel';
case 35: return 'Internacional';
default:
return 'NI';
}
}
function ChamadaFila($uid, $temp = 1) {
$query = sprintf("select strtoint(param2, 0) as billsec from %s where uid2 = %s and evento in('COMPLETACALLER', 'COMPLETAAGENT', 'TRANSFERORIG', 'COMPLETECALLER', 'COMPLETEAGENT', 'TRANSFER','COMPLETECALLERRAMAL')", ($temp ? 'ast_eventos_dacs' : 'pbx_eventos_dacs'), QuotedStr($uid));
$result = pg_query($query);
if (!pg_num_rows($result))
return 0;
$row = pg_fetch_row($result);
return $row[0];
}
function GetIdMunicipio($tipo, $dddPadrao, $destino, $useBanco = true) {
$tamPrefixo = 6;
$movel = ($tipo == 23) || ($tipo == 24) || ($tipo == 33) || ($tipo == 34);
/*
* ligacao Interna,Eemergencia, Gratuita(0800) e internacional nao tem municipio associado.
*/
if (($tipo == 1) || ($tipo == 4) || ($tipo == 5) || ($tipo == 25) || ($tipo == 35)) {
return '0';
}
/*
*
*/
if ($movel) {
if (strlen($destino) == 9) {
$dddCel = $dddPadrao;
} else {
$dddCel = substr(substr($destino, -11), 0, 2);
}
/*
* Procura o municipio em um array global previamente alimentado.
*/
if (!$useBanco) {
return GetIdMunicipioMovel($dddCel);
}
$query = sprintf("select id from (select min(id) as id, codigo_ddd, uf from pbx_municipios group by codigo_ddd, uf) a where codigo_ddd = %s", StrToIntDef($dddCel));
} else {
if (strlen($destino) == 8)
$destino = $dddPadrao . $destino;
$destino = soNumero(substr($destino, -10));
$prefixo = StrToIntDef(substr($destino, 0, 6));
$numero = StrToIntDef(substr($destino, -4));
/*
* Procura o municipio em um array global previamente alimentado.
*/
if (!$useBanco) {
return GetIdMunicipioFixo($prefixo, $numero);
}
$query = sprintf("select id from pbx_municipios where prefixo = '%s' and '%s' >= faixa_inicial and '%s' <= faixa_final", $prefixo, $numero, $numero);
}
$result = pg_query($query);
if (!$result || !pg_num_rows($result)) {
$codMun = -1;
} else {
$dados = pg_fetch_row($result);
$codMun = $dados[0];
}
return $codMun;
}
function PreparaConsltaMunicipio() {
global $arPrefixo, $arDddMunicipio;
$query = "select distinct prefixo, faixa_inicial, faixa_final, id, codigo_ddd from pbx_municipios";
$result = pg_query($query);
if (!$result || !pg_num_rows($result)) {
return;
}
$dddOld = '';
$prefixoAtual = '';
while ($dados = pg_fetch_array($result, null, PGSQL_ASSOC)) {
/*
* Separa os dados por prefixo para facilitar a consulta de
* prefixo por faixa.
*/
$prefixo = $dados["prefixo"];
if (($prefixo != $prefixoAtual) && $prefixoAtual) {
$arPrefixo[$prefixoAtual] = $dadosPrefixo;
$dadosPrefixo = array();
}
$dadosPrefixo[] = $dados;
$prefixoAtual = $prefixo;
/*
* Inclui um municipio por ddd para ser usado na
* consulta de uf para movel.
*/
$dddAtual = $dados["codigo_ddd"];
if (!$dddOld || ($dddOld != $dddAtual)) {
$arDddMunicipio[$dddAtual] = $dados[id];
$dddOld = $dddAtual;
}
}
if (count($dadosPrefixo)) {
$arPrefixo[$prefixo] = $dadosPrefixo;
}
}
function GetIdMunicipioMovel($ddd) {
global $arDddMunicipio;
return $arDddMunicipio[$ddd] ? $arDddMunicipio[$ddd] : '-1';
}
function GetIdMunicipioFixo($prefixo, $sufixo) {
global $arPrefixo;
$arPesquisa = $arPrefixo[$prefixo];
if (!count($arPesquisa)) {
return '-1';
}
foreach ($arPesquisa as $dados) {
$faixaInicial = $dados['faixa_inicial'];
$faixaFinal = $dados['faixa_final'];
$id = $dados['id'];
if (($sufixo >= $faixaInicial) && ($sufixo <= $faixaFinal)) {
return $id ? $id : '-1';
}
}
return -1;
}
function TrataEntrada($numero) {
$num = trim($numero);
/*
* Trata ligacoes entrantes vindas de operadoras voip, para que
* nao sejam confundidas com ligacoes internacionais.
*
*/
if (substr($num, 0, 2) == '00') {
return substr($num, 2);
}
return $num;
}
/* commnad lines
* $rows = intval(`tput lines`);
$cols = intval(`tput cols`);
$colors = intval(`tput colors`);
echo "monitor $rows x $cols with $colors colors\n";
*/
?>