src/Controller/EquipoController.php line 46

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\BitacoraMovimientos;
  4. use App\Entity\CatComponentes;
  5. use App\Entity\CatTiposMovimientos;
  6. use App\Entity\CMarcas;
  7. use App\Entity\Equipo;
  8. use App\Entity\Unidad;
  9. use App\Entity\Usuario;
  10. use App\Form\EquipoType;
  11. use App\Form\UnidadFiltroType;
  12. use App\Repository\EquipoRepository;
  13. use App\Repository\BitacoraMovimientosRepository;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\HttpFoundation\StreamedResponse;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use DateTime;
  23. use Dompdf\Dompdf;
  24. use Dompdf\Options;
  25. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  26. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  27. use App\Entity\Inventario;
  28. use App\Entity\Solicitud;
  29. /*
  30. ------------- COMPORTAMIENTOS -------------
  31. 0 = Sin acceso
  32. 1 = Administración de equipo del plantel
  33. 2 = Administración de equipo universal
  34. 3 = Visualización universal
  35. */
  36. #[Route('/equipo')]
  37. class EquipoController extends AbstractController
  38. {
  39.     #[Route('/'name'app_equipo_index'methods: ['GET''POST'])]
  40.     public function index(Request $requestEquipoRepository $equipoRepository): RedirectResponse|JsonResponse|Response
  41.     {
  42.         # Se obtiene el nivel de acceso
  43.         $perfil $request->getSession()->get('perfil');
  44.         $nivel $perfil[4]["nivel"];
  45.         
  46.         # Si el nivel de acceso es 0 = "Sin acceso" entonces se retorna a página de inicio
  47.         if ($nivel == 0) {
  48.             $this->addFlash('danger''El acceso a agregar "Equipos de cómputo" está restringido.');
  49.             return $this->redirectToRoute('homepage');
  50.         }
  51.         
  52.         # Usuario que está autenticado
  53.         /** @var Usuario $user */
  54.         $user $this->getUser();
  55.         
  56.         $rol $user->getRol() ? $user->getRol()->getIdRol() : null;
  57.         # Verifica el estado de la unidad del usuario
  58.         $unidad $user->getUnidad();
  59.         
  60.         /*if ($unidad && !$unidad->getActiva()) {
  61.             // Agrega una notificación persistente
  62.             $this->addFlash('warning', 'La unidad a la que está asociado está inactiva. Solicite al administrador la activación de la unidad.');
  63.             //return $this->redirectToRoute('homepage');
  64.             }*/
  65.             $unidadActiva true;  // Asume que la unidad está activa
  66.         if ($unidad && !$unidad->getActiva()) {
  67.             $unidadActiva false;  // Cambia el estado si la unidad no está activa
  68.             //$this->addFlash('warning', 'En este momento no tiene privilegios para editar sus inventarios, si lo requiere, por favor solicítelo al Administrador.');
  69.         }
  70.         # Formulario de filtro por unidad
  71.         $uni in_array($nivel, [123456]);
  72.         $form $this->createForm(UnidadFiltroType::class, null, ['unidad' => $uni'tipo' => 'equipo']);
  73.         $form->handleRequest($request);
  74.         if ($request->isMethod('POST')) {
  75.             $criteria = [];
  76.             # Verifica y añade los criterios de búsqueda
  77.             if ($form['unidad']->getData()) {
  78.                 $criteria['unidad'] = $form['unidad']->getData()->getIdUni();
  79.             }
  80.             if ($form['marca']->getData()) {
  81.                 $criteria['idMarca'] = $form['marca']->getData()->getIdMarca();
  82.             }
  83.             if ($form['modelo']->getData()) {
  84.                 $criteria['modelo'] = $form['modelo']->getData()->getModelo();
  85.             }
  86.             if ($form['uso']->getData()) {
  87.                 $criteria['uso'] = $form['uso']->getData();
  88.             }
  89.             if ($form['estatus']->getData()) {
  90.                 $criteria['estatus'] = $form['estatus']->getData();
  91.             }
  92.             # Obtiene los equipos según los criterios
  93.             $equipos = empty($criteria) ? $equipoRepository->findAll() : $equipoRepository->findBy($criteria);
  94.             # Procesa los datos para JSON
  95.             $data = [];
  96.             foreach ($equipos as $equipo) {
  97.                 $estatus = match ($equipo->getEstatus()) {
  98.                     '1' => '<span class="badge bg-gradient-green d-block">En operación</span>',
  99.                     '2' => '<span class="badge bg-gradient-orange d-block">Descompuesto</span>',
  100.                     '3' => '<span class="badge bg-gradient-primary d-block">Sin instalar</span>',
  101.                     '4' => '<span class="badge bg-gradient-yellow d-block">En proceso de baja</span>',
  102.                     '5' => '<span class="badge bg-gradient-danger d-block">Baja</span>',
  103.                     default => ""
  104.                 };
  105.                 $uso = match ($equipo->getUso()) {
  106.                     '1' => '<span>Educativo</span>',
  107.                     '2' => '<span>Docente</span>',
  108.                     '3' => '<span>Administrativo</span>',
  109.                     default => ""
  110.                 };
  111.                 $ver $this->generateUrl('app_equipo_show', ['idEqu' => $equipo->getIdEqu()]);
  112.                 $editar $this->generateUrl('app_equipo_edit', ['idEqu' => $equipo->getIdEqu()]);
  113.                 $resguardo_editar $this->generateUrl('app_equipo_edit_resguardo', ['idEqu' => $equipo->getIdEqu()]);
  114.                 
  115.                 $u = ($equipo->getUsuario()) ? $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido() : 'Sin usuario';
  116.                 
  117.                 $data[] = [
  118.                     'idEqu' => $equipo->getIdEqu(),
  119.                     'marbete' => $equipo->getMarbete(),
  120.                     'descripcion' => $equipo->getDescripcion(),
  121.                     'hostname' => ($equipo->getHostname()) ? $equipo->getHostname() : 'S/Host',
  122.                     'marca' => $equipo->getIdMarca()->getMarca(),
  123.                     'modelo' => $equipo->getModelo(),
  124.                     'uso' => $uso,
  125.                     'estatus' => $estatus,
  126.                     'emhv' => ($equipo->isEmhv()) ? '<span class="badge bg-gradient-green d-block">Cumple</span>' '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
  127.                     'bandera' => $equipo->isEmhv(),
  128.                     'unidad' => $equipo->getUnidad()->getNombre(),
  129.                     'usuario' => $u,
  130.                     'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 33) . ' - ' $equipo->getUbicacion()->getArea(),
  131.                     'ver' => $ver,
  132.                     'editar' => $editar,
  133.                     'editar_resguardo' => $resguardo_editar
  134.                 ];
  135.             }
  136.             return new JsonResponse($dataResponse::HTTP_OK);
  137.         }
  138.         # Lógica para determinar la lista de equipos basada en el nivel de acceso
  139.         if ($nivel == 1) {
  140.             $equipos $equipoRepository->findBy(['unidad' => $user->getUnidad()]);
  141.         } elseif (in_array($nivel, [23])) {
  142.             $equipos $equipoRepository->findAll();
  143.         } else {
  144.             $equipos = [];
  145.         }        
  146.         
  147.         $equipos = [];
  148.         return $this->render('equipo/index.html.twig', [
  149.             'equipos' => $equipos,
  150.             'form' => $form->createView(),
  151.             'nivel' => $nivel,
  152.             'unidadActiva' => $unidadActiva,
  153.             'rol' => $rol,
  154.         ]);
  155.     }
  156.     #[Route('/new'name'app_equipo_new'methods: ['GET''POST'])]
  157.     public function new(Request $requestEntityManagerInterface $entityManager): Response #Request $request, EquipoRepository $equipoRepository
  158.     {
  159.         # Se obtiene el nivel de acceso
  160.         $perfil $request->getSession()->get('perfil');
  161.         $nivel $perfil[4]["nivel"];
  162.         # Si el nivel de acceso es 0, 2 o 3 entonces se retorna a página de inicio
  163.         if (in_array($nivel, [023])) {
  164.             $this->addFlash('danger''El acceso a agregar "Equipos de cómputo" está restringido.');
  165.             return $this->redirectToRoute('homepage');
  166.         }
  167.         /** @var Usuario $user */
  168.         $user $this->getUser();
  169.         date_default_timezone_set("America/Mexico_City");
  170.         $fecha = new DateTime();
  171.         # Se contruye el formulario
  172.         $equipo = new Equipo();
  173.         $form $this->createForm(EquipoType::class, $equipo, [
  174.             'unidad' => true
  175.             'bloquear_edicion' => false
  176.         ]);
  177.         $form->handleRequest($request); 
  178.         if ($form->isSubmitted() && $form->isValid()) {
  179.             $equipo->setUnidad($user->getUnidad());
  180.             $equipo->setFactualizacion($fecha);
  181.             $equipo->setFalta($fecha);
  182.             # Cálculo del Estandar Mínimo Hardware Vigente
  183.             $equipo->setEmhv(0);
  184.             if (intval($equipo->getRam()) >= 8) {
  185.                 if (intval($equipo->getNucleos()) >= 8) {
  186.                     if (floatval($equipo->getCpuVelocidad()) >= 4.2) {
  187.                         $equipo->setEmhv(1);
  188.                     }
  189.                 }
  190.             }
  191.             $entityManager->persist($equipo);
  192.             $entityManager->flush();
  193.             return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
  194.         }
  195.         return $this->renderForm('equipo/new.html.twig', [
  196.             'equipo' => $equipo,
  197.             'form' => $form
  198.         ]);
  199.     }
  200.     /*#[Route('/show', name: 'app_equipo_show', methods: ['POST'])]
  201.     public function show(Request $request, EquipoRepository $equipoRepository): Response
  202.     {
  203.         $idEqu = $request->request->get('idEqu');
  204.         $equipo = $equipoRepository->findOneBy(['idEqu' => $idEqu]);
  205.         return $this->render('equipo/show.html.twig', [
  206.             'equipo' => $equipo,
  207.         ]);
  208.     }*/
  209.     #[Route('/show'name'app_equipo_show'methods: ['POST'])]
  210.     public function show(Request $requestEquipoRepository $equipoRepositoryBitacoraMovimientosRepository $bitacoraRepository): Response
  211.     {
  212.         $idEqu $request->request->get('idEqu');
  213.         $equipo $equipoRepository->findOneBy(['idEqu' => $idEqu]);
  214.         if (!$equipo) {
  215.             throw $this->createNotFoundException('No se encontró el equipo con el ID: ' $idEqu);
  216.         }
  217.         // Obtener las bitácoras relacionadas con el equipo
  218.         $bitacoras $bitacoraRepository->findBy(['idEqu' => $idEqu]);
  219.         // Ordenar las bitácoras por fecha en orden ascendente
  220.         usort($bitacoras, function ($a$b) {
  221.             return $a->getFechaMov() <=> $b->getFechaMov();
  222.         });
  223.         return $this->render('equipo/show.html.twig', [
  224.             'equipo' => $equipo,
  225.             'bitacoras' => $bitacoras,
  226.         ]);
  227.     }
  228.     #[Route('/{idEqu}/edit'name'app_equipo_edit'methods: ['GET''POST'])]
  229.     public function edit(Request $requestEquipo $equipoEntityManagerInterface $entityManager): Response
  230.     {
  231.         // Datos de la solicitud
  232.         # Se obtiene el nivel de acceso
  233.         $perfil $request->getSession()->get('perfil');
  234.         $nivel $perfil[4]["nivel"];
  235.         # Bloqueo de edición de [Merbete, Descripción, Marca, Modelo, No. serie] exceptuando al comportamiento 2
  236.         $bloquear_edicion true;
  237.         $unidad true;
  238.         ($nivel == 2) && $bloquear_edicion false;
  239.         ($nivel == 2) && $unidad false;
  240.         $uanterior $equipo->getUsuario()->getNombre() .' '$equipo->getUsuario()->getPapellido() .' '$equipo->getUsuario()->getSapellido();
  241.         # Se contruye el formulario
  242.         $form $this->createForm(EquipoType::class, $equipo, ['unidad' => $unidad'bloquear_edicion' => $bloquear_edicion]);
  243.         $form->handleRequest($request);
  244.         
  245.         /** @var Usuario $user */
  246.         $user $this->getUser();
  247.         date_default_timezone_set("America/Mexico_City");
  248.         $fecha = new DateTime();
  249.         if ($form->isSubmitted() && $form->isValid()) {
  250.             $s $entityManager->getRepository(Solicitud::class)->findBy(['idEquipo' => $equipo->getIdEqu(), 'estatus' =>[1,2,3], 'tipoEquipo' => 'Equipo']);
  251.             $usu $form->get('usuario')->getData();
  252.             $ubi $form->get('ubicacion')->getData();
  253.             $equipo->setFactualizacion($fecha);
  254.             $equipo->setUnidad($equipo->getUbicacion()->getUnidad());
  255.             
  256.             if($s != []){
  257.                 $solicitudesArray = [];
  258.                 foreach ($s as $solicitud) {
  259.                     if ($solicitud->getEstatus() == 1){
  260.                         $estatus1 "Pendiente";
  261.                     }elseif ($solicitud->getEstatus() == 2){
  262.                         $estatus1 "Proceso";
  263.                     }elseif ($solicitud->getEstatus() == 3){
  264.                         $estatus1 "Atendido";
  265.                     }elseif ($solicitud->getEstatus() == 4){
  266.                         $estatus1 "Evaluado";
  267.                     }
  268.                     $solicitud->setUsuario($usu);
  269.                     $solicitud->setUbicacion($ubi);
  270.                     $entityManager->persist($solicitud);
  271.                     $e = array(
  272.                         'idSolicitud' => $solicitud-> getIdSol(),
  273.                         'estatus' => $estatus1,
  274.                         'usuAnterior' => $uanterior,
  275.                         'usuNuevo' => $solicitud->getUsuario()->getNombre() .' '$solicitud->getUsuario()->getPapellido() .' '$solicitud->getUsuario()->getSapellido()
  276.                     );
  277.                     $solicitudesArray[] = $e;
  278.                 }
  279.             }else{
  280.                 $solicitudesArray = array(
  281.                     'idSolicitud' => 0
  282.                 );
  283.             }
  284.             
  285.             $entityManager->flush();
  286.             # Cálculo del Estandar Mínimo Hardware Vigente
  287.             $equipo->setEmhv(0);
  288.             if (intval($equipo->getRam()) >= 8) {
  289.                 if (intval($equipo->getNucleos()) >= 8) {
  290.                     if (floatval($equipo->getCpuVelocidad()) >= 4.2) {
  291.                         $equipo->setEmhv(1);
  292.                     }
  293.                 }
  294.             }
  295.             $entityManager->persist($equipo);
  296.             $entityManager->flush();
  297.             //$equipoRepository->add($equipo, true);
  298.             if ($equipo->getEstatus() == 2){
  299.                 $estatus "Descompuesto";
  300.             }elseif ($equipo->getEstatus() == 1){
  301.                 $estatus "En operacion";
  302.             }elseif ($equipo->getEstatus() == 3){
  303.                 $estatus "Sin instalar";
  304.             }elseif ($equipo->getEstatus() == 4){
  305.                 $estatus "En proceso de baja";
  306.             }elseif ($equipo->getEstatus() == 5){
  307.                 $estatus "Baja";
  308.             }
  309.             $data = array(
  310.                 'idEqu' => $equipo->getIdEqu(),
  311.                 'marbete' => $equipo->getMarbete(),
  312.                 'descripcion' => $equipo->getDescripcion(),
  313.                 'hostname' => ($equipo->getHostname()) ? $equipo->getHostname() : 'S/Host',
  314.                 'marca' => $equipo->getIdMarca()->getMarca(),
  315.                 'modelo' => $equipo->getModelo(),
  316.                 'estatus' => $estatus,
  317.                 'emhv' => ($equipo->isEmhv()) ? '<span class="badge bg-gradient-green d-block">Cumple</span>' '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
  318.                 'bandera' => $equipo->isEmhv(),
  319.                 'usuario' => $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido(),
  320.                 'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 33) . ' - ' $equipo->getUbicacion()->getArea(),
  321.                 'mensaje' => 'Se actualizo correctamente',
  322.             );
  323.             //Combina ambos arrays
  324.             $responseData array_merge($data, ['solicitudes'=>$solicitudesArray]);
  325.             // Retorna el array combinado como respuesta JSON
  326.             return new JsonResponse($responseData);
  327.             //return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
  328.         }
  329.         if($form->isSubmitted() && !$form->isValid()){
  330.             $view $this->renderView('equipo/modal.html.twig', [
  331.                 'equipo' => $equipo,
  332.                 'form' => $form->createView(),
  333.             ]);
  334.             $response = new JsonResponse(['form' => $view]);
  335.             $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
  336.             return $response;
  337.         }
  338.         return $this->renderForm('equipo/modal.html.twig', [
  339.             'equipo' => $equipo,
  340.             'form' => $form,
  341.         ]);
  342.     }
  343.     #[Route('/{idEqu}/editrefaccion'name'app_equipo_editrefaccion'methods: ['GET''POST'])]
  344.     public function editRefaccion(Request $requestEquipo $equipoEntityManagerInterface $entityManager): Response
  345.     {
  346.         /** @var Usuario $user */
  347.         $user $this->getUser();
  348.         // Datos de la solicitud
  349.         $perfil $request->getSession()->get('perfil');
  350.         $nivel $perfil[4]["nivel"];
  351.         // Bloqueo de edición de los campos excepto al comportamiento 2
  352.         $bloquear_edicion true;
  353.         $unidad true;
  354.         if ($nivel == 2) {
  355.             $bloquear_edicion false;
  356.             $unidad false;
  357.         }
  358.         // Construir el formulario
  359.         $form $this->createForm(EquipoType::class, $equipo, ['unidad' => $unidad'bloquear_edicion' => $bloquear_edicion]);
  360.         $form->remove('estatus');
  361.         $form->remove('usuario');
  362.         $form->remove('ubicacion');
  363.         $form->remove('gestor');
  364.         $form->remove('funcion');          // Remover el campo funcion
  365.         $form->remove('funcionDescripcion'); // Remover el campo funcionDescripcion
  366.         $form->remove('uso');              // Remover el campo uso
  367.         $form->remove('unidad');           // Remover el campo unidad
  368.         $form->handleRequest($request);
  369.         date_default_timezone_set("America/Mexico_City");
  370.         $fecha = new DateTime();
  371.         if ($form->isSubmitted() && $form->isValid()) {
  372.             if ($request->request->has('componente')){
  373.                 date_default_timezone_set('America/Mexico_City');
  374.                 $condicion implode(','$request->request->get('componente'));
  375.                 $usuario $entityManager->getRepository(Usuario::class)->findOneBy(['idUsu' => $user->getIdUsu()]);
  376.                 $unidad $entityManager->getRepository(Unidad::class)->findOneBy(['idUni' => $user->getUnidad()]);
  377.                 $tMovimiento $entityManager->getRepository(CatTiposMovimientos::class)->findOneBy(['idMov' => 5]);
  378.                 $conn $entityManager->getConnection();
  379.                 $sql "SELECT * 
  380.                     FROM inventario WHERE id_inventario IN (" $condicion ")
  381.                 ";
  382.                 $stmt $conn->prepare($sql);
  383.                 $resultSet $stmt->executeQuery();
  384.                 $componentes $resultSet->fetchAll();
  385.                 $factual = new DateTime();
  386.                 foreach ($componentes as $componente) {
  387.                     $iComponente $entityManager->getRepository(CatComponentes::class)->findOneBy(['idComponente' => $componente['id_componente']]);
  388.                     $c = new BitacoraMovimientos();
  389.                     $c->setTipoMov($tMovimiento);
  390.                     $c->setFechaMov($factual);
  391.                     $c->setIdUsu($usuario);
  392.                     $c->setIdComponente($iComponente);
  393.                     $c->setIdUni($unidad);
  394.                     $c->setTipoEquipo('Equipo');
  395.                     $c->setIdEqu($equipo->getIdEqu());
  396.                     $entityManager->persist($c);
  397.                     $entityManager->flush();
  398.                     // Actualizar el campo en_uso en el registro de inventario
  399.                     $inventario $entityManager->getRepository(Inventario::class)->find($componente['id_inventario']);
  400.                     if ($inventario) {
  401.                         $inventario->setEnUso(0);
  402.                         $entityManager->persist($inventario);
  403.                         $entityManager->flush();
  404.                     }
  405.                 }
  406.             }
  407.             $equipo->setFactualizacion($fecha);
  408.             $equipo->setUnidad($equipo->getUbicacion()->getUnidad());
  409.             // Cálculo del Estándar Mínimo Hardware Vigente
  410.             $equipo->setEmhv(0);
  411.             if (intval($equipo->getRam()) >= && intval($equipo->getNucleos()) >= && floatval($equipo->getCpuVelocidad()) >= 4.2) {
  412.                 $equipo->setEmhv(1);
  413.             }
  414.             $entityManager->persist($equipo);
  415.             $entityManager->flush();
  416.             $estatus = match ($equipo->getEstatus()) {
  417.                 => "Descompuesto",
  418.                 => "En operación",
  419.                 => "Sin instalar",
  420.                 => "En proceso de baja",
  421.                 => "Baja",
  422.                 default => "Desconocido",
  423.             };
  424.             $data = [
  425.                 'idEqu' => $equipo->getIdEqu(),
  426.                 'marbete' => $equipo->getMarbete(),
  427.                 'descripcion' => $equipo->getDescripcion(),
  428.                 'hostname' => ($equipo->getHostname()) ? $equipo->getHostname() : 'S/Host',
  429.                 'marca' => $equipo->getIdMarca()->getMarca(),
  430.                 'modelo' => $equipo->getModelo(),
  431.                 'estatus' => $estatus,
  432.                 'emhv' => $equipo->isEmhv() ? '<span class="badge bg-gradient-green d-block">Cumple</span>' '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
  433.                 'bandera' => $equipo->isEmhv(),
  434.                 'usuario' => $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido(),
  435.                 'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 33) . ' - ' $equipo->getUbicacion()->getArea(),
  436.                 'mensaje' => 'Se actualizó correctamente',
  437.             ];
  438.             return new JsonResponse($data);
  439.         }
  440.         if ($form->isSubmitted() && !$form->isValid()) {
  441.             $view $this->renderView('equipo/modalrefaccion.html.twig', [
  442.                 'equipo' => $equipo,
  443.                 'form' => $form->createView(),
  444.             ]);
  445.             $response = new JsonResponse(['form' => $view]);
  446.             $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
  447.             return $response;
  448.         }
  449.         return $this->renderForm('equipo/modalrefaccion.html.twig', [
  450.             'equipo' => $equipo,
  451.             'form' => $form,
  452.         ]);
  453.     }
  454.     #[Route('/{idEqu}'name'app_equipo_delete'methods: ['POST'])]
  455.     public function delete(Request $requestEquipo $equipoEquipoRepository $equipoRepository): Response
  456.     {
  457.         if ($this->isCsrfTokenValid('delete'.$equipo->getIdEqu(), $request->request->get('_token'))) {
  458.             $equipoRepository->remove($equipotrue);
  459.         }
  460.         return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
  461.     }
  462.     #[Route('/pdf/{idEqu}'name'equipo_pdf')]
  463.     public function generaResguardoPdf(Equipo $equipo): Response
  464.     {
  465.         // Configura Dompdf
  466.         $pdfOptions = new Options();
  467.         $pdfOptions->set('defaultFont''Arial');
  468.         // Inicializa Dompdf
  469.         $dompdf = new Dompdf($pdfOptions);
  470.         // Renderiza la plantilla Twig
  471.         $html $this->renderView('equipo/pdf.html.twig', [
  472.             'equipo' => $equipo
  473.         ]);
  474.         // Carga el HTML en Dompdf
  475.         $dompdf->loadHtml($html);
  476.         // (Opcional) Configura el tamaño de papel y la orientación
  477.         $dompdf->setPaper('A4''portrait');
  478.         // Renderiza el PDF
  479.         $dompdf->render();
  480.         // Obtiene el contenido del PDF generado
  481.         $pdfOutput $dompdf->output();
  482.         // Devuelve una respuesta con el contenido del PDF como un archivo adjunto
  483.         return new Response($pdfOutputResponse::HTTP_OK, [
  484.             'Content-Type' => 'application/pdf',
  485.             'Content-Disposition' => 'attachment; filename="equipo_' $equipo->getIdEqu() . '.pdf"',
  486.         ]);
  487.     }
  488.     /**
  489.      * @Route("/upload-excel", name="xlsx")
  490.      * @param Request $request
  491.      * @throws \Exception
  492.      */
  493.     #[Route('/{idEqu}'name'app_equipo_upload-excel'methods: ['POST'])]
  494.     public function upload(Equipo $equipo): Response
  495.     {
  496.         return $this->render('equipo/show.html.twig', [
  497.             'equipo' => $equipo,
  498.         ]);
  499.     }
  500.     #[Route('/download/excel/{id}'name'app_equipo_download_excel'methods: ['GET'])]
  501.     public function downloadExcel(int $idEquipoRepository $equipoRepositoryBitacoraMovimientosRepository $bitacoraRepository): StreamedResponse
  502.     {
  503.         // Limpiar cualquier salida previa
  504.         ob_end_clean();
  505.         // Obtener el equipo por su ID
  506.         $equipo $equipoRepository->find($id);
  507.         if (!$equipo) {
  508.             throw $this->createNotFoundException('No se encontró el equipo con el ID: ' $id);
  509.         }
  510.         // Obtener las bitácoras relacionadas con el equipo
  511.         $bitacoras $bitacoraRepository->findBy(['idEqu' => $id]);
  512.         // Ordenar las bitácoras por fecha en orden ascendente
  513.         usort($bitacoras, function ($a$b) {
  514.             return $a->getFechaMov() <=> $b->getFechaMov();
  515.         });
  516.         // Obtener la información del usuario
  517.         /** @var Usuario $user */
  518.         $user $this->getUser();
  519.         $nombreUsuario $user->getNombre();
  520.         $unidadAdministrativa $user->getUnidadAdministrativa(); // Ajusta el método según cómo obtengas la unidad administrativa
  521.         $spreadsheet = new Spreadsheet();
  522.         $sheet $spreadsheet->getActiveSheet();
  523.         $sheet->setTitle('Datos del Equipo y Bitacora');
  524.         // Establecer el encabezado principal
  525.         $sheet->setCellValue('A1''Reporte Asignación de Refacciones')
  526.             ->mergeCells('A1:J1')
  527.             ->getStyle('A1:J1')->applyFromArray([
  528.                 'font' => ['bold' => true'size' => 16],
  529.                 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER]
  530.             ]);
  531.         // Información adicional
  532.         $sheet->setCellValue('A2''Unidad Administrativa: ' $unidadAdministrativa)
  533.             ->mergeCells('A2:J2')
  534.             ->getStyle('A2:J2')->applyFromArray([
  535.                 'font' => ['italic' => true],
  536.                 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER]
  537.             ]);
  538.         $sheet->setCellValue('A3''Usuario que Generó el Reporte: ' $nombreUsuario)
  539.             ->mergeCells('A3:J3')
  540.             ->getStyle('A3:J3')->applyFromArray([
  541.                 'font' => ['italic' => true],
  542.                 'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER]
  543.             ]);
  544.         // Establecer los encabezados de columna para datos del equipo
  545.         $sheet->setCellValue('A5''ID')
  546.             ->setCellValue('B5''Marbete')
  547.             ->setCellValue('C5''Descripción')
  548.             ->setCellValue('D5''Marca')
  549.             ->setCellValue('E5''Modelo')
  550.             ->setCellValue('F5''Estatus')
  551.             ->setCellValue('G5''Cumplimiento EMHV')
  552.             ->setCellValue('H5''Usuario Resguardatario')
  553.             ->setCellValue('I5''Ubicación');
  554.         // Llenar la hoja con los datos del equipo
  555.         $estatus = match ($equipo->getEstatus()) {
  556.             '0' => 'Descompuesto',
  557.             '1' => 'En operación',
  558.             '2' => 'Sin instalar',
  559.             '3' => 'En proceso de baja',
  560.             '4' => 'Baja',
  561.             default => ''
  562.         };
  563.         $emhv $equipo->isEmhv() ? 'Cumple' 'No Cumple';
  564.         $usuario $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido();
  565.         $ubicacion substr($equipo->getUnidad()->getIdUni(), 33) . ' - ' $equipo->getUbicacion()->getArea();
  566.         $sheet->setCellValue('A6'$equipo->getIdEqu())
  567.             ->setCellValue('B6'$equipo->getMarbete())
  568.             ->setCellValue('C6'$equipo->getDescripcion())
  569.             ->setCellValue('D6'$equipo->getIdMarca()->getMarca())
  570.             ->setCellValue('E6'$equipo->getModelo())
  571.             ->setCellValue('F6'$estatus)
  572.             ->setCellValue('G6'$emhv)
  573.             ->setCellValue('H6'$usuario)
  574.             ->setCellValue('I6'$ubicacion);
  575.         // Encabezado para datos de bitacora
  576.         $sheet->setCellValue('A8''ID Mov')
  577.             ->setCellValue('B8''Fecha Movimiento')
  578.             ->setCellValue('C8''Tipo Equipo')
  579.             ->setCellValue('D8''Componente')
  580.             ->setCellValue('E8''Observación')
  581.             ->setCellValue('F8''Núcleos')
  582.             ->setCellValue('G8''Velocidad')
  583.             ->setCellValue('H8''Capacidad Memoria')
  584.             ->setCellValue('I8''Unidad')
  585.             ->setCellValue('J8''Usuario Gestor');
  586.         // Llenar la hoja con los datos de bitacoras
  587.         $row 9;
  588.         foreach ($bitacoras as $bitacora) {
  589.             $sheet->setCellValue('A' $row$bitacora->getIdMov())
  590.                 ->setCellValue('B' $row$bitacora->getFechaMov()->format('Y-m-d H:i:s'))
  591.                 ->setCellValue('C' $row$bitacora->getTipoEquipo())
  592.                 ->setCellValue('D' $row$bitacora->getIdComponente() ? $bitacora->getIdComponente()->getTipo() : 'N/A'// Reemplaza getNombre por getTipo
  593.                 ->setCellValue('E' $row$bitacora->getObservacion())
  594.                 ->setCellValue('F' $row$bitacora->getNucleos())
  595.                 ->setCellValue('G' $row$bitacora->getVelocidad())
  596.                 ->setCellValue('H' $row$bitacora->getCapacidadMemoria())
  597.                 ->setCellValue('I' $row$bitacora->getIdUni() ? $bitacora->getIdUni()->getNombre() : 'N/A')
  598.                 ->setCellValue('J' $row$bitacora->getIdUsu() ? $bitacora->getIdUsu()->getNombre() : 'N/A');
  599.             $row++;
  600.         }
  601.         // Crear la respuesta
  602.         $response = new StreamedResponse(function() use ($spreadsheet) {
  603.             $writer = new Xlsx($spreadsheet);
  604.             $writer->save('php://output');
  605.         });
  606.         // Configurar los encabezados de la respuesta
  607.         $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  608.         $response->headers->set('Content-Disposition''attachment;filename="datos_equipo_y_bitacora_' $id '.xlsx"');
  609.         $response->headers->set('Cache-Control''max-age=0');
  610.         return $response;
  611.     }
  612.     #[Route('/{idEqu}/edit_resguardo'name'app_equipo_edit_resguardo'methods: ['GET''POST'])]
  613.     public function edit_resguardo(Request $requestEquipo $equipoEntityManagerInterface $entityManager): Response
  614.     {
  615.         // Datos de la solicitud
  616.         # Se obtiene el nivel de acceso
  617.         $perfil $request->getSession()->get('perfil');
  618.         $nivel $perfil[4]["nivel"];
  619.         # Bloqueo de edición de [Merbete, Descripción, Marca, Modelo, No. serie] exceptuando al comportamiento 2
  620.         $bloquear_edicion true;
  621.         $unidad true;
  622.         ($nivel == 2) && $bloquear_edicion false;
  623.         ($nivel == 2) && $unidad false;
  624.         # Se contruye el formulario
  625.         $form $this->createForm(EquipoType::class, $equipo, ['unidad' => $unidad'bloquear_edicion' => $bloquear_edicion]);
  626.         $form->handleRequest($request);
  627.         /** @var Usuario $user */
  628.         $user $this->getUser();
  629.         date_default_timezone_set("America/Mexico_City");
  630.         $fecha = new DateTime();
  631.         if ($form->isSubmitted() && $form->isValid()) {
  632.             $equipo->setFactualizacion($fecha);
  633.             $equipo->setUnidad($equipo->getUbicacion()->getUnidad());
  634.             # Cálculo del Estandar Mínimo Hardware Vigente
  635.             $equipo->setEmhv(0);
  636.             if (intval($equipo->getRam()) >= 8) {
  637.                 if (intval($equipo->getNucleos()) >= 8) {
  638.                     if (floatval($equipo->getCpuVelocidad()) >= 4.2) {
  639.                         $equipo->setEmhv(1);
  640.                     }
  641.                 }
  642.             }
  643.             $entityManager->persist($equipo);
  644.             $entityManager->flush();
  645.             //$equipoRepository->add($equipo, true);
  646.             if ($equipo->getEstatus() == 2){
  647.                 $estatus "Descompuesto";
  648.             }elseif ($equipo->getEstatus() == 1){
  649.                 $estatus "En operacion";
  650.             }elseif ($equipo->getEstatus() == 3){
  651.                 $estatus "Sin instalar";
  652.             }elseif ($equipo->getEstatus() == 4){
  653.                 $estatus "En proceso de baja";
  654.             }elseif ($equipo->getEstatus() == 5){
  655.                 $estatus "Baja";
  656.             }
  657.             $data = array(
  658.                 'idEqu' => $equipo->getIdEqu(),
  659.                 'marbete' => $equipo->getMarbete(),
  660.                 'descripcion' => $equipo->getDescripcion(),
  661.                 'hostname' => ($equipo->getHostname()) ? $equipo->getHostname() : 'S/Host',
  662.                 'marca' => $equipo->getIdMarca(),
  663.                 'modelo' => $equipo->getModelo(),
  664.                 'estatus' => $estatus,
  665.                 'emhv' => ($equipo->isEmhv()) ? '<span class="badge bg-gradient-green d-block">Cumple</span>' '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
  666.                 'bandera' => $equipo->isEmhv(),
  667.                 'usuario' => $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido(),
  668.                 'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 33) . ' - ' $equipo->getUbicacion()->getArea(),
  669.                 'mensaje' => 'Se actualizo correctamente',
  670.             );
  671.             return new JsonResponse($data);
  672.             //return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
  673.         }
  674.         if($form->isSubmitted() && !$form->isValid()){
  675.             $view $this->renderView('equipo/modalresguardo.html.twig', [
  676.                 'equipo' => $equipo,
  677.                 'form' => $form->createView(),
  678.             ]);
  679.             $response = new JsonResponse(['form' => $view]);
  680.             $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
  681.             return $response;
  682.         }
  683.         return $this->renderForm('equipo/modalresguardo.html.twig', [
  684.             'equipo' => $equipo,
  685.             'form' => $form,
  686.         ]);
  687.     }
  688.     //Para subir controllers
  689. }