src/Controller/CertificadoController.php line 326

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Certificado;
  4. use App\Form\CertificadoType;
  5. use App\Repository\CertificadoRepository;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\Serializer\Serializer;
  12. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  13. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  14. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  15. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use Dompdf\Dompdf;
  18. use Dompdf\Options;
  19. use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;
  20. /**
  21.  * @Route("/certificado")
  22.  */
  23. class CertificadoController extends BaseController
  24. {
  25.     /**
  26.      * @Route("/", name="certificado_index", methods={"GET"})
  27.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
  28.      */
  29.     public function index(CertificadoRepository $certificadoRepositoryTranslatorInterface $translator): Response
  30.     {
  31.         $breadcrumbs[$translator->trans('Certificados')] = null;
  32.         $entityManager $this->getDoctrine()->getManager();
  33.         return $this->render('certificado/index.html.twig', [
  34.             'certificados' => $certificadoRepository->findAll(),
  35.             'cantPendientes' => $entityManager->getRepository('App:Certificado')->getCantByEstado(Certificado::ESTADO_PENDIENTE),
  36.             'cantAceptados' => $entityManager->getRepository('App:Certificado')->getCantByEstado(Certificado::ESTADO_ACEPTADO),
  37.             'cantRechazados' => $entityManager->getRepository('App:Certificado')->getCantByEstado(Certificado::ESTADO_RECHAZADO),
  38.             'breadcrumbs' => $breadcrumbs,
  39.             'page_title' => $translator->trans('Certificados')
  40.         ]);
  41.     }
  42.     /**
  43.      * @Route("/grid", name="certificado_grid", methods={"GET","POST"})
  44.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
  45.      */
  46.     public function indexGridAction(Request $request) {
  47.         $em $this->getDoctrine()->getManager();
  48.         $idUser $this->getUser()->getId();
  49.         $admin false;
  50.         if ($this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) {
  51.             $admin true;
  52.         }
  53.         $search $request->request->get('search');
  54.         $draw $request->request->get('draw');
  55.         $start $request->request->get('start');
  56.         $length $request->request->get('length');
  57.         if (!$request->request->get('order')) {
  58.             $column "c.orden, c.fechaSolicitud";
  59.             $direction 'asc';
  60.         } else {
  61.             $order $request->request->get('order');
  62.             $column $order[0]['column']; // 1|2|..|n
  63.             switch ($column) {
  64.                 case 0:
  65.                     $column 'c.identificador';
  66.                     break;
  67.                 case 1:
  68.                     $column 'c.apellido';
  69.                     break;
  70.                 case 2:
  71.                     $column 'c.nombre';
  72.                     break;
  73.                 case 3:
  74.                     $column 'c.numeroDocumento';
  75.                     break;
  76.                 case 4:
  77.                     $column 'c.carrera';
  78.                     break;
  79.                 case 5:
  80.                     $column 'c.tipoCertificacion';
  81.                     break;
  82.                 case 6:
  83.                     $column 'c.estado';
  84.                     break;
  85.             }
  86.             $direction $order[0]['dir']; // asc|desc
  87.         }
  88.         
  89.         $recordsTotal $em->getRepository('App:Certificado')->getCountRecords($idUser$admin);
  90.         if ($search['value'] == "") {
  91.             $entities $em->getRepository('App:Certificado')->getDrawForTable($start$length$column$direction$idUser$admin);           
  92.             $recordsFiltered $recordsTotal;
  93.         } else {
  94.             $recordsFiltered count($em->getRepository('App:Certificado')->getRecordsBySearch($search['value'], $idUser$admin));
  95.             $entities $em->getRepository('App:Certificado')->search($search['value'], $start$length$column$direction$idUser$admin);
  96.         }
  97.         
  98.         return $this->render('certificado/index_grid.html.twig', array(
  99.                 'entities' => $entities,
  100.                 'vdraw' => $draw,
  101.                 'vrecordsTotal' => $recordsTotal,
  102.                 'vrecordsFiltered' => $recordsFiltered
  103.             )
  104.         );
  105.     }
  106.     /**
  107.      * @Route("/new", name="certificado_new", methods={"GET","POST"})
  108.      */
  109.     public function new(Request $requestTranslatorInterface $translatorRecaptcha3Validator $recaptcha3Validator): Response
  110.     {
  111.         $certificado = new Certificado();
  112.         $form $this->createForm(CertificadoType::class, $certificado);
  113.         $form->handleRequest($request);
  114.         if ($form->isSubmitted() && $form->isValid()) {
  115.             $score $recaptcha3Validator->getLastResponse()->getScore();
  116.             if ($score >= 0.5) {
  117.                 try {
  118.                     $numeroDocumento $form->get('numeroDocumento')->getData();
  119.                     $entityManager $this->getDoctrine()->getManager();
  120.                     $exist $entityManager->getRepository('App:Certificado')->findByDocumento($numeroDocumento);
  121.                     if (!$exist) {
  122.                         $certificado->setEstado(Certificado::ESTADO_PENDIENTE);
  123.                         $certificado->setOrden(1);
  124.                         $certificado->setFechaSolicitud(new \DateTime());
  125.                         // Se comprueba la extensión de los archivos a subir
  126.                         $extensions = array("pdf""gif""jpg""jpeg""png""bmp");
  127.                         $file1 $form->get('imageFile1')->getData();
  128.                         if (isset($file1)) {
  129.                             // Comprueba que la extension del archivo 1 sea valida
  130.                             if (!$this->validateExtensionFile($file1$extensions)) {
  131.                                 $error "Compruebe la extensión de los archivos a subir. Sólo se pueden subir archivos con extensiones: [.pdf | .png | .jpeg | .jpg | .gif | .bmp]";
  132.                                 $this->get('session')->getFlashBag()->add('error'$error);
  133.                                 return $this->redirect($this->generateUrl('certificado_new'));
  134.                             }
  135.                             $certificado->setUpdatedAt(new \DateTime());
  136.                         }
  137.                         $file2 $form->get('imageFile2')->getData();
  138.                         if (isset($file2)) {
  139.                             // Comprueba que la extension del archivo 2 sea valida
  140.                             if (!$this->validateExtensionFile($file2$extensions)) {
  141.                                 $error "Compruebe la extensión de los archivos a subir. Sólo se pueden subir archivos con extensiones: [.pdf | .png | .jpeg | .jpg | .gif | .bmp]";
  142.                                 $this->get('session')->getFlashBag()->add('error'$error); 
  143.                                 return $this->redirect($this->generateUrl('certificado_index'));
  144.                             }
  145.                             $certificado->setUpdatedAt(new \DateTime());
  146.                         }
  147.                         $file3 $form->get('imageFile3')->getData();
  148.                         if (isset($file3)) {
  149.                             // Comprueba que la extension del archivo 3 sea valida
  150.                             if (!$this->validateExtensionFile($file3$extensions)) {
  151.                                 $error "Compruebe la extensión de los archivos a subir. Sólo se pueden subir archivos con extensiones: [.pdf | .png | .jpeg | .jpg | .gif | .bmp]";
  152.                                 $this->get('session')->getFlashBag()->add('error'$error); 
  153.                                 return $this->redirect($this->generateUrl('certificado_index'));
  154.                             }
  155.                             $certificado->setUpdatedAt(new \DateTime());
  156.                         }
  157.                         $entityManager->persist($certificado);
  158.                         $entityManager->flush();
  159.                     } else {
  160.                         $error "Ocurrio un error al procesar su solicitud. Su certificado ya fue solicitado.";
  161.                         $this->get('session')->getFlashBag()->add('error'$error);
  162.                         return $this->redirectToRoute('certificado_new');
  163.                     }
  164.                 } catch (Exception $e) {
  165.                     $exception $e->getMessage();
  166.                     $error "Ocurrio un error al procesar su solicitud. Por favor, vuelva a intentarlo.";
  167.                     $this->get('session')->getFlashBag()->add('error'$error);
  168.                     return $this->redirectToRoute('certificado_new');
  169.                 }
  170.                 $this->get('session')->getFlashBag()->add('success''Su solicitud se envió correctamente.');
  171.             } else {
  172.                 $error "El captcha es invalido. Por favor, vuelva a intentarlo.";
  173.                 $this->get('session')->getFlashBag()->add('error'$error);
  174.                 return $this->redirectToRoute('certificado_new');
  175.             }
  176.         }
  177.         if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')) {
  178.             $breadcrumbs = array(
  179.                 $translator->trans('Certificados') => $this->generateUrl('certificado_index'),
  180.                 $translator->trans('Solicitud') => null
  181.             );
  182.         } else {
  183.             $breadcrumbs null;
  184.         }
  185.         return $this->render('certificado/new.html.twig', [
  186.             'certificado' => $certificado,
  187.             'form' => $form->createView(),
  188.             'breadcrumbs' => $breadcrumbs,
  189.             'page_title' => $translator->trans('Solicitud de Certificado')
  190.         ]);
  191.     }
  192.     /**
  193.      * @Route("/{id}", name="certificado_show", methods={"GET"})
  194.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
  195.      */
  196.     public function show(Certificado $certificadoTranslatorInterface $translator): Response
  197.     {
  198.         $breadcrumbs = array(
  199.             $translator->trans('Certificados') => $this->generateUrl('certificado_index'),
  200.             $translator->trans('Detalle') => null
  201.         );
  202.         return $this->render('certificado/show.html.twig', [
  203.             'certificado' => $certificado,
  204.             'rechazado' => Certificado::ESTADO_RECHAZADO,
  205.             'pendiente' => Certificado::ESTADO_PENDIENTE,
  206.             'breadcrumbs' => $breadcrumbs,
  207.             'page_title' => $translator->trans('Detalle Certificado')
  208.         ]);
  209.     }
  210.     /**
  211.      * @Route("/{id}/accept", name="certificado_accept", methods={"GET","POST"})
  212.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
  213.      */
  214.     public function accept(Request $request$idTranslatorInterface $translator): Response
  215.     {
  216.         $entityManager $this->getDoctrine()->getManager();
  217.         $certificado $entityManager->getRepository('App:Certificado')->find($id);
  218.         $certificado->setEstado(Certificado::ESTADO_ACEPTADO);
  219.         $certificado->setOrden(2);
  220.         $identificador uniqid();
  221.         $certificado->setIdentificador($identificador);
  222.         $certificado->setFechaProcesado(new \DateTime());
  223.         $certificado->setProcesadoPor($this->getUser()->getUsername());
  224.         $entityManager->persist($certificado);
  225.         $entityManager->flush();
  226.         $this->get('session')->getFlashBag()->add('success''El certificado se aceptó correctamente.');
  227.         return $this->redirectToRoute('certificado_index');
  228.     }
  229.     /**
  230.      * @Route("/reject", name="certificado_reject", methods={"GET","POST"})
  231.      * @Security("is_granted('ROLE_ADMIN') or is_granted('ROLE_SECRETARIA_ESTUDIANTIL')")
  232.      */
  233.     public function reject(Request $requestTranslatorInterface $translator): Response
  234.     {
  235.         $entityManager $this->getDoctrine()->getManager();
  236.         $id $request->request->get('id');
  237.         $motivo $request->request->get('motivo');
  238.         $certificado $entityManager->getRepository('App:Certificado')->find($id);
  239.         $certificado->setEstado(Certificado::ESTADO_RECHAZADO);
  240.         $certificado->setOrden(3);
  241.         $certificado->setMotivoRechazo($motivo);
  242.         $certificado->setFechaProcesado(new \DateTime());
  243.         $certificado->setProcesadoPor($this->getUser()->getUsername());
  244.         $entityManager->persist($certificado);
  245.         $entityManager->flush();
  246.         $this->get('session')->getFlashBag()->add('success''El certificado se rechazó correctamente.');
  247.         return $this->redirectToRoute('certificado_index');
  248.     }
  249.     private function redirectToHomepageWithMessage($msg$msgValidate$msgSearch) {
  250.         $breadcrumbs['Inicio'] = null;
  251.         return $this->render('default/index.html.twig', [
  252.             'breadcrumbs' => $breadcrumbs,
  253.             'msg' => $msg,
  254.             'msgValidate' => $msgValidate,
  255.             'msgSearch' => $msgSearch,
  256.             'page_title' => 'Inicio'
  257.         ]);
  258.     }
  259.     /**
  260.      * @Route("/validate", name="certificado_validate", methods={"GET","POST"})
  261.      */
  262.     public function validate(Request $requestTranslatorInterface $translator): Response
  263.     {
  264.         $entityManager $this->getDoctrine()->getManager();
  265.         $identificador $request->request->get('identificador');
  266.         try {
  267.             $certificado $entityManager->getRepository('App:Certificado')->findByIdentificador($identificador);
  268.             if (!$certificado) {
  269.                 $msg "No se encontro ningún certificado con identificador <b>".$identificador."</b>.";
  270.                 return $this->redirectToHomepageWithMessage($msgtruefalse);
  271.             }
  272.         } catch (Exception $e) {
  273.             $exception $e->getMessage();
  274.             $msg "Ocurrio un error al intentar validar el certificado. Por favor, vuelva a intentarlo.";
  275.             return $this->redirectToHomepageWithMessage($msgtruefalse);
  276.         }
  277.         $breadcrumbs = array(
  278.             $translator->trans('Inicio') => $this->generateUrl('homepage'),
  279.             $translator->trans('Validación de Certificado') => null
  280.         );
  281.         return $this->render('certificado/validate.html.twig', [
  282.             'certificado' => $certificado,
  283.             'breadcrumbs' => $breadcrumbs,
  284.             'page_title' => $translator->trans('Validación de Certificado')
  285.         ]);
  286.     }
  287.     /**
  288.      * @Route("/search", name="certificado_search", methods={"GET","POST"}, options={"expose"=true})
  289.      */
  290.     public function search(Request $requestTranslatorInterface $translator): Response
  291.     {
  292.         $xLegajo true;
  293.         $legajo $request->request->get('legajo');
  294.         if (!$legajo) {
  295.             $xLegajo false;
  296.             $tipoDocumento $request->request->get('tipo_documento');
  297.             $numeroDocumento $request->request->get('numero_documento');
  298.         }
  299.         $entityManager $this->getDoctrine()->getManager();
  300.         if ($xLegajo) {
  301.             $certificados $entityManager->getRepository('App:Certificado')->findBy(array('legajo' => $legajo));
  302.         } else {
  303.             $certificados $entityManager->getRepository('App:Certificado')->findBy(array('tipoDocumento' => $tipoDocumento'numeroDocumento' => $numeroDocumento));
  304.         }
  305.         if (is_array($certificados) && (count($certificados) > 0)) {
  306.             $breadcrumbs = array(
  307.                 $translator->trans('Inicio') => $this->generateUrl('homepage'),
  308.                 $translator->trans('Certificado') => null
  309.             );
  310.     
  311.             return $this->render('certificado/search.html.twig', [
  312.                 'certificados' => $certificados,
  313.                 'estadoAceptado' => Certificado::ESTADO_ACEPTADO,
  314.                 'estadoPendiente' => Certificado::ESTADO_PENDIENTE,
  315.                 'estadoRechazado' => Certificado::ESTADO_RECHAZADO,
  316.                 'breadcrumbs' => $breadcrumbs,
  317.                 'page_title' => $translator->trans('Certificado')
  318.             ]);                            
  319.         } else { 
  320.             $msg "El certificado buscado es inexistente.";
  321.         }
  322.         return $this->redirectToHomepageWithMessage($msgfalsetrue);
  323.     }
  324.     /**
  325.      * @Route("/export", name="certificado_export", methods={"GET","POST"}, options={"expose"=true})
  326.      */
  327.     public function export(Request $requestTranslatorInterface $translator): Response
  328.     {
  329.         $tipoDocumento $request->request->get('tipo_documento');
  330.         $numeroDocumento $request->request->get('numero_documento');
  331.         $entityManager $this->getDoctrine()->getManager();
  332.         $certificado $entityManager->getRepository('App:Certificado')->findOneBy(array('tipoDocumento' => $tipoDocumento'numeroDocumento' => $numeroDocumento'estado' => Certificado::ESTADO_ACEPTADO));
  333.         $monthName $this->getCurrentMonth();
  334.         $html $this->renderView('certificado/pdf.html.twig', array(
  335.             'title' => "Certificado Único de Estudiantes Trabajadores y/o con familiares a cargo",
  336.             'monthName' => $monthName,
  337.             'certificado' => $certificado
  338.         ));
  339.         // Configure Dompdf according to your needs
  340.         $pdfOptions = new Options();
  341.         $pdfOptions->set('defaultFont''Calibri');
  342.         $pdfOptions->set('isRemoteEnabled'TRUE);
  343.         $pdfOptions->set('isHtml5ParserEnabled'TRUE);
  344.         
  345.         // Instantiate Dompdf with our options
  346.         $dompdf = new Dompdf($pdfOptions);
  347.         $contxt stream_context_create([ 
  348.             'ssl' => [ 
  349.                 'verify_peer' => FALSE
  350.                 'verify_peer_name' => FALSE,
  351.                 'allow_self_signed'=> TRUE
  352.             
  353.         ]);
  354.         $dompdf->setHttpContext($contxt);
  355.             
  356.         // (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
  357.         $dompdf->setPaper('A4');
  358.         // Load HTML to Dompdf
  359.         $dompdf->loadHtml($html);
  360.         // Render the HTML
  361.         $dompdf->render();
  362.         ob_end_clean();
  363.         $filename str_replace(' ','_',(strtolower($certificado->getApellido()).'_'.strtolower($certificado->getNombre())));
  364.         $dompdf->stream($filename, array(
  365.             "Attachment" => FALSE
  366.         ));
  367.     }
  368. }