<?php
namespace App\Controller;
use App\Repository\Cliente\Comunicacao\ConversaRepository;
use App\Repository\Cliente\Dados\EvsRepository;
use App\Repository\Cliente\Dados\GpsRepository;
use App\Repository\Cliente\Modelagem\ProgramaRepository;
use App\Repository\Cliente\Modelagem\AvaliadoRepository;
use App\Repository\Painel\ClienteRepository;
use App\Repository\Painel\ClienteTermoRepository;
use App\Repository\Painel\ClienteUsuarioRepository;
use App\Repository\Painel\UsuarioRepository;
use App\Service\DeterminaModulosService;
use App\Service\UsuarioPermissoes;
use App\Service\VisoesService;
use DateTime;
use Doctrine\DBAL\Exception\ConnectionException;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use TypeError;
/**
* Controller Default com diversos métodos que são utilizados no login do sistema
* e para configurações padrão do sistema.
*
* @author Bruno Barea <bruno.barea@2im.com.br>
*
* @version 1.0.0
*
* @copyright (c) 2019, 2IM Inteligencia Medica <https://www.2im.com.br>
*/
class DefaultController extends Customs\Custom2IMController
{
/**
* @var ClienteUsuarioRepository
*/
private $clienteUsuario;
/**
* @var ClienteRepository
*/
private $cliente;
/**
* @var UsuarioRepository
*/
private $usuario;
/**
* @var UsuarioPermissoes
*/
private $usuarioPermissoes;
/**
* @var AvaliadoRepository
*/
private $avaliadoRepository;
private $router;
/**
* @param ClienteUsuarioRepository $clienteUsuario
* @param ClienteRepository $cliente
* @param UsuarioRepository $usuario
* @param UsuarioPermissoes $usuarioPermissoes
*/
public function __construct(
ClienteUsuarioRepository $clienteUsuario,
ClienteRepository $cliente,
UsuarioRepository $usuario,
UsuarioPermissoes $usuarioPermissoes,
AvaliadoRepository $avaliadoRepository,
RouterInterface $router
) {
$this->clienteUsuario = $clienteUsuario;
$this->cliente = $cliente;
$this->usuario = $usuario;
$this->usuarioPermissoes = $usuarioPermissoes;
$this->avaliadoRepository = $avaliadoRepository;
$this->router = $router;
}
/**
* @Route("/", name="visoes")
*
* @param ProgramaRepository $programaRepository
* @param UserInterface $user
* @param VisoesService $visaoService
* @return Response
*/
public function visoes(ProgramaRepository $programaRepository, UserInterface $user, VisoesService $visaoService, EvsRepository $evsRepository, GpsRepository $gpsRepository, Request $request) :Response
{
try {
$programa = $programaRepository->findOneBy(['ativo' => true]);
} catch ( ConnectionException $ex ) {
$this->addFlash('erro', 'Cliente inválido ou não existe! Verifique o cadastro para melhores informações.');
return $this->redirectToRoute('clientes');
}
try {
$getVisoesDoPrograma = $visaoService->getVisoesDoPrograma($programa);
} catch (TypeError $ex) {
$this->addFlash('error', 'O avaliado configurado não foi encontrado ou não foi definido para o tipo de perfil do usuário.');
return $this->render('error.html.twig', ['page' => 'page-clientes']);
}
$appUserRole = $user->getPerfil()->getRole();
$sess = $this->getSession();
if ( $appUserRole === 'ROLE_AVALIADO' ) {
$arrayKeysToRemove = [
'programa'
,'modelagem'
,'periodo'
,'nota_corte'
];
} else {
$arrayKeysToRemove = [
'avaliado'
,'programa'
,'modelagem'
,'periodo'
,'especialidade'
,'especialidade_selecionada'
,'dimensao'
,'visao_nome'
,'visao_gestor_periodo'
,'mudou_periodo'
,'nota_corte'
];
}
// loop2remove
array_map(function($key) use($sess) {
$sess->remove($key);
},$arrayKeysToRemove);
unset($sess);
// setar sessão de perfil
$this->usuarioPermissoes->executar($appUserRole, $user->getId_usuario());
// dados.evs vazio
/* if ( empty($evsRepository->findBy([],[],1,0)) && empty($gpsRepository->findBy([],[],1,0)) ) {
foreach ( ['empty-evs','error'] as $key ) {
$this->addFlash($key, 'Cálculos não finalizados ou avaliação em configuração, por favor aguarde.');
}
}/** */
if ( $appUserRole === 'ROLE_AVALIADO' ) {
return $this->redirectToRoute(($getVisoesDoPrograma['visoes'][0])->getRota_Default());
}
if($request->getSession()->get('cliente')->getIdTipo() == 5) {
return $this->redirectToRoute('clientes');
}
return $this->render($getVisoesDoPrograma['template'], $getVisoesDoPrograma);
}
/**
* @Route("/menu/{menu}", name="menu", defaults={"menu": ""})
*
* @param null|mixed $menu
* @return Response
*/
public function menu($menu = null, Request $request) :Response
{
$activeRoute = $request->server->get('REDIRECT_URL');
$menu = json_decode($menu) ?? null;
return $this->render('menu.html.twig', ['menu' => $menu, 'active_route' => $activeRoute ?? null]);
}
/**
* @Route("/language/{locale}", name="language", defaults={"locale": "pt_BR"})
*
* @param mixed $locale
*/
public function setLanguage(Request $request, $locale)
{
$locales = ['pt_BR','en_US','es_ES'];
if(!in_array($locale, $locales)) {
$locale = 'pt_BR';
}
$request->getSession()->set('_locale', $locale);
$redirect = $request->server->get('HTTP_REFERER');
if (!$redirect) {
$redirect = $this->router->generate('clientes');
if ($request->getSession()->has('cliente')) {
$redirect = $this->router->generate('visoes');
}
}
return new RedirectResponse($redirect);
}
/**
* Faz a troca para quando o usuário possuir multiplos clientes configurados.
*
* @Route("/clientes", name="clientes")
*
* @author Bruno Barea <bruno.barea@2im.com.br>
* @param Request $request
* @param ManagerRegistry $managerRegistry
* @return Response
*/
public function clientes(Request $request, ManagerRegistry $managerRegistry) :Response
{
//Busca os dados dos clientes que o usuário possui acesso.
$clientes = $this->clienteUsuario->buscaDadosUsuarioCliente($this->getUser()->getId_usuario());
//Sempre que o usuário for para essa tela deve remover todas as sessões dele.
$this->limpaCliente();
$this->limpaPeriodos();
$this->limpaFiltros();
if ( $request->isMethod('POST') ) {
$databaseId = $request->request->get('database') ? : 0;
$clienteSelected = $this->cliente->find($databaseId);
if ( !$clienteSelected ) {
$this->addFlash('erro', 'O cliente selecionado não foi encontrado, sinto muito!');
return $this->render('clientes.html.twig', ['page' => 'page-clientes', 'clientes' => $clientes]);
}
$managerRegistry->getConnection('cliente')->forceSwitch($clienteSelected->getDbname(), $clienteSelected->getHost());
$this->getSession()->set('cliente', $clienteSelected);
//Faz a busca do usuário na base de do cliente.
$user = $this->usuario->find($this->getUser()->getId_usuario());
//Pega a permissão do usuário na base do cliente
$permissoesPerfil = $user->getPerfil()->getPermissao() ?? $this->getUser()->getPerfil()->getPermissao();
//Seta as sessões para configuração do cliente.
$this->getSession()->set('permissoesPerfil', $permissoesPerfil);
$this->getSession()->set('linguagem', 'pt_BR');
$this->getSession()->set('no-periodo', '');
$this->getSession()->set('nome_cliente', $clienteSelected->getNome());
$this->getSession()->remove('modelagem');
if($clienteSelected->getIdTipo() == 5) {
return $this->redirectToRoute('pba_dashboard');
}
//Faz o direcionamento para a tela de seleção do sistema.
return $this->redirectToRoute('visoes');
}
// Faz o render do twig com a lista e combo de clientes.
return $this->render('clientes.html.twig', ['page' => 'page-clientes', 'clientes' => $clientes]);
}
/**
* @Route("/header", name="header")
*/
public function header(Request $request, ConversaRepository $conversaRepository)
{
$user_id = $this->getUser()->getId_usuario();
$contador_nao_lidos = $conversaRepository->contaMensagensNãoLidas($user_id);
$rota_atual = $request->query->get('rota_atual') ?? (($request->getSession()->get('visao_nome') === 'GestorGPS') ? 'gps_visao_gestor_dashboard' : 'dashboard');
return $this->render('header.html.twig', [
'contador_nao_lidos' => $contador_nao_lidos
,'rota_atual' => $rota_atual
]);
}
/**
* @Route("/right-menu", name="right-menu")
*/
public function rightMenu(DeterminaModulosService $determinaModulosService)
{
$modulos = [];
if (null != $this->getPrograma()['modelagem_obj']) {
$modulos = $determinaModulosService->execute($this->getPrograma()['modelagem_obj']);
}
return $this->render('right-menu.html.twig', [
'modulos' => $modulos,
]);
}
/**
* @Route("/sem-cliente", name="sem_cliente")
*/
public function semCliente()
{
$mensagem = 'Você não possui nenhum cliente configurado. Por favor, entre em contato com a 2iM.';
return $this->render('sem-cliente.html.twig', ['mensagem' => $mensagem, 'type_page' => 'page-login']);
}
/**
* @Route("/termo-aceite", name="termo_aceite")
*/
public function termoAceite(Request $request, ClienteUsuarioRepository $clienteUsuarioRepository, ClienteTermoRepository $clienteTermoRepository): Response
{
$data = new DateTime();
$usuario = $this->getUser();
$cliente = $this->getSession()->get('cliente');
$clienteUsuario = $clienteUsuarioRepository->findOneBy(['id_usuario' => $usuario->getId_usuario(), 'id_cliente' => $cliente->getId()]);
if (!is_null($clienteUsuario->getDataAceiteTermo())) {
$this->addFlash(
'success',
'Você já aceitou o Termo.'
);
return $this->redirectToRoute('visoes');
}
if ($request->isMethod('POST')) {
try {
$clienteUsuario->setDataAceiteTermo();
$clienteUsuarioRepository->salvar($clienteUsuario);
} catch (\Throwable $th) {
$this->addFlash(
'error',
'Erro ao salvar aceite do Termo, tente novamente mais tarde!'
);
return $this->redirectToRoute('termo_aceite');
}
return $this->redirectToRoute('visoes');
}
$termo = "Eu, Dr./Dra. {{medico}}, declaro e estou ciente de que tenho o dever de confidencialidade conforme os
princípios fundamentais do código de ética médica do capítulo I inciso XI, desta forma declaro que ao acessar a
plataforma 2iM.Analytics, de avaliação de indicadores de produção médicos, da 2iM guardarei o sigilo dos eventuais
dados acessados, seja como médico do Corpo Clínico ou como gestor para avaliar os indicadores de produção dos
profissionais médicos do Corpo Clínico do {{hospital}}.
<br><br>Declaro também e dou o consentimento livre e informado conforme dispõe o artigo 5º inciso XII da Lei Federal
nº 13.709/2018 - “Lei Geral de Proteção de Dados Pessoais” ou “LGPD”. de que estou de acordo que os meus dados
pessoais sejam tratados para que a gestão médica e seus funcionários possam avaliar os números estatísticos dos
meus atendimentos.
<br><br>Estou ciente de que qualquer dúvida relativa ao tratamento dos meus dados pessoais deverá ser direcionada ao
e-mail {{email_contato}} onde a equipe de proteção de dados pessoais responderá a quaisquer dúvidas do tratamento
de dados para a utilização do sistema 2iM.Analytics de gestão de indicadores de produção médicos.";
$clienteTermos = $clienteTermoRepository->findBy(['id_cliente' => $cliente->getId()]);
if (sizeof($clienteTermos) == 1) {
$termo = $clienteTermos[0]->getTermo();
} else {
foreach ($clienteTermos as $clienteTermo) {
if ($usuario->getRoles()[0] == $clienteTermo->getParametros()['role']) {
$termo = $clienteTermo->getTermo();
break;
}
}
}
$variaveis = [
'{{medico}}' => $usuario->getNome(),
'{{hospital}}' => $cliente->getNome(),
'{{email_contato}}' => '<a href="mailto:seguranca@2im.com.br">seguranca@2im.com.br</a>',
'{{data}}' => $data->format('d/m/Y')
];
$termo = str_replace(array_keys($variaveis), $variaveis, $termo);
return $this->render('termo-aceite.html.twig', [
'termo' => $termo,
'page' => 'page-clientes'
]);
}
}