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.

234 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<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);
}
?>