src/Controller/Visao/Gestor/GestorController.php line 237

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Visao\Gestor;
  3. use App\Controller\Componentes\PeriodoController;
  4. use App\Controller\Customs\Custom2IMController;
  5. use App\Entity\Cliente\Dimensao;
  6. use App\Repository\Cliente\Dados\CalculoRepository;
  7. use App\Repository\Cliente\Dados\EvsRepository;
  8. use App\Repository\Cliente\Dados\ScorecardRepository;
  9. use App\Repository\Cliente\Fornecidos\DadosEnviadosRepository;
  10. use App\Repository\Cliente\Fornecidos\SolicitacaoRepository;
  11. use App\Repository\Cliente\Modelagem\AvaliadoRepository;
  12. use App\Repository\Cliente\Modelagem\ProgramaRepository;
  13. use App\Repository\Cliente\Privilegios\AvaliacaoRepository;
  14. use App\Repository\Painel\VisaoRepository;
  15. use App\Service\S3Service;
  16. use Exception;
  17. use Knp\Component\Pager\PaginatorInterface;
  18. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  19. use Symfony\Component\HttpFoundation\RedirectResponse;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\RequestStack;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\HttpFoundation\StreamedResponse;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Component\Routing\RouterInterface;
  26. /**
  27.  * @Route("/visao-gestor")
  28.  */
  29. class GestorController extends Custom2IMController
  30. {
  31.     const TEMPLATEBASE 'visao/gestor/';
  32.     /**
  33.      * @var array
  34.      */
  35.     public $rotas = ['visa_gestor_dashboard''relatorio_dashboard'];
  36.     /**
  37.      * @var string
  38.      */
  39.     protected $visao 'gestor';
  40.     /**
  41.      * @var ProgramaRepository
  42.      */
  43.     private $programaRepository;
  44.     /**
  45.      * @var VisaoRepository
  46.      */
  47.     private $visaoRepository;
  48.     /**
  49.      * @var EvsRepository
  50.      */
  51.     private $evsRepository;
  52.     /**
  53.      * @var RouterInterface
  54.      */
  55.     private $router;
  56.     /**
  57.      * @var PeriodoController
  58.      */
  59.     private $servicePeriodoController;
  60.     /**
  61.      * @var CalculoRepository
  62.      */
  63.     private $calculoRepository;
  64.     /**
  65.      * @var AvaliadoRepository
  66.      */
  67.     private $avaliadoRepository;
  68.     /**
  69.      * @var DadosEnviadosRepository
  70.      */
  71.     private $dadosEnviadosRepo;
  72.     /**
  73.      * @var SolicitacaoRepository
  74.      */
  75.     private $solicitacaoRepository;
  76.     /**
  77.      * @var S3Service
  78.      */
  79.     private $s3;
  80.     /**
  81.      * @param ProgramaRepository $programaRepository
  82.      * @param VisaoRepository $visaoRepository
  83.      * @param EvsRepository $evsRepository
  84.      * @param RouterInterface $router
  85.      */
  86.     public function __construct(
  87.          ProgramaRepository $programaRepository
  88.         ,VisaoRepository $visaoRepository
  89.         ,EvsRepository $evsRepository
  90.         ,RouterInterface $router
  91.         ,PeriodoController $servicePeriodoController
  92.         ,RequestStack $requestStack
  93.         ,CalculoRepository $calculoRepository
  94.         ,AvaliadoRepository $avaliadoRepository
  95.         ,DadosEnviadosRepository $dadosEnviadosRepository
  96.         ,SolicitacaoRepository $solicitacaoRepository
  97.         ,S3Service $s3Service
  98.     ) {
  99.         $this->programaRepository $programaRepository;
  100.         $this->visaoRepository $visaoRepository;
  101.         $this->evsRepository $evsRepository;
  102.         $this->router $router;
  103.         $this->servicePeriodoController $servicePeriodoController;
  104.         $this->calculoRepository $calculoRepository;
  105.         $this->avaliadoRepository $avaliadoRepository;
  106.         $this->dadosEnviadosRepo $dadosEnviadosRepository;
  107.         $this->solicitacaoRepository $solicitacaoRepository;
  108.         $this->s3 $s3Service;
  109.         // mantem a sessao de periodo para visao do gestor
  110.         // existe um conflito de sessao.periodo em todas as visoes
  111.         // esta condicao mantem para visao_gestor
  112.         $sess $requestStack->getSession();
  113.         if ( $sess->has('modelagem') AND (NULL !== $sess->get('periodo')) ) {
  114.             // see PeriodoController::processa
  115.             $requestStack->getSession()->set('periodo'$requestStack->getSession()->get('visao_gestor_periodo'));
  116.         }
  117.         // remove a chave da sessao do periodo
  118.         if ( NULL === $sess->get('periodo') ) {
  119.             $sess->remove('periodo');
  120.         }
  121.         unset($sess);
  122.     }
  123.     /**
  124.      * Render Controller in templates/visao/gestor/base.html.twig
  125.      * @param Request $request
  126.      * @return Response
  127.      */
  128.     public function defineDimensao(Request $request): Response
  129.     {        
  130.         $dimensao $request->query->get('dimensao');
  131.         $id_busca $request->query->get('id_busca'null);
  132.         $id_avaliado $request->query->get('id_filtro'null);
  133.         $dimensao = (new Dimensao())
  134.             ->setDimensao($dimensao)
  135.             ->setIdBusca($id_busca)
  136.             ->setIdFiltro($id_avaliado)
  137.             ->setPrograma($this->getPrograma())
  138.             ->setPeriodo($this->getPeriodo());
  139.         // persiste o objeto da Dimensao na sessao
  140.         $this->getSession()->set('dimensao'$dimensao);
  141.         
  142.         return $this->render($dimensao->getTemplate(), [
  143.             'dimensao' => $dimensao,
  144.         ]);
  145.     }
  146.     /**
  147.      * @Route("/dashboard/{dimensao}", name="visao_gestor_dashboard")
  148.      *
  149.      * @param Request $request
  150.      * @param string|null $dimensao
  151.      * @return Response
  152.      */
  153.     public function index(Request $requeststring $dimensao null) :Response
  154.     {
  155.         $this->setarSessoesVisao('Gestor'truefalse$this->hasPeriodo() ? '' 'no-periodo''visao_gestor_dashboard');
  156.         $gestor_permissoes $this->getSession()->get('gestor_permissoes');
  157.         $visaoObj $this->visaoRepository->findOneBy(['slug' => $this->visao]);
  158.         $id_busca $request->query->get('id_busca'null);
  159.         $id_avaliado $request->query->get('id_filtro'null);
  160.         $valida $this->testaPermissoes(
  161.             ($visaoObj $visaoObj->getIdVisao() : 0),
  162.             $this->getUser()->getPerfil()->getRota_default(),
  163.             $this->router,
  164.             $this->visaoRepository
  165.         );
  166.         if ($valida) {
  167.             return $valida;
  168.         }
  169.         if ($this->hasModelagem() && !$this->getModelagem()->getPrograma()->getEvs() && $this->getPeriodo()) {
  170.             return $this->redirectToRoute('gps_visao_gestor_dashboard');
  171.         }
  172.         if ( $dimensao && !$id_busca ) {
  173.             return $this->redirectToRoute('visao_gestor_dashboard');
  174.         }
  175.         $especialidade_selecionada null;
  176.         if ( Dimensao::POR_ESPECIALIDADE === $dimensao ) {
  177.             $especialidade_selecionada $this->evsRepository->buscarPerformanceDaEspecialidade($this->getPrograma(), $this->getPeriodo(), $id_busca$gestor_permissoes['where']);
  178.             $this->getSession()->set('especialidade'$especialidade_selecionada);
  179.         }
  180.         
  181.         $programas $this->programaRepository->findAll();
  182.         $filtro Dimensao::defineFiltro((array) $id_busca$id_avaliado);
  183.         //Informações de qtd de grupos, avaliados e indicadores com performance e os seus totais
  184.         $informacoesAlertas null;
  185.         $abaixoNotaCorte null;
  186.         $qtdAcessos 0;
  187.         if (!is_null($this->getPeriodo())) {
  188.             $filtroSemAvaliado Dimensao::defineFiltro((array) $id_busca);
  189.             $informacoesAlertas = [
  190.                 'qtds' => $this->calculoRepository->findQtdsAlertasGestor($this->getPeriodo(), $filtro$this->getPrograma(), $gestor_permissoes['where']),
  191.                 'totais' => $this->calculoRepository->findTotaisAlertasGestor($this->getPeriodo(), $filtro$this->getPrograma())
  192.             ];
  193.             $abaixoNotaCorte = [
  194.                 'avaliados' => $this->calculoRepository->findQtdAvaliadosAbaixoNotaCorte($this->getPeriodo(), $filtro$this->getPrograma(), $gestor_permissoes['where']),
  195.                 'grupos' => $this->calculoRepository->findQtdGruposAbaixoNotaCorte($this->getPeriodo(), $filtroSemAvaliado$this->getPrograma(), $gestor_permissoes['where'])
  196.             ];
  197.             $qtdAcessos $this->avaliadoRepository->findCountAvaliadosWithAcesso($this->getPeriodo(), $filtro$this->getPrograma());
  198.         }
  199.         $avaliado null;
  200.         if ( null !== $id_avaliado ) {
  201.             $avaliado $this->avaliadoRepository->find($id_avaliado);
  202.         }
  203.         $this->getSession()->remove('telas');
  204.         return $this->render('base.html.twig', [
  205.             'especialidade_selecionada' => $especialidade_selecionada,
  206.             'programas' => $programas,
  207.             'dimensao' => $dimensao,
  208.             'id_busca' => $id_busca,
  209.             'id_filtro' => $request->query->get('id_filtro'null), // para avaliado
  210.             'alertas' => $informacoesAlertas,
  211.             'abaixoNotaCorte' => $abaixoNotaCorte,
  212.             'avaliado' => $avaliado,
  213.             'qtdAcessos' => $qtdAcessos
  214.         ]);
  215.     }
  216.     /**
  217.      * @isGranted("ROLE_GESTOR")
  218.      * @Route("/redirect/avaliado/{id}", name="redirect_avaliado_dashboard")
  219.      *
  220.      * @param Request $request
  221.      * @param EvsRepository $evs
  222.      * @param RouterInterface $router
  223.      * @param integer $id ID avaliado
  224.      * @return RedirectResponse
  225.      */
  226.     public function redirectAvaliadoDashboard(Request $requestEvsRepository $evsRouterInterface $router,int $id) :RedirectResponse
  227.     {
  228.         // dados do ultimo mes do avaliado
  229.         // [id_avaliado,id_programa,id_modelagem,id_grupo]
  230.         $ano $this->getPeriodo()['to']['ano'];
  231.         $mes $this->getPeriodo()['to']['periodo'];
  232.         $periodo = (int) join('',[$ano,$mes]);
  233.         $avaliado current($evs->avaliadoMesesComAvaliacao([
  234.              'id_avaliado'  => $id
  235.             ,'id_programa'  => $this->getPrograma()['programa']['id_programa']
  236.             ,'id_modelagem' => $this->getPrograma()['modelagem']
  237.             ,'id_grupo'     => $this->getSession()->get('id_busca')
  238.         ], $ano$periodo));
  239.         // session avaliado setter
  240.         $this->getSession()->set('avaliado'$avaliado + ['http_referer' => 'visao_gestor']);
  241.         // para periodo
  242.         $ultimoPeriodoProducao $avaliado['periodo'];
  243.         $ano substr($ultimoPeriodoProducao,0,4);
  244.         $mes substr($ultimoPeriodoProducao,-2);
  245.         // as service
  246.         // periodo_multiplo para periodo_unico
  247.         // simula select do avaliado
  248.         $this->servicePeriodoController->processa($request, [
  249.              'from' => join('|',['Mensal',$ano$mes])
  250.             ,'to' => join('|',['Mensal',$ano$mes])
  251.             ,'referer' => 'avaliado'
  252.         ]);
  253.         return $this->redirect($router->generate('visao_avaliado_dashboard'));
  254.     }
  255.     /**
  256.      * @Route("/nota-corte/avaliado", name="visao_gestor_nota_corte_avaliado")
  257.      */
  258.     public function detalhesAvaliado(Request $requestEvsRepository $evsRepository): Response
  259.     {
  260.         $id_busca $this->getSession()->get('id_busca');
  261.         $id_avaliado $this->getSession()->get('dimensao')->getIdFiltro();
  262.         $gestor_permissoes $this->getSession()->get('gestor_permissoes');
  263.         $filtro Dimensao::defineFiltro((array) $id_busca$id_avaliado);
  264.         $avaliados $evsRepository->avaliadosNotaCorte($this->getPrograma(), $this->getPeriodo(), $filtro$gestor_permissoes['where']);
  265.         return $this->render('modal-nota-corte-avaliado.html.twig', [
  266.             'avaliados' => $avaliados
  267.         ]);
  268.     }
  269.     /**
  270.      * @Route("/nota-corte/grupo", name="visao_gestor_nota_corte_grupo")
  271.      */
  272.     public function detalhesGrupo(Request $requestEvsRepository $evsRepository): Response
  273.     {
  274.         $id_busca $this->getSession()->get('id_busca');
  275.         $gestor_permissoes $this->getSession()->get('gestor_permissoes');
  276.         $filtro Dimensao::defineFiltro((array) $id_busca);
  277.         $grupos $evsRepository->gruposNotaCorte($this->getPrograma(), $this->getPeriodo(), $filtro$gestor_permissoes['where']);
  278.         return $this->render('modal-nota-corte-grupo.html.twig',[
  279.             'grupos' => $grupos
  280.         ]);
  281.     }
  282.     /**
  283.      * listagem dos avaliados por especialidade
  284.      * @Route("/avaliados/{id_especialidade}", name="visao_gestor_avaliados_especialidade")
  285.      */
  286.     public function avaliadosPorEspecialidade(Request $requestint $id_especialidadeScorecardRepository $scorecardRepository): Response
  287.     {
  288.         $modelagem $this->getPrograma()['modelagem'] ?? false;
  289.         $periodo $this->getPeriodo() ? 
  290.             (int) ($this->getPeriodo()['to']['ano'] . str_pad($this->getPeriodo()['to']['periodo'], 2'0'STR_PAD_LEFT)) : 
  291.             false;
  292.         $avaliados $scorecardRepository->findAvaliadosPorEspecialidade($id_especialidade$modelagem$periodo);
  293.         return $this->render('modal-avaliados-especialidade.html.twig', [
  294.             'avaliados' => $avaliados,
  295.             'id_especialidade' => $id_especialidade
  296.         ]);
  297.     }
  298.     /**
  299.      * @Route("/acesso", name="visao_gestor_acesso_avaliados")
  300.      */
  301.     public function acessoAvaliados(Request $request): Response
  302.     {
  303.         $id_busca $this->getSession()->get('id_busca');
  304.         $id_avaliado $this->getSession()->get('dimensao')->getIdFiltro();
  305.         $gestor_permissoes $this->getSession()->get('gestor_permissoes');
  306.         $filtro Dimensao::defineFiltro((array) $id_busca$id_avaliado);
  307.         $avaliados $this->avaliadoRepository->findAvaliadosWithAcesso($this->getPeriodo(), $filtro$this->getPrograma(), $gestor_permissoes['where']);
  308.         return $this->render('modal-acesso-avaliados.html.twig',[
  309.             'avaliados' => $avaliados
  310.         ]);
  311.     }
  312.     /**
  313.      * @Route("/acesso/{id_avaliado}", name="visao_gestor_acesso_avaliado_detalhe")
  314.      */
  315.     public function detalhesAcessoAvaliado(Request $requestint $id_avaliado): Response
  316.     {
  317.         $acessos $this->avaliadoRepository->findDetalhesAvaliadoAcesso($id_avaliado$this->getPeriodo());
  318.         return $this->render('modal-acesso-avaliado-detalhe.html.twig',[
  319.             'acessos' => $acessos
  320.         ]);
  321.     }
  322.     /**
  323.      * @Route("/decil/avaliados", name="visao_gestor_decil_avaliados")
  324.      */
  325.     public function decilAvaliados(Request $requestEvsRepository $evsRepository)
  326.     {
  327.         $id_busca $this->getSession()->get('id_busca');
  328.         $id_avaliado $this->getSession()->get('dimensao')->getIdFiltro();
  329.         $filtro Dimensao::defineFiltro((array) $id_busca$id_avaliado);
  330.         $decil $request->query->get('decil');
  331.         $avaliados $evsRepository->avaliadosDecil($this->getPrograma(), $this->getPeriodo(), $filtro$decil);
  332.         return $this->render('modal-decil-avaliados.html.twig',[
  333.             'decil' => $decil,
  334.             'avaliados' => $avaliados
  335.         ]);
  336.     }
  337.     /**
  338.      * @Route("/privilegios/relatorio", name="visao_gestor_relatorio_privilegios")
  339.      */
  340.     public function privilegiosRelatorio(AvaliacaoRepository $avaliacaoRepository): Response
  341.     {
  342.         $id_busca $this->getSession()->get('id_busca'null);
  343.         $id_avaliado $this->getSession()->get('dimensao')->getIdFiltro() ?? null;
  344.         $privilegios $avaliacaoRepository->findAllAvaliadosPrivilegios($this->getPrograma(), $id_busca$id_avaliado);
  345.         return $this->render('privilegios-relatorio.html.twig',[
  346.             'privilegios' => $privilegios
  347.         ]);
  348.     }
  349.     /**
  350.      * @Route("/documentos-recebidos", name="visao_gestor_documentos_recebidos")
  351.      */
  352.     public function documentosRecebidos(Request $requestPaginatorInterface $paginatorInterface)
  353.     {
  354.         $gestor_permissoes $this->getSession()->get('gestor_permissoes');
  355.         $currentPage = (int) $request->query->get('page',1);
  356.         $paginator $paginatorInterface->paginate([],$currentPage);
  357.         $limit $paginator->getItemNumberPerPage();
  358.         $offset = ($currentPage 1) * $limit;
  359.         $busca filter_var($request->query->get('busca'), FILTER_SANITIZE_SPECIAL_CHARS);
  360.         preg_match("/AND id_avaliado IN\((.*?)\)/"$gestor_permissoes['where'], $matches);
  361.         $resultDadosEnviados $this->dadosEnviadosRepo->findArquivosEnviados(
  362.              $limit
  363.             ,$offset
  364.             ,$busca
  365.             ,$request->query->get('sort')
  366.             ,$request->query->get('direction')
  367.             , NULL
  368.             ,$matches[0] ?? NULL //AND id_avaliado IN(....)
  369.         );
  370.         $paginator->setTotalItemCount($resultDadosEnviados[0]['num_rows'] ?? 0);
  371.         $paginator->setItems($resultDadosEnviados);
  372.         return $this->render('componentes/solicitacao-documentos/gestor-equipe-recebidos.html.twig', [
  373.             'pagination' => $paginator
  374.         ]);
  375.     }
  376.     /**
  377.      * @Route("/aprovar-documento/{id_arquivo}/{aprovar}", name="visao_gestor_aprovar_documento")
  378.      */
  379.     public function aprovarDocumento(Request $requestint $id_arquivostring $aprovar)
  380.     {
  381.         if ( $aprovar === "true" ) {
  382.             $aprovar TRUE;
  383.         } else if ( $aprovar === "false") {
  384.             $aprovar FALSE;
  385.         }
  386.         $dadosEnviadosObject $this->dadosEnviadosRepo->findOneBy(['idArquivo' => $id_arquivo]);
  387.         $dadosEnviadosObject->setAprovado($aprovar === TRUE ?: FALSE);
  388.         
  389.         try {
  390.             $this->dadosEnviadosRepo->save($dadosEnviadosObject);
  391.             $this->addFlash("success""Salvo com sucesso!");
  392.         } catch (Exception $ex) {
  393.             $this->addFlash("error""Ocorreu um erro ao salvar!");
  394.         }
  395.         return $this->redirect($request->headers->get('referer'));
  396.     }
  397.     /**
  398.      * @Route("/visualizar-documento/{id}", name="visualizar_documento")
  399.      */
  400.     public function documento(Request $requestint $id)
  401.     {
  402.         $documento $this->dadosEnviadosRepo->getArquivoById($id);
  403.         return $this->render('componentes/solicitacao-documentos/modal-documento.html.twig', [
  404.             'documento'=>$documento
  405.         ]);
  406.     }
  407.     /**
  408.      * @Route("/download-documento/{id_arquivo}", name="visao_gestor_documentos_download")
  409.      */
  410.     public function download(Request $requestint $id_arquivo)
  411.     {
  412.         $client $request->getSession()->get('cliente_connection');
  413.         $arquivo $this->dadosEnviadosRepo->findOneBy(['idArquivo' => $id_arquivo]);
  414.         $fileName substr($arquivo->getFilePath(), strrpos($arquivo->getFilePath(), '/') + 1);
  415.         $solicitacao $this->solicitacaoRepository->findOneBy(['idSolicitacao' => $arquivo->getIdSolicitacao()]);
  416.         $pathToFile $client['dbname'].'/'.$solicitacao->getPastaSlug().'/'.$fileName;
  417.         $fileUrl $this->s3->presignedGetObjectRequest($_ENV['AWS_S3_BUCKET'], $pathToFile);
  418.         if (!$fileUrl) {
  419.             $this->addFlash(
  420.                'error',
  421.                'Arquivo não encontrado.'
  422.             );
  423.             return $this->redirect($request->headers->get('referer'));
  424.         }
  425.         $stream fopen($fileUrl'r');
  426.         return new StreamedResponse(function () use ($stream) {
  427.             fpassthru($stream);
  428.             flush();
  429.         }, 200, [
  430.             'Content-Transfer-Encoding''binary',
  431.             // 'Content-Type' => 'text/csv',
  432.             'Content-Disposition' => 'attachment; filename=' $fileName,
  433.         ]);
  434.     }
  435. }