|
|
|
|
#!/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 = split(": ", $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<EFBFBD>mero m<EFBFBD>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<EFBFBD>o a TNL,
|
|
|
|
|
* mas os troncos s<EFBFBD>o criados sempre para OI ent<EFBFBD>o TNL -> 331
|
|
|
|
|
* deve procurar o tronco relacionado OI -> 314. A fun<EFBFBD><EFBFBD>o abaixo
|
|
|
|
|
* busca essa rela<EFBFBD><EFBFBD>o na tabela pbx_operadora_rel.
|
|
|
|
|
* Este relacionamento deve ser configurado na aplica<EFBFBD><EFBFBD>o web menu:
|
|
|
|
|
* Ferramentas->Tarifa<EFBFBD><EFBFBD>o/Portabilidade->Operadoras.
|
|
|
|
|
*/
|
|
|
|
|
$operadora = GetOperadoraRelacionada($operadora);
|
|
|
|
|
__log($operadora, 'GetOperadoraRelacionada($operadora)');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Fun<EFBFBD><EFBFBD>o retorna basicamente um array com informa<EFBFBD><EFBFBD>es da chamada,
|
|
|
|
|
* ex.: uma chamada m<EFBFBD>vel local retorna array('movel', 'local', '0')
|
|
|
|
|
* o <EFBFBD>ltimo parametro <EFBFBD> a operadora atual informada no destino, 0(zero)
|
|
|
|
|
* n<EFBFBD>o foi adicionado uma.
|
|
|
|
|
*/
|
|
|
|
|
$tpChamada = GetTipoChamada($destino);
|
|
|
|
|
$tipoChamada = $tpChamada[0];
|
|
|
|
|
__log($tipoChamada, 'GetTipoChamada($destino)');
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Essa vari<EFBFBD>vel cont<EFBFBD>m a operadora portada.
|
|
|
|
|
*/
|
|
|
|
|
__log("SET VARIABLE SPID $operadora");
|
|
|
|
|
write("SET VARIABLE SPID $operadora");
|
|
|
|
|
read();
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Indica se a chamada <EFBFBD> para m<EFBFBD>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<EFBFBD>mero da operadora, oper_numero_saida por padr<EFBFBD>o tr<EFBFBD>z a mesama informa<EFBFBD><EFBFBD>o
|
|
|
|
|
* de oper_numero, entretanto em algumas localidades uma operadora pode fazer uma con-
|
|
|
|
|
* se<EFBFBD><EFBFBD>o a outra ou seja a tabela de portabilidade retorna "014" mas na verdade deve
|
|
|
|
|
* discar "031" ent<EFBFBD>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<EFBFBD><EFBFBD>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<EFBFBD>o encontrar a Operadora no banco de dados envia mensagem e interrompe a execu<EFBFBD><EFBFBD>o.
|
|
|
|
|
*/
|
|
|
|
|
if (!pg_num_rows($result)) {
|
|
|
|
|
__log("\"Operadora n<EFBFBD>o encontrada na base de dados! Oper: $operadora\"");
|
|
|
|
|
write("NOOP \"Operadora n<EFBFBD>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<EFBFBD>o 1.6.5.5 foram desvinculadas da tarifa<EFBFBD><EFBFBD>o, s<EFBFBD>o adicionadas diretamente nos troncos que farao liga<EFBFBD><EFBFBD>es
|
|
|
|
|
* para m<EFBFBD>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);
|
|
|
|
|
}
|
|
|
|
|
?>
|