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.
180 lines
6.2 KiB
180 lines
6.2 KiB
<?php |
|
|
|
/* |
|
* Autor: Amarildo Pereira. |
|
* Data: 02/07/2020 |
|
* Objetivo: Verificar regras da Anatel para televendas. |
|
* Regra 1: As chamdas deverao serem feitas dentro do horario estipulado pela Anatel. |
|
* Regra 2: Um numero so pode receber 2(duas) ligacoes no mesmo dia. |
|
* Regra 3: Um numero so pode receber 15(quinze) ligacoes dentro do mes. |
|
* |
|
* Tabelas para acompanhamento. |
|
-- drop table pbx_televendas_bloqueio |
|
create table pbx_televendas_bloqueio( |
|
tlvb_id bigserial not null primary key, |
|
tlvb_mes int not null default extract('month' from now()), |
|
tlvb_data date not null default now()::date, |
|
src varchar(18), |
|
dst varchar(18), |
|
tlvb_status int, |
|
tlvb_msg varchar(255), |
|
data_reg timestamp not null default now() |
|
); |
|
|
|
create index "idxPbxTelevendasBloqueioDst" on pbx_televendas_bloqueio(dst); |
|
create index "idxPbxTelevendasBloqueioDstData" on pbx_televendas_bloqueio(dst,tlvb_data); |
|
create index "idxPbxTelevendasBloqueioSrc" on pbx_televendas_bloqueio(src); |
|
create index "idxPbxTelevendasBloqueioMes" on pbx_televendas_bloqueio(tlvb_mes); |
|
create index "idxPbxTelevendasBloqueioData" on pbx_televendas_bloqueio(tlvb_data); |
|
|
|
-- drop table pbx_televendas_reg |
|
create table pbx_televendas_reg( |
|
tlvb_id bigserial not null primary key, |
|
tlvb_mes int not null default extract('month' from now()), |
|
tlvb_data date not null default now()::date, |
|
src varchar(18), |
|
dst varchar(18), |
|
tlvb_status int, |
|
tlvb_msg varchar(255), |
|
data_reg timestamp not null default now() |
|
); |
|
|
|
create index "idxPbxTelevendasRegDst" on pbx_televendas_reg(dst); |
|
create index "idxPbxTelevendasRegDstData" on pbx_televendas_bloqueio(dst,tlvb_data); |
|
create index "idxPbxTelevendasRegSrc" on pbx_televendas_reg(src); |
|
create index "idxPbxTelevendasRegMes" on pbx_televendas_reg(tlvb_mes); |
|
create index "idxPbxTelevendasRegData" on pbx_televendas_reg(tlvb_data); |
|
* |
|
* Status: |
|
* 1 => bloqueio por horario. |
|
* 2 => bloqueio por exceder tentativas diarias. |
|
* 3 => bloqueio por exceder tentativas mensais. |
|
*/ |
|
|
|
/* |
|
* Define o numero de tentativas diaria e Mensal. |
|
*/ |
|
define("TLVB_MAX_DIA", 2); |
|
define("TLVB_MAX_MES", 15); |
|
define("TLVB_BLQ_HORARIO", 1); |
|
define("TLVB_BLQ_DIARIA", 2); |
|
define("TLVB_BLQ_MENSAL", 3); |
|
$pathLogTlvb = "/var/log/asterisk/televendas_bloqueio.log"; |
|
WriteLog("Iniciando checagem de regras Anatel.", $pathLogTlvb); |
|
/* |
|
* Menagens de som. |
|
*/ |
|
$logOperErro = $pathSom . 'ligacaoinvalidaanatel'; |
|
$logBlqHorario = $pathSom . 'horarionaopermitidoanatel'; |
|
$logBlqDiario = $pathSom . 'limitdiarioanatel'; |
|
$logBlqMensal = $pathSom . 'limitemensalanatel'; |
|
|
|
/* |
|
* Regras de horario. |
|
*/ |
|
|
|
$ini = strtotime("09:00"); |
|
$fim = strtotime("21:00"); |
|
$hr[0] = array(strtotime("00:00"), strtotime("00:00")); // Domingo |
|
$hr[1] = array($ini, $fim); //Segunda |
|
$hr[2] = array($ini, $fim); //Terca |
|
$hr[3] = array($ini, $fim); //Quarta |
|
$hr[4] = array($ini, $fim); //Quinta |
|
$hr[5] = array($ini, $fim); //Sexta |
|
$hr[6] = array(strtotime("10:00"), strtotime("16:00")); //Sabado |
|
|
|
try { |
|
$dataAtual = date("Y-m-d"); |
|
$mesAtual = date('m'); |
|
$diaSemana = date("w"); |
|
$horaAtual = strtotime(date("H:i")); |
|
$src = TlvbGetRaml($agi); |
|
|
|
$iniVal = $hr[$diaSemana][0]; |
|
$fimVal = $hr[$diaSemana][1]; |
|
WriteLog("Parametros configurados, iniciando checagem no banco de dados.", $pathLogTlvb); |
|
/* |
|
* Verifica o bloqueio por horario. |
|
*/ |
|
if (($horaAtual < $iniVal) || ($horaAtual > $fimVal )) { |
|
|
|
$query = sprintf("insert into pbx_televendas_bloqueio(src,dst,tlvb_status)values('%s','%s','%s');", $src, $numeroConsulta, TLVB_BLQ_HORARIO); |
|
if (!$result = pg_query($query)) { |
|
throw new Exception("Nao foi possivel registra o bloqueio por horario: cmd: {$query}"); |
|
} |
|
TlvbBloqueio($logBlqHorario); |
|
} |
|
|
|
/* |
|
* Verifia bloqueio por tentativa diaria. |
|
*/ |
|
$query = "select count(*) as num_dia from pbx_televendas_bloqueio where dst = '{$numeroConsulta}' and tlvb_data = '{$dataAtual}' and tlvb_status = '0'"; |
|
if (!$result = pg_query($query)) { |
|
throw new Exception("Nao foi possivel consultar o numero: {$numeroConsulta}!"); |
|
} |
|
$row = pg_fetch_row($result); |
|
$numTentativas = $row[0]; |
|
|
|
if ($numTentativas >= TLVB_MAX_DIA) { |
|
$query = sprintf("insert into pbx_televendas_bloqueio(src,dst,tlvb_status)values('%s','%s','%s');", $src, $numeroConsulta, TLVB_BLQ_DIARIA); |
|
if (!$result = pg_query($query)) { |
|
throw new Exception("Nao foi possivel registra o bloqueio por tentativa diaria: cmd: {$query}"); |
|
} |
|
TlvbBloqueio($logBlqDiario); |
|
} |
|
|
|
/* |
|
* Verifia bloqueio por tentariva diaria. |
|
*/ |
|
$query = "select count(*) as num_dia from pbx_televendas_bloqueio where dst = '{$numeroConsulta}' and tlvb_mes = '{$mesAtual}' and tlvb_status = '0'"; |
|
if (!$result = pg_query($query)) { |
|
throw new Exception("Nao foi possivel consultar o numero: {$numeroConsulta}!"); |
|
} |
|
$row = pg_fetch_row($result); |
|
$numTentativas = $row[0]; |
|
|
|
if ($numTentativas >= TLVB_MAX_MES) { |
|
$query = sprintf("insert into pbx_televendas_bloqueio(src,dst,tlvb_status)values('%s','%s','%s');", $src, $numeroConsulta, TLVB_BLQ_MENSAL); |
|
if (!$result = pg_query($query)) { |
|
throw new Exception("Nao foi possivel registra o bloqueio por tentativa mensal: cmd: {$query}"); |
|
} |
|
TlvbBloqueio($logBlqMensal); |
|
} |
|
WriteLog("Registrando a chamada para chacagem futura.", $pathLogTlvb); |
|
/* |
|
* Nao ha bloquio, registra a ligacao |
|
*/ |
|
$query = sprintf("insert into pbx_televendas_bloqueio(src,dst,tlvb_status)values('%s','%s','%s');", $src, $numeroConsulta, '0'); |
|
if (!$result = pg_query($query)) { |
|
throw new Exception("Nao foi possivel registra o bloqueio por horario: cmd: {$query}"); |
|
} |
|
} catch (Exception $ex) { |
|
WriteLog($ex->getMessage(), $pathLogTlvb); |
|
TlvbBloqueio($logOperErro); |
|
} |
|
|
|
function TlvbGetRaml($agi) { |
|
/* |
|
* Pega a origem. |
|
*/ |
|
write("GET VARIABLE RAMAL"); |
|
$ramal = substr(strrchr(read(), "("), 1, -1); |
|
if (!$ramal) { |
|
$ramal = $agi["callerid"]; |
|
} |
|
|
|
return $ramal; |
|
} |
|
|
|
function TlvbBloqueio($audio) { |
|
/* |
|
* Executa audio padrao para o usuario. |
|
*/ |
|
$audio = trim($audio); |
|
write("EXEC Playback $audio"); |
|
read(); |
|
|
|
write("HANGUP"); |
|
read(); |
|
exit; |
|
}
|
|
|