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.
 
 
 
 
 
 

640 lines
24 KiB

#!/usr/bin/php -q
<?php
include('bd.php');
include('util/util.php');
ob_implicit_flush(true);
set_time_limit(6);
error_reporting(0);
$in = fopen("php://stdin", "r");
$stdlog = fopen("/var/log/asterisk/pbx_complemento.log", "w");
// Habilita modo debugging (mais verbose)
$debug = true;
// 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) {
global $debug, $stdlog;
if ($debug)
fputs($stdlog, "write: $line\n");
echo $line . "\n";
}
// 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;
}
}
write("GET VARIABLE EPOCH");
$inicio=substr(strrchr(read(),"("),1,-1);
/*
* Implementação para Monitoramento dos ramais vinculados ao serviço de Callcenter - Ativo/Receptivo
* Ligações Originadas
*/
write("GET VARIABLE CONSULTA");
$consulta = substr(strrchr(read(), "("), 1, -1);
if (!$consulta) {
write("GET VARIABLE MONITORADO");
$monitorado = substr(strrchr(read(), "("), 1, -1);
if (!$monitorado) {
$origem = $agi['callerid'];
$destino = $agi['extension'];
$canal_agente = $agi['channel'];
$uniqueid = $agi['uniqueid'];
write("GET VARIABLE CONTEXTORAMAL");
$contextoramal = substr(strrchr(read(), "("), 1, -1);
if (!$contextoramal) {
$contextoramal = 'padrao';
}
$query = "select matricula,dac,status,chamada_classificado from pbx_supervisor_agentes where ramal = '$origem' and coalesce(trim(uniqueid), '') = ''";
$result = pg_query($conexao, $query);
$row = @pg_fetch_array($result);
$resultado = pg_num_rows($result);
$matricula = $row['matricula'];
$fila = $row['dac'];
$status = $row['status'];
$classifica = $row['chamada_classificado'];
if ($resultado) {
/*
* Tratamento para transferencias cegas nao passarem pela macro-origina-agente
* O ideia eh que seja adicionado uma variavel TRANSFERENCIACEGA
* Ultimo implementado com accountcode ao inves da variavel CONSULTANDO
* write("GET VARIABLE CONSULTANDO");
* $consultando=substr(strrchr(read(),"("),1,-1);
*/
mostra_parametro("TEM_AGENTE_LOGADO");
$accountcode = $agi['accountcode'];
if (!$accountcode) {
// write("EXEC PauseQueueMember |Agent/$matricula");
write("EXEC PauseQueueMember ,Local/$origem@app-callcenter/n");
read();
// write("SET VARIABLE __PAUSA $status");
// read();
if (strtoupper($status) == 'PAUSA') {
write("EXEC Playback appsounds/atendente_em_pausa_retire_da_pausa");
read();
write("HANGUP");
read();
exit;
}
/*
* Trata classificao
* Verifica se a classificao esta ativa
* Verifica se e exigida a classificao
*/
VerificaClassificacao($conexao, $fila, $matricula, $origem, $uniqueid, $classifica, "SAINTE");
// $query = "select b.prm_agente_classifica, a.exige_classificacao as prm_exige_classificacao
// from pbx_queues_grupos a, pbx_parametros b
// where nome = '$fila'";
//
// $result = pg_query($conexao, $query);
// $dados = pg_fetch_row($result);
// if ($dados[0] && $dados[1]) {
// //verifica se a chamada ja esta classificada
// if ($classifica == 0) {
// write("EXEC Playback appsounds/chamada_nao_classificada");
// read();
// write("HANGUP");
// read();
// exit;
// }
// else {
// $query = "update pbx_supervisor_agentes set origem_destino = '$destino',canal_agente = '$canal_agente' , status = 'OCUPADO',duracao = 'now()',tipo_ligacao = 'S',uniqueid = '$uniqueid',uniqueid2 = '$uniqueid',tipo_discagem = 'MANUAL' where ramal = '$origem'";
// $result = pg_query($conexao, $query);
// }
//}
// else {
// $query = "update pbx_supervisor_agentes set origem_destino = '$destino',canal_agente = '$canal_agente' , status = 'OCUPADO',duracao = 'now()',tipo_ligacao = 'S',uniqueid = '$uniqueid',uniqueid2 = '$uniqueid',tipo_discagem = 'MANUAL' where ramal = '$origem'";
// $result = pg_query($conexao, $query);
// }
/*
* Função retorna numero de Protocolo de Atendimento para o agente
*/
$protocolo=GeraProtocolo($conexao, $uniqueid);
// $tentativa = 0;
// while (true) {
// $proto = @GetProto($conexao, $uniqueid);
// if ($proto == '99') {
// $proto = '0000-000000';
// break;
// }
//
// if (!empty($proto) || $tentativa >= NUM_TENTATIVAS_GERA_PROTO) {
// break;
// }
// $tentativa++;
// }
$query = "update pbx_supervisor_agentes set protocolo = '$protocolo', origem_destino = '$destino',canal_agente = '$canal_agente' , status = 'CHAMANDO',duracao = 'now()',tipo_ligacao = 'S',uniqueid = '$uniqueid',uniqueid2 = '$uniqueid',tipo_discagem = 'MANUAL' where ramal = '$origem'";
$result = pg_query($conexao, $query);
// write("EXEC PauseQueueMember |Agent/$matricula");
// read();
write("SET VARIABLE __INICIO_DIAL $inicio");
read();
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
write("SET VARIABLE __MONITORADO SIM");
read();
write("SET VARIABLE __CALLCENTER SIM");
read();
write("SET VARIABLE __FILA-ORIGEM $fila");
read();
write("SET VARIABLE __MATRICULA-ORIGEM $matricula");
read();
write("SET VARIABLE __DESTINO-ORIGEM $destino");
read();
write("SET VARIABLE __RAMAL $origem");
read();
write("SET VARIABLE __CANALORIGEM $canal_agente");
read();
write("EXEC Macro origina-agente");
read();
mostra_parametro("SAIU_DO_AGENTE_LOGADO");
}
}
}
}
//Local/$destino@$contextoramal
$uniqueid = $agi['uniqueid'];
$contexto = $argv[1];
$destino = $agi['extension'];
if (strtolower($contexto) == 'ext-transferencia') {
mostra_parametro("EXT_TRANSFERENCIA");
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
$result = insert_padrao($conexao, $uniqueid, 'transfer', $destino);
} else if (strtolower($contexto) == 'macro-dial-interno') {
mostra_parametro("MACRO_DIAL_INTERNO");
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
$direcao = $argv[2];
$destino = $argv[3];
if ($idorigem) {
$result = insert_padrao($conexao, $idorigem, $direcao, $destino);
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
$result = insert_padrao($conexao, $uniqueid, $direcao, $destino);
}
} else if (strtolower($contexto) == 'app-conta-senha') {
mostra_parametro("APP_CONTA_SENHA");
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
$conta = $argv[2];
$destino = $argv[3];
$query = "select id from pbx_cs_usuarios where matricula = '$conta' and upper(status) = upper('a')";
$result = pg_query($conexao, $query);
$row = @pg_fetch_array($result);
$id_usuario = $row['id'];
if ($idorigem) {
$result = insert_padrao($conexao, $idorigem, $contexto, $destino, $conta, $id_usuario);
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
$result = insert_padrao($conexao, $uniqueid, $contexto, $destino, $conta, $id_usuario);
}
} else if (strtolower($contexto) == 'saida-pstn') {
mostra_parametro("SAIDA_PSTN");
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
$ramal = strtolower($agi["callerid"]);
$query = "select matricula,dac from pbx_supervisor_agentes where ramal = '$ramal'";
$result = pg_query($conexao, $query);
$row = @pg_fetch_array($result);
$matricula = $row['matricula'];
$dac = $row['dac'];
if ($idorigem) {
if ($matricula) {
//$query = "select count(*) from ast_bilhetes_complemento where uniqueid2 = '$idorigem' and conta = '$matricula' and direcao = 'app-conta-senha'";
$query = "select conta from ast_bilhetes_complemento where uniqueid2 = '$idorigem' and direcao = 'app-conta-senha'";
$result = pg_query($conexao, $query);
$row = @pg_fetch_array($result);
$conta = $row['conta'];
if ($conta) {
if ($conta == $matricula) {
$result = insert_padrao($conexao, $idorigem, $contexto, $destino, 'null', 'null', $matricula, $dac);
} else {
insert_padrao($conexao, $idorigem, $contexto, $destino);
}
} else {
$result = insert_padrao($conexao, $idorigem, $contexto, $destino, 'null', 'null', $matricula, $dac);
}
} else {
insert_padrao($conexao, $idorigem, $contexto, $destino);
}
} else {
if ($matricula) {
$query = "select conta from ast_bilhetes_complemento where uniqueid2 = '$uniqueid' and direcao = 'app-conta-senha'";
$result = pg_query($conexao, $query);
$row = @pg_fetch_array($result);
$conta = $row['conta'];
if ($conta) {
if ($conta == $matricula) {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
$result = insert_padrao($conexao, $uniqueid, $contexto, $destino, 'null', 'null', $matricula, $dac);
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
insert_padrao($conexao, $idorigem, $contexto, $destino);
}
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
$result = insert_padrao($conexao, $uniqueid, $contexto, $destino, 'null', 'null', $matricula, $dac);
}
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
insert_padrao($conexao, $uniqueid, $contexto, $destino);
}
}
} else if (strtolower($contexto) == 'ext-ramais') {
mostra_parametro("EXT_RAMAIS");
$origem = $agi['callerid'];
$destino = $agi['extension'];
$canal = $agi['channel'];
write("GET VARIABLE MONITORADO");
$monitorado = substr(strrchr(read(), "("), 1, -1);
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
write("GET VARIABLE TIPO");
$tipo = substr(strrchr(read(), "("), 1, -1);
$tipo = strtolower($tipo);
if (!$tipo) {
$tipo = $argv[2];
}
if ($idorigem) {
if ($idorigem == $uniqueid) {
insert_padrao($conexao, $idorigem, $tipo, $destino);
} else {
if ($monitorado) {
insert_padrao($conexao, $idorigem, $tipo, $destino);
} else {
insert_padrao($conexao, $uniqueid, $tipo, $destino);
}
}
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
insert_padrao($conexao, $uniqueid, $tipo, $destino);
}
//Monitoramento Ligações Recebidas CallCenter
//$query = "select matricula,dac,status from pbx_supervisor_agentes where ramal = '$destino' and upper(status) in ('LIVRE','PAUSA')";
$query = "select matricula,dac,status,chamada_classificado,upper(modo_atendimento) as modo_atendimento from pbx_supervisor_agentes where ramal = '$destino'";
$result = pg_query($conexao, $query);
$row = @pg_fetch_array($result);
$resultado = pg_num_rows($result);
$matricula = $row['matricula'];
$fila = $row['dac'];
$status = $row['status'];
$classifica = $row['chamada_classificado'];
$modo_atendimento = $row['modo_atendimento'];
$origem = $agi['callerid'];
if ($modo_atendimento == 'MANUAL') {
$canal_agente = $agi['channel'];
} else {
$canal_agente = 'Agent/' . $matricula;
write("SET VARIABLE MODOATENDIMENTO AUTO");
read();
}
//Se houver agente logado
if ($resultado) {
switch (strtoupper($status)) {
case 'PAUSA':
write("SET VARIABLE __PAUSA SIM");
read();
exit;
break;
case 'LIVRE':
/*
* Trata classificao
* Verifica se a classificao esta ativa
* Verifica se e exigida a classificao
*/
VerificaClassificacao($conexao, $fila, $matricula, $destino, $uniqueid, $classifica, "ENTRANTE");
// $query = "select b.prm_agente_classifica, a.exige_classificacao as prm_exige_classificacao
// from pbx_queues_grupos a, pbx_parametros b
// where nome = '$fila'";
//
// $result = pg_query($conexao, $query);
// $dados = pg_fetch_row($result);
// if ($dados[0] && $dados[1]) {
// //verifica se a chamada já está classificada
// if ($classifica == 0) {
// write("SET VARIABLE __CLASSIFICADA NAO");
// read();
// exit;
// break;
// }
// else {
// $query = "update pbx_supervisor_agentes set origem_destino = '$origem',status = 'CHAMANDO',duracao = 'now()',tipo_ligacao = 'E',uniqueid = '$uniqueid',uniqueid2 = '$uniqueid',tipo_discagem = 'MANUAL' where ramal = '$destino'";
// $result = pg_query($conexao, $query);
// }
//}
// else {
// $query = "update pbx_supervisor_agentes set origem_destino = '$origem',status = 'CHAMANDO',duracao = 'now()',tipo_ligacao = 'E',uniqueid = '$uniqueid',uniqueid2 = '$uniqueid',tipo_discagem = 'MANUAL' where ramal = '$destino'";
// $result = pg_query($conexao, $query);
// }
/*
* Função retorna numero de Protocolo de Atendimento para o agente
*/
$protocolo=GeraProtocolo($conexao, $uniqueid);
// $tentativa = 0;
// while (true) {
// $proto = @GetProto($conexao, $uniqueid, $agente);
// if ($proto == '99') {
// $proto = '0000-000000';
// break;
// }
//
// if (!empty($proto) || $tentativa >= NUM_TENTATIVAS_GERA_PROTO) {
// break;
// }
// $tentativa++;
// }
$query = "update pbx_supervisor_agentes set protocolo = '$protocolo', canal = '$canal', origem_destino = '$origem',status = 'CHAMANDO',duracao = 'now()',tipo_ligacao = 'E',uniqueid = '$uniqueid',uniqueid2 = '$uniqueid',tipo_discagem = 'MANUAL' where ramal = '$destino'";
$result = pg_query($conexao, $query);
write("EXEC PauseQueueMember ,Local/$destino@app-callcenter/n");
read();
write("SET VARIABLE __INICIO_DIAL $inicio");
read();
write("SET VARIABLE __MATRICULA-DESTINO $matricula");
read();
write("SET VARIABLE __FILA-DESTINO $fila");
read();
write("SET VARIABLE __DIRECAO ENTRADA");
read();
write("SET VARIABLE __CALLCENTER-DESTINO SIM");
read();
write("SET VARIABLE __RAMALAGENTE $destino");
read();
break;
default:
write("SET VARIABLE __OCUPADO SIM");
read();
exit;
break;
}
}
} else if (strtolower($contexto) == 'ext-rotasinternas') {
mostra_parametro("EXT_ROTAS_INTERNAS");
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
$tipo = $argv[2];
if ($idorigem) {
if ($tipo == 'interna') {
insert_padrao($conexao, $idorigem, $tipo, $destino);
} else {
insert_padrao($conexao, $idorigem, $contexto, $destino);
}
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
if ($tipo == 'interna') {
insert_padrao($conexao, $uniqueid, $tipo, $destino);
} else {
insert_padrao($conexao, $uniqueid, $contexto, $destino);
}
}
} else if (strtolower($contexto) == 'ext-fila') {
mostra_parametro("EXT_FILA");
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
write("GET VARIABLE TRANSFER");
$transfer = substr(strrchr(read(), "("), 1, -1);
$FONE = $agi["callerid"];
write("SET VARIABLE BINA_RETORNO $FONE");
read();
if ($idorigem) {
if ($transfer) {
mostra_parametro("TEM_TRANSFER");
insert_padrao($conexao, $uniqueid, $contexto, $destino);
}
insert_padrao($conexao, $idorigem, $contexto, $destino);
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
insert_padrao($conexao, $uniqueid, $contexto, $destino);
}
} else if (strtolower($contexto) == 'transfer-saida') {
mostra_parametro("TRANSFER_SAIDA");
insert_padrao($conexao, $uniqueid, $contexto, $destino);
} else if (strtolower($contexto) == 'fila-ramal') {
mostra_parametro("FILA_RAMAL");
$destino = $argv[2];
insert_padrao($conexao, $uniqueid, $contexto, $destino);
} else if (strtolower($contexto) == 'ura') {
/*
* Executa noop para cli do asterisk, mostrando a passagem para ura.
*/
mostra_parametro('ura');
/*
* Captura valores passados na linha de comando.
*/
$tipo = trim($argv[2]);
$idUra = trim($argv[3]);
$opcUra = isset($argv[4]) ? trim($argv[4]) : '0';
$opcao = isset($argv[5]) ? trim($argv[5]) : '';
$acao = isset($argv[6]) ? trim($argv[6]) : '';
$identProc = 'pbx_complemento.php';
$upd = '';
//$log = sprintf("Contexto: %s Tipo: %s Id: %s OpcUra: %s Opcao: %s Acao: %s", $contexto, $tipo, $idUra, $opcUra, $opcao, $acao );
/*
* Tenta recuperar o identificador da chamada pela origem, ou seja
* o identificador atribuido a chamada no momento da recepcao da mesma,
* sendo que este valor possa ser alterado numa transferencia por exemplo.
*/
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
/*
* Identificador da chamada.
*/
$uid = $idorigem ? $idorigem : $uniqueid;
/*
* Primera interacao com a ura.
* ini -> Inicia o atendimento da ura.
* opc -> Digitou uma opcao na ura.
* def -> Foi executada a opcao default da ura por timeout.
* seq -> Indica o inicio da atendimeto com "ini", entretanto
* esta ura foi redirecionada de outra.
* table field: uniqueid,umv_tipo,umv_ura_id,umv_atendimento,umv_ura_opcao,umv_opcao,umv_acao,reg_proc
*/
if ($tipo == 'ini') {
/*
* Retorna seq quando ja houve atendimeto em outra "URA" para
* o identificador corrente, ou seja este atendimento eh para uma
* "URA" que foi chamada a partir de outra.
*/
if (GetInteraUra($uid)) {
$tipo = 'seq';
}
$query = "insert into pbx_ura_movimento(uniqueid,umv_tipo,umv_ura_id,reg_proc,umv_ura_nome)values(%s,%s,%s,%s,(SELECT nome FROM pbx_ura WHERE id = $idUra))";
$query = sprintf($query, QuotedStr($uid), QuotedStr($tipo), QuotedStr($idUra), QuotedStr($identProc));
} else if (($tipo == 'opc') or ( $tipo == 'def')) {
$query = "insert into pbx_ura_movimento(uniqueid,umv_tipo,umv_ura_id,umv_ura_opcao,umv_opcao,umv_acao,reg_proc,umv_ura_nome)values(%s,%s,%s,%s,%s,%s,%s,(SELECT nome FROM pbx_ura WHERE id = $idUra))";
$query = sprintf($query, QuotedStr($uid), QuotedStr($tipo), QuotedStr($idUra), QuotedStr($opcUra), QuotedStr($opcao), QuotedStr($acao), QuotedStr($identProc));
$upd = sprintf("update pbx_ura_movimento set umv_ult_atend_ura = %s, umv_ult_atend_opcao = %s where uniqueid = %s and umv_tipo = 'ini'", QuotedStr($idUra), (($tipo == 'opc') ? QuotedStr($opcUra) : QuotedStr('99')), QuotedStr($uid));
}
try {
$erro = '';
$inTran = 0;
$result = pg_query('begin');
if (!$result) {
RaiseExcept('Erro ao iniciar uma transação.', true);
}
$inTran = 1;
$result = pg_query($query);
if (!$result) {
RaiseExcept('Erro ao inserir pbx_ura_movimento.', true);
}
if ($upd) {
$result = pg_query($upd);
if (!$result) {
RaiseExcept('Erro ao atualizar pbx_ura_movimento.', true);
}
}
$result = pg_query('commit');
if (!$result) {
RaiseExcept('Erro ao finalizar uma transação.', true);
}
} catch (Exception $ex) {
$log = sprintf("Data: %s Cmd: %s Cmd2: %s Sys: %s [ERRO]\n", date('Y-m-d H:i:s'), $query, $upd, $ex->getMessage());
WriteLog($log, '/var/log/asterisk/pbx_complemento_reg.log');
write("EXEC Playback appsounds/erro_operacao");
read();
write("HANGUP");
read();
if ($inTran) {
pg_query('rollback');
}
exit;
}
/*
* Tenta gravar as informaçoes da ura, caso nao seja possivel a operacao eh abortada.
*/
if ($idUra) {
$destino = $idUra;
}
/*
* Realiza insert padrao na tabela pbx_complemento.
*/
insert_padrao($conexao, $uid, $contexto, $destino);
if (!$idorigem) {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
insert_padrao($conexao, $uniqueid, $contexto, $destino);
}
} else {
write("GET VARIABLE IDORIGEM");
$idorigem = substr(strrchr(read(), "("), 1, -1);
if ($idorigem) {
insert_padrao($conexao, $idorigem, $contexto, $destino);
} else {
write("SET VARIABLE __IDORIGEM $uniqueid");
read();
insert_padrao($conexao, $uniqueid, $contexto, $destino);
}
}
function mostra_parametro($parametro) {
write("EXEC Noop PARAMETRO:$parametro");
read();
}
function GetInteraUra($uid) {
$query = "select '' from pbx_ura_movimento where uniqueid = '$uid' and umv_tipo = 'ini'";
$result = pg_query($query);
return pg_num_rows($result) ? true : false;
}
fclose($in);
fclose($stdlog);
exit;
?>