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.
 
 
 
 
 
 

743 lines
26 KiB

<?php
namespace app\Middleware;
use app\Controllers\AgentController;
use app\Controllers\ClassificacaoController;
use app\Controllers\QueueController;
use app\Controllers\SystemMessageController;
use app\Interfaces\IApi;
use app\Models\Atendimento;
use app\Models\Evento;
use app\Models\ListaNegraPalavras;
use app\Models\Message;
use app\Models\Parametros;
use app\Models\Pause;
use app\Models\Queue;
use app\Models\SupervisorModel;
use websocket\WsInterface;
class ApiAgente implements IApi
{
/** @var AgentController $agentController Controller do agente */
protected $agentController;
/** @var ClassificacaoController $classificacao Controller do classificacao */
protected $classificacao;
/** @var SupervisorModel $supervisor model do supervisor */
protected $supervisor;
/** @var Atendimento $atendimento model do atendimento */
protected $atendimento;
/** @var Evento $eventos model do Evento */
protected $eventos;
/** @var Parametros $parametros model do Parametros */
protected $parametros;
/** @var Pause $pausasModel model do Pause */
protected $pausasModel;
public function __construct()
{
$this->classificacao = new ClassificacaoController();
$this->agentController = new AgentController();
$this->supervisor = new SupervisorModel();
$this->atendimento = new Atendimento();
$this->eventos = new Evento();
$this->pausasModel = new Pause();
$this->parametros = new Parametros();
}
function router($rota, $request)
{
$request = json_decode($request, true);
switch ($rota) {
case 'entrar':
$this->login($request);
break;
case 'listarFilas':
$this->listaFilas($request);
break;
case 'classificarAtendimento':
$this->classificarAtendimento($request);
break;
case 'enviarMensagem':
$this->enviaMsg($request);
break;
case 'sair':
$this->logoff($request);
break;
case 'listarAgentesDisponivel':
$this->listaAgentesDisponivel();
break;
case 'finalizarAtendimento':
$this->finalizaAtendimento($request);
break;
case 'listarAtendimentoAgente':
$this->listaAtendimentoAgent($request);
break;
case 'listarMensagem':
$this->listaMensagem($request);
break;
case 'listarPausasAgente':
$this->listaPausasAgente($request);
break;
case 'sairPausa':
$this->saiPausa($request);
break;
case 'entrarPausa':
$this->entrarPausa($request);
break;
case 'transferirAtendimento':
$this->transfAtendimento($request);
break;
case 'marcarMensagemVista':
$this->markMessegeRead($request);
break;
case 'statusAgente':
$this->statusAgente($request);
break;
case 'listarAtendimentosFilas':
$this->listarAtendimentosFilas($request);
break;
case 'listarAtendimentosAbandonado':
$this->listarAtendimentosAbandonado($request);
break;
default:
echo json_encode(['status' => '404']);
break;
}
}
function login($request)
{
try {
$agente = $this->supervisor->findByAgent($request['matricula']);
//verifica se existe agente
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return;
}
$filaModel = new Queue();
$fila = $filaModel->findQueueById($request['id_fila']);
if (empty($fila)) {
$this->retorno("Fila n<EFBFBD>o encontrada");
return;
}
$ret = $this->agentController->login(
$fila->nome,
$request['matricula']
);
if (is_string($ret)) {
$this->retorno($ret);
return;
}
$this->retorno(
$ret ? "Logado com sucesso" : "Erro",
$ret ? $ret : null
);
} catch (\Exception $th) {
$this->retorno($th->getMessage());
}
return null;
}
function logoff($request, $valida = true)
{
try {
$agente = $this->supervisor->findAgentByMatricula($request['matricula']);
//verifica se existe agente
$atends = $this->atendimento->getAtendimentoAbertoByAgente($request['matricula']);
if (!$valida) {
foreach ($atends as $key => $atendimento) {
$this->sinalisaErroAtendimento(
$request['matricula'],
$atendimento->uniqueid,
$agente->fila,
$atendimento->cliente_id
);
}
}
if (!empty($atends) && $valida) {
$this->retorno("Atendimentos em aberto, finalize os atendimentos para fazer logoff");
return;
}
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return;
}
$ret = $this->agentController->logoff(
$request['matricula'],
$valida
);
if (is_string($ret)) {
$this->retorno($ret);
return;
}
$this->retorno(
$ret ? "Deslogado com sucesso" : "Erro",
$ret ? $ret : null
);
} catch (\Exception $th) {
$this->retorno($th->getMessage());
}
return null;
}
function listaAgentesDisponivel()
{;
try {
$param = $this->atendimento->getQuantiAtendimentSimultaneos();
$ret = $this->supervisor->listaAgentesDisponivel('LIVRE');
$agentes = [];
foreach ($ret as $key => $value) {
if ($value->countAtendimentos < $param->prm_media_simultaneo) {
array_push($agentes, $value);
}
}
$this->retorno(
$agentes ? "Sucesso" : "Nenhum agente disponivel",
$agentes ? $agentes : null,
$agentes ? $agentes : null
);
} catch (\Exception $th) {
$this->retorno($th->getMessage());
}
return null;
}
function finalizaAtendimento($request)
{
try {
$agente = $this->supervisor->findAgentByMatricula($request['matricula']);
logger('debug')->info(var_export($agente, true));
//verifica se existe agente
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return;
}
$atendimento = $this->atendimento->findAtendId($request['uniqueid']);
//verifica se existe atendimento
if (empty($atendimento)) {
$this->retorno("Atendimento n<EFBFBD>o encontrado");
return;
}
$event = $this->eventos->findEventFinish($request['uniqueid']);
//verifica se o atendimento ja foi finalizado
if (!empty($event)) {
$this->retorno("Atendimento j<EFBFBD> foi finalizado");
return;
}
$ret = $this->eventos->createEvento(
$request['uniqueid'],
CONF_EVENT_TIMERMINO_AGENTE,
date('Y-m-d H:i:s'),
date('Y-m-d H:i:s'),
$atendimento->fila,
$request['matricula']
);
$ws = new WsInterface();
$mesg = "Atendimento finalizado pelo agente {$agente->nome}";
$ws->enviaMsg($this->enviaActions($mesg, 'finish', $agente->matricula, $request['uniqueid']));
$systemController = new SystemMessageController();
$provedor = returnChannel($atendimento->context);
$systemController->sendMessageSystem(
CONF_MOMENT_FINALIZAR_ATENDIMENTO,
[["nome" => "@autor_name", "valor" => $agente->nome]],
$provedor,
$atendimento->cliente_id
);
$messegeModel = new Message();
$messegeModel->addMessage(
$request['uniqueid'],
$agente->matricula,
$agente->matricula,
'finish',
$mesg,
$agente->nome,
$atendimento->context,
'read'
);
if ($agente->status == CONF_AGENT_STATUS_INDISPONIVEL) {
$atends = $this->atendimento->getAtendimentoAbertoByAgente($request['matricula']);
if (empty($atends)) {
$this->agentController->enterPause($request['matricula'], $agente->motivo_pausa);
$ws->enviaMsg($this->enviaActions('Agente em pausa', 'att_status', $agente->matricula, $request['uniqueid']));
}
}
if ($agente->status == CONF_AGENT_STATUS_OCUPADO) {
$atendimentosAbertos = $this->atendimento->getAtendimentoAbertoByAgente($agente->matricula);
$param = $this->atendimento->getQuantiAtendimentSimultaneos();
if (count($atendimentosAbertos) < $param->prm_media_simultaneo) {
$this->supervisor->updateAgent($agente->matricula, CONF_AGENT_STATUS_LIVRE);
}
}
$this->retorno(
$ret ? "Finalizado com sucesso" : "Erro",
$ret ? $ret : null,
$ret ? [$ret] : null
);
} catch (\Exception $th) {
$this->retorno($th->getMessage());
}
return null;
}
function sinalisaErroAtendimento($matricula, $uniqueid, $fila, $client_id)
{
try {
$ret = $this->eventos->createEvento(
$uniqueid,
CONF_EVENT_ERRO_ATEND,
date('Y-m-d H:i:s'),
date('Y-m-d H:i:s'),
$fila,
$matricula
);
$atendimento = $this->atendimento->findAtendId($uniqueid);
$systemController = new SystemMessageController();
$provedor = returnChannel($atendimento->context);
$systemController->sendMessageSystem(
CONF_MOMENT_ERRO_ATEND,
[],
$provedor,
$client_id,
$fila
);
$this->retorno(
$ret ? "Finalizado com sucesso" : "Erro",
$ret ? $ret : null,
$ret ? ["id" => $ret] : null
);
} catch (\Exception $th) {
$this->retorno($th->getMessage());
}
return null;
}
public function listaFilas()
{
$queue = new QueueController();
$search = $queue->listaAllFilas();
$this->retorno(
$search ? "Sucesso" : "Erro",
$search ? $search : null,
$search ? $search : null
);
return null;
}
public function classificarAtendimento($request)
{
$agent = $this->agentController->getAgente($request['ramal']);
if (!$agent) {
$msg = "Fa<EFBFBD>a o login para iniciar o atendimento!\n";
echo json_encode(['message' => $msg]);
return null;
}
/**
* VERIFICA CLASSIFICACAO DE ATENDIMENTO
*/
$chamadaSemClassificacao = $this->classificacao->agentClassificacaoPending($agent->matricula, $agent->dac);
if ($chamadaSemClassificacao) {
$classificacaoRegisterReturn = $this->classificacao->agentClassificacaoRegister(
$agent->matricula,
$agent->dac,
$chamadaSemClassificacao,
$request['option']
);
if ($classificacaoRegisterReturn) {
echo json_encode(['message' => CONF_NAME_REPONSE . " : " . $this->classificacao->message()]);
return null;
}
$classificacaoList = $this->classificacao->agentClassificacaoList($agent->dac);
echo json_encode(['message' => CONF_NAME_REPONSE . " : " . $classificacaoList]);
return null;
}
echo json_encode(['status' => "false"]);
return null;
}
public function enviaMsg($request)
{
try {
$mensagem = $request['event']['mensagem'];
$contact = $request['event']['contact'];
$status = $this->atendimento->getStatusAtendimento($mensagem['uniqueid']);
if ($status->evento == CONF_EVENT_START) {
$provider = returnChannel($mensagem['media']);
$modelMensagem = new Message();
$msgTexto = $contact['name'] . ': ' . $this->validaPalavroes($mensagem['content']);
if ($mensagem['type'] == 'text') {
$retuno = $provider->enviarMsg(
$mensagem['dst'],
$msgTexto,
false
);
} else {
$anmeArquivo = CONF_PATH_FILES . $mensagem['id_provedor'];
$texto = base64_decode($mensagem['content']);
file_put_contents($anmeArquivo, $texto);
ConvertWavToMp3($anmeArquivo);
$retuno = $provider->enviarMedia(
$mensagem['dst'],
CONF_MIDDLEWARE_LINKUPLOAD .
$mensagem['id_provedor'] . '/' .
base64_encode($mensagem['mimetype']),
$mensagem['type'],
$mensagem['file_name']
);
}
$modelMensagem->addMessage(
$mensagem['uniqueid'],
$contact['number'],
$mensagem['dst'],
$mensagem['type'],
$mensagem['type'] == 'text' ? $msgTexto : $mensagem['id_provedor'],
$contact['name'],
$mensagem['media'],
$mensagem['status'],
$mensagem['mimetype'],
$mensagem['file_name'],
$mensagem['id_provedor']
);
$this->retorno(
$retuno ? "Sucesso" : "Erro",
$retuno ? $retuno : null,
$retuno ? [["message" => $retuno]] : null
);
} else {
$this->retorno('Atendimento j<EFBFBD> foi finalizado');
}
return;
} catch (\Exception $th) {
$this->retorno($th->getMessage());
return;
}
}
function retorno($mensagem, $status = null, $dados = null)
{
//{ "status": "success", "message": "register created!", "data": [ "id": 20 ] }
$data = [];
$data['message'] = utf8_encode($mensagem);
if (!empty($status)) {
$data['status'] = "success";
} else {
$data['status'] = "error";
}
if (!empty($dados)) {
$data['data'] = $dados;
}
echo json_encode($data);
}
function listaAtendimentoAgent($request)
{
try {
if ($request['matricula']) {
$agente = $this->supervisor->findAgentByMatricula($request['matricula']);
//verifica se existe agente
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return;
}
}
$ret = $this->atendimento->findAtendAgent($request['matricula'], $request['quantidade']);
$data = [];
$data['message'] = utf8_encode("Sucesso");
$data['status'] = "success";
$data['data'] = $ret;
echo json_encode($data);
return null;
} catch (\Exception $th) {
$this->retorno($th->getMessage());
return;
}
}
function listaMensagem($request)
{
try {
$atend = $this->atendimento->findAtendId($request['uniqueid']);
//verifica se existe agente
if (empty($atend)) {
$this->retorno("N<EFBFBD>o existe atendimento para esse uniqueid");
return;
}
$messageModel = new Message();
$retunr = $messageModel->findMessageByUniqueid($request['uniqueid']);
$mensagenss = [];
foreach ($retunr as $key => $value) {
$mensagem = [];
$mensagem["event"] = [
"type" => $value->type == 'finish' ? 'actions' : "mensagem",
"contact" => [
"name" => utf8_encode($value->profile_name),
"number" => $value->src,
],
"mensagem" => [
"type" => $value->type,
"content" => $value->content,
"id_provedor" => $value->id_provedor,
"dst" => $value->dst,
"uniqueid" => $value->uniqueid,
"media" => $value->media,
"file_name" => utf8_encode($value->file_name),
"datetime" => $value->msg_date,
"status" => $value->status,
'mimetype' => $value->mimetype
]
];
array_push($mensagenss, $mensagem);
}
$data = [];
$data['message'] = utf8_encode("Sucesso");
$data['status'] = "success";
$data['data'] = $mensagenss;
echo json_encode($data);
return;
} catch (\Exception $th) {
$this->retorno($th->getMessage());
return;
}
}
function listaPausasAgente($request)
{
$agente = $this->supervisor->findAgentByMatricula($request['matricula']);
//verifica se existe agente
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return null;
}
$param = $this->parametros->findProtocolByParams();
if (false) {
$ret = $this->pausasModel->findPauseByGroupUser($request['matricula']);
} else {
$ret = $this->pausasModel->findAllPause();
}
foreach ($ret as $key => $value) {
$ret[$key] = removeAcentosArray((array) $value);
}
$this->retorno(
$ret ? "Sucesso" : "Erro",
$ret ? $ret : null,
$ret ? $ret : null
);
return null;
}
function entrarPausa($request)
{
$ws = new WsInterface();
$agente = $this->supervisor->findAgentByMatricula($request['matricula']);
//verifica se existe agente
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return;
}
$pausa = $this->pausasModel->findPauseById($request['id_pausa']);
if (empty($pausa)) {
$this->retorno("Pausa n<EFBFBD>o encontrado");
return;
}
if ($agente->status == CONF_AGENT_STATUS_PAUSA || $agente->status == CONF_AGENT_STATUS_INDISPONIVEL) {
$this->retorno('Agente precisa estar livre para entrar em pausa!');
return;
}
$atends = $this->atendimento->getAtendimentoAbertoByAgente($request['matricula']);
if (!empty($atends)) {
$ret = $this->agentController->indisponivelAtendimento($request['matricula'], $pausa->motivo);
if (is_string($ret)) {
$this->retorno($ret);
} else {
$ws->enviaMsg($this->enviaActions('Agente em pausa', 'att_status', $agente->matricula));
$this->retorno(
"Agente em 'indisponivel'",
$ret
);
}
return;
}
$ret = $this->agentController->enterPause($request['matricula'], $pausa->motivo);
$ws->enviaMsg($this->enviaActions('Agente em pausa', 'att_status', $agente->matricula));
$this->retorno(
$ret ? "Agente em 'pausa'" : "Erro",
$ret ? $ret : null
);
return null;
}
function saiPausa($request)
{
$ws = new WsInterface();
$agente = $this->supervisor->findAgentByMatricula($request['matricula']);
//verifica se existe agente
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return;
}
$ret = $this->agentController->exitPause($request['matricula']);
if (is_string($ret)) {
$this->retorno($ret);
} else {
$ws->enviaMsg($this->enviaActions('Agente em pausa', 'att_status', $agente->matricula));
$this->retorno(
"Agente 'livre'",
$ret
);
}
return;
}
function transfAtendimento($request)
{
$retunr = $this->agentController->transfer(
$request['matricula_origem'],
$request['matricula_destino'],
$request['uniqueid']
);
if (is_string($retunr)) {
$this->retorno($retunr);
} else {
$this->retorno(
$retunr ? "Sucesso" : "Erro",
$retunr ? $retunr : null
);
}
return null;
}
function markMessegeRead($request)
{
$atend = $this->atendimento->findAtendId($request['uniqueid']);
//verifica se existe agente
if (empty($atend)) {
$this->retorno("N<EFBFBD>o existe atendimento para esse uniqueid");
return;
}
$modelMensagem = new Message();
$ret = $modelMensagem->markMessege($request['uniqueid'], 'read');
$this->retorno(
$ret ? "Sucesso" : "Erro",
$ret ? $ret : null
);
return null;
}
function statusAgente($request)
{
try {
$agente = $this->supervisor->findAgentByMatricula($request['matricula']);
//verifica se existe agente
if (empty($agente)) {
$this->retorno("Agente n<EFBFBD>o encontrado");
return;
}
$this->supervisor->updateAgent($agente->matricula, $agente->status, $agente->motivo_pausa);
$ret = $this->supervisor->statusAgente($request['matricula']);
$ret = removeAcentosArray((array) $ret);
$this->retorno(
$ret ? "Sucesso" : "Erro",
$ret ? $ret : null,
$ret ? [$ret] : null
);
} catch (\Exception $th) {
$this->retorno($th->getMessage());
}
}
function enviaActions($msg, $tipo, $destino, $uniqueid = null)
{
try {
$mensagem = [];
$mensagem["event"] = [
"type" => 'actions',
"contact" => [
"name" => 'Sistema',
"number" => '0'
],
"mensagem" => [
"type" => $tipo,
"dst" => $destino,
"uniqueid" => $uniqueid,
"content" => utf8_encode($msg)
],
];
return json_encode($mensagem);
} catch (\Exception $th) {
logger('monitora')->info($th->getMessage());
}
}
public function validaPalavroes($msg)
{
try {
$palavroes = new ListaNegraPalavras();
$palavras = $palavroes->getAll();
foreach ($palavras as $key => $value) {
$pattern = "/\b($value->palavra)\b/i";
$msg = preg_replace($pattern, '*' . str_repeat('*', strlen($value->palavra)) . '*', $msg);
}
} catch (\Exception $th) {
logger('telegram')->info(print_r($th, true), true);
}
return $msg;
}
public function listarAtendimentosFilas($request)
{
try {
$filaModel = new Queue();
$fila = $filaModel->findQueueById($request['id_fila']);
if (empty($fila)) {
$this->retorno("Fila n<EFBFBD>o encontrada");
return;
}
$retunr = $this->atendimento->getAtendFila($fila->nome);
$data = [];
$data['message'] = utf8_encode("Sucesso");
$data['status'] = "success";
$data['data'] = $retunr;
echo json_encode($data);
return null;
} catch (\Exception $th) {
return $this->retorno($th->getMessage());
}
}
public function listarAtendimentosAbandonado($request)
{
try {
$filaModel = new Queue();
if ($request['id_fila']) {
$fila = $filaModel->findQueueById($request['id_fila']);
if (empty($fila)) {
$this->retorno("Fila n<EFBFBD>o encontrada");
return;
}
}
$retunr = $this->atendimento->getAtendAbandonado($fila->nome);
$data = [];
$data['message'] = utf8_encode("Sucesso");
$data['status'] = "success";
$data['data'] = $retunr;
echo json_encode($data);
return null;
} catch (\Exception $th) {
return $this->retorno($th->getMessage());
}
}
}