src/Controller/DefaultController.php line 97

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\Cliente\Comunicacao\ConversaRepository;
  4. use App\Repository\Cliente\Dados\EvsRepository;
  5. use App\Repository\Cliente\Dados\GpsRepository;
  6. use App\Repository\Cliente\Modelagem\ProgramaRepository;
  7. use App\Repository\Cliente\Modelagem\AvaliadoRepository;
  8. use App\Repository\Painel\ClienteRepository;
  9. use App\Repository\Painel\ClienteTermoRepository;
  10. use App\Repository\Painel\ClienteUsuarioRepository;
  11. use App\Repository\Painel\UsuarioRepository;
  12. use App\Service\DeterminaModulosService;
  13. use App\Service\UsuarioPermissoes;
  14. use App\Service\VisoesService;
  15. use DateTime;
  16. use Doctrine\DBAL\Exception\ConnectionException;
  17. use Doctrine\Persistence\ManagerRegistry;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Routing\RouterInterface;
  23. use Symfony\Component\Security\Core\User\UserInterface;
  24. use TypeError;
  25. /**
  26.  * Controller Default com diversos métodos que são utilizados no login do sistema
  27.  * e para configurações padrão do sistema.
  28.  *
  29.  * @author Bruno Barea <bruno.barea@2im.com.br>
  30.  *
  31.  * @version 1.0.0
  32.  *
  33.  * @copyright (c) 2019, 2IM Inteligencia Medica <https://www.2im.com.br>
  34.  */
  35. class DefaultController extends Customs\Custom2IMController
  36. {
  37.     /**
  38.      * @var ClienteUsuarioRepository
  39.      */
  40.     private $clienteUsuario;
  41.     /**
  42.      * @var ClienteRepository
  43.      */
  44.     private $cliente;
  45.     /**
  46.      * @var UsuarioRepository
  47.      */
  48.     private $usuario;
  49.     /**
  50.      * @var UsuarioPermissoes
  51.      */
  52.     private $usuarioPermissoes;
  53.     /**
  54.      * @var AvaliadoRepository
  55.      */
  56.     private $avaliadoRepository;
  57.     private $router;
  58.     /**
  59.      * @param ClienteUsuarioRepository $clienteUsuario
  60.      * @param ClienteRepository $cliente
  61.      * @param UsuarioRepository $usuario
  62.      * @param UsuarioPermissoes $usuarioPermissoes
  63.      */
  64.     public function __construct(
  65.         ClienteUsuarioRepository $clienteUsuario,
  66.         ClienteRepository $cliente,
  67.         UsuarioRepository $usuario,
  68.         UsuarioPermissoes $usuarioPermissoes,
  69.         AvaliadoRepository $avaliadoRepository,
  70.         RouterInterface $router
  71.     ) {
  72.         $this->clienteUsuario $clienteUsuario;
  73.         $this->cliente $cliente;
  74.         $this->usuario $usuario;
  75.         $this->usuarioPermissoes $usuarioPermissoes;
  76.         $this->avaliadoRepository $avaliadoRepository;
  77.         $this->router $router;
  78.     }
  79.     /**
  80.      * @Route("/", name="visoes")
  81.      *
  82.      * @param ProgramaRepository $programaRepository
  83.      * @param UserInterface $user
  84.      * @param VisoesService $visaoService
  85.      * @return Response
  86.      */
  87.     public function visoes(ProgramaRepository $programaRepositoryUserInterface $userVisoesService $visaoServiceEvsRepository $evsRepositoryGpsRepository $gpsRepositoryRequest $request) :Response
  88.     {
  89.         try {
  90.             $programa $programaRepository->findOneBy(['ativo' => true]);
  91.         } catch ( ConnectionException $ex ) {
  92.             $this->addFlash('erro''Cliente inválido ou não existe! Verifique o cadastro para melhores informações.');
  93.             return $this->redirectToRoute('clientes');
  94.         }
  95.         try {
  96.             $getVisoesDoPrograma $visaoService->getVisoesDoPrograma($programa);
  97.         } catch (TypeError $ex) {
  98.             $this->addFlash('error''O avaliado configurado não foi encontrado ou não foi definido para o tipo de perfil do usuário.');
  99.             return $this->render('error.html.twig', ['page' => 'page-clientes']);
  100.         }
  101.         $appUserRole $user->getPerfil()->getRole();
  102.         $sess $this->getSession();
  103.         if ( $appUserRole === 'ROLE_AVALIADO' ) {
  104.             $arrayKeysToRemove = [
  105.                 'programa'
  106.                ,'modelagem'
  107.                ,'periodo'
  108.                ,'nota_corte'
  109.            ];
  110.         } else {
  111.             $arrayKeysToRemove = [
  112.                  'avaliado'
  113.                 ,'programa'
  114.                 ,'modelagem'
  115.                 ,'periodo'
  116.                 ,'especialidade'
  117.                 ,'especialidade_selecionada'
  118.                 ,'dimensao'
  119.                 ,'visao_nome'
  120.                 ,'visao_gestor_periodo'
  121.                 ,'mudou_periodo'
  122.                 ,'nota_corte'
  123.             ];
  124.         }
  125.         // loop2remove
  126.         array_map(function($key) use($sess) {
  127.             $sess->remove($key);
  128.         },$arrayKeysToRemove);
  129.         unset($sess);
  130.         // setar sessão de perfil
  131.         $this->usuarioPermissoes->executar($appUserRole$user->getId_usuario());
  132.         // dados.evs vazio
  133.        /* if ( empty($evsRepository->findBy([],[],1,0)) && empty($gpsRepository->findBy([],[],1,0)) ) {
  134.             foreach ( ['empty-evs','error'] as $key ) {
  135.                 $this->addFlash($key, 'Cálculos não finalizados ou avaliação em configuração, por favor aguarde.');
  136.             }
  137.         }/** */
  138.         if ( $appUserRole === 'ROLE_AVALIADO' ) {
  139.             return $this->redirectToRoute(($getVisoesDoPrograma['visoes'][0])->getRota_Default());
  140.         }
  141.         
  142.         if($request->getSession()->get('cliente')->getIdTipo() == 5) {
  143.             return $this->redirectToRoute('clientes');
  144.         }
  145.         return $this->render($getVisoesDoPrograma['template'], $getVisoesDoPrograma);
  146.     }
  147.     /**
  148.      * @Route("/menu/{menu}", name="menu", defaults={"menu": ""})
  149.      *
  150.      * @param null|mixed $menu
  151.      * @return Response
  152.      */
  153.     public function menu($menu nullRequest $request) :Response
  154.     {
  155.         $activeRoute $request->server->get('REDIRECT_URL');
  156.         $menu json_decode($menu) ?? null;
  157.         return $this->render('menu.html.twig', ['menu' => $menu'active_route' => $activeRoute ?? null]);
  158.     }
  159.     /**
  160.      * @Route("/language/{locale}", name="language", defaults={"locale": "pt_BR"})
  161.      *
  162.      * @param mixed $locale
  163.      */
  164.     public function setLanguage(Request $request$locale)
  165.     {
  166.         $locales = ['pt_BR','en_US','es_ES'];
  167.         
  168.         if(!in_array($locale$locales)) {
  169.             $locale 'pt_BR';
  170.         }
  171.         $request->getSession()->set('_locale'$locale);
  172.         $redirect $request->server->get('HTTP_REFERER');
  173.         if (!$redirect) {
  174.             $redirect $this->router->generate('clientes');
  175.             if ($request->getSession()->has('cliente')) {
  176.                 $redirect $this->router->generate('visoes');
  177.             }
  178.         }
  179.         return new RedirectResponse($redirect);
  180.     }
  181.     /**
  182.      * Faz a troca para quando o usuário possuir multiplos clientes configurados.
  183.      *
  184.      * @Route("/clientes", name="clientes")
  185.      *
  186.      * @author Bruno Barea <bruno.barea@2im.com.br>
  187.      * @param Request $request
  188.      * @param ManagerRegistry $managerRegistry
  189.      * @return Response
  190.      */
  191.     public function clientes(Request $requestManagerRegistry $managerRegistry) :Response
  192.     {
  193.         //Busca os dados dos clientes que o usuário possui acesso.
  194.         $clientes $this->clienteUsuario->buscaDadosUsuarioCliente($this->getUser()->getId_usuario());
  195.         //Sempre que o usuário for para essa tela deve remover todas as sessões dele.
  196.         $this->limpaCliente();
  197.         $this->limpaPeriodos();
  198.         $this->limpaFiltros();
  199.         if ( $request->isMethod('POST') ) {
  200.             $databaseId $request->request->get('database') ? : 0;
  201.             $clienteSelected $this->cliente->find($databaseId);
  202.             if ( !$clienteSelected ) {
  203.                 $this->addFlash('erro''O cliente selecionado não foi encontrado, sinto muito!');
  204.                 return $this->render('clientes.html.twig', ['page' => 'page-clientes''clientes' => $clientes]);
  205.             }
  206.             $managerRegistry->getConnection('cliente')->forceSwitch($clienteSelected->getDbname(), $clienteSelected->getHost());
  207.             $this->getSession()->set('cliente'$clienteSelected);
  208.             //Faz a busca do usuário na base de do cliente.
  209.             $user $this->usuario->find($this->getUser()->getId_usuario());
  210.             //Pega a permissão do usuário na base do cliente
  211.             $permissoesPerfil $user->getPerfil()->getPermissao() ?? $this->getUser()->getPerfil()->getPermissao();
  212.             //Seta as sessões para configuração do cliente.
  213.             $this->getSession()->set('permissoesPerfil'$permissoesPerfil);
  214.             $this->getSession()->set('linguagem''pt_BR');
  215.             $this->getSession()->set('no-periodo''');
  216.             $this->getSession()->set('nome_cliente'$clienteSelected->getNome());
  217.             $this->getSession()->remove('modelagem');
  218.             if($clienteSelected->getIdTipo() == 5) {
  219.                 return $this->redirectToRoute('pba_dashboard');
  220.             }
  221.             //Faz o direcionamento para a tela de seleção do sistema.
  222.             return $this->redirectToRoute('visoes');
  223.         }
  224.         // Faz o render do twig com a lista e combo de clientes.
  225.         return $this->render('clientes.html.twig', ['page' => 'page-clientes''clientes' => $clientes]);
  226.     }
  227.     /**
  228.      * @Route("/header", name="header")
  229.      */
  230.     public function header(Request $requestConversaRepository $conversaRepository)
  231.     {
  232.         $user_id $this->getUser()->getId_usuario();
  233.         $contador_nao_lidos $conversaRepository->contaMensagensNãoLidas($user_id);
  234.         $rota_atual $request->query->get('rota_atual') ?? (($request->getSession()->get('visao_nome') === 'GestorGPS') ? 'gps_visao_gestor_dashboard' 'dashboard');
  235.         return $this->render('header.html.twig', [
  236.             'contador_nao_lidos' => $contador_nao_lidos
  237.             ,'rota_atual' => $rota_atual
  238.         ]);
  239.     }
  240.     /**
  241.      * @Route("/right-menu", name="right-menu")
  242.      */
  243.     public function rightMenu(DeterminaModulosService $determinaModulosService)
  244.     {
  245.         $modulos = [];
  246.         if (null != $this->getPrograma()['modelagem_obj']) {
  247.             $modulos $determinaModulosService->execute($this->getPrograma()['modelagem_obj']);
  248.         }
  249.         return $this->render('right-menu.html.twig', [
  250.             'modulos' => $modulos,
  251.         ]);
  252.     }
  253.     /**
  254.      * @Route("/sem-cliente", name="sem_cliente")
  255.      */
  256.     public function semCliente()
  257.     {
  258.         $mensagem 'Você não possui nenhum cliente configurado. Por favor, entre em contato com a 2iM.';
  259.         return $this->render('sem-cliente.html.twig', ['mensagem' => $mensagem'type_page' => 'page-login']);
  260.     }
  261.     /**
  262.      * @Route("/termo-aceite", name="termo_aceite")
  263.      */
  264.     public function termoAceite(Request $requestClienteUsuarioRepository $clienteUsuarioRepositoryClienteTermoRepository $clienteTermoRepository): Response
  265.     {
  266.         $data = new DateTime();
  267.         $usuario $this->getUser();
  268.         $cliente $this->getSession()->get('cliente');
  269.         $clienteUsuario $clienteUsuarioRepository->findOneBy(['id_usuario' => $usuario->getId_usuario(), 'id_cliente' => $cliente->getId()]);
  270.         if (!is_null($clienteUsuario->getDataAceiteTermo())) {
  271.             $this->addFlash(
  272.                'success',
  273.                'Você já aceitou o Termo.'
  274.             );
  275.             return $this->redirectToRoute('visoes');
  276.         }
  277.         if ($request->isMethod('POST')) {
  278.             try {
  279.                 $clienteUsuario->setDataAceiteTermo();
  280.                 $clienteUsuarioRepository->salvar($clienteUsuario);
  281.             } catch (\Throwable $th) {
  282.                 $this->addFlash(
  283.                    'error',
  284.                    'Erro ao salvar aceite do Termo, tente novamente mais tarde!'
  285.                 );
  286.                 return $this->redirectToRoute('termo_aceite');
  287.             }
  288.             return $this->redirectToRoute('visoes');
  289.         }
  290.         $termo "Eu, Dr./Dra. {{medico}}, declaro e estou ciente de que tenho o dever de confidencialidade conforme os 
  291.         princípios fundamentais do código de ética médica do capítulo I inciso XI, desta forma declaro que ao acessar a 
  292.         plataforma 2iM.Analytics, de avaliação de indicadores de produção médicos, da 2iM guardarei o sigilo dos eventuais 
  293.         dados acessados, seja como médico do Corpo Clínico ou como gestor para avaliar os indicadores de produção dos 
  294.         profissionais médicos do Corpo Clínico do {{hospital}}.
  295.         <br><br>Declaro também e dou o consentimento livre e informado conforme dispõe o artigo 5º inciso XII da Lei Federal 
  296.         nº 13.709/2018 - “Lei Geral de Proteção de Dados Pessoais” ou “LGPD”. de que estou de acordo que os meus dados 
  297.         pessoais sejam tratados para que a gestão médica e seus funcionários possam avaliar os números estatísticos dos 
  298.         meus atendimentos.
  299.         <br><br>Estou ciente de que qualquer dúvida relativa ao tratamento dos meus dados pessoais deverá ser direcionada ao 
  300.         e-mail {{email_contato}} onde a equipe de proteção de dados pessoais responderá a quaisquer dúvidas do tratamento 
  301.         de dados para a utilização do sistema 2iM.Analytics de gestão de indicadores de produção médicos.";
  302.         $clienteTermos $clienteTermoRepository->findBy(['id_cliente' => $cliente->getId()]);
  303.         if (sizeof($clienteTermos) == 1) {
  304.             $termo $clienteTermos[0]->getTermo();
  305.         } else {
  306.             foreach ($clienteTermos as $clienteTermo) {
  307.                 if ($usuario->getRoles()[0] == $clienteTermo->getParametros()['role']) {
  308.                     $termo $clienteTermo->getTermo();
  309.                     break;
  310.                 }
  311.             }
  312.         }
  313.         $variaveis = [
  314.             '{{medico}}' => $usuario->getNome(),
  315.             '{{hospital}}' => $cliente->getNome(),
  316.             '{{email_contato}}' => '<a href="mailto:seguranca@2im.com.br">seguranca@2im.com.br</a>',
  317.             '{{data}}' => $data->format('d/m/Y')
  318.         ];
  319.         $termo str_replace(array_keys($variaveis), $variaveis$termo);
  320.         return $this->render('termo-aceite.html.twig', [
  321.             'termo' => $termo,
  322.             'page' => 'page-clientes'
  323.         ]);
  324.     }
  325. }