src\Controller\AprovadorController.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Solicitacao;
  4. use App\Repository\SolicitacaoRepository;
  5. use Knp\Component\Pager\PaginatorInterface;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. #[Route('/aprovador')]
  11. class AprovadorController extends AbstractController
  12. {
  13.     /**
  14.      * Normaliza o campo de filtro antigo "u.numeroLancamento" para "s.numeroLancamento".
  15.      * Se detectar o valor antigo na query, faz um redirect 302 para a mesma rota com o valor corrigido.
  16.      */
  17.     private function normalizeFilterField(Request $requeststring $routeName, array $routeParams = []): ?Response
  18.     {
  19.         $filterField $request->query->get('filterField');
  20.         if ($filterField === 'u.numeroLancamento') {
  21.             $params $request->query->all();
  22.             $params['filterField'] = 's.numeroLancamento';
  23.             // Mantém a navegação/ordenacão atuais mas troca apenas o campo
  24.             return $this->redirectToRoute($routeNamearray_merge($routeParams$params));
  25.         }
  26.         return null;
  27.     }
  28.     #[Route(
  29.         '/empresa/{empresaId}/{status}',
  30.         name'app_aprovador_empresa_status',
  31.         methods: ['GET'],
  32.         defaults: ['status' => 'pendentes'],
  33.         requirements: ['status' => 'pendentes|pre-aprovados|aprovados|todos']
  34.     )]
  35.     public function empresaPorStatus(
  36.         SolicitacaoRepository $solicitacaoRepository,
  37.         Request $request,
  38.         PaginatorInterface $paginator,
  39.         int $empresaId,
  40.         string $status
  41.     ): Response {
  42.         $user $this->getUser();
  43.         // Acesso: SUPER vê tudo; senão precisa pertencer à empresa
  44.         $hasAccess $this->isGranted('ROLE_SUPER');
  45.         if (!$hasAccess) {
  46.             foreach ($user->getEmpresas() as $empresa) {
  47.                 if ($empresa->getId() === $empresaId) {
  48.                     $hasAccess true;
  49.                     break;
  50.                 }
  51.             }
  52.         }
  53.         if (!$hasAccess) {
  54.             throw $this->createAccessDeniedException('Você não tem permissão para acessar as solicitações desta empresa.');
  55.         }
  56.         // Normaliza filtro legado e limpa filtro vazio (evita lista zerada)
  57.         $filterField $request->query->get('filterField');
  58.         $filterValue $request->query->get('filterValue');
  59.         if ($filterField === 'u.numeroLancamento') {
  60.             $params $request->query->all();
  61.             $params['filterField'] = 's.numeroLancamento';
  62.             return $this->redirectToRoute('app_aprovador_empresa_status'array_merge([
  63.                 'empresaId' => $empresaId,
  64.                 'status'    => $status,
  65.             ], $params));
  66.         }
  67.         if ($filterField && is_string($filterValue) && trim($filterValue) === '') {
  68.             $params $request->query->all();
  69.             unset($params['filterField'], $params['filterValue']);
  70.             return $this->redirectToRoute('app_aprovador_empresa_status'array_merge([
  71.                 'empresaId' => $empresaId,
  72.                 'status'    => $status,
  73.             ], $params));
  74.         }
  75.         // Mapa de status base
  76.         $statusMap = [
  77.             'pendentes'     => Solicitacao::STATUS_PENDENTE,          // será ajustado para SUPER
  78.             'pre-aprovados' => Solicitacao::STATUS_APROVADOR_OK,
  79.             'aprovados'     => Solicitacao::STATUS_ADMINISTRADOR_OK,
  80.             'todos'         => null,                                  // sem filtro
  81.         ];
  82.         // Fallback padrão coerente
  83.         $statusCode array_key_exists($status$statusMap)
  84.             ? $statusMap[$status]
  85.             : Solicitacao::STATUS_PENDENTE;
  86.         // Ajuste semântico: para SUPER, "pendentes" = pré-aprovados do aprovador
  87.         if ($status === 'pendentes' && $this->isGranted('ROLE_SUPER')) {
  88.             $statusCode Solicitacao::STATUS_APROVADOR_OK;
  89.         }
  90.         // Monta QB (se $statusCode for null, não aplica filtro de status)
  91.         $qb $solicitacaoRepository->qbByEmpresaAndStatus($empresaId$statusCode);
  92.         $pagination $paginator->paginate(
  93.             $qb,
  94.             $request->query->getInt('page'1),
  95.             10,
  96.             [
  97.                 'defaultSortFieldName' => 's.updatedAt',
  98.                 'defaultSortDirection' => 'desc',
  99.                 'sortFieldAllowList'   => ['s.titulo''s.valor''s.numeroLancamento''s.vencimento''s.status''s.updatedAt'],
  100.                 'filterFieldAllowList' => ['s.numeroLancamento'],
  101.             ]
  102.         );
  103.         return $this->render('aprovador/index.html.twig', [
  104.             'solicitacoes' => $pagination,
  105.             'nav_active'   => ucfirst($status),
  106.             'empresaId'    => $empresaId,
  107.             'subEmpresaId' => null,
  108.         ]);
  109.     }
  110.     #[Route(
  111.         '/subempresa/{subEmpresaId}/{status}',
  112.         name'app_aprovador_subempresa_status',
  113.         methods: ['GET'],
  114.         defaults: ['status' => 'pendentes'],
  115.         requirements: ['status' => 'pendentes|pre-aprovados|aprovados|todos']
  116.     )]
  117.     public function subEmpresaPorStatus(
  118.         SolicitacaoRepository $solicitacaoRepository,
  119.         Request $request,
  120.         PaginatorInterface $paginator,
  121.         int $subEmpresaId,
  122.         string $status
  123.     ): Response {
  124.         $user $this->getUser();
  125.         $hasAccess false;
  126.         foreach ($user->getSubEmpresas() as $subEmpresa) {
  127.             if ($subEmpresa->getId() === $subEmpresaId) {
  128.                 $hasAccess true;
  129.                 break;
  130.             }
  131.         }
  132.         if (!$hasAccess) {
  133.             throw $this->createAccessDeniedException('Você não tem permissão para acessar as solicitações desta empresa.');
  134.         }
  135.         // Normaliza filtro legado também nesta rota
  136.         if ($resp $this->normalizeFilterField($request'app_aprovador_subempresa_status', [
  137.             'subEmpresaId' => $subEmpresaId,
  138.             'status'       => $status,
  139.         ])) {
  140.             return $resp;
  141.         }
  142.         $statusMap = [
  143.             'pendentes'     => Solicitacao::STATUS_PENDENTE,
  144.             'pre-aprovados' => Solicitacao::STATUS_APROVADOR_OK,
  145.             'aprovados'     => Solicitacao::STATUS_ADMINISTRADOR_OK,
  146.             'todos'         => Solicitacao::STATUS_TODOS
  147.         ];
  148.         $statusCode $statusMap[$status] ?? Solicitacao::STATUS_PENDENTE;
  149.         $qb $statusCode === Solicitacao::STATUS_TODOS
  150.             $solicitacaoRepository->qbBySubEmpresa($subEmpresaId)
  151.             : $solicitacaoRepository->qbBySubEmpresaAndStatus($subEmpresaId$statusCode);
  152.         $pagination $paginator->paginate(
  153.             $qb,
  154.             $request->query->getInt('page'1),
  155.             10,
  156.             [
  157.                 'defaultSortFieldName' => 's.updatedAt',
  158.                 'defaultSortDirection' => 'desc',
  159.                 'sortFieldAllowList'   => ['s.titulo''s.valor''s.numeroLancamento''s.vencimento''s.status''s.updatedAt'],
  160.                 'filterFieldAllowList' => ['s.numeroLancamento'],
  161.             ]
  162.         );
  163.         return $this->render('aprovador/index.html.twig', [
  164.             'solicitacoes' => $pagination,
  165.             'nav_active'   => ucfirst($status),
  166.             'subEmpresaId' => $subEmpresaId,
  167.         ]);
  168.     }
  169. }