PABX criado para pesquisas
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

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