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.
1037 lines
37 KiB
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"; |
|
*/ |
|
?>
|
|
|