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