src\Controller\SolicitacaoController.php line 153

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Solicitacao;
  4. use App\Form\SolicitacaoType;
  5. use App\Entity\User;
  6. use App\Repository\SolicitacaoRepository;
  7. use App\Repository\UserRepository;
  8. use App\Utils\FormSolicitacaoUtil;
  9. use App\Utils\VerificaRole;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Knp\Component\Pager\PaginatorInterface;
  15. use App\Service\FileUploader;
  16. use App\Service\Watermark;
  17. use App\Service\Mailer;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use App\Service\SpreadsheetGenerator;
  20. #[Route('/solicitacao')]
  21. class SolicitacaoController extends AbstractController
  22. {
  23.     #[Route('/pendentes'name'app_solicitacao_pendentes'methods: ['GET'])]
  24.     public function solicitacaoPendentes(SolicitacaoRepository $solicitacaoRepositoryRequest $requestPaginatorInterface $paginator): Response
  25.     {           
  26.             $solicitacoes $solicitacaoRepository->findSolicitacaoByUserStatus($this->getUser(), Solicitacao::STATUS_PENDENTE);
  27.             $pagination $paginator->paginate($solicitacoes$request->query->getInt('page'1), 10);
  28.             return $this->render('solicitacao/index.html.twig', [
  29.                 'solicitacoes' => $pagination,
  30.                 'nav_active' => "Solicitação"
  31.             ]);    
  32.     }
  33.     #[Route('/pre-aprovados'name'app_solicitacao_pre_aprovados'methods: ['GET'])]
  34.     public function solicitacaoPreAprovadas(SolicitacaoRepository $solicitacaoRepositoryRequest $requestPaginatorInterface $paginator): Response
  35.     {
  36.         $solicitacoes $solicitacaoRepository->findSolicitacaoByUserStatus($this->getUser(), Solicitacao::STATUS_APROVADOR_OK);
  37.         $pagination $paginator->paginate($solicitacoes$request->query->getInt('page'1), 10);
  38.         return $this->render('solicitacao/index.html.twig', [
  39.             'solicitacoes' => $pagination,
  40.             'nav_active' => "Solicitação"
  41.         ]);
  42.     }
  43.     #[Route('/aprovados'name'app_solicitacao_aprovados'methods: ['GET'])]
  44.     public function solicitacaoAprovadas(SolicitacaoRepository $solicitacaoRepositoryRequest $requestPaginatorInterface $paginator): Response
  45.     {
  46.         $solicitacoes $solicitacaoRepository->findSolicitacaoByUserStatus($this->getUser(), Solicitacao::STATUS_ADMINISTRADOR_OK);
  47.         $pagination $paginator->paginate($solicitacoes$request->query->getInt('page'1), 10);
  48.         return $this->render('solicitacao/index.html.twig', [
  49.             'solicitacoes' => $pagination,
  50.             'nav_active' => "Solicitação"
  51.         ]);
  52.     }
  53.     #[Route('/todos'name'app_solicitacao_todos'methods: ['GET'])]
  54.     public function solicitacaoTodas(SolicitacaoRepository $solicitacaoRepositoryRequest $requestPaginatorInterface $paginator): Response
  55.     {
  56.         $solicitacoes $solicitacaoRepository->findSolicitacaoByUser($this->getUser());
  57.         $pagination $paginator->paginate($solicitacoes$request->query->getInt('page'1), 10);
  58.         return $this->render('solicitacao/index.html.twig', [
  59.             'solicitacoes' => $pagination,
  60.             'nav_active' => "Solicitação"
  61.         ]);
  62.     }
  63.     #[Route('/recusados'name'app_solicitacao_recusados'methods: ['GET'])]
  64.     public function solicitacaoRecusados(SolicitacaoRepository $solicitacaoRepositoryRequest $requestPaginatorInterface $paginator): Response
  65.     {
  66.         $solicitacoes $solicitacaoRepository->getRecusados($this->getUser());
  67.         $pagination $paginator->paginate($solicitacoes$request->query->getInt('page'1), 10);
  68.         return $this->render('solicitacao/index.html.twig', [
  69.             'solicitacoes' => $pagination,
  70.             'nav_active' => "Solicitação"
  71.         ]);
  72.     }
  73.     #[Route('/new'name'app_solicitacao_new'methods: ['GET''POST'])]
  74.     public function new(Request $requestFormSolicitacaoUtil $formSolicitacaoUtilVerificaRole $verificiaRoleSolicitacaoRepository $solicitacaoRepositoryFileUploader $fileUploaderWatermark $watermarkMailer $mailer): Response
  75.     {        
  76.         
  77.         $solicitacao = new Solicitacao();        
  78.         $form $this->createForm(SolicitacaoType::class, $solicitacao);
  79.         $form->handleRequest($request);
  80.         $user $this->getUser();
  81.         $isSuperUser $this->isGranted('ROLE_SUPER');
  82.         
  83.         $empresasUsuario $user->getEmpresas();
  84.         
  85.         if(!$empresasUsuario){
  86.             throw new \Exception('Usuário sem empresa vinculada.');
  87.         }
  88.         
  89.         if ($form->isSubmitted() && $form->isValid()) {            
  90.             
  91.             $solicitacao $formSolicitacaoUtil->formatter($solicitacao);
  92.             if ($form->getClickedButton() && 'salvar' === $form->getClickedButton()->getName()) {
  93.                 $solicitacaoRepository->add($solicitacaotrue$this->getuser());
  94.                 if($isSuperUser){
  95.                     $watermark->addWatermark($solicitacao$this->getParameter('kernel.project_dir'), $this->getUser());
  96.                 }
  97.                 $mailer->sendMail($solicitacao);
  98.                 $this->addFlash(
  99.                     'success',
  100.                     'Solicitação adicionada com sucesso.'
  101.                 );
  102.                 return $this->redirectToRoute('app_solicitacao_pendentes', [], Response::HTTP_SEE_OTHER);
  103.             }
  104.             if ($form->getClickedButton() && 'recorrente' === $form->getClickedButton()->getName()) {
  105.                 $solicitacaoRepository->add($solicitacaotrue$this->getuser());
  106.                 if ($isSuperUser) {
  107.                     $watermark->addWatermark($solicitacao$this->getParameter('kernel.project_dir'), $this->getUser());
  108.                 } else {
  109.                     $solicitacao->setAprovador($this->getUser());
  110.                     $mailer->sendMail($solicitacao);
  111.                 }
  112.                 $this->addFlash(
  113.                     'success',
  114.                     'Solicitação adicionada com sucesso.'
  115.                 );             
  116.             }
  117.         }
  118.         return $this->renderForm('solicitacao/new.html.twig', ['solicitacao' => $solicitacao,
  119.             'form' => $form,
  120.             'nav_active' => 'Solicitação']);
  121.     }
  122.     #[Route('/checker'name'app_solicitacao_recorrente'methods: ['POST'])]
  123.     public function checker(Request $requestSolicitacaoRepository $solicitacaoRepository): Response
  124.     {
  125.         $post_data $request->getContent();
  126.         $post_data json_decode($post_datatrue);
  127.         $numeroLancamento $post_data['numeroLancamento'];
  128.         $isChecked $solicitacaoRepository->findBy(
  129.             [   'numeroLancamento' => $numeroLancamento,
  130.             ]);
  131.         if (count($isChecked) > 0) {
  132.             return $this->json(true);
  133.         }
  134.         return $this->json(false);
  135.     }
  136.     #[Route('/empresa/{empresaId}/subempresa/{subEmpresaId}/solicitacao/{id}'name'app_solicitacao_show'methods: ['GET'])]
  137.     public function show(SolicitacaoRepository $solicitacaoRepositorySolicitacao $solicitacao$empresaId$subEmpresaId): Response
  138.     
  139.         $user $this->getUser();
  140.         $hasAccess false;
  141.         if ($this->isGranted('ROLE_SUPER')) {
  142.             $hasAccess true;
  143.         } else {            
  144.             $subEmpresasUser $user->getSubEmpresas();
  145.             foreach ($subEmpresasUser as $subEmpresa) {                
  146.                 if ($subEmpresa->getId() == $subEmpresaId) {                    
  147.                     $hasAccess true;
  148.                     break;
  149.                 }
  150.             }
  151.         }
  152.         if($solicitacao->getUsuario() == $user) {
  153.             $hasAccess true;
  154.         }
  155.         
  156.         if (!$hasAccess) {
  157.             throw $this->createAccessDeniedException('Você não tem permissão para acessar as solicitações desta empresa.');
  158.         }      
  159.         $duplicidade $solicitacaoRepository->findBy([
  160.             'numeroLancamento'=> $solicitacao->getNumeroLancamento()
  161.             ]);
  162.         if(count($duplicidade) > 1)
  163.         {
  164.             $duplicidade true;
  165.         } else{
  166.             $duplicidade false;
  167.         }
  168.                 
  169.             return $this->render('solicitacao/show.html.twig', [
  170.                 'solicitacao' => $solicitacao,
  171.                 'nav_active' => 'Solicitação',
  172.                 'duplicidade' => $duplicidade
  173.             ]);
  174.     }
  175.     #[Route('/{id}/edit'name'app_solicitacao_edit'methods: ['GET''POST'])]
  176.     public function edit(Request $requestSolicitacao $solicitacaoSolicitacaoRepository $solicitacaoRepository): Response
  177.     {
  178.         if ($solicitacao->getStatus() != Solicitacao::STATUS_PENDENTE || $solicitacao->getUsuario() !== $this->getUser()) {
  179.             return $this->redirectToRoute('app_solicitacao_redirect');
  180.         }
  181.         $form $this->createForm(SolicitacaoType::class, $solicitacao);
  182.         $form->handleRequest($request);
  183.         if ($form->isSubmitted() && $form->isValid()) {
  184.             $solicitacaoRepository->add($solicitacaotrue$this->getUser());
  185.             return $this->redirectToRoute('app_solicitacao_pendentes', [], Response::HTTP_SEE_OTHER);
  186.         }
  187.         return $this->renderForm('solicitacao/edit.html.twig', [
  188.             'solicitacao' => $solicitacao,
  189.             'form' => $form,
  190.             'nav_active' => 'Solicitação'
  191.         ]);
  192.     }
  193.     #[Route('/aprovar/{id}'name'app_solicitacao_aprovar'methods: ['POST'])]
  194.     public function aprovar(Request $requestSolicitacao $solicitacaoSolicitacaoRepository $solicitacaoRepositoryWatermark $watermarkMailer $mailer): Response
  195.     {
  196.         $isSuperUser $this->isGranted('ROLE_SUPER');
  197.         $status $isSuperUser Solicitacao::STATUS_ADMINISTRADOR_OK Solicitacao::STATUS_APROVADOR_OK;
  198.         
  199.         if ($this->isCsrfTokenValid('aprovar' $solicitacao->getId(), $request->request->get('_token'))) {
  200.                 $solicitacao->setStatus($status);                
  201.                 $solicitacao->setUpdatedAt(new \DateTimeImmutable('now'));
  202.                 $solicitacao->setApprovedAt(new \DateTimeImmutable('now'));
  203.                 $isSuperUser $this->addFlash('success''Solicitação Aprovada com sucesso.') : $this->addFlash('success''Solicitação Pré-Aprovada com sucesso.');
  204.                 if($isSuperUser){
  205.                     $watermark->addWatermark($solicitacao$this->getParameter('kernel.project_dir'), $this->getUser());
  206.                     $solicitacao->setAdministrador($this->getUser());
  207.                 }else{
  208.                     $solicitacao->setAprovador($this->getUser());
  209.                 }
  210.                                          
  211.                 $solicitacaoRepository->update($solicitacaotrue);
  212.                  
  213.                 $mailer->sendMail($solicitacao);                              
  214.         }      
  215.         return $isSuperUser $this->redirectToRoute('app_aprovador_pendentes', ['empresaId' => $solicitacao->getEmpresa()->getId()], Response::HTTP_SEE_OTHER)
  216.              : $this->redirectToRoute('app_aprovador_subempresa_pendentes',  ['empresaId' => $solicitacao->getEmpresa()->getId(), 'subEmpresaId' => $solicitacao->getSubEmpresa()->getId()], Response::HTTP_SEE_OTHER);
  217.                 
  218.     }
  219.     #[Route('/recusar/{id}'name'app_solicitacao_recusar'methods: ['POST'])]
  220.     public function recusar(Request $requestSolicitacao $solicitacaoSolicitacaoRepository $solicitacaoRepository): Response
  221.     {
  222.         $isSuperUser $this->isGranted('ROLE_SUPER');
  223.         if ($this->isCsrfTokenValid('recusar' $solicitacao->getId(), $request->request->get('_token'))) {
  224.             $solicitacao->setUpdatedAt(new \DateTimeImmutable('now'));
  225.             $solicitacao->setRecusedAt(new \DateTimeImmutable('now'));
  226.             $solicitacao->setRecusador($this->getUser());
  227.             $solicitacao->setStatus($isSuperUser Solicitacao::STATUS_ADMINISTRADOR_RECUSADO Solicitacao::STATUS_APROVADOR_RECUSADO);
  228.             $solicitacao->setRecusa($request->request->get('recusa'));
  229.             $solicitacaoRepository->update($solicitacaotrue);
  230.             $this->addFlash(
  231.                 'success',
  232.                 'Solicitação recusada com sucesso.'
  233.              );
  234.         }
  235.         return $isSuperUser $this->redirectToRoute('app_aprovador_pendentes', ['empresaId' => $solicitacao->getEmpresa()->getId()], Response::HTTP_SEE_OTHER)
  236.         : $this->redirectToRoute('app_aprovador_subempresa_pendentes',  ['empresaId' => $solicitacao->getEmpresa()->getId(), 'subEmpresaId' => $solicitacao->getSubEmpresa()->getId()], Response::HTTP_SEE_OTHER);
  237.     }
  238.     #[Route('/{id}'name'app_solicitacao_delete'methods: ['POST'])]
  239.     public function delete(Request $requestSolicitacao $solicitacaoSolicitacaoRepository $solicitacaoRepository): Response
  240.     {
  241.         if ($this->isCsrfTokenValid('delete' $solicitacao->getId(), $request->request->get('_token'))) {
  242.             $solicitacaoRepository->remove($solicitacaotrue);
  243.         }
  244.         return $this->redirectToRoute('app_solicitacao_pendentes', [], Response::HTTP_SEE_OTHER);
  245.     }
  246.     #[Route('/pendentes-count/{empresa}/{status}/{tipo}'methods: ['GET'], defaults: ["empresa" => "any""tipo" => "any"])]
  247.     public function pendentsCount(Request $requestSolicitacaoRepository $solicitacaoRepository$empresa$status$tipo): Response
  248.     {
  249.         if ($empresa != "any" && $status != 'any' && $tipo != 'any') {
  250.             return $this->json($solicitacaoRepository->count(['empresa' => $empresa'status' => $status'tipo' => $tipo]));
  251.         }
  252.         if ($empresa != "any" && $status != 'any') {
  253.             return $this->json($solicitacaoRepository->count(['empresa' => $empresa'status' => $status]));
  254.         }
  255.         if ($empresa == 'any' $tipo != "any") {
  256.             return $this->json($solicitacaoRepository->count(['status' => $status'tipo' => $tipo]));
  257.         }
  258.         return false;
  259.     }
  260.     /**
  261.      * @Route("/report/spreadsheet", name="app_solicitacao_report", methods={"GET"})
  262.      */
  263.     public function report(Request $requestSpreadsheetGenerator $spreadsheetGenerator): Response
  264.     {
  265.         // Obter os parâmetros do formulário
  266.         $startDate $request->query->get('start_date');
  267.         $endDate $request->query->get('end_date');
  268.         $reportType $request->query->get('report_type');
  269.         // Chamar o método generateExcel() passando os parâmetros necessários
  270.         try {
  271.             $response $spreadsheetGenerator->generateExcel($startDate$endDate$reportType);
  272.         } catch (\Exception $e) {
  273.             // Lidar com a exceção
  274.             $this->addFlash('error''Ocorreu um erro ao gerar o relatório: ' $e->getMessage());
  275.             return new RedirectResponse($request->headers->get('referer'));
  276.         }
  277.         return $response;
  278.     }
  279. }