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.
233 lines
7.1 KiB
233 lines
7.1 KiB
#!/usr/bin/php -q |
|
<?php |
|
include('bd.php'); |
|
include('util/util.php'); |
|
include('funcoes/shared.php'); |
|
|
|
write(sprintf('NOOP "%s"', 'Inicio Scritpt\n')); |
|
read(); |
|
|
|
ob_implicit_flush(true); |
|
set_time_limit(6); |
|
error_reporting(0); |
|
$in = fopen("php://stdin", "r"); |
|
|
|
/* |
|
* Arquivo de log. |
|
*/ |
|
$stdlog = fopen("/var/log/asterisk/portabilidade_agi.log", "w"); |
|
|
|
/* |
|
* Habilita modo debugging (mais verbose) |
|
*/ |
|
$debug = false; |
|
|
|
|
|
/* |
|
* Colocamos headers AGI dentro de um array |
|
*/ |
|
while ($env = read()) { |
|
$s = explode(": ", $env); |
|
$agi[str_replace("agi_", "", $s[0])] = trim($s[1]); |
|
if (($env == "") || ($env == "\n")) { |
|
break; |
|
} |
|
} |
|
|
|
/* |
|
* Parametros vindos do dialplan. |
|
*/ |
|
$destino = trim($argv[1]); |
|
$discado = trim($agi["extension"]); |
|
$context = trim($agi["context"]); |
|
|
|
__log("Inicio"); |
|
__log($destino, 'destino'); |
|
__log($discado, 'discado'); |
|
__log($context, 'context'); |
|
__log(""); |
|
|
|
write(sprintf('NOOP "Var Destino: %s Discado: %s Context: %s"', $destino, $discado, $context)); |
|
read(); |
|
|
|
/* |
|
* Retorna a operadora atual do número móvel baseado na tabela de portabilidade ou prefixos. |
|
* Podendo escolher assim a melhor rota |
|
*/ |
|
$operadora = GetSpid($destino); |
|
__log($operadora, 'GetSpid($destino)'); |
|
|
|
/* |
|
* Verifica se a operadora deve sair por outra relacionada, ex.: |
|
* em algumas localidades a operadora OI faz consessão a TNL, |
|
* mas os troncos são criados sempre para OI então TNL -> 331 |
|
* deve procurar o tronco relacionado OI -> 314. A função abaixo |
|
* busca essa relação na tabela pbx_operadora_rel. |
|
* Este relacionamento deve ser configurado na aplicação web menu: |
|
* Ferramentas->Tarifação/Portabilidade->Operadoras. |
|
*/ |
|
$operadora = GetOperadoraRelacionada($operadora); |
|
__log($operadora, 'GetOperadoraRelacionada($operadora)'); |
|
|
|
/* |
|
* Função retorna basicamente um array com informações da chamada, |
|
* ex.: uma chamada móvel local retorna array('movel', 'local', '0') |
|
* o último parametro é a operadora atual informada no destino, 0(zero) |
|
* não foi adicionado uma. |
|
*/ |
|
$tpChamada = GetTipoChamada($destino); |
|
$tipoChamada = $tpChamada[0]; |
|
__log($tipoChamada, 'GetTipoChamada($destino)'); |
|
|
|
/* |
|
* Essa variável contém a operadora portada. |
|
*/ |
|
__log("SET VARIABLE SPID $operadora"); |
|
write("SET VARIABLE SPID $operadora"); |
|
read(); |
|
|
|
/* |
|
* Indica se a chamada é para móvel ou fixo. |
|
*/ |
|
__log("SET VARIABLE tipoChamada $tipoChamada"); |
|
write("SET VARIABLE tipoChamada $tipoChamada"); |
|
read(); |
|
|
|
|
|
if ($operadora) { |
|
__log($operadora, 'if ($operadora)'); |
|
/* |
|
* OPERADORAS E SPID |
|
* OI(BRASIL TELECOM S/A)" => 314 |
|
* VIVO S.A. => 320 |
|
* CLARO(AMERICEL S.A.)" => 321 |
|
* TIM CELULAR S.A. => 341 |
|
* Busca o número da operadora, oper_numero_saida por padrão tráz a mesama informação |
|
* de oper_numero, entretanto em algumas localidades uma operadora pode fazer uma con- |
|
* seção a outra ou seja a tabela de portabilidade retorna "014" mas na verdade deve |
|
* discar "031" então nesse caso oper_numero = 014 oper_numero_saida = 031. |
|
*/ |
|
$query = "select coalesce(a.oper_numero_saida, a.oper_numero) as oper_numero_saida from pbx_operadoras a where a.oper_spid = '$operadora' "; |
|
$result = pg_query($conexao, $query); |
|
__log(''); |
|
__log($query, 'Numero de saida da operadora'); |
|
__log(''); |
|
/* |
|
* Se houver problemas para acessar o banco de dados envia mensagem e interrompe a execução. |
|
*/ |
|
if (!$result) { |
|
__log("Erro Query: \"Erro ao cousultar Operadora na base de dados! Oper: $operadora. Msg: $msg\""); |
|
$msg = GetLasterror(); |
|
write("NOOP \"Erro ao cousultar Operadora na base de dados! Oper: $operadora. Msg: $msg\""); |
|
read(); |
|
exit; |
|
} |
|
|
|
/* |
|
* Se não encontrar a Operadora no banco de dados envia mensagem e interrompe a execução. |
|
*/ |
|
if (!pg_num_rows($result)) { |
|
__log("\"Operadora não encontrada na base de dados! Oper: $operadora\""); |
|
write("NOOP \"Operadora não encontrada na base de dados! Oper: $operadora\""); |
|
read(); |
|
exit; |
|
} |
|
$dados = pg_fetch_array($result); |
|
$numeroSaida = $dados['oper_numero_saida']; |
|
__log($numeroSaida, 'Numero de saida retornado da tabela pbx_operadoras'); |
|
|
|
write("SET VARIABLE OPERDDD $numeroSaida"); |
|
write("SET VARIABLE OPERDDD $numeroSaida"); |
|
read(); |
|
|
|
/* |
|
* Ajusta operadora DDD |
|
*/ |
|
$tam = strlen(ltrim($discado, "0")); |
|
__log($tam, "Tamanho discado: $discado"); |
|
if ($tam > 9) { |
|
$destinoEntra = $destino; |
|
$numero = substr(ltrim($destino, "0"), -11); |
|
$destino = $numeroSaida . $numero; |
|
write($destino, "Tamanho > 9: "); |
|
__log(sprintf('"Ajusta Operadora, Destino E: %s Destino S: %s Operadora Orig: %s Operadora Port: %s "', $destinoEntra, $destino, $operadora, $numeroSaida)); |
|
write(sprintf('NOOP "Ajusta Operadora, Destino E: %s Destino S: %s Operadora Orig: %s Operadora Port: %s "', $destinoEntra, $destino, $operadora, $numeroSaida)); |
|
read(); |
|
} |
|
|
|
/* |
|
* As operadoras a partir da versão 1.6.5.5 foram desvinculadas da tarifação, são adicionadas diretamente nos troncos que farao ligações |
|
* para móvel. |
|
*/ |
|
$query = "select a.tipo||'/'||a.username as tronco, a.id, a.max_ligacoes from pbx_troncos a where a.portabilidade = '$operadora' and a.portabilidade > 0"; |
|
$result = pg_query($conexao, $query); |
|
__log(''); |
|
__log($query, "Pesquisa tronco pela operadora"); |
|
__log(''); |
|
if (pg_num_rows($result)) { |
|
$row = pg_fetch_array($result); |
|
$tronco = $row['tronco']; |
|
$idTronco = $row['id']; |
|
$maxLigacoes = $row['max_ligacoes']; |
|
__log(sprintf("Retorno troncos: Tronco: %s id: %s Max lig: %s", $tronco, $idTronco, $maxLigacoes)); |
|
|
|
__log("SET VARIABLE TRONCO $tronco"); |
|
write("SET VARIABLE TRONCO $tronco"); |
|
read(); |
|
|
|
__log("SET VARIABLE ID_TRONCO $idTronco"); |
|
write("SET VARIABLE ID_TRONCO $idTronco"); |
|
read(); |
|
|
|
__log("SET VARIABLE MAX_LIG $maxLigacoes"); |
|
write("SET VARIABLE MAX_LIG $maxLigacoes"); |
|
read(); |
|
|
|
__log("SET VARIABLE DESTINO $destino"); |
|
write("SET VARIABLE DESTINO $destino"); |
|
read(); |
|
|
|
__log("SET VARIABLE __IDOPERADORA $operadora"); |
|
write("SET VARIABLE __IDOPERADORA $operadora"); |
|
read(); |
|
|
|
// __log("EXEC Goto $context|$discado|portabilidade"); |
|
// write("EXEC Goto $context|$discado|portabilidade"); |
|
__log("EXEC Goto $context,$discado,portabilidade"); |
|
write("EXEC Goto $context,$discado,portabilidade"); |
|
read(); |
|
} |
|
} |
|
|
|
pg_close(); |
|
fclose($in); |
|
fclose($stdlog); |
|
exit; |
|
|
|
// Do function definitions before we start the main loop |
|
function read() { |
|
global $in, $debug, $stdlog; |
|
$input = str_replace("\n", "", fgets($in, 4096)); |
|
if ($debug) |
|
fputs($stdlog, "read: $input\n"); |
|
return $input; |
|
} |
|
|
|
function write($line, $logOnly = false) { |
|
global $debug, $stdlog; |
|
if ($logOnly) { |
|
fputs($stdlog, "$line\n"); |
|
} else if ($debug) { |
|
fputs($stdlog, "write: $line\n"); |
|
} |
|
|
|
if (!$logOnly) { |
|
echo $line . "\n"; |
|
} |
|
} |
|
|
|
function __log($log, $label = '') { |
|
$line = $label ? sprintf("%s: %s", $label, $log) : $log; |
|
write($line, true); |
|
} |
|
?>
|
|
|