|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace app\Core;
|
|
|
|
|
|
|
|
|
|
use app\Controllers\AgentController;
|
|
|
|
|
use app\Controllers\BilheteController;
|
|
|
|
|
use app\Controllers\QueueController;
|
|
|
|
|
use app\Controllers\SystemMessageController;
|
|
|
|
|
use app\Interfaces\IApiMedia;
|
|
|
|
|
use app\Models\Atendimento;
|
|
|
|
|
use app\Models\Evento;
|
|
|
|
|
use app\Models\Message;
|
|
|
|
|
use app\Models\SupervisorModel;
|
|
|
|
|
use websocket\WsInterface;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @author Lucas Awade
|
|
|
|
|
*/
|
|
|
|
|
class Commands
|
|
|
|
|
{
|
|
|
|
|
/** @var IApiMedia $api provider de mensagens */
|
|
|
|
|
protected $api;
|
|
|
|
|
|
|
|
|
|
/** @var SystemMessageController $systemController controller de mensagens de sistemas */
|
|
|
|
|
protected $systemController;
|
|
|
|
|
|
|
|
|
|
/** @var BilheteController $bilheteController controller de billhete */
|
|
|
|
|
protected $bilheteController;
|
|
|
|
|
|
|
|
|
|
/** @var Atendimento $atendimentoModel model de atendimento*/
|
|
|
|
|
protected $atendimentoModel;
|
|
|
|
|
|
|
|
|
|
/** @var Evento $eventosModel model de eventos */
|
|
|
|
|
protected $eventosModel;
|
|
|
|
|
|
|
|
|
|
/** @var QueueController $queue controller da queue*/
|
|
|
|
|
protected $queue;
|
|
|
|
|
|
|
|
|
|
public function __construct()
|
|
|
|
|
{
|
|
|
|
|
$this->queue = new QueueController();
|
|
|
|
|
$this->eventosModel = new Evento();
|
|
|
|
|
$this->atendimentoModel = new Atendimento();
|
|
|
|
|
$this->agente = new AgentController();
|
|
|
|
|
$this->bilheteController = new BilheteController();
|
|
|
|
|
$this->systemController = new SystemMessageController();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function setApi(IApiMedia $api)
|
|
|
|
|
{
|
|
|
|
|
$this->api = $api;
|
|
|
|
|
}
|
|
|
|
|
public function isCommand(IApiMedia $api)
|
|
|
|
|
{
|
|
|
|
|
$this->api = $api;
|
|
|
|
|
$messageParams = explode(" ", $api->getMessage());
|
|
|
|
|
$command = $messageParams[0];
|
|
|
|
|
switch (strtoupper($command)) {
|
|
|
|
|
case '/FINALIZAR':
|
|
|
|
|
return $this->finalizar($api->getPhone());
|
|
|
|
|
case '/CANCELAR':
|
|
|
|
|
return $this->cancelar($api->getPhone());
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function finalizar($numero)
|
|
|
|
|
{
|
|
|
|
|
try {
|
|
|
|
|
$this->atendimentoModel->begin();
|
|
|
|
|
$supervisorModel = new SupervisorModel();
|
|
|
|
|
$atendimento = $this->atendimentoModel->getAtendimentoByCliente($numero, CONF_EVENT_START);
|
|
|
|
|
//verifica se existe atendimento
|
|
|
|
|
if (empty($atendimento)) {
|
|
|
|
|
$this->atendimentoModel->rollback();
|
|
|
|
|
$this->api->enviarMsg($numero, CONF_NAME_REPONSE . " : N<EFBFBD>o foi encontrado atendimento em aberto");
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
//cria o evento pra finalizar
|
|
|
|
|
$ret = $this->eventosModel->createEvento(
|
|
|
|
|
$atendimento->uniqueid,
|
|
|
|
|
CONF_EVENT_TIMERMINO_CLIENTE,
|
|
|
|
|
date('Y-m-d H:i:s'),
|
|
|
|
|
date('Y-m-d H:i:s'),
|
|
|
|
|
$atendimento->fila
|
|
|
|
|
);
|
|
|
|
|
if ($ret) {
|
|
|
|
|
$ws = new WsInterface();
|
|
|
|
|
$agente = $supervisorModel->findAgentByMatricula($atendimento->matricula);
|
|
|
|
|
$messegeModel = new Message();
|
|
|
|
|
$mensagemW = 'Atendimento finalizado pelo cliente';
|
|
|
|
|
$messegeModel->addMessage(
|
|
|
|
|
$atendimento->uniqueid,
|
|
|
|
|
$numero,
|
|
|
|
|
$agente->matricula,
|
|
|
|
|
'finish',
|
|
|
|
|
$mensagemW,
|
|
|
|
|
$atendimento->nome,
|
|
|
|
|
$atendimento->context,
|
|
|
|
|
'read'
|
|
|
|
|
);
|
|
|
|
|
//verifica se est<EFBFBD> como indisponivel e caso n<EFBFBD>o tenha atendimento ele entra em pausa
|
|
|
|
|
if ($agente->status == CONF_AGENT_STATUS_INDISPONIVEL) {
|
|
|
|
|
$atends = $this->atendimentoModel->getAtendimentoAbertoByAgente($atendimento->matricula);
|
|
|
|
|
if (empty($atends)) {
|
|
|
|
|
$agente->enterPause($atendimento->matricula, $agente->motivo_pausa);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//coloca o agente como livre caso esteja ocupado e com menos atendimento que o maximo de atendimento
|
|
|
|
|
if ($agente->status == CONF_AGENT_STATUS_OCUPADO) {
|
|
|
|
|
$param = $this->atendimentoModel->getQuantiAtendimentSimultaneos();
|
|
|
|
|
$atendimentosAbertos = $this->atendimentoModel->getAtendimentoAbertoByAgente($agente->matricula);
|
|
|
|
|
if (count($atendimentosAbertos) < $param->prm_media_simultaneo) {
|
|
|
|
|
$supervisorModel->updateAgent($agente->matricula, CONF_AGENT_STATUS_LIVRE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//envia as mensagens do sistema do momento atual para o cliente
|
|
|
|
|
$this->systemController->sendMessageSystem(
|
|
|
|
|
CONF_MOMENT_FINALIZAR_ATENDIMENTO,
|
|
|
|
|
[["nome" => "@autor_name", "valor" => $atendimento->nome]],
|
|
|
|
|
$this->api,
|
|
|
|
|
$numero
|
|
|
|
|
);
|
|
|
|
|
$this->atendimentoModel->commit();
|
|
|
|
|
//notifica o agente da mudan<EFBFBD>a
|
|
|
|
|
$ws->enviaMsg($ws->enviaActions($mensagemW, 'finish', $agente->matricula, $atendimento->uniqueid));
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
$this->atendimentoModel->rollback();
|
|
|
|
|
$this->api->enviarMsg($numero, CONF_NAME_REPONSE . " : Erro ao finalizar!");
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} catch (\Exception $th) {
|
|
|
|
|
$this->atendimentoModel->rollback();
|
|
|
|
|
$this->api->enviarMsg($numero, CONF_NAME_REPONSE . " : " . $th->getMessage());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function cancelar($numero)
|
|
|
|
|
{
|
|
|
|
|
$atendimento = $this->atendimentoModel->getAtendimentoByCliente($numero, CONF_EVENT_ESPERA);
|
|
|
|
|
$ret = $this->eventosModel->createEvento(
|
|
|
|
|
$atendimento->uniqueid,
|
|
|
|
|
CONF_EVENT_ABANDONADA,
|
|
|
|
|
date('Y-m-d H:i:s'),
|
|
|
|
|
date('Y-m-d H:i:s'),
|
|
|
|
|
$atendimento->fila
|
|
|
|
|
);
|
|
|
|
|
if ($ret) {
|
|
|
|
|
//envia as mensagens do sistema do momento atual para o cliente
|
|
|
|
|
$this->systemController->sendMessageSystem(
|
|
|
|
|
CONF_MOMENT_CANCELAR_FILA,
|
|
|
|
|
[],
|
|
|
|
|
$this->api,
|
|
|
|
|
$numero
|
|
|
|
|
);
|
|
|
|
|
$filas = $this->queue->listAllQueueWhatsApp($this->api->getMessage());
|
|
|
|
|
if ($filas['LIST']) {
|
|
|
|
|
$this->api->enviarMsg($this->api->getPhone(), $filas['LIST']);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
$this->api->enviarMsg($numero, CONF_NAME_REPONSE . " : N<EFBFBD>o foi poss<EFBFBD>vel cancelar o atendimento! " . $this->bilheteController->message());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|