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.
399 lines
14 KiB
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); |
|
} |
|
?>
|
|
|