src/Controller/Customs/Custom2IMController.php line 732

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Customs;
  3. use App\Helper\DateHelper;
  4. use App\Repository\Painel\VisaoRepository;
  5. use ErrorException;
  6. use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination;
  7. use Knp\Component\Pager\PaginatorInterface;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\RouterInterface;
  13. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  14. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  15. use Symfony\Component\Serializer\Serializer;
  16. use Symfony\Component\Validator\Validator\ValidatorInterface;
  17. use Twig\Error\RuntimeError;
  18. /**
  19.  * Controller para agrupar metodos comuns de execucao nas controllers.
  20.  *
  21.  * @author     Vrunobieira <bruno.vieira@2im.com.br>
  22.  * @copyright  (c) 2IM Inteligencia Medica <https://www.2im.com.br>
  23.  */
  24. class Custom2IMController extends AbstractController
  25. {
  26.     const PERIODO_UNICO_PARA_MULTIPLO 'PERIODO_UNICO_PARA_MULTIPLO';
  27.     const PERIODO_MULTIPLO_PARA_UNICO 'PERIODO_MULTIPLO_PARA_UNICO';
  28.     const TEMPLATEBASE '';
  29.     /**
  30.      * @var ValidatorInterface
  31.      */
  32.     private $validator;
  33.     /**
  34.      * @param ValidatorInterface $validator
  35.      */
  36.     public function __construct(ValidatorInterface $validator)
  37.     {
  38.         $this->validator $validator;
  39.     }
  40.     /**
  41.      * Iguala o período inicial ao final caso o filtro seja por mês ou ano.
  42.      */
  43.     public function trataPeriodoMultiploParaUnico()
  44.     {
  45.         $request = new Request();
  46.         $periodo $this->getPeriodo();
  47.         $resposta null;
  48.         if ('mes' == $periodo['tipoFiltro']) {
  49.             $from sprintf('%s|%s|%s'$periodo['to']['tipo'], $periodo['to']['ano'], $periodo['to']['periodo']);
  50.             $to sprintf('%s|%s|%s'$periodo['to']['tipo'], $periodo['to']['ano'], $periodo['to']['periodo']);
  51.             $resposta $this->forward('App\Controller\Componentes\PeriodoController::processa', [
  52.                 'request' => $request,
  53.                 'periodoBruto' => ['from' => $from'to' => $to],
  54.             ]);
  55.         } elseif ('ano' == $periodo['tipoFiltro']) {
  56.             $from sprintf('%s|ND|%s'$periodo['to']['tipo'], $periodo['to']['periodo']);
  57.             $to sprintf('%s|ND|%s'$periodo['to']['tipo'], $periodo['to']['periodo']);
  58.             $resposta $this->forward('App\Controller\Componentes\PeriodoController::processa', [
  59.                 'request' => $request,
  60.                 'periodoBruto' => ['from' => $from'to' => $to],
  61.             ]);
  62.         } else {
  63.             $this->limpaPeriodos();
  64.         }
  65.         return $resposta;
  66.     }
  67.     /**
  68.      * Converte um período múltiplo (range) para período único, útil quando for mudar de visão de gestor -> avaliado
  69.      * Caso o filtro seja mês e o período inicial e final sejam iguais (período unico), será atribuido o período inicio para janeiro do mesmo ano.
  70.      */
  71.     public function trataPeriodoUnicoParaMultiplo()
  72.     {
  73.         $request = new Request();
  74.         $periodo $this->getPeriodo();
  75.         $resposta null;
  76.         if ('mes' == $periodo['tipoFiltro']) {
  77.             $from sprintf('%s|%s|%s'$periodo['to']['tipo'], $periodo['to']['ano'], $periodo['to']['periodo']);
  78.             $to sprintf('%s|%s|%s'$periodo['to']['tipo'], $periodo['to']['ano'], $periodo['to']['periodo']);
  79.             if ($from == $to) {
  80.                 $from sprintf('%s|%s|01'$periodo['to']['tipo'], $periodo['to']['ano']);
  81.                 $resposta $this->forward(
  82.                     'App\Controller\Componentes\PeriodoController::processa',
  83.                     [
  84.                         'request' => $request,
  85.                         'periodoBruto' => ['from' => $from'to' => $to],
  86.                     ]
  87.                 );
  88.             }
  89.         }
  90.         return $resposta;
  91.     }
  92.     /**
  93.      * Método para remover na seção e modificar o período caso o avaliado caso a visão anterior seja diferente da atual.
  94.      *
  95.      * @param $rotas será as rotas adicionais que também compõem o controller
  96.      * @param $tipo Constante que indicará qual tratamento do período será feito
  97.      *      - Se passar a constante PERIODO_UNICO_PARA_MULTIPLO será executada a função trataPeriodoUnicoParaMultiplo()
  98.      *      - Se passar a cosntante PERIODO_MULTIPLO_PARA_UNICO será executada a função trataPeriodoMultiploParaUnico()
  99.      */
  100.     public function trataPeriodoAvaliado($rotas$tipo)
  101.     {
  102.         if ($this->getSession()->has('visao') && !in_array($this->getSession()->get('visao'), $rotas) && $this->getSession()->get('visao') != $this->getCurrentRoute()) {
  103.             //* Converte um período multiplo (range) para período único, útil quando for mudar de visão de gestor -> avaliados
  104.             $this->limpaAvaliado();
  105.             if (Custom2IMController::PERIODO_UNICO_PARA_MULTIPLO == $tipo) {
  106.                 $this->trataPeriodoUnicoParaMultiplo();
  107.             } elseif (Custom2IMController::PERIODO_MULTIPLO_PARA_UNICO == $tipo) {
  108.                 $this->trataPeriodoMultiploParaUnico();
  109.             } else {
  110.                 // Para configurar outra tipo de conversão de período basta configurar uma constante, criar uma função e testar aqui
  111.                 throw new \Exception('Configure o tipo de conversão que deverá ser feita');
  112.             }
  113.         }
  114.     }
  115.     /**
  116.      * Metodo para validar objetos com base nos asserts especificado na entidade.
  117.      *
  118.      * @param $filledObj objeto com informações que serão persistidas no banco de dados
  119.      * @param $validator interface de validação Symfony\Component\Validator\Validator\ValidatorInterface
  120.      *
  121.      * @return 1 - Retorna um array vazio para caso não seja encontrado nenhum erro.
  122.      *           2 - Retorna um array com as não conformidades do objeto com os asserts da entidade.
  123.      */
  124.     public function validarEntity($filledObjValidatorInterface $validator): array
  125.     {
  126.         $validacao $validator->validate($filledObj);
  127.         $erros = [];
  128.         if (count($validacao) > 0) {
  129.             $contErros count($validacao);
  130.             for ($i 0$i $contErros; ++$i) {
  131.                 $erros[] = $validacao[$i]->getMessage();
  132.             }
  133.         }
  134.         return $erros;
  135.     }
  136.     /**
  137.      * Metodo para setar filtros de ordenação em sessão.
  138.      *
  139.      * @param string $nomeComponente
  140.      *
  141.      * @author Guilherme Arduino
  142.      *
  143.      * @version 1.0.0
  144.      */
  145.     public function setFiltros($nomeComponente)
  146.     {
  147.         $ascendencia $this->getCurrentRequest()->query->get($nomeComponente.'_acendencia'$this->getCurrentRequest()->getSession()->get($nomeComponente.'_acendencia'null));
  148.         $order $this->getCurrentRequest()->query->get($nomeComponente.'_order'$this->getCurrentRequest()->getSession()->get($nomeComponente.'_order'null));
  149.         //se a chamada da action veio pelo clica na ordenação dos campos
  150.         if ('true' == $this->getCurrentRequest()->query->get('ordenacao')) {
  151.             if ($ascendencia) {
  152.                 if ('ASC' == $ascendencia) {
  153.                     $ascendencia 'DESC';
  154.                 } else {
  155.                     $ascendencia 'ASC';
  156.                 }
  157.             } else {
  158.                 $ascendencia 'ASC';
  159.             }
  160.         }
  161.         $this->getSession()->set($nomeComponente.'_acendencia'$ascendencia);
  162.         $this->getSession()->set($nomeComponente.'_order'$order);
  163.         $this->getSession()->set($nomeComponente.'_ordem'$order && $ascendencia $order.' '.$ascendencia null);
  164.     }
  165.     /**
  166.      * Metodo para setar paginação em sessão.
  167.      *
  168.      * @param PaginatorInterface $paginator
  169.      * @param mixed              $nome_componente
  170.      *
  171.      * @author Guilherme Arduino
  172.      *
  173.      * @version 1.0.0
  174.      */
  175.     public function setPaginacao(string $nomeComponenteint $pag_linhas, array $dados$nome_componente ''): SlidingPagination
  176.     {
  177.         $this->paginator->setDefaultPaginatorOptions(['nomeDono' => $nomeComponente]);
  178.         $this->paginator->setDefaultPaginatorOptions(['nome_componente' => $nome_componente]);
  179.         $this->paginator->setDefaultPaginatorOptions(['paginasConfig' => $pag_linhas]);
  180.         $this->paginator->setDefaultPaginatorOptions(['numRows' => $this->getCurrentRequest()->query->get($nomeComponente.'_numRows'$this->getCurrentRequest()->getSession()->get($nomeComponente.'_numRows'$pag_linhas))]);
  181.         $page $this->getCurrentRequest()->query->get($nomeComponente.'_page'$this->getCurrentRequest()->getSession()->get($nomeComponente.'_page'1));
  182.         $numRows $this->getCurrentRequest()->query->get($nomeComponente.'_numRows'$this->getCurrentRequest()->getSession()->get($nomeComponente.'_numRows'$pag_linhas));
  183.         $this->getSession()->set($nomeComponente.'_numRows'$numRows);
  184.         // se quantidade de linhas mostradas for maior do que a quantidade de linhas em $dados setar pagina para 1
  185.         if ($this->getCurrentRequest()->getSession()->get($nomeComponente.'_numRows'$pag_linhas) > count($dados)) {
  186.             $page 1;
  187.         } else {
  188.             $page $this->getCurrentRequest()->query->get($nomeComponente.'_page'$this->getCurrentRequest()->getSession()->get($nomeComponente.'_page'$page));
  189.         }
  190.         $this->getSession()->set($nomeComponente.'_page'$page);
  191.         return $this->paginator->paginate($dados$page$this->getCurrentRequest()->query->get($nomeComponente.'_numRows'$this->getCurrentRequest()->getSession()->get($nomeComponente.'_numRows'$pag_linhas)));
  192.     }
  193.     /**
  194.      * Retorna os dados da sessão referente a ordem da tabela que está selecionada.
  195.      *
  196.      * @author Guilherme Arduino
  197.      *
  198.      * @param string $nomeDonoEspecifico (parametro para especificar um nome para um componente que possua mais de uma listagem sendo carregada na mesma classe)
  199.      *
  200.      * @version 1.0.0
  201.      *
  202.      * @return string
  203.      */
  204.     public function getFiltroOrdem(?string $nomeDonoEspecifico null): ?string
  205.     {
  206.         return $this->getSession()->get(($nomeDonoEspecifico ?? $this->nomeDono).'_ordem');
  207.     }
  208.     /**
  209.      * Retorna o caminho completo da classe.
  210.      *
  211.      * @return string App\\Controller\\Componentes\\Avaliado\\AlgumaClasse
  212.      *
  213.      * @author Juliano Luiz da Silva <juliano.silva@2im.com.br>
  214.      */
  215.     public function getPathFormatted()
  216.     {
  217.         return (new \ReflectionClass($this))->getName();
  218.     }
  219.     /**
  220.      * Seta sessions para inicializar visão.
  221.      *
  222.      * @author Guilherme Arduino
  223.      *
  224.      * @version 1.0.0
  225.      *
  226.      * @param bool   $periodo_multiplo (define se pode selecionar um range de periodos ou apenas um periodo)
  227.      * @param bool   $filtra_avaliado  (define se seleciona avaliado na visão)
  228.      * @param string $no_periodo       (define se seleciona periodo na visão)
  229.      */
  230.     public function setarSessoesVisao(string $nomeVisaobool $periodo_multiplobool $filtra_avaliadostring $no_periodo '')
  231.     {
  232.         $sess $this->getSession();
  233.         $sess->set('visao'$this->getCurrentRoute());
  234.         $sess->set('visao_nome'$nomeVisao);
  235.         $sess->set('periodo_multiplo'$periodo_multiplo);
  236.         $sess->set('filtra_avaliado'$filtra_avaliado);
  237.         $sess->set('no-periodo'$no_periodo);
  238.     }
  239.     /**
  240.      * Seta informações para montar o selecionador na ultima posição do breadcrumb.
  241.      *
  242.      * @author Guilherme Arduino
  243.      *
  244.      * @version 1.0.0
  245.      *
  246.      * @param string $url       (nome da rota onde será feita a requisição no click [$request->get('_route')])
  247.      * @param string $url_param (parametro requisitado na url para a pesquisa)
  248.      * @param string $modal_id  (chave do modal para recarregar informações no mesmo box)
  249.      * @param string $titulo    (nome do parametro na requisição com os nomes que irão aparecer no dropdown)
  250.      * @param array  $array     (array com informações do seletor)
  251.      */
  252.     public function setarSeletorBreadCrumb(string $urlstring $url_paramstring $modal_idstring $titulo, ?array $array)
  253.     {
  254.         $select['url'] = $url;
  255.         $select['url_param'] = $url_param;
  256.         $select['modal_id'] = $modal_id;
  257.         $select['titulo'] = $titulo;
  258.         $select['array'] = $array;
  259.         return $select;
  260.     }
  261.     public function renderiza(string $template, array $dados)
  262.     {
  263.         return $this->render($templatearray_merge($this->return$dados));
  264.     }
  265.     /**
  266.      * @param string $view
  267.      * @param array $parameters
  268.      * @param Response|null $response
  269.      * @return Response
  270.      */
  271.     protected function render(string $view, array $parameters = [], Response $response null): Response
  272.     {
  273.         if ( defined('static::TEMPLATEBASE') ) {
  274.             $view = static::TEMPLATEBASE.$view;
  275.         }
  276.         return parent::render($view$parameters$response);
  277.     }
  278.     /**
  279.      * Lida com a aplicação de filtros para previnir sql injections.
  280.      *
  281.      * @author Juliano Silva <juliano.silva@2im.com.br>
  282.      *
  283.      * @param string
  284.      * @param mixed $string
  285.      */
  286.     public function sanitizeString($string): string
  287.     {
  288.         return filter_var($stringFILTER_SANITIZE_STRING, ['flags' => FILTER_SANITIZE_MAGIC_QUOTES FILTER_SANITIZE_SPECIAL_CHARS]);
  289.     }
  290.     /**
  291.      * Retorna a propriedade $translator.
  292.      */
  293.     protected function getTranslatorInterface(): \Symfony\Component\Translation\TranslatorInterface
  294.     {
  295.         return $this->translator;
  296.     }
  297.     /**
  298.      * Retorna a propriedade $validator.
  299.      */
  300.     protected function getValidatorInterface(): ValidatorInterface
  301.     {
  302.         return $this->validator;
  303.     }
  304.     /**
  305.      * @return \Symfony\Component\HttpFoundation\Session\Session\SessionInterface
  306.      */
  307.     protected function getSession(): \Symfony\Component\HttpFoundation\Session\SessionInterface
  308.     {
  309.         return $this->get('session');
  310.     }
  311.     /**
  312.      * Retorna a instancia ativa do objeto de serializer.
  313.      */
  314.     protected function getSerializer(): Serializer
  315.     {
  316.         return new Serializer([new ObjectNormalizer()], [new JsonEncoder()]);
  317.     }
  318.     /**
  319.      * Retorna o array de programa e modelagem que foram selecionados no sistema.
  320.      *
  321.      * @return array
  322.      */
  323.     protected function getPrograma(): ?array
  324.     {
  325.         return $this->getSession()->get('programa');
  326.     }
  327.     /**
  328.      * Retorna o array de periodos que foram selecionados no sistema.
  329.      * @return array
  330.      */
  331.     protected function getPeriodo(): ?array
  332.     {
  333.         return $this->getSession()->get('periodo');
  334.     }
  335.     /**
  336.      * Retorna a string do tipo do periodo que foi selecionado.
  337.      * @return string
  338.      */
  339.     protected function getTipoPeriodo(): string
  340.     {
  341.         return $this->getSession()->get('periodo')['tipoFiltro'];
  342.     }
  343.     /**
  344.      * Retorna o array de periodos que foram selecionados no sistema.
  345.      * @return string
  346.      */
  347.     protected function getPeriodoAnoMes(): string
  348.     {
  349.         // auxs
  350.         $ano = (int) $this->getSession()->get('periodo')['from']['ano'];
  351.         $mes = (int) $this->getSession()->get('periodo')['from']['periodo'];
  352.         $referencia = ($ano 100 ) + $mes;
  353.         return ( 'ND' == $this->getSession()->get('periodo')['from']['ano'] )
  354.             ? "{$mes} BETWEEN av.inicio::char(4)::int AND av.fim::char(4)::int"
  355.             "{$referencia} BETWEEN av.inicio AND av.fim";
  356.     }
  357.     /**
  358.      * Retorna o inteiro da referencia do periodo selecionado.
  359.      *
  360.      * @todo Precisa ver como vamos fazer os tratamentos para Marco, que como usamos BETWEEN em algumas buscas.
  361.      */
  362.     protected function getPeriodoReferencia(): int
  363.     {
  364.         return ( 'ND' == $this->getSession()->get('periodo')['from']['ano'] )
  365.             ? $this->getSession()->get('periodo')['from']['periodo']
  366.             : $this->getSession()->get('periodo')['from']['ano'].$this->get('session')->get('periodo')['from']['periodo'];
  367.     }
  368.     /**
  369.      * Retorna se existe periodo configurado.
  370.      */
  371.     protected function hasPeriodo(): bool
  372.     {
  373.         return $this->getSession()->has('periodo');
  374.     }
  375.     /**
  376.      * Retorna a data formatada.
  377.      *
  378.      * @param mixed $date
  379.      *
  380.      * @return \Symfony\Component\HttpFoundation\Request
  381.      */
  382.     protected function getDataFormatada($date): string
  383.     {
  384.         $tipo =$this->getSession()->get('periodo')['from']['tipo'];
  385.         switch ($tipo) {
  386.             case 'Mensal':
  387.                 $return DateHelper::shortDataToFormated($datetrue);
  388.                 break;
  389.             default:
  390.                 $return $date;
  391.                 break;
  392.         }
  393.         return $return;
  394.     }
  395.     /**
  396.      * Limpa sessao periodo.
  397.      * @return mixed
  398.      */
  399.     protected function limpaPeriodos()
  400.     {
  401.         return $this->getSession()->remove('periodo') && $this->limpaAvaliado();
  402.     }
  403.     /**
  404.      * Limpa sessao avaliado.
  405.      * @return mixed
  406.      */
  407.     protected function limpaAvaliado()
  408.     {
  409.         return $this->getSession()->remove('avaliado');
  410.     }
  411.     /**
  412.      * Limpa sessao cliente.
  413.      * @return mixed
  414.      */
  415.     protected function limpaCliente()
  416.     {
  417.         return $this->getSession()->remove('periodo') && $this->getSession()->remove('avaliado') && $this->getSession()->remove('cliente') && $this->getSession()->remove('modelagem');
  418.     }
  419.     /**
  420.      * Limpa filtros setados.
  421.      * @return mixed
  422.      */
  423.     protected function limpaFiltros()
  424.     {
  425.         return $this->getSession()->remove('filtros');
  426.     }
  427.     /**
  428.      * Retorna o array de programa e modelagem que foram selecionados no sistema.
  429.      * @return array|\App\Entity\Cliente\Modelagem\Modelagem
  430.      */
  431.     protected function getModelagem(): ?\App\Entity\Cliente\Modelagem\Modelagem
  432.     {
  433.         return $this->getSession()->get('modelagem');
  434.     }
  435.     /**
  436.      * Retorna o código do programa que está selecionado.
  437.      * @return integer
  438.      */
  439.     protected function getIdPrograma(): int
  440.     {
  441.         return $this->getSession()->get('modelagem')['programa']['id_programa'];
  442.     }
  443.     /**
  444.      * Retorna se existe um programa configurado.
  445.      * @return boolean
  446.      */
  447.     protected function hasModelagem(): bool
  448.     {
  449.         return $this->getSession()->has('modelagem');
  450.     }
  451.     /**
  452.      * Lista os icones de determinado programa caso exista.
  453.      *
  454.      * @author Juliano Silva <juliano.silva@2im.com.br>
  455.      *
  456.      * @return ?array
  457.      */
  458.     protected function getIcones(): array
  459.     {
  460.         $icones = ['avaliado' => ['codigo' => 'f0f0''classe' => 'fa-user-md']];
  461.         if ($this->hasPrograma()) {
  462.             $config $this->getModelagem()->getPrograma()->getConfig();
  463.             if (isset($config->icone)) {
  464.                 $configIcones = (array) $config->icone;
  465.             } else {
  466.                 $configIcones = [];
  467.             }
  468.             if (array_key_exists('avaliado'$configIcones) && !empty($configIcones['avaliado'])) {
  469.                 $icones $configIcones;
  470.             }
  471.         }
  472.         return $icones;
  473.     }
  474.     /**
  475.      * Retorna um array com os filtros do sistema.
  476.      * @return array
  477.      */
  478.     protected function getFiltros(): array
  479.     {
  480.         return $this->getSession()->get('filtros') ?? ['where' => ''];
  481.     }
  482.     /**
  483.      * Retorna se existem filtros configurados no sistema.
  484.      * @return boolean
  485.      */
  486.     protected function hasFiltros(): bool
  487.     {
  488.         return $this->getSession()->has('filtros');
  489.     }
  490.     /**
  491.      * Retorna uma string com os filtros de grupo.
  492.      * @return string
  493.      */
  494.     protected function getFiltroGrupo(): string
  495.     {
  496.         return $this->getSession()->get('filtroGrupo') ?? '';
  497.     }
  498.     /**
  499.      * Retorna uma string com os filtros de perfil.
  500.      * @return string
  501.      */
  502.     protected function getFiltroPerfil(): string
  503.     {
  504.         return $this->getSession()->get('filtroPerfil') ?? '';
  505.     }
  506.     /**
  507.      * Retorna uma string com os filtros de avaliados.
  508.      * @return string
  509.      */
  510.     protected function getFiltroAvaliado(): string
  511.     {
  512.         return $this->getSession()->get('filtroAvaliado') ?? '';
  513.     }
  514.     /**
  515.      * Retorna a Url atual da rota
  516.      * @return string
  517.      */
  518.     protected function getCurrentRoute(): string
  519.     {
  520.         return $this->getCurrentRequest()->get('_route');
  521.     }
  522.     /**
  523.      * @return Request
  524.      */
  525.     protected function getCurrentRequest(): Request
  526.     {
  527.         return $this->container->get('request_stack')->getCurrentRequest();
  528.     }
  529.     /**
  530.      * @return array|object|null
  531.      */
  532.     protected function getAvaliado()
  533.     {
  534.         return $this->getSession()->get('avaliado');
  535.     }
  536.     /**
  537.      * @return boolean
  538.      */
  539.     protected function isAvaliadoInstanceOfEntity()
  540.     {
  541.         return $this->getAvaliado() instanceof \App\Entity\Cliente\Modelagem\Avaliado;
  542.     }
  543.     /**
  544.      * @return integer|null
  545.      */
  546.     protected function getIdAvaliado()
  547.     {
  548.         if ( $this->isAvaliadoInstanceOfEntity() ) {
  549.             return $this->getAvaliado()->getIdAvaliado();
  550.         }
  551.         return $this->getAvaliado()[0]['id_avaliado'] ?? $this->getAvaliado()['id_avaliado'];
  552.     }
  553.     /**
  554.      * Modelagens que o avaliado tem cadastro
  555.      * @return array|null
  556.      */
  557.     protected function getIdModelagemAvaliado(): ?array
  558.     {
  559.         return array_column($this->getAvaliado(), 'id_modelagem');
  560.     }
  561.     /**
  562.      * @return boolean
  563.      */
  564.     protected function hasAvaliado(): bool
  565.     {
  566.         return $this->getSession()->has('avaliado');
  567.     }
  568.     /**
  569.      * Retorna a sessão com as permissões.
  570.      *
  571.      * @author Guilherme Arduino
  572.      *
  573.      * @version 1.0.0
  574.      */
  575.     protected function getSessionPermissoes(): array
  576.     {
  577.         return $this->getSession()->get('permissoesPerfil');
  578.     }
  579.     /**
  580.      * Testa se usuario tem permissão para a visao.
  581.      *
  582.      * @author Guilherme Arduino
  583.      *
  584.      * @version 1.0.0
  585.      *
  586.      * @return \Symfony\Component\HttpFoundation\RedirectResponse
  587.      */
  588.     protected function testaPermissoes(int $idVisaostring $rota_defaultRouterInterface $routerVisaoRepository $visaoRepository)
  589.     {
  590.         if (!array_key_exists($idVisao$this->getSessionPermissoes())) { // testa se o usuario possui permissao para a visao que sera carregada, se não possuir retorna false
  591.             // testa se o usuario possui permissao para a rota default para onde será encaminhado caso nao tenha permissão para a visao que tentou encaminhar, caso não possua permissao para o default faz logout do sistema (TESTE PARA EVITAR 429 Too Many Requests)
  592.             $default $visaoRepository->findOneBy(['rota_default' => $rota_default]);
  593.             if (!array_key_exists($default->getIdVisao(), $this->getSessionPermissoes())) {
  594.                 $this->addFlash('error''Erro de permissão!');
  595.                 return new RedirectResponse($router->generate('logout'));
  596.             }
  597.             // caso usuario tenha permissão ele será redirecionado para a rota_default do respectivo perfil
  598.             return new RedirectResponse($router->generate($rota_default));
  599.         }
  600.         return false;
  601.     }
  602.     /**
  603.      * Monta os drilldowns.
  604.      *
  605.      * @author Lincoln
  606.      *
  607.      * @version 1.0.0.0
  608.      *
  609.      * @return array
  610.      */
  611.     protected function montaDrillDown(string $telaAtual, array $breadcumbstring $proximaTelastring $telaAnterior)
  612.     {
  613.         $request $this->getCurrentRequest();
  614.         $telas $request->getSession()->get('telas');
  615.         if ($request->query->get('voltar')) {
  616.             array_pop($telas);
  617.             $request->getSession()->set('telas'$telas);
  618.         }
  619.         if ($telas) {
  620.             if (!in_array($telaAtual$telas['telas'])) {
  621.                 array_push($telas['telas'], $telaAtual);
  622.                 array_push($telas['breadcumb'], $breadcumb);
  623.                 array_push($telas['id_next_tela'], $proximaTela);
  624.                 array_push($telas['id_prev_tela'], $telaAnterior);
  625.             } else {
  626.                 if ($telas['breadcumb']) {
  627.                     end($telas['breadcumb']);
  628.                     $key key($telas['breadcumb']);
  629.                     $telas['breadcumb'][$key] = $breadcumb;
  630.                 }
  631.             }
  632.         } else {
  633.             $telas['telas'] = [$telaAtual];
  634.             $telas['breadcumb'] = [$breadcumb];
  635.             $telas['id_next_tela'] = [$proximaTela];
  636.             $telas['id_prev_tela'] = [$telaAnterior];
  637.         }
  638.         $request->getSession()->set('telas'$telas);
  639.         return [
  640.             'status' => true,
  641.         ];
  642.     }
  643.     /**
  644.      * Retorna se existe um programa configurado.
  645.      */
  646.     protected function hasPrograma(): bool
  647.     {
  648.         return $this->get('session')->has('programa');
  649.     }
  650.     protected function getPeriodoAvaliacao(): string
  651.     {
  652.         $periodos $this->get('session')->get('periodo');
  653.         if ('ano' == $periodos['tipoFiltro']) {
  654.             return "(av.inicio BETWEEN {$periodos['from']['ano']}01 AND {$periodos['from']['ano']}12) OR (av.fim BETWEEN {$periodos['to']['ano']}01 AND {$periodos['from']['ano']}12)";
  655.         }
  656.         if('marco' == $periodos['tipoFiltro']) {
  657.             return "(av.inicio BETWEEN {$periodos['from']['ano']}01 AND {$periodos['from']['ano']}12) OR (av.fim BETWEEN {$periodos['to']['ano']}01 AND {$periodos['from']['ano']}12)";
  658.         }
  659.         return "({$periodos['from']['ano']}{$periodos['from']['periodo']} BETWEEN av.inicio AND av.fim) OR ({$periodos['to']['ano']}{$periodos['to']['periodo']} BETWEEN av.inicio AND av.fim)";
  660.     }
  661.     /**
  662.      * Retorna o periodo selecionado atual ou null caso nao tenha nenhum selecionado.
  663.      *
  664.      * @author Guilherme Arduino Barlatti
  665.      *
  666.      * @version 1.0.0.0
  667.      *
  668.      * @return string
  669.      */
  670.     protected function getPeridoAtual(): ?string
  671.     {
  672.         $periodoAtual $this->getSession()->get('periodo');
  673.         $atual $periodoAtual['from']['titulo'];
  674.         if (isset($periodoAtual['to']) && $periodoAtual['from']['periodo'] != $periodoAtual['to']['periodo']) {
  675.             $atual .= ' à '.$periodoAtual['to']['titulo'];
  676.         }
  677.         return $atual ?? null;
  678.     }
  679. }