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.
 
 
 
 
 
 

399 lines
14 KiB

#!/usr/bin/php -q
<?php
require("funcoes/shared.php");
require("phpagi/phpagi.php");
require("funcoesAgi.php");
define("DIR_BASE_APL", "/var/lib/asterisk/scripts/uraativa/");
define("DIR_BASE_AUDIO", "/var/lib/asterisk/sounds/");
define("AUDIO_EXTENSAO", ".alaw");
define("TTS_EXE", "/var/lib/asterisk/scripts/uraativa/ttsimples");
declare(ticks = 1);
pcntl_signal(SIGTERM, "signal_handler");
pcntl_signal(SIGINT, "signal_handler");
pcntl_signal(SIGHUP, "signal_handler");
$tempo = time();
$nomeApl = 'ura_atende_simples';
//$stdlog = fopen("/var/lib/asterisk/scripts/uraativa/$nomeApl.log", "a");
/*
* Interage com agi.
*/
$optconfig['phpagi']['error_handler'] = false;
$agi = new AGI("/var/lib/asterisk/scripts/uraativa/phpagi.conf", $optconfig);
$globais = array("callerid" => 0, "uid" => 0, "nome_cliente" => "", "cpf_cliente" => 0, "saldo_cartao" => 0, "cli_id" => 0, "fones" => array("fone" => "", "fone1" => "", "fone2" => ""));
$globais["callerid"] = GetVariavelAgi($agi, "CALLERID(num)");
$globais["uid"] = GetVariavelAgi($agi, "UNIQUEID");
$uid = $globais["uid"];
$removeFiles = array();
$log = sprintf("Callerid: %s Uid: %s", $globais["callerid"], $globais["uid"]);
Grava_log($log);
/*
* Cria conexão para o banco de dados.
*/
$conStr = false;
//$conStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '192.168.115.11', '5432', 'teste', 'contacte', 'ctepgSQL');
/*
* Se a configuração não foi definida manualmente retorna a configuração padrão.
*/
if ($conStr === false) {
$conStr = GetDefStrDb();
}
/*
* Inicia a conexão com banco de dados.
*/
$conn = pg_connect($conStr);
//if($conn) Grava_log('Banco conectado.'); else Grava_log('Banco não conectado.');
/*
* Quando o cliente entra na ura verificamos se o telefone já esta cadastrado.
*/
$cliCad = GetCadastroFone();
$fileSauda = "saudacao" . $uid;
$agi->answer();
$saudacao = RemoveEspaco(Sauda());
if ($cliCad) {
/*
* O cliente foi localizado pelo número do telefone, então é apresentado uma saudação de boas vindas
* personalizada. O arquivo é gerado e armazenado posteriormente será utilizado.
*/
$textaudio = sprintf("%s senhor \"%s\", bem vindo a Simples Ipê , escolha uma das opções apresentadas a seguir. ", Sauda(), $globais["nome_cliente"]);
$audio = sprintf("%s_%s_%s_%s", "opcoes_clicad", $saudacao, $globais["cli_id"], $uid);
$finish = true;
Grava_log("Cliente encontrado Audio: $audio Txt: $textaudio");
} else {
/*
* O cliente não possui cadastro. Pede para informar o cpf caso seja cliente ou indicar uma opeção.
*/
$finish = false;
$infinite = 0;
$txt = '';
$nomeAudio = '';
$timeout = 6000;
$maxDigit = 11;
while (!$finish) {
$infinite++;
$digits = SolicitaCpf($agi, $txt, $nomeAudio, $timeout, $maxDigit);
if ($digits == 9) {
$audio = "redir_atendimetno_$uid";
$textoConctAudio = "Obrigado por utilizar nossa central de serviços\, em instantes você será redirecionado para um dos nossos atendentes.";
$audio = GetAudioText($textoConctAudio, $audio);
$agi->stream_file($audio);
$agi->exec("Queue", "simples");
$finish = true;
} else {
if (!$digits) {
$finish = false;
$audio = "cpf_invalido_$uid";
$textoConctAudio = "O número informado é inválido ou não consta em nosso cadastro. Por favor após o sinal digite pausadamente seu cpf";
$audio = GetAudioText($textoConctAudio, $audio);
$agi->stream_file($audio);
$txt = 'beep';
$nomeAudio = "beep";
} else {
if (GetCadastroCpf($digits)) {
$finish = true;
$audio = "cpf_encontrado_$uid";
$textoConctAudio = sprintf("%s senhor %s se você deseja associar este número de telefone ao seu cadastro digite um ou aguarde para ouvir as opções de atendimento.", Sauda(), $globais["nome_cliente"]);
$audio = GetAudioText($textoConctAudio, $audio);
$ret = $agi->get_data($audio, 3000, 1);
$digit = $ret["result"];
if ($digit == '1')
AssociaFone($agi);
$textaudio = '';
$audio = sprintf("%s_%s_%s_%s", "opcoes_clicad", $saudacao, $globais["cli_id"], $uid);
}
else {
$finish = false;
$audio = "cpf_invalido_$uid";
$textoConctAudio = "O número informado é inválido ou não consta em nosso cadastro. Por favor após o sinal digite pausadamente seu cpf";
$audio = GetAudioText($textoConctAudio, $audio);
$agi->stream_file($audio);
$txt = 'beep';
$nomeAudio = "beep";
}
}
}
if ($infinite >= 9)
break;
}
}
if ($finish) {
MenuAtendimento($agi, $textaudio, $audio);
}
$agi->hangup();
$agi = null;
ApagaArquivos();
Grava_log('Opeeração finalizado', 1);
exit(0);
/* ----------------------------------------------------Funcoes do arquivo---------------------------------------------------- */
function Grava_log($log, $force = 0) {
if (!$force)
return true;
global $nomeApl, $tempo;
$stdlog = fopen("/var/lib/asterisk/scripts/uraativa/$nomeApl.log", "a");
$log = (trim($log) . " Tempo de execução: " . (time() - $tempo) . " Data Atual: " . date('Y-m-d H:i:s-z'));
$tempo = time();
//if(!$stdlog)$stdlog = fopen("/var/lib/asterisk/scripts/uraativa/$nomeApl.log", "a");
fputs($stdlog, "Log: $log\n");
fclose($stdlog);
}
function GetVariableCmd() {
global $argv;
if (!isset($argv[3]))
return;
$params = explode('@', $argv[3]);
foreach ($params as $param) {
if (trim($param) != '') {
$var = explode('#', $param);
$varName = trim($var[0]);
if ($varName) {
$varValue = trim($var[1]);
$GLOBALS[$varName] = $varValue;
}
}
}
}
function Sauda($caixa = 'l', $cType = "f") {
$hora = (int) date('H');
if (($hora >= 6) && ($hora < 12))
$sauda = "bom dia";
else if (($hora >= 12) && ($hora < 18))
$sauda = "boa tarde";
else
$sauda = "boa noite";
if ($caixa == 'U') {
$sauda = strtoupper($sauda);
}
if ($caixa == 'C') {
$sauda = $cType == "f" ? ucfirst($sauda) : ucwords($sauda);
}
return $sauda;
}
function GetAudio($txtAudio, $fileName) {
global $removeFiles;
$audio = DIR_BASE_AUDIO . $fileName;
$removeFiles[] = $audio;
$txtAudio = str_replace('"', '\"', $txtAudio);
$txtAudio = str_replace("\n", "", $txtAudio);
$cmd = sprintf("%s \"%s\" %s", TTS_EXE, $txtAudio, $audio);
exec($cmd, $ret, $result);
$audio .= AUDIO_EXTENSAO;
return file_exists($audio) ? $fileName : false;
}
function GetCadastroFone() {
global $globais;
$fone = $globais["callerid"];
$query = "select cli_id, cpf, nome, saldo_cartao, fone, fone1, fone2 from clientes where '$fone' in(fone, fone1, fone2)";
$result = pg_query($query);
if (!pg_num_rows($result)) {
return false;
} else {
$dados = pg_fetch_array($result);
$globais["cli_id"] = $dados["cli_id"];
$globais["cpf_cliente"] = $dados["cpf"];
$globais["nome_cliente"] = $dados["nome"];
$globais["saldo_cartao"] = $dados["saldo_cartao"];
$globais["fones"] = array("fone" => $dados["fone"], "fone1" => $dados["fone1"], "fone2" => $dados["fone2"]);
return true;
}
}
function GetCadastroCpf($cpf) {
global $globais;
$fone = $globais["callerid"];
$query = "select cli_id, cpf, nome, saldo_cartao, fone, fone1, fone2 from clientes where cpf = '$cpf' ";
$result = pg_query($query);
if (!pg_num_rows($result)) {
return false;
} else {
$dados = pg_fetch_array($result);
$globais["cli_id"] = $dados["cli_id"];
$globais["cpf_cliente"] = $dados["cpf"];
$globais["nome_cliente"] = $dados["nome"];
$globais["saldo_cartao"] = $dados["saldo_cartao"];
$globais["fones"] = array("fone" => $dados["fone"], "fone1" => $dados["fone1"], "fone2" => $dados["fone2"]);
return true;
}
}
function GetAudioText($textoConctAudio, $nomeAudio) {
$audio = DIR_BASE_AUDIO . $nomeAudio . AUDIO_EXTENSAO;
if (file_exists($audio)) {
return $nomeAudio;
} else {
return GetAudio($textoConctAudio, $nomeAudio);
}
}
function GetMenuAtendimento($textoConctAudio = '', $nomeAudio = '') {
$audio = DIR_BASE_AUDIO . (!$nomeAudio ? "menu_atendimento_simples" : $nomeAudio) . AUDIO_EXTENSAO;
$menu = !$textoConctAudio ? '' : trim($textoConctAudio);
$menu .= "Abrir um chamado para reparo técnico digite 1.Agendar uma visita digite 2.Se você quer saber seu saldo do cartão fidelidade digite 3.Cancelar o seu contrato digite 4.Fazer um elogio sugestão ou reclamação digite 5.Conhecer nossas ofertas e promoções digite 6.Falar com um de nossos atendentes digite 9.E caso queira ouvir novamente este menu digite 0.";
if (file_exists($audio)) {
return $nomeAudio;
} else {
return GetAudio($menu, $nomeAudio);
}
}
function GetOption($audio, $maxDigits = 1, $timeout = 2) {
$numDigit = 0;
while ($count < $maxDigits) {
$dtmf = $agi->get_data($audio, $maxDigits, $timeout);
if ($dtmf["result"] > 3) {
$agi->stream_file("invalid-opt");
$count++;
continue;
}
}
}
function MenuAtendimento($agi, $textaudio, $audio) {
global $uid;
Grava_log("Menu Atendimento Audio: $audio Txt: $textaudio");
$fim = 0;
$repete = true;
$invalido = 0;
$valido = array('1', '2', '3', '4', '5', '6', '9', '0');
$txtInvalido = '';
while (!$fim) {
if ($repete) {
$repete = false;
$audio = GetMenuAtendimento($textaudio, $audio);
$ret = $agi->get_data($audio, 3000, 1);
$digit = $ret["result"];
}
if ($invalido) {
$invalido = false;
$nomeAudio = "opcao_menu_invalido";
$nomeAudio = GetAudioText($txtInvalido, $nomeAudio);
$ret = $agi->stream_file($nomeAudio);
$nomeAudio = "beep";
$ret = $agi->get_data($nomeAudio, 3000, 1);
$digit = $ret["result"];
Grava_log("Menu Atendimento Invalido: " . print_r($ret, true) . " Digito: $digit");
}
if (!$invalido) {
if (array_search($digit, $valido) !== false) {
Grava_log("Menu Atendimento Escolhe: $digit");
if ($digit == '0') {
$repete = true;
continue;
} else if ($digit == '1')
$txt = "Você selecionou abrir um chamado.";
else if ($digit == '2')
$txt = "Você selecionou agendar uma visita.";
else if ($digit == '3')
$txt = "Você selecionou Consulta de saldo.";
else if ($digit == '4')
$txt = "Você selecionou cancelar contrato.";
else if ($digit == '5')
$txt = "Você selecionou fazer um elogio reclamação ou sugestão.";
else if ($digit == '6')
$txt = "Você selecionou ouvir nossas ofertas.";
else if ($digit == '9')
$txt = "Você selecionou redirecionar para nossos atendentes.";
Grava_log("Menu Atendimento Escolhe: $digit Txt: $txt");
$txt = $txt . "Esta é uma pequena demosntração das inúmeras possibilidades de integração que este aplicativo possibilita, obrigado por participar";
$nomeAudio = "agradecimento_demo_$uid";
$nomeAudio = GetAudioText($txt, $nomeAudio);
Grava_log("Menu Atendimento Escolhe: $digit Txt comp: $txt");
$agi->stream_file($nomeAudio);
return;
}
$txtInvalido = "Opção inválida após o bípe entre com outra opção ou pressione zero para ouvir o menu";
$invalido = true;
}
}
}
function SolicitaCpf($agi, $txt = '', $nomeAudio = '', $timeout = 3000, $maxDigit = 11) {
global $saudacao;
$textaudio = $txt ? $txt : sprintf("%s, bem vindo a Simples Ipê, não encontramos o seu telefone em nosso cadastro\, se você já é nosso cliente digite o número de seu cpf ou digite 9 para falar com um de nossos atendentes.", Sauda());
$audio = $nomeAudio ? $nomeAudio : sprintf("%s_%s", "opcoes_clicad", $saudacao);
$audio = GetAudioText($textaudio, $audio);
$ret = $agi->get_data($audio, $timeout, $maxDigit);
return _soNumero($ret["result"]);
}
function AssociaFone($agi) {
global $globais, $uid;
$fone = $globais["callerid"];
$fones = $globais["fones"];
$query = "";
foreach ($fones as $key => $value) {
$value = trim($value);
if (empty($value)) {
$query = sprintf("update clientes set %s = '%s' where cli_id = '%s'", $key, $fone, $globais['cli_id']);
Grava_log("AssociaFone: $query");
break;
}
}
if (empty($query))
$query = sprintf("update clientes set %s = '%s' where cli_id = '%s'", "fone2", $fone, $globais['cli_id']);
@pg_query($query);
$audio = "fone_incluido_$uid";
$textoConctAudio = "Senhor %s este telefone foi associado ao seu cadastro este procedimento irá agilizar o seu atendimento na próxima vez em que nos ligar. A seguir você será redirecionado para o menu de atendimento.";
$textoConctAudio = sprintf($textoConctAudio, $globais['nome_cliente']);
$audio = GetAudioText($textoConctAudio, $audio);
$agi->stream_file($audio);
}
function ApagaArquivos() {
global $removeFiles;
foreach ($removeFiles as $file) {
$file = trim($file) . AUDIO_EXTENSAO;
@unlink($file);
}
}
function signal_handler($signal) {
Grava_log("signal_handler", 1);
ApagaArquivos();
exit(0);
}
?>