src/Controller/ConsultaReporteSolicitudController.php line 46

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Evaluacion;
  4. use App\Entity\Periodo;
  5. use App\Entity\Solicitud;
  6. use App\Entity\Unidad;
  7. use App\Entity\Usuario;
  8. use App\Form\EvaluacionType;
  9. use Box\Spout\Common\Exception\InvalidArgumentException;
  10. use Box\Spout\Common\Exception\IOException;
  11. use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
  12. use Box\Spout\Writer\Exception\WriterNotOpenedException;
  13. use DateTime;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Doctrine\ORM\EntityRepository;
  16. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\Form\Extension\Core\Type\DateType;
  19. use Symfony\Component\Form\Extension\Core\Type\ButtonType;
  20. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  27. use Symfony\Component\Form\AbstractType;
  28. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  29. #[Route('/consulta/solicitud')]
  30. class ConsultaReporteSolicitudController extends AbstractController
  31. {
  32.     public EntityManagerInterface $entityManager;
  33.     /**
  34.      * @param EntityManagerInterface $entityManager
  35.      */
  36.     public function __construct(EntityManagerInterface $entityManager)
  37.     {
  38.         $this->entityManager $entityManager;
  39.     }
  40.     #[Route('/'name'consulta_solicitud_index')]
  41.     public function index(Request $request): Response
  42.     {
  43.         date_default_timezone_set('America/Mexico_City');
  44.         setlocale(LC_ALL'es_MX');
  45.         /** @var Usuario $user */
  46.         $user $this->getUser();
  47.         $perfil $request->getSession()->get('perfil');
  48.         $nivel $perfil[12]["nivel"];
  49.         if ($nivel == 0) {
  50.             $this->addFlash('danger''El acceso al módulo de "Consulta y Reportes de Solicitudes" está restringido.');
  51.             return $this->redirectToRoute('homepage');
  52.         }
  53.         /*$periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);*/
  54.         if ($nivel == 1) {
  55.             $form $this->createFormBuilder()
  56.                 ->add('finicio'DateType::class, [
  57.                     'label' => 'Desde',
  58.                     'attr' => ['class' => 'form-control''class' => 'js-datepicker'],
  59.                     'widget' => 'single_text',
  60.                     'format' => 'yyyy-MM-dd',
  61.                     'data' => new \DateTime(date('Y') . '-01-01'),
  62.                 ])
  63.                 ->add('ftermino'DateType::class, [
  64.                     'label' => 'Hasta',
  65.                     'attr' => ['class' => 'form-control'],
  66.                     'widget' => 'single_text',
  67.                     'format' => 'yyyy-MM-dd',
  68.                     'data'  =>  new \DateTime()
  69.                 ])
  70.                 /*->add('buscar', ButtonType::class, [
  71.                     'attr' => ['class' => 'form-control btn-success', 'id' => 'submit-btn']
  72.                 ])*/
  73.                 ->getForm();
  74.             $form->handleRequest($request);
  75.             $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($user->getIdUsu(), 2);
  76.         }
  77.         if ($nivel == 2){
  78.             $form $this->createFormBuilder()
  79.                 ->add('finicio'DateType::class, [
  80.                     'label' => 'Desde',
  81.                     //'attr' => ['class' => 'form-control'],
  82.                     'required' => true,
  83.                     'widget' => 'single_text',
  84.                     'format' => 'yyyy-MM-dd',
  85.                     'data' => new \DateTime(date('Y') . '-01-01'),
  86.                     'attr' => ['class' => 'js-datepicker'],
  87.                 ])
  88.                 ->add('ftermino'DateType::class, [
  89.                     'label' => 'Hasta',
  90.                     'attr' => ['class' => 'form-control'],
  91.                     'required' => true,
  92.                     'widget' => 'single_text',
  93.                     'format' => 'yyyy-MM-dd',
  94.                     'data' => new \DateTime(),
  95.                     'attr' => ['class' => 'js-datepicker'],
  96.                 ])
  97.                 ->add('unidad'EntityType::class,[
  98.                     'label' => 'Unidad administrativa',
  99.                     'class' => Unidad::class,
  100.                     'attr' => ['class' => 'form-control col-6','js-datepicker'],
  101.                     'placeholder' => 'Todo',
  102.                     'query_builder' => function (EntityRepository $er) {
  103.                         return $er->createQueryBuilder('u')
  104.                             ->orderBy('u.nombre''ASC');
  105.                     }
  106.                 ])
  107.                 /*->add('Consultar', ButtonType::class, [
  108.                     'attr' => ['class' => 'form-control btn-success', 'id' => 'submit-btn']
  109.                 ])*/
  110.                 ->getForm();
  111.             if($user->getRol()->getIdRol() == 3){
  112.                 $form->remove('unidad');
  113.                 $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03$user->getUnidad()->getIdUni());
  114.             }
  115.             if($user->getRol()->getIdRol() == 2){
  116.                 $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03);
  117.             }
  118.             $form->handleRequest($request);
  119.         }
  120.         if ($request->isMethod('POST')) {
  121.             if($user->getRol()->getIdRol() == 4){
  122.                 $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($user->getIdUsu(), 2''$form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
  123.             }
  124.             if($user->getRol()->getIdRol() == 3){
  125.                 if (empty($form['finicio']->getData()) && empty($form['ftermino']->getData())) {
  126.                     $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03$user->getUnidad()->getIdUni());
  127.                 }
  128.                 if (!empty($form['finicio']->getData()) && !empty($form['ftermino']->getData())) {
  129.                     $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03$user->getUnidad()->getIdUni(), $form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
  130.                 }
  131.             }
  132.             if($user->getRol()->getIdRol() == 2){
  133.                 if (empty($form['unidad']->getData()) && empty($form['finicio']->getData()) && empty($form['ftermino']->getData())) {
  134.                     $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03);
  135.                 }
  136.                 if (!empty($form['unidad']->getData()) && empty($form['finicio']->getData()) && empty($form['ftermino']->getData())) {
  137.                     $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03$form->get('unidad')->getData()->getIdUni());
  138.                 }
  139.                 if (!empty($form['unidad']->getData()) && !empty($form['finicio']->getData()) && !empty($form['ftermino']->getData())) {
  140.                     $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03$form->get('unidad')->getData()->getIdUni(), $form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
  141.                 }
  142.                 if (empty($form['unidad']->getData()) && !empty($form['finicio']->getData()) && !empty($form['ftermino']->getData())) {
  143.                     $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(03''$form['finicio']->getData()->format('Y-m-d'), $form['ftermino']->getData()->format('Y-m-d'));
  144.                 }
  145.             }
  146.             $data = [];
  147.             $i 0;
  148.             foreach ($solicitudes as $s){
  149.                 $evaluacionUrl $this->generateUrl('consulta_solicitud_evaluacion', ['idSol' => $s['id_sol']]);
  150.                 $viewUrl $this->generateUrl('consulta_solicitud_vista_solicitud', ['id' => $s['id_sol']]);
  151.                 $data[$i]['id_sol'] = $s['id_sol'];
  152.                 $data[$i]['tipo_equipo'] = $s['tipo_equipo'];
  153.                 $data[$i]['marbete'] = $s['marbete'];
  154.                 $data[$i]['marca'] = $s['marca'];
  155.                 $data[$i]['modelo'] = $s['modelo'];
  156.                 $data[$i]['id_equipo'] = $s['id_equipo'];
  157.                 $data[$i]['ubicacion'] = $s['ubicacion'];
  158.                 $data[$i]['usuario'] = $s['usuario'];
  159.                 $data[$i]['gestor'] = $s['gestor'];
  160.                 $data[$i]['periodo'] = $s['periodo'];
  161.                 $data[$i]['tipo_mantenimiento'] = $s['tipo_mantenimiento'];
  162.                 $data[$i]['falla'] = $s['falla'];
  163.                 $data[$i]['srealizado'] = $s['srealizado'];
  164.                 $data[$i]['fregistro'] = $s['fregistro'];
  165.                 $data[$i]['fatencion'] = $s['fatencion'];
  166.                 $data[$i]['ffin'] = $s['ffin'];
  167.                 $data[$i]['fevaluacion'] = $s['fevaluacion'];
  168.                 $data[$i]['refacciones'] = $s['refacciones'];
  169.                 $data[$i]['estatus'] = $s['estatus'];
  170.                 $data[$i]['unidad'] = $s['unidad'];
  171.                 $data[$i]['ver'] = $viewUrl;
  172.                 $data[$i]['evaluacion'] = $evaluacionUrl;
  173.                 $i++;
  174.             }
  175.             return new JsonResponse($dataResponse::HTTP_OK);
  176.         }
  177.         return $this->render('consulta_solicitud/index.html.twig', [
  178.             'form' => $form->createView(),
  179.             'solicitudes' => $solicitudes
  180.         ]);
  181.     }
  182.     /**
  183.      * Vista detallada de solicitud
  184.      * @Route("/vista/solicitud/{id}", name="consulta_solicitud_vista_solicitud", methods={"GET", "POST"})
  185.      * @param Request $request
  186.      * @return Response
  187.      */
  188.     public function vistaSolicitud(Request $request) :Response
  189.     {
  190.         $solicitud $this->entityManager->getRepository(Solicitud::class)->detalleTipoEquipoSolicitud($request->get('id'));
  191.         return $this->render('prog_solicitud/informacion_solicitud.html.twig', ['info' => $solicitud]);
  192.     }
  193.     #[Route('/vista/contador'name'consulta_solicitud_vista')]
  194.     public function vistaContador() :JsonResponse
  195.     {
  196.         /** @var Usuario $user */
  197.         $user $this->getUser();
  198.         if($user->getRol()->getIdRol() == 4) {
  199.             $cTodoEquipo $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario($user->getIdUsu(), 2);
  200.         }
  201.         if($user->getRol()->getIdRol() == 3) {
  202.             $cTodoEquipo $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario(03$user->getUnidad()->getIdUni());
  203.         }
  204.         if($user->getRol()->getIdRol() == 2) {
  205.             $cTodoEquipo $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario(04);
  206.         }
  207.         return new JsonResponse(['data' => $cTodoEquipo], Response::HTTP_OK);
  208.     }
  209.     /**
  210.      * Evaluación de mantenimiento por solicitud
  211.      * @Route("/evaluacion/{idSol}", name="consulta_solicitud_evaluacion", methods={"GET", "POST"})
  212.      * @param Solicitud $solicitud
  213.      * @param Request $request
  214.      * @return Response|JsonResponse
  215.      */
  216.     public function evaluacionMantenimiento(Request $requestSolicitud $solicitud) :Response
  217.     {
  218.         date_default_timezone_set("America/Mexico_City");
  219.         $contestada $this->entityManager->getRepository(Evaluacion::class)->findOneBy(['solicitud' => $solicitud->getIdSol()]);
  220.         $nueva 0;
  221.         $info = [
  222.             'solicitud' => $solicitud->getIdSol(),
  223.             'tipoMantenimiento' => $solicitud->getTipoMantenimiento(),
  224.         ];
  225.         if (empty($contestada) && $solicitud->getEstatus() == 3) {
  226.             $nueva 1;
  227.             $time = new DateTime();
  228.             $form $this->createForm(EvaluacionType::class);
  229.             $form->handleRequest($request);
  230.             if ($form->isSubmitted() && $form->isValid()) {
  231.                 $evaluacion = new Evaluacion();
  232.                 $evaluacion->setEvalua1($form->get('evalua1')->getData());
  233.                 $evaluacion->setEvalua2($form->get('evalua2')->getData());
  234.                 $evaluacion->setEvalua3($form->get('evalua3')->getData());
  235.                 $evaluacion->setEvalua4($form->get('evalua4')->getData());
  236.                 $evaluacion->setEvalua5($form->get('evalua5')->getData());
  237.                 $evaluacion->setSolicitud($solicitud);
  238.                 $this->entityManager->persist($evaluacion);
  239.                 $this->entityManager->flush();
  240.                 $solicitud->setEstatus(4);
  241.                 $solicitud->setFevaluacion($time);
  242.                 $this->entityManager->persist($solicitud);
  243.                 $this->entityManager->flush();
  244.                 if ($solicitud->getEstatus() == 4){
  245.                     $estatus="<span class='badge bg-gradient-green d-block'>Evaluado</span>";
  246.                 }
  247.                 return new JsonResponse([
  248.                     'id' => $solicitud->getIdSol(),
  249.                     'estatus' => $estatus
  250.                 ]);
  251.             }
  252.         } else {
  253.             $form $this->createForm(EvaluacionType::class, $contestada);
  254.             $form->handleRequest($request);
  255.         }
  256.         if ($form->isSubmitted() && !$form->isValid()) {
  257.             $view $this->renderView('prog_correctivo/evaluacion.html.twig', [
  258.                 'form' => $form->createView(),
  259.                 'info' => $info,
  260.                 'nueva' => $nueva
  261.             ]);
  262.             $response = new JsonResponse(['form' => $view]);
  263.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  264.             return $response;
  265.         }
  266.         return $this->renderForm('prog_correctivo/evaluacion.html.twig', [
  267.             'form' => $form,
  268.             'info' => $info,
  269.             'nueva' => $nueva
  270.         ]);
  271.     }
  272.     /**
  273.      * @Route("/reporte/excel/{id}/{finicio}/{ftermino}", name= "consulta_solicitud_reporte_excel")
  274.      * @param Request $request
  275.      * @return BinaryFileResponse
  276.      * @throws IOException
  277.      * @throws InvalidArgumentException
  278.      * @throws WriterNotOpenedException
  279.      */
  280.     public function generarExcelReporteAction(Request $request): BinaryFileResponse
  281.     {
  282.         date_default_timezone_set('America/Mexico_City');
  283.         setlocale(LC_ALL'es_MX');
  284.         ini_set('memory_limit''5120M');
  285.         ini_set('max_execution_time'0);
  286.         ini_set('output_buffering'0);
  287.         # Obtenemos los datos del documento
  288.         /** @var Usuario $user */
  289.         $user $this->getUser();
  290.         if ($user->getRol()->getIdRol() == 3){
  291.             if($request->get('id') != "undefined"){
  292.                 $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(04$request->get('id'), $request->get('finicio'), $request->get('ftermino'));
  293.             }
  294.         }
  295.         if ($user->getRol()->getIdRol() == 4){
  296.             if($request->get('id') != "undefined"){
  297.                 $solicitudes $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($request->get('id'), 5''$request->get('finicio'), $request->get('ftermino'));
  298.             }
  299.         }
  300.         # Definir el nombre temporal del archivo
  301.         $filePath 'solicitudes.xlsx';
  302.         # Se definen las cabeceras del archivo
  303.         $cabecera WriterEntityFactory::createRowFromArray([
  304.             'Nombre(s)',
  305.             'Apellido(s)',
  306.             'Correo',
  307.             'Marbete',
  308.             'Descripción',
  309.             'Acción a Realizar',
  310.             'No. Solicitud',
  311.             'Tipo de Equipo',
  312.             'Ubicación',
  313.             'Gestor',
  314.             'Periodo',
  315.             'Tipo de Mantenimiento',
  316.             'Incidente',
  317.             'Servicio Realizado',
  318.             'Fecha de Registro',
  319.             'Fecha de Atención',
  320.             'Fecha de Termino',
  321.             'Fecha de Evaluación',
  322.             'Refacciones',
  323.             'Estatus',
  324.             'Unidad',
  325.             '1. La falla reportada, Ya se había presentado en el reporte inmediato anterior',
  326.             '2. ¿Cómo calificas el tiempo de respuesta a tu reporte?',
  327.             '3. ¿La solución a tu problema, ¿satisface tus necesidades laborales?',
  328.             '4. ¿En general, cómo calificarías el servicio recibido?',
  329.             '5. Si pudieras, ¿qué mejorarías acerca del Servicio de Mantenimiento recibido?'
  330.         ]);
  331.         # Se crea el arreglo con los datos del cuerpo del documento
  332.         $data = [];
  333.         $n 1;
  334.         dump($solicitudes);
  335.         foreach ($solicitudes as $s) {
  336.             $estatus $s['estatus'];
  337.             $r1 '';
  338.             $r2 '';
  339.             $r3 '';
  340.             $r4 '';
  341.             $r5 '';
  342.             if ($estatus == 1)
  343.             {
  344.                 $estatus "Pendiente";
  345.             } elseif ($estatus == 2)
  346.             {
  347.                 $estatus "En proceso";
  348.             } elseif ($estatus == 3)
  349.             {
  350.                 $estatus "Atendido";
  351.             } elseif ($estatus == 4)
  352.             {
  353.                 $estatus "Evaluado";
  354.                 $evaluacion $this->entityManager->getRepository(Solicitud::class)->respuestasSolicitudEvaluacion($s['id_sol']);
  355.                 if(!empty($evaluacion)){
  356.                     $r1 $evaluacion['evalua1'];
  357.                     ($r1 == 1) ? $r1 "Si" $r1 "No";
  358.                     $r2 $evaluacion['evalua2'];
  359.                     if ($r2 == 5)
  360.                     {
  361.                         $r2 "Muy bueno";
  362.                     } elseif ($r2 == 4)
  363.                     {
  364.                         $r2 "Bueno";
  365.                     } elseif ($r2 == 3)
  366.                     {
  367.                         $r2 "Regular";
  368.                     } elseif ($r2 == 2)
  369.                     {
  370.                         $r2 "Aceptable";
  371.                     } elseif ($r2 == 1)
  372.                     {
  373.                         $r2 "Deficiente";
  374.                     }
  375.                     $r3 $evaluacion['evalua3'];
  376.                     if ($r3 == 5)
  377.                     {
  378.                         $r3 "Muy bueno";
  379.                     } elseif ($r3 == 4)
  380.                     {
  381.                         $r3 "Bueno";
  382.                     } elseif ($r3 == 3)
  383.                     {
  384.                         $r3 "Regular";
  385.                     } elseif ($r3 == 2)
  386.                     {
  387.                         $r3 "Aceptable";
  388.                     } elseif ($r3 == 1)
  389.                     {
  390.                         $r3 "Deficiente";
  391.                     }
  392.                     $r4 $evaluacion['evalua4'];
  393.                     if ($r4 == 5)
  394.                     {
  395.                         $r4 "Muy bueno";
  396.                     } elseif ($r4 == 4)
  397.                     {
  398.                         $r4 "Bueno";
  399.                     } elseif ($r4 == 3)
  400.                     {
  401.                         $r4 "Regular";
  402.                     } elseif ($r4 == 2)
  403.                     {
  404.                         $r4 "Aceptable";
  405.                     } elseif ($r4 == 1)
  406.                     {
  407.                         $r4 "Deficiente";
  408.                     }
  409.                     $r5 $evaluacion['evalua5'];
  410.                 }
  411.             }
  412.             $p $s['refacciones'];
  413.             ($p == '' || $p == null) ? $p 'No' $p 'Si';
  414.             $data[] = WriterEntityFactory::createRowFromArray([
  415.                 $s['unombre'],
  416.                 $s['uapellido'],
  417.                 $s['ucorreo'],
  418.                 $s['marbete'],
  419.                 'Marca: ' $s['marca'] . ' Modelo: ' $s['modelo'],
  420.                 $s['falla'],
  421.                 $s['id_sol'],
  422.                 $s['tipo_equipo'],
  423.                 $s['nubicacion'],
  424.                 $s['gnombre'] . ' ' $s['gapellido'] . ' ' $s['gcorreo'],
  425.                 $s['periodo'],
  426.                 $s['tipo_mantenimiento'],
  427.                 $s['falla'],
  428.                 $s['srealizado'],
  429.                 $s['fregistro'],
  430.                 $s['fatencion'],
  431.                 $s['ffin'],
  432.                 $s['fevaluacion'],
  433.                 $p,
  434.                 $estatus,
  435.                 $s['nunidad'],
  436.                 $r1,
  437.                 $r2,
  438.                 $r3,
  439.                 $r4,
  440.                 $r5
  441.             ]);
  442.             $n++;
  443.         }
  444.         # Se crea el documento en formato CSV
  445.         $writer WriterEntityFactory::createXLSXWriter();
  446.         $writer
  447.             ->openToFile($filePath)
  448.             ->addRow($cabecera)
  449.             ->addRows($data)
  450.             ->close()
  451.         ;
  452.         $response = new BinaryFileResponse($filePath);
  453.         $response->setContentDisposition(
  454.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  455.             'ReporteSolicitudes' '_' date('Y-m-d His') . '.xlsx'
  456.         );
  457.         $response->deleteFileAfterSend(true);
  458.         return $response;
  459.     }
  460.     //Para subir formulario
  461. }