src/Controller/EquipoController.php line 257

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