eventosModel = new Evento(); $this->message = new MessageController(); $this->notificaMedia = new NotificaMedia(); $this->mensages = new Message(); $this->atendimentos = new Atendimento(); $this->systemController = new SystemMessageController(); $this->mensagem = [ "ALERTA_INATIVIDADE" => "Você será desconectado em " . ($this->timeout_agent_desconexao - $this->timeout_agent_alert) . " minutos, para permanecer em atendimento clique em '/presente'", "ALERTA_DESCONECTADO" => "Você foi desconectado por inatividade!", "ALERTA_CLIENTE" => "Olá, como podemos lhe ajudar!", "TIMEOUT_CLIENT_INATIVIDADE" => "O tempo da conversa foi expirado, por favor volte novamente a fila para um novo atendimento!", "TALK_FINISHED" => "O atendimento foi finalizado!", "TALK_ALERT_FINISH" => "Por favor, volte a comunicação com nosso atendimento em 1 minuto ou atendimento será encerrado!" ]; } public function run() { $atendiss = $this->atendimentos->findAtenEmAberto(); foreach ($atendiss as $value) { $this->api = returnChannel($value->context); $this->timeoutCliente($value->uniqueid, $value->cliente_id); $this->timeoutSessao($value->uniqueid, $value->cliente_id, $value->data_reg); } } private function timeoutCliente($uniqueid, $client) { // echo "unique: $uniqueid - client: $client \n"; if ($this->message->timeoutTalk($uniqueid, $client) == 'FINISH') { $this->api->enviarMsg($client, $this->mensagem['TIMEOUT_CLIENT_INATIVIDADE']); $this->finalizar($client); return null; } if ($this->message->timeoutTalk($uniqueid, $client) == 'ALERT') { $msg = $this->mensages->findLastMessage($uniqueid); $retorno = $this->notificaMedia->verificaNotifica( $uniqueid, $client, utf8_encode($this->mensagem['TALK_ALERT_FINISH']) . $msg->id ); if ($retorno->quant == 0) { $this->notificaMedia->addNotifica( $uniqueid, $client, utf8_encode($this->mensagem['TALK_ALERT_FINISH']) . $msg->id ); $this->api->enviarMsg( $client, $this->mensagem['TALK_ALERT_FINISH'] ); } } } private function timeoutSessao($uniqueid, $client, $data_atendimento) { $date1 = date_create($data_atendimento); $date2 = date_create(); echo $date1->format('Y-m-d H:i:s') . "\n"; echo $date2->format('Y-m-d H:i:s') . "\n"; $diff = date_diff($date1, $date2); echo $diff->h . "\n"; if ($diff->h > 23) { $this->notificaMedia->addNotifica( $uniqueid, $client, utf8_encode($this->mensagem['TIMEOUT_CLIENT_INATIVIDADE']) . $uniqueid ); $this->api->enviarMsg( $client, $this->mensagem['TIMEOUT_CLIENT_INATIVIDADE'] ); $this->finalizar($client); } } public function finalizar($numero) { try { $this->atendimentos->begin(); $supervisorModel = new SupervisorModel(); $atendimento = $this->atendimentos->getAtendimentoByCliente($numero, CONF_EVENT_START); //cria o evento pra finalizar $ret = $this->eventosModel->createEvento( $atendimento->uniqueid, CONF_EVENT_TIMEOUT_CLIENTE, date('Y-m-d H:i:s'), date('Y-m-d H:i:s'), $atendimento->fila ); if ($ret) { $mensagemW = 'Atendimento finalizado pelo sistema por inatividade do cliente'; $ws = new WsInterface(); $agente = $supervisorModel->findAgentByMatricula($atendimento->matricula); $messegeModel = new Message(); $messegeModel->addMessage( $atendimento->uniqueid, $numero, $agente->matricula, 'finish', $mensagemW, $atendimento->nome, $atendimento->context, 'read' ); //verifica se está como indisponivel e caso não tenha atendimento ele entra em pausa if ($agente->status == CONF_AGENT_STATUS_INDISPONIVEL) { $atends = $this->atendimentos->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->atendimentos->getQuantiAtendimentSimultaneos(); $atendimentosAbertos = $this->atendimentos->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" => 'inatividade']], $this->api, $numero ); $this->atendimentos->commit(); //notifica o agente da mudança $ws->enviaMsg($ws->enviaActions($mensagemW, 'finish', $agente->matricula, $atendimento->uniqueid)); return true; } else { $this->atendimentos->rollback(); $this->api->enviarMsg($numero, CONF_NAME_REPONSE . " : Erro ao finalizar!"); return true; } } catch (\Exception $th) { $this->atendimentos->rollback(); $this->api->enviarMsg($numero, CONF_NAME_REPONSE . " : " . $th->getMessage()); return true; } } }