src/Controller/ReporteController.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Repository\InventarioRepository;
  4. use App\Repository\UnidadRepository;
  5. use App\Entity\CatComponentes;
  6. use App\Service\ArchivoPDF;
  7. use DateInterval;
  8. use App\Entity\Unidad;
  9. use App\Entity\Usuario;
  10. use App\Service\DocumentoPDF;
  11. use App\Service\SelloDigital;
  12. use App\Service\DocumentoPDF1;
  13. use App\Repository\RedRepository;
  14. use App\Repository\OtroRepository;
  15. use Doctrine\ORM\EntityRepository;
  16. use App\Repository\EquipoRepository;
  17. use App\Repository\ImpresoraRepository;
  18. use App\Repository\SolicitudRepository;
  19. use App\Repository\UbicacionRepository;
  20. use App\Repository\UsuarioRepository;
  21. use Doctrine\ORM\EntityManagerInterface;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\Routing\Annotation\Route;
  25. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  26. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  27. use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
  28. use DateTime;
  29. use Symfony\Component\Form\Extension\Core\Type\DateType;
  30. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  31. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  32. #[Route('/reporte')]
  33. class ReporteController extends AbstractController
  34. {
  35.     #[Route('/refaccion-asignacion-pdf'name'app_refaccion_asignacion_pdf'methods: ['POST'])]
  36.     public function refaccionAsignacionPDF(InventarioRepository $inventarioRepositoryUnidadRepository $unidadRepositoryRequest $requestSelloDigital $sello): Response
  37.     {
  38.         ini_set('memory_limit''5120M');
  39.         ini_set('max_execution_time'0);
  40.         ini_set('output_buffering'0);
  41.         date_default_timezone_set('America/Mexico_City');
  42.         setlocale(LC_ALL'es_MX');
  43.         $refaccionId $request->request->get('refaccionId'); // Obtener el ID de la refacción desde la solicitud
  44.         // Obtener datos de la refacción específica
  45.         $inventario $inventarioRepository->find($refaccionId);
  46.         if (!$inventario) {
  47.             throw $this->createNotFoundException('Refacción no encontrada.');
  48.         }
  49.         // Obtener la unidad de origen utilizando el idUni
  50.         $unidadOrigen $unidadRepository->find($inventario->getUnidadOrigen());
  51.         $nombreUnidadOrigen $unidadOrigen $unidadOrigen->getNombre() : 'Unidad no encontrada';
  52.         $procedencia $unidadRepository->find($inventario->getProcedencia());
  53.         $nombreUnidadProcedencia $procedencia $procedencia->getNombre() : 'Unidad no encontrada';
  54.         $tiposComponente = [
  55.             => 'CPU',
  56.             => 'Placa base',
  57.             => 'RAM',
  58.             => 'HDD',
  59.             => 'SSD',
  60.             => 'NVMe',
  61.             => 'GPU',
  62.             => 'Tarjeta de sonido',
  63.             => 'Tarjeta de red',
  64.             10 => 'PSU',
  65.             11 => 'Teclado',
  66.             12 => 'Ratón',
  67.             13 => 'Monitor',
  68.             14 => 'Puertos USB',
  69.             15 => 'Webcams',
  70.             16 => 'Adaptadores Wi-Fi',
  71.         ];
  72.         $tipoComponente $tiposComponente[$inventario->getIdComponente()] ?? 'Tipo no encontrado';
  73.         $fecha date('d-m-Y');
  74.         // Declaración de la instancia de TCPDF
  75.         $pdf = new DocumentoPDF1();
  76.         $pdf->setPrintFooter(false);
  77.         $pdf->SetCreator('Conalep Estado de México');
  78.         $pdf->SetAuthor('SIGMEC');
  79.         $pdf->SetTitle('Reporte');
  80.         $pdf->SetAutoPageBreak(TRUEPDF_MARGIN_BOTTOM);
  81.         $pdf->AddPage('P''JIS_B4');
  82.         $pdf->SetY(70);
  83.         $pdf->setFontSubsetting(true);
  84.         // Renderizado del contenido del PDF con los datos de la refacción
  85.         $html = <<<EOD
  86. <style>
  87.     .header { text-align: center; }
  88.     .content { font-size: 12px; }
  89.     .footer { text-align: center; font-size: 10px; margin-top: 10px; text-align: left; }
  90.     .table-header { background-color: #f0f0f0; }
  91.     .table-body { text-align: center; font-size: 8px; }
  92. </style>
  93. <div class="content">
  94.     <p style="text-align: right;">Cuautitlán Izcalli, México; {$fecha}</p>
  95.     <p style="text-align: right;">Unidad de Innovación y Tecnologías de la Información</p>
  96.     <p style="text-align: right;"><strong>Asunto: Transferencia de refacciones</strong></p>
  97.     <p style="text-align: right;"><strong>Asunto: Asignación de equipo de cómputo</strong></p>
  98.     <p><strong>{$this->getUser()->getNombreCompleto()}</strong></p>
  99.     <p><strong>{$this->getUser()->getArea()}</strong></p>
  100.     <p><strong>P R E S E N T E</strong></p>
  101.     <p>Por medio del presente se le hace entrega de la siguiente refacción:</p>
  102.     <table width="100%" cellpadding="2" border="0.1">
  103.     <thead class="table-header">
  104.         <tr>
  105.             <th>Tipo</th>
  106.             <th>Marca</th>
  107.             <th>Modelo</th>
  108.             <th>Serie</th>
  109.             <th>Descripción</th>
  110.             <th>Procedencia</th>
  111.             <th>Unidad de Origen</th>
  112.         </tr>
  113.     </thead>
  114.     <tbody class="table-body">
  115.         <tr>
  116.             <td>{$tipoComponente}</td>
  117.             <td>{$inventario->getMarca()}</td>
  118.             <td>{$inventario->getModelo()}</td>
  119.             <td>{$inventario->getSerie()}</td>
  120.             <td>{$inventario->getDescripcion()}</td>
  121.             <td>{$nombreUnidadProcedencia}</td>
  122.             <td>{$nombreUnidadOrigen}</td>
  123.         </tr>
  124.     </tbody>
  125.     </table>
  126.     <p>Entrega ___________________</p>
  127.     <p>Recibe   ___________________</p>
  128.     <p>Sin más por el momento aprovecho la oportunidad para enviarle un cordial saludo.</p>
  129.     <div class="footer">
  130.         <p><strong>A T E N T A M E N T E</strong></p>
  131.         <p>GREGORIO JUAN BERNAL SOLÍS<br>
  132.            JEFE DE PROYECTO DE LA UNIDAD DE<br>
  133.            INNOVACIÓN Y TECNOLOGÍAS DE LA INFORMACIÓN</p>
  134.         <p>c.c.p – Beatriz Marlet Torres Perea</p>
  135.         <p>G.J.B.S.</p>
  136.     </div>
  137. </div>
  138. EOD;
  139.         $pdf->writeHTML($htmltrue0true0);
  140.         // Enviar el PDF como respuesta para descarga
  141.         $pdf->Output('reporte.pdf''D');
  142.         return new Response(); // Este return evita un error, el PDF se envía directamente al navegador
  143.     }
  144.     #[Route('/equipo-resguardo-pdf'name'app_resguardo_equipo_pdf'methods: ['POST'])]
  145.     public function equipoResguardoPDF(EquipoRepository $equipoRepositoryUsuarioRepository $usuarioRepositoryRequest $requestSelloDigital $sello)
  146.     {
  147.         ini_set('memory_limit''5120M');
  148.         ini_set('max_execution_time'0);
  149.         ini_set('output_buffering'0);
  150.         date_default_timezone_set('America/Mexico_City');
  151.         setlocale(LC_ALL'es_MX');
  152.         setlocale(LC_TIME'es_ES.UTF-8');
  153.         // Obtener el ID del equipo del request
  154.         $idEqu $request->request->get('idEqu');
  155.         // Obtener los datos del equipo desde la base de datos
  156.         $equipo $equipoRepository->find($idEqu);
  157.         if (!$equipo) {
  158.             throw $this->createNotFoundException('El equipo no se encontró.');
  159.         }
  160.         /** @var Usuario $user */
  161.         $user $this->getUser();
  162.         //$equipo->getUsuario()->getNombre()
  163.         $user_equipo $equipo->getUsuario();
  164.         $user_gestor $usuarioRepository->findGestorByUnidad($user_equipo->getUnidad()->getIdUni());
  165.         $id_uni $user_equipo->getUnidad()->getIdUni();
  166.         $nombre_plantel $user_equipo->getUnidad()->getNombre();
  167.         $nombre_plantel_mayus mb_strtoupper($nombre_plantel'UTF-8');
  168.         if ($id_uni == "3155280") { // Id de Dirección General
  169.             $cargo_del_responsable = ($user_equipo->getUnidad()->getSexo() == "M" "JEFA" "JEFE") . " DE LA UNIDAD DE INNOVACIÓN Y <br>TECNOLOGÍAS DE LA INFORMACIÓN <br>";
  170.             $text_plantel "Plantel {$nombre_plantel}";
  171.         } elseif ($id_uni == "3157010") { // Id del CAST
  172.             $cargo_del_responsable "DIRECTOR" . ($user_equipo->getUnidad()->getSexo() == "M" "A" "") . " DEL {$nombre_plantel_mayus} <br>";
  173.             $text_plantel "Plantel {$nombre_plantel}";
  174.         } else {
  175.             $cargo_del_responsable "DIRECTOR" . ($user_equipo->getUnidad()->getSexo() == "M" "A" "") . " DEL PLANTEL {$nombre_plantel_mayus} <br>";
  176.             $text_plantel "Plantel {$nombre_plantel}";
  177.         }
  178.         // Declaración de la instancia de TCPDF con el encabezado personalizado
  179.         $pdf = new ArchivoPDF();
  180.         $pdf->data = [
  181.             'tipo' => 1,
  182.             'fecha' => strftime("%d de %B de %Y"),
  183.             'ubicacion' => $user_equipo->getUnidad()->getMunicipio(),
  184.             'plantel' => $text_plantel,
  185.             'cpp' => $user_equipo->getUnidad()->getIdUni() != "3155280" ?  'c.c.p – Mtra. Beatriz Marlet Torres Perea''',
  186.             'gestor' => strtoupper($user_gestor->getNombre()[0])."." . (strpos($user_gestor->getNombre(), ' ') !== false strtoupper($user_gestor->getNombre()[strpos($user_gestor->getNombre(), ' ') + 1])."." '') . strtoupper($user_gestor->getPapellido()[0])."." . (!empty($user_gestor->getSapellido()) ? strtoupper($user_gestor->getSapellido()[0])."." ''),
  187.             'responsable' => mb_strtoupper($user_equipo->getUnidad()->getDirector(), 'UTF-8') . '<br>' $cargo_del_responsable,
  188.             'resguardatario' => $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido(),
  189.             'equipo' => [
  190.                 'ubicacion' => $equipo->getUbicacion(),
  191.                 'cpu' => [
  192.                     'marbete' => $equipo->getMarbete(),
  193.                     'marca' => $equipo->getMarca(),
  194.                     'modelo' => $equipo->getModelo(),
  195.                     'serie' => $equipo->getSerie()
  196.                 ],
  197.                 'monitor' => [
  198.                     'marbete' => $equipo->getMonitorMarbete(),
  199.                     'marca' => $equipo->getMonitorMarca(),
  200.                     'modelo' => $equipo->getMonitorModelo(),
  201.                     'serie' => $equipo->getMonitorSerie()
  202.                 ],
  203.                 'teclado' => [
  204.                     'marca' => $equipo->getTecladoMarca(),
  205.                     'modelo' => $equipo->getTecladoModelo(),
  206.                     'serie' => $equipo->getTecladoSerie()
  207.                 ],
  208.                 'mouse' => [
  209.                     'marca' => $equipo->getMouseMarca(),
  210.                     'modelo' => $equipo->getMouseModelo(),
  211.                     'serie' => $equipo->getMouseSerie()
  212.                 ]
  213.             ],
  214.             'usuario' => [
  215.                 'direccion' => $user_equipo->getUnidad()->getCalle() . ', ' $user_equipo->getUnidad()->getColonia() . ', ' $user_equipo->getUnidad()->getMunicipio(),
  216.                 'cp' => $user_equipo->getUnidad()->getCP(),
  217.                 'telefono' => $user_equipo->getUnidad()->getTelefono(),
  218.                 'correo' => $user_equipo->getUnidad()->getCorreo()
  219.             ],
  220.             'texto' => [
  221.                 'a' => 'Por medio del presente se le hace entrega del equipo de cómputo descrito a continuación.',
  222.                 'b' => 'Es importante mencionar que el presente equipo, le es asignado para poder llevar a cabo el cumplimiento de sus actividades laborales.',
  223.                 'c' => 'Lo que lo compromete a hacer un buen uso del mismo, no instalar software ilegal y a no modificar o alterar la configuración del mismo.',
  224.                 'd' => 'Sin más por el momento aprovecho la oportunidad para enviarle un cordial saludo.'
  225.             ]
  226.         ];
  227.         $pdf->setPrintFooter(true);
  228.         // Generamos el contenido a mostrar
  229.         $pdf->addPage('P');
  230.         $pdf->Properties();
  231.         $pdf->Content();
  232.         ob_end_clean();
  233.         // Respuesta del PDF para visualización del usuario
  234.         $pdf->Output('reporte.pdf''I');
  235.         return new Response(); // No es necesario renderizar una vista aquí, ya que estamos generando el PDF
  236.     }
  237.     #[Route('/otro-resguardo-pdf'name'app_resguardo_otro_pdf'methods: ['POST'])]
  238.     public function otroResguardoPDF(EquipoRepository $equipoRepositoryRequest $requestSelloDigital $sello/*, int $equipoId*/)
  239.     {
  240.         ini_set('memory_limit''5120M');
  241.         ini_set('max_execution_time'0);
  242.         ini_set('output_buffering'0);
  243.         date_default_timezone_set('America/Mexico_City');
  244.         setlocale(LC_ALL'es_MX');
  245.         // Obtenemos los datos de la petición
  246.         /** @var Usuario $user */
  247.         $user $this->getUser();
  248.         $unidadId $request->request->get('unidad_filtro');
  249.         $fecha date('d-m-Y');
  250.         /*$equipo = $equipoRepository->findOneBy(['idEquipo' => 1]);
  251.         echo "**Equipo:** {$equipo->getMarca()} {$equipo->getModelo()}\n";
  252.         echo "**Serie:** {$equipo->getSerie()}\n";
  253.         echo "**Estatus:** {$equipo->getEstatus()}\n";
  254.         echo "**Marbete:** {$equipo->getMarbete()}\n";
  255.         echo "**Procesador:** {$equipo->getProcesador()}\n";
  256.         echo "**RAM:** {$equipo->getRam()}\n";
  257.         echo "**SSD:** {$equipo->getSsd()}\n";
  258.         echo "**HDD:** {$equipo->getHdd()}\n";
  259.         echo "**EMHV:** {$equipo->getEmhv()}\n";
  260.         echo "**Ubicación:** {$equipo->getUbicacion()}\n";
  261.         echo "**Usuario:** {$equipo->getUsuario()}\n";*/
  262.         $equipos = [
  263.             [
  264.                 'estatus' => 'Activo',
  265.                 'marbete' => '1234567890',
  266.                 'marca' => 'Dell',
  267.                 'modelo' => 'OptiPlex 3090',
  268.                 'serie' => '123456789ABC',
  269.                 'procesador' => 'Intel Core i5-12345',
  270.                 'ssd' => '256 GB',
  271.                 'hdd' => '1 TB',
  272.                 'ram' => '16 GB',
  273.                 'emhv' => 'No aplica',
  274.                 'ubicacion' => 'Edificio A, Nivel 3',
  275.                 'usuario' => 'Juan Pérez López'
  276.             ],
  277.             // Add more sample data as needed
  278.         ];
  279.         // Declaración de la instancia de TCPDF con el encabezado personalizado
  280.         $pdf = new DocumentoPDF1();
  281.         if (empty($unidadId)) {
  282.             $pdf->unidad "Todas las Unidades administrativas";
  283.         } else {
  284.             $uni $this->getDoctrine()->getRepository(Unidad::class)->findOneBy(['idUni' => $unidadId]);
  285.             $pdf->unidad $uni->getNombre();
  286.         }
  287.         $pdf->codigo '15-528-PO-15-F18';
  288.         $pdf->revision '02';
  289.         $pdf->faprobacion '30/10/2022';
  290.         $pdf->fecha $fecha;
  291.         $pdf->formato '';
  292.         $pdf->nombre '';
  293.         $pdf->usuarioa $user->getNombreCompleto();
  294.         $pdf->areaa $user->getArea();
  295.         $pdf->presente 'Presente';
  296.         $pdf->mensaje1 'Por medio del presente se le hace entrega del equipo de cómputo descrito a continuación.';
  297.         $pdf->mensaje2 'Es importante mencionar que el presente equipo, le es asignado para poder llevar a cabo el cumplimiento de sus actividades laborales.';
  298.         $pdf->mensaje3 'Lo que lo compromete a hacer un buen uso del mismo, no instalar software ilegal y a no modificar o alterar la configuración del mismo.';
  299.         $pdf->mensaje4 'Sin más por el momento aprovecho la oportunidad para enviarle un cordial saludo.<br><br><br>';
  300.         $pdf->atentamente '  A T E N T A M E N T E';
  301.         $pdf->atentamente1 '  GREGORIO JUAN BERNAL SOLÍS<br>
  302.                               JEFE DE PROYECTO DE LA UNIDAD DE<br>
  303.                               INNOVACIÓN Y TECNOLOGÍAS DE LA INFORMACIÓN';
  304.         $pdf->cpp 'c.c.p – Beatriz Marlet Torres Perea';
  305.         $pdf->gjbs 'G.J.B.S.';
  306.         $pdf->setPrintFooter(false);
  307.         // Obtenemos los datos del documento
  308.         $cadenaOriginal $pdf->formato '||';
  309.         $cadenaOriginal .= (empty($unidadId)) ? "Todas las Unidades administrativas" $pdf->unidad;
  310.         $cadenaOriginal .= '||' $user->getNombre() . ' ' $user->getPapellido() . '||' $user->getCorreo() . '||' $user->getRol()->getNombre();
  311.         $cadenaOriginal .= '||' $fecha;
  312.         $cadena64 $sello->generar($cadenaOriginal);
  313.         // Información del documento
  314.         $pdf->SetCreator('Conalep Estado de México');
  315.         $pdf->SetAuthor('SIGMEC');
  316.         $pdf->SetTitle('Reporte');
  317.         // Definimos los saltos de página como automáticos
  318.         $pdf->SetAutoPageBreak(TRUEPDF_MARGIN_BOTTOM);
  319.         // Nueva página con sus respectivas características
  320.         $pdf->AddPage('P''JIS_B4');
  321.         $pdf->SetY(70);
  322.         // Definimos la utilización de tipografías
  323.         $pdf->setFontSubsetting(true);
  324.         // Generamos el contenido a mostrar
  325.         ob_start();
  326.         $html = <<<EOD
  327. <style>
  328.     .header { text-align: center; }
  329.     .content { font-size: 12px; }
  330.     .footer { text-align: center; font-size: 10px; margin-top: 10px; text-align: left; }
  331.     .table-body { text-align: center; font-size: 8px; }
  332. </style>
  333. <div class="content">
  334.     <p style="text-align: right;">Cuautitlán Izcalli, México; {$fecha}</p>
  335.     <p style="text-align: right;">Unidad de Innovación y Tecnologías de la Información</p>
  336.     <p style="text-align: right;"><strong>Asunto: Asignación de equipo de cómputo</strong></p>
  337.     <p><strong>{$user->getNombreCompleto()}</strong></p>
  338.     <p><strong>{$user->getArea()}</strong></p>
  339.     <p><strong>P R E S E N T E</strong></p>
  340.     <p>{$pdf->mensaje1}</p>
  341.     <table width="100%" cellpadding="2" border="0.1">
  342.     <thead>
  343.         <tr class="table-header">
  344.             <td>#</td>
  345.             <td>Estatus</td>
  346.             <td>Marbete</td>
  347.             <td>Marca</td>
  348.             <td>Modelo</td>
  349.             <td>Serie</td>
  350.             <td>Procesador</td>
  351.             <td>SSD</td>
  352.             <td>HDD</td>
  353.             <td>RAM</td>
  354.             <td>EMHV</td>
  355.             <td>Ubicación</td>
  356.             <td>Usuario</td>
  357.         </tr>
  358.     </thead>
  359.     <tbody class="table-body">
  360. EOD;
  361.         $pdf->setMargins(1030);
  362.         $n 1;
  363.         // **Iterate through the sample data and generate table rows**
  364.         foreach ($equipos as $equipo) {
  365.             $html .= <<<EOD
  366.     <tr>
  367.         <td>{$n}</td>
  368.         <td>{$equipo['estatus']}</td>
  369.         <td>{$equipo['marbete']}</td>
  370.         <td>{$equipo['marca']}</td>
  371.         <td>{$equipo['modelo']}</td>
  372.         <td>{$equipo['serie']}</td>
  373.         <td>{$equipo['procesador']}</td>
  374.         <td>{$equipo['ssd']}</td>
  375.         <td>{$equipo['hdd']}</td>
  376.         <td>{$equipo['ram']}</td>
  377.         <td>{$equipo['emhv']}</td>
  378.         <td>{$equipo['ubicacion']}</td>
  379.         <td>{$equipo['usuario']}</td>
  380.     </tr>
  381.     EOD;
  382.             $n++;
  383.         }
  384.         $html .= <<<EOD
  385.         </tbody>  
  386.     </table>
  387.     <p>{$pdf->mensaje2}</p>
  388.     <p>{$pdf->mensaje3}</p>
  389.     <p>{$pdf->mensaje4}</p>
  390.     <div class="footer">
  391.         <p><strong>A T E N T A M E N T E</strong></p>
  392.         <p>{$pdf->atentamente1}</p>
  393.         <p>{$pdf->cpp}</p>
  394.         <p>{$pdf->gjbs}</p>
  395.     </div>
  396. </div>
  397. EOD;
  398.         ob_end_clean();
  399.         $pdf->writeHTML($htmltrue0true0);
  400.         // Respuesta del PDF para visualización del usuario
  401.         $pdf->Output('reporte.pdf''I');
  402.         return $this->render('reporte/equipo_resguardo_pdf.html.twig');
  403.     }
  404.     #[Route('/equipo-excel'name'app_reporte_equipo_excel'methods: ['POST'])]
  405.     public function equipoExcel(EquipoRepository $equipoRepositoryRequest $request): Response
  406.     {
  407.         ini_set('memory_limit''5120M');
  408.         ini_set('max_execution_time'0);
  409.         ini_set('output_buffering'0);
  410.         # Obtenemos los datos de la petición
  411.         /** @var Usuario $user */
  412.         $user $this->getUser();
  413.         $parameters $request->request->get('unidad_filtro');
  414.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  415.         
  416.         $equipos = [];
  417.         # Validar si la unidad está vacía
  418.         if ($user->getRol()->getIdRol() >&& empty($unidad)) {
  419.             throw new \InvalidArgumentException('Debe seleccionar una unidad administrativa.');
  420.         }
  421.         $equipos $equipoRepository->equipoUnidad($unidad);
  422.         # Definir el nombre temporal del archivo
  423.         $filePath 'equipo.xlsx';
  424.         # Se definen las cabeceras del archivo
  425.         $cabecera WriterEntityFactory::createRowFromArray([
  426.             'No.',
  427.             'Estatus',
  428.             'Marbete',
  429.             'Descripción',
  430.             'Marca',
  431.             'Modelo',
  432.             'Serie',
  433.             'Procesador',
  434.             'CPU velocidad',
  435.             'Núcleos',
  436.             'SSD',
  437.             'HDD',
  438.             'RAM',
  439.             'MAC',
  440.             'IP',
  441.             'EMHV',
  442.             'Monitor marbete',
  443.             'Monitor marca',
  444.             'Monitor modelo',
  445.             'Monitor serie',
  446.             'Monitor tipo',
  447.             'Monitor pulgadas',
  448.             'Teclado marca',
  449.             'Teclado modelo',
  450.             'Teclado serie',
  451.             'Mouse marca',
  452.             'Mouse modelo',
  453.             'Mouse serie',
  454.             'Uso',
  455.             'Función',
  456.             'Descripción de la función',
  457.             'Unidad',
  458.             'Ubicación',
  459.             'Usuario'
  460.         ]);
  461.         # Se crea el arreglo con los datos del cuerpo del documento
  462.         $data = [];
  463.         $n 1;
  464.         foreach ($equipos as $equipo) {
  465.             $u '';
  466.                 if ($equipo->getUsuario()) {
  467.                     $u $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido();
  468.                 }else{
  469.                     $u 'Sin usuario';
  470.                 }
  471.             $usuario $u;
  472.             $ubicacion $equipo->getUbicacion()->getArea();
  473.             $unidad $equipo->getUnidad()->getNombre();
  474.             $ssd "";
  475.             if ($equipo->getSsd() > || $equipo->getSsd() != "") {
  476.                 $ssd $equipo->getSsd() . ' Gb';
  477.             }
  478.             $uso = match ($equipo->getUso()) {
  479.                 "1" => "Educativo",
  480.                 "2" => "Docente",
  481.                 "3" => "Administrativo",
  482.                 default => ""
  483.             };
  484.             $funcion = match ($equipo->getFuncion()) {
  485.                 "1" => "Escritorio",
  486.                 "2" => "Servidor",
  487.                 default => ""
  488.             };
  489.             $estatus = match ($equipo->getEstatus()) {
  490.                 "1" => "En operación",
  491.                 "2" => "Descompuesto",
  492.                 "3" => "Sin instalar",
  493.                 "4" => "En proceso de baja",
  494.                 "5" => "Baja",
  495.                 default => ""
  496.             };
  497.             $emhv = match ($equipo->isEmhv()) {
  498.                 true => "Cumple",
  499.                 false => "No cumple",
  500.                 default => ""
  501.             };
  502.             $data[] = WriterEntityFactory::createRowFromArray([
  503.                 $n,
  504.                 $estatus,
  505.                 $equipo->getMarbete(),
  506.                 $equipo->getDescripcion(),
  507.                 $equipo->getMarca(),
  508.                 $equipo->getModelo(),
  509.                 $equipo->getSerie(),
  510.                 $equipo->getProcesador(),
  511.                 $equipo->getCpuVelocidad(),
  512.                 $equipo->getNucleos(),
  513.                 $ssd,
  514.                 $equipo->getHhd(),
  515.                 $equipo->getRam(),
  516.                 $equipo->getMac(),
  517.                 $equipo->getIp(),
  518.                 $emhv,
  519.                 $equipo->getMonitorMarbete(),
  520.                 $equipo->getMonitorMarca(),
  521.                 $equipo->getMonitorModelo(),
  522.                 $equipo->getMonitorSerie(),
  523.                 $equipo->getMonitorTipo(),
  524.                 $equipo->getMonitorPulgadas(),
  525.                 $equipo->getTecladoMarca(),
  526.                 $equipo->getTecladoModelo(),
  527.                 $equipo->getTecladoSerie(),
  528.                 $equipo->getMouseMarca(),
  529.                 $equipo->getMouseModelo(),
  530.                 $equipo->getMouseSerie(),
  531.                 $uso,
  532.                 $funcion,
  533.                 $equipo->getFuncionDescripcion(),
  534.                 $unidad,
  535.                 $ubicacion,
  536.                 $usuario
  537.             ]);
  538.             $n++;
  539.         }
  540.         # Se crea el documento en formato CSV
  541.         $writer WriterEntityFactory::createXLSXWriter();
  542.         $writer
  543.             ->openToFile($filePath)
  544.             ->addRow($cabecera)
  545.             ->addRows($data)
  546.             ->close()
  547.         ;
  548.         $response = new BinaryFileResponse($filePath);
  549.         $response->setContentDisposition(
  550.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  551.             'equipo' '_' date('Y-m-d') . '.xlsx'
  552.         );
  553.         $response->deleteFileAfterSend(true);
  554.         return $response;
  555.     }
  556.     #[Route('/equipo-pdf'name'app_reporte_equipo_pdf'methods: ['POST'])]
  557.     public function equipoPDF(EquipoRepository $equipoRepositoryRequest $requestSelloDigital $sello)
  558.     {
  559.         ini_set('memory_limit''5120M');
  560.         ini_set('max_execution_time'0);
  561.         ini_set('output_buffering'0);
  562.         date_default_timezone_set('America/Mexico_City');
  563.         setlocale(LC_ALL'es_MX');
  564.         # Obtenemos los datos de la petición
  565.         /** @var Usuario $user */
  566.         $user $this->getUser();
  567.         $parameters $request->request->get('unidad_filtro');
  568.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  569.         $fecha date('d-m-Y H:i');
  570.         # Declaración de la instancia de TCPDF con el encabezado personalizado
  571.         $pdf = new DocumentoPDF();
  572.         if (empty($unidad)) {
  573.             $pdf->unidad "Todas las Unidades administrativas";
  574.         } else {
  575.             $uni $this->getDoctrine()->getRepository(Unidad::class)->findOneBy(['idUni' => $unidad]);
  576.             $pdf->unidad $uni->getNombre();
  577.         }
  578.         $pdf->codigo '15-528-PO-15-F18';
  579.         $pdf->revision '02';
  580.         $pdf->faprobacion '30/10/2022';
  581.         $pdf->fecha $fecha;
  582.         $pdf->formato 'FORMATO CE-1';
  583.         $pdf->nombre 'CONTROL DE EQUIPO DE CÓMPUTO';
  584.         $pdf->setPrintFooter(false);
  585.         
  586.         # Obtenemos los datos del documento
  587.         $equipos $equipoRepository->equipoUnidad($unidad1);
  588.         $cadenaOriginal $pdf->formato '||';
  589.         $cadenaOriginal .= (empty($unidad)) ? "Todas las Unidades administrativas" $pdf->unidad;
  590.         $cadenaOriginal .= '||' $user->getNombre() . ' ' $user->getPapellido() . '||' $user->getCorreo() . '||' $user->getRol()->getNombre();
  591.         $cadenaOriginal .= '||' $fecha;
  592.         $cadena64 $sello->generar($cadenaOriginal);
  593.         # Información del documento
  594.         $pdf->SetCreator('Conalep Estado de México');
  595.         $pdf->SetAuthor('SIGMEC');
  596.         $pdf->SetTitle('Reporte');
  597.         # Definimos los saltos de página como automáticos
  598.         $pdf->SetAutoPageBreak(TRUEPDF_MARGIN_BOTTOM);
  599.         #Nueva página con sus respectivas características
  600.         $pdf->AddPage('L''JIS_B4');
  601.         $pdf->SetY(50);
  602.         # Definimos la utilización de tipigrafías
  603.         $pdf->setFontSubsetting(true);
  604.         ### Generamos el contenido a mostrar ###
  605.         ob_start();
  606.         $html = <<<EOD
  607.         <table cellpadding="2" border="0.1">
  608.         <thead>
  609.             <tr style="text-align: center; background-color: #e4e4e4; font-size: 9px">
  610.                 <td rowspan="2" style="width: 2%">#</td>
  611.                 <td rowspan="2">Estatus</td>
  612.                 <td colspan="9">CPU</td>
  613.                 <td colspan="6">Monitor</td>
  614.                 <td colspan="3">Teclado</td>
  615.                 <td colspan="3">Mouse</td>
  616.                 <td rowspan="2">Uso</td>
  617.                 <td rowspan="2" style="font-size: 7.5px">Función</td>
  618.                 <td rowspan="2" style="font-size: 7px">Ubicación</td>
  619.                 <td rowspan="2" style="font-size: 7.5px">Usuario</td>
  620.             </tr>
  621.             <tr style="text-align: center; background-color: #e4e4e4; font-size: 7px">
  622.                 <td>Marbete</td>
  623.                 <td>Marca</td>
  624.                 <td>Modelo</td>
  625.                 <td>Serie</td>
  626.                 <td style="font-size: 6px">Procesador</td>
  627.                 <td>SSD</td>
  628.                 <td>HDD</td>
  629.                 <td>RAM</td>
  630.                 <td>EMHV</td>
  631.                 <td>Marbete</td>
  632.                 <td>Marca</td>
  633.                 <td>Modelo</td>
  634.                 <td>Serie</td>
  635.                 <td>Tipo</td>
  636.                 <td>Pulgadas</td>
  637.                 <td>Marca</td>
  638.                 <td>Modelo</td>
  639.                 <td>Serie</td>
  640.                 <td>Marca</td>
  641.                 <td>Modelo</td>
  642.                 <td>Serie</td>
  643.             </tr>
  644.         </thead>
  645.         <tbody>
  646.         EOD;
  647.         $pdf->setMargins(1050);
  648.         $n 1;
  649.         foreach ($equipos as $equipo) {
  650.             $u '';
  651.                 if ($equipo->getUsuario()) {
  652.                     $u $equipo->getUsuario()->getNombre() . ' ' $equipo->getUsuario()->getPapellido();
  653.                 }else{
  654.                     $u 'Sin usuario';
  655.                 }
  656.             $usuario $u;
  657.             $ubicacion $equipo->getUbicacion()->getArea();
  658.             $uso = match ($equipo->getUso()) {
  659.                 "1" => "Educativo",
  660.                 "2" => "Docente",
  661.                 "3" => "Administrativo",
  662.                 default => ""
  663.             };
  664.             $funcion = match ($equipo->getFuncion()) {
  665.                 "1" => "Escritorio",
  666.                 "2" => "Servidor",
  667.                 default => ""
  668.             };
  669.             $estatus = match ($equipo->getEstatus()) {
  670.                 "1" => "En operación",
  671.                 "2" => "Descompuesto",
  672.                 "3" => "Sin instalar",
  673.                 "4" => "En proceso de baja",
  674.                 "5" => "Baja",
  675.                 default => ""
  676.             };
  677.             $emhv = match ($equipo->isEmhv()) {
  678.                 true => "Si",
  679.                 false => "No",
  680.                 default => ""
  681.             };
  682.             $html .= <<<EOD
  683.             <tr style="font-size: 7px" nobr="true">
  684.                 <td style="width: 2%">{$n}</td>
  685.                 <td>{$estatus}</td>
  686.                 <td>{$equipo->getMarbete()}</td>
  687.                 <td>{$equipo->getMarca()}</td>
  688.                 <td>{$equipo->getModelo()}</td>
  689.                 <td>{$equipo->getSerie()}</td>
  690.                 <td>{$equipo->getProcesador()}</td>
  691.                 <td>{$equipo->getSsd()}</td>
  692.                 <td>{$equipo->getHhd()}</td>
  693.                 <td>{$equipo->getRam()}</td>
  694.                 <td>{$emhv}</td>
  695.                 <td>{$equipo->getMonitorMarbete()}</td>
  696.                 <td>{$equipo->getMonitorMarca()}</td>
  697.                 <td>{$equipo->getMonitorModelo()}</td>
  698.                 <td>{$equipo->getMonitorSerie()}</td>
  699.                 <td>{$equipo->getMonitorTipo()}</td>
  700.                 <td>{$equipo->getMonitorPulgadas()}</td>
  701.                 <td>{$equipo->getTecladoMarca()}</td>
  702.                 <td>{$equipo->getTecladoModelo()}</td>
  703.                 <td>{$equipo->getTecladoSerie()}</td>
  704.                 <td>{$equipo->getMouseMarca()}</td>
  705.                 <td>{$equipo->getMouseModelo()}</td>
  706.                 <td>{$equipo->getMouseSerie()}</td>
  707.                 <td>{$uso}</td>
  708.                 <td style="font-size: 6px">{$funcion}</td>
  709.                 <td style="font-size: 6px">{$ubicacion}</td>
  710.                 <td style="font-size: 6px">{$usuario}</td>
  711.             </tr>
  712.             EOD;
  713.             $n++;
  714.         }
  715.         $html .= <<<EOD
  716.                 </tbody>  
  717.             </table>
  718.         EOD;
  719.         # Declaramos una nueva tipografía para el pie de página del contenido
  720.         $pdf->SetFont('freesans'''10''true);
  721.         # $pdf->write2DBarcode($cadenaOriginal, 'QRCODE,H', false, false, 20, 20, $styleQR, 'N')
  722.         $qr = new \TCPDF2DBarcode($cadenaOriginal'QRCODE,M');
  723.         $imgdata $qr->getBarcodePngData(2.52.5, array(000));
  724.         file_put_contents('img/sistema/qr.png'$imgdata);
  725.         $html .=
  726.             <<<EOD
  727.             <br>
  728.             <br>
  729.             <br>
  730.             <table width="100%" cellpadding="5" border="0">
  731.                 <tbody>
  732.                     <tr>
  733.                         <td style="width: 30%; font-size: 11px"><strong>GENERÓ: </strong></td>
  734.                         <td style="width: 30%"><strong>Usuario: </strong>{$user->getNombre()} {$user->getPapellido()}</td>
  735.                         <td style="width: 30%"><strong>Correo: </strong>{$user->getCorreo()}</td>
  736.                         <td style="width: 9%" rowspan="2"><img src="img/sistema/qr.png" alt="QRCODE" /></td>
  737.                     </tr>
  738.                     <tr>
  739.                         <td colspan="2" style="width: 75%">{$cadena64}</td>
  740.                         <td style="width: 13%"><img src="img/sistema/logo.png" alt="LOGO"></td>
  741.                     </tr>
  742.                 </tbody>
  743.             </table>
  744.             EOD;
  745.         # Imprimimos el contenido como HTML
  746.         $pdf->writeHTMLCell($w 0$h 0$x ''$y ''$html$border 0$ln 1$fill 0$reseth true$align ''$autopadding true);
  747.         ob_end_clean();
  748.         # ---------------------------------------------------------
  749.         # Mostramos el resultado en pantalla
  750.         $pdf->Output($pdf->formato date('Ymd') . '.pdf''D');
  751.     }
  752.     #[Route('/impresora-excel'name'app_reporte_impresora_excel'methods: ['POST'])]
  753.     public function impresoraExcel(ImpresoraRepository $impresoraRepositoryRequest $request): Response
  754.     {
  755.         ini_set('memory_limit''5120M');
  756.         ini_set('max_execution_time'0);
  757.         ini_set('output_buffering'0);
  758.         # Obtenemos los datos de la petición
  759.         /** @var Usuario $user */
  760.         $user $this->getUser();
  761.         $parameters $request->request->get('unidad_filtro');
  762.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  763.         # Validar si la unidad está vacía
  764.         if ($user->getRol()->getIdRol() >&& empty($unidad)) {
  765.             throw new \InvalidArgumentException('Debe seleccionar una unidad administrativa.');
  766.         }
  767.         $impresoras $impresoraRepository->impresoraUnidad($unidad);
  768.         
  769.         # Definir el nombre temporal del archivo
  770.         $filePath 'impresora.xlsx';
  771.         # Se definen las cabeceras del archivo
  772.         $cabecera WriterEntityFactory::createRowFromArray([
  773.             'No.',
  774.             'Estatus',
  775.             'Marbete',
  776.             'Descripción',
  777.             'Marca',
  778.             'Modelo',
  779.             'Serie',
  780.             'Tipo',
  781.             'Uso',
  782.             'MAC',
  783.             'IP',
  784.             'Unidad',
  785.             'Ubicación',
  786.             'Usuario'
  787.         ]);
  788.         # Se crea el arreglo con los datos del cuerpo del documento
  789.         $data = [];
  790.         $n 1;
  791.         foreach ($impresoras as $impresora) {
  792.             $u = ($impresora->getUsuario()) ? $impresora->getUsuario()->getNombre() . ' ' $impresora->getUsuario()->getPapellido() : 'Sin usuario';
  793.             $usuario $u;
  794.             $ubicacion $impresora->getUbicacion()->getArea();
  795.             $unidad $impresora->getUnidad()->getNombre();
  796.             $tipo = match ($impresora->getTipo()) {
  797.                 "0" => "Laser",
  798.                 "1" => "Matriz",
  799.                 "2" => "Tinta",
  800.                 default => ""
  801.             };
  802.             $uso = match ($impresora->getUso()) {
  803.                 "1" => "Educativo",
  804.                 "2" => "Docente",
  805.                 "3" => "Administrativo",
  806.                 default => ""
  807.             };
  808.             $estatus = match ($impresora->getEstatus()) {
  809.                 "1" => "En operación",
  810.                 "2" => "Descompuesto",
  811.                 "3" => "Sin instalar",
  812.                 "4" => "En proceso de baja",
  813.                 "5" => "Baja",
  814.                 default => ""
  815.             };
  816.             $data[] = WriterEntityFactory::createRowFromArray([
  817.                 $n,
  818.                 $estatus,
  819.                 $impresora->getMarbete(),
  820.                 $impresora->getMarca(),
  821.                 $impresora->getModelo(),
  822.                 $impresora->getSerie(),
  823.                 $tipo,
  824.                 $uso,
  825.                 $impresora->getMac(),
  826.                 $impresora->getIp(),
  827.                 $unidad,
  828.                 $ubicacion,
  829.                 $usuario
  830.             ]);
  831.             $n++;
  832.         }
  833.         # Se crea el documento en formato CSV
  834.         $writer WriterEntityFactory::createXLSXWriter();
  835.         $writer
  836.             ->openToFile($filePath)
  837.             ->addRow($cabecera)
  838.             ->addRows($data)
  839.             ->close();
  840.         $response = new BinaryFileResponse($filePath);
  841.         $response->setContentDisposition(
  842.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  843.             'impresora' '_' date('Y-m-d') . '.xlsx'
  844.         );
  845.         $response->deleteFileAfterSend(true);
  846.         return $response;
  847.     }
  848.     #[Route('/impresora-pdf'name'app_reporte_impresora_pdf'methods: ['POST'])]
  849.     public function impresoraPDF(ImpresoraRepository $impresoraRepositoryRequest $requestSelloDigital $sello)
  850.     {
  851.         ini_set('memory_limit''5120M');
  852.         ini_set('max_execution_time'0);
  853.         ini_set('output_buffering'0);
  854.         date_default_timezone_set('America/Mexico_City');
  855.         setlocale(LC_ALL'es_MX');
  856.         # Obtenemos los datos de la petición
  857.         /** @var Usuario $user */
  858.         $user $this->getUser();
  859.         $parameters $request->request->get('unidad_filtro');
  860.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  861.         $fecha date('d-m-Y H:i');
  862.         # Declaración de la instancia de TCPDF con el encabezado personalizado
  863.         $pdf = new DocumentoPDF();
  864.         if (empty($unidad)) {
  865.             $pdf->unidad "Todas las Unidades administrativas";
  866.         } else {
  867.             $uni $this->getDoctrine()->getRepository(Unidad::class)->findOneBy(['idUni' => $unidad]);
  868.             $pdf->unidad $uni->getNombre();
  869.         }
  870.         $pdf->codigo '15-528-PO-15-F18';
  871.         $pdf->revision '02';
  872.         $pdf->faprobacion '30/10/2022';
  873.         $pdf->fecha $fecha;
  874.         $pdf->formato 'FORMATO CE-2';
  875.         $pdf->nombre 'CONTROL DE IMPRESORAS';
  876.         $pdf->setPrintFooter(false);
  877.         # Obtenemos los datos del documento
  878.         $impresoras $impresoraRepository->impresoraUnidad($unidad1);
  879.         $cadenaOriginal $pdf->formato '||';
  880.         $cadenaOriginal .= (empty($unidad)) ? "Todas las Unidades administrativas" $pdf->unidad;
  881.         $cadenaOriginal .= '||' $user->getNombre() . ' ' $user->getPapellido() . '||' $user->getCorreo() . '||' $user->getRol()->getNombre();
  882.         $cadenaOriginal .= '||' $fecha;
  883.         $cadena64 $sello->generar($cadenaOriginal);
  884.         # Información del documento
  885.         $pdf->SetCreator('Conalep Estado de México');
  886.         $pdf->SetAuthor('SIGMEC');
  887.         $pdf->SetTitle('Reporte');
  888.         # Definimos los saltos de página como automáticos
  889.         #$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  890.         #Nueva página con sus respectivas características
  891.         $pdf->AddPage('L''LEGAL');
  892.         $pdf->SetY(50);
  893.         # Definimos la utilización de tipigrafías
  894.         $pdf->setFontSubsetting(true);
  895.         ### Generamos el contenido a mostrar ###
  896.         ob_start();
  897.         $html = <<<EOD
  898.         <table cellpadding="2" border="0.1" width="100%">
  899.         <thead>
  900.             <tr style="text-align: center; background-color: #e4e4e4; font-size: 11px">
  901.                 <td style="width: 5%">No.</td>
  902.                 <td>Estatus</td>
  903.                 <td>Marbete</td>
  904.                 <td>Marca</td>
  905.                 <td>Modelo</td>
  906.                 <td>Serie</td>
  907.                 <td>Tipo</td>
  908.                 <td>Uso</td>
  909.                 <td>Ubicación</td>
  910.                 <td>Usuario</td>
  911.             </tr>
  912.         </thead>
  913.         <tbody>
  914.         EOD;
  915.         $pdf->setMargins(1050);
  916.         $n 1;
  917.         foreach ($impresoras as $impresora) {
  918.             $u = ($impresora->getUsuario()) ? $impresora->getUsuario()->getNombre() . ' ' $impresora->getUsuario()->getPapellido() : 'Sin usuario';
  919.             $usuario $u;
  920.             $ubicacion $impresora->getUbicacion()->getArea();
  921.             $tipo = match ($impresora->getTipo()) {
  922.                 '0' => '<span>Laser</span>',
  923.                 '1' => '<span>Matriz</span>',
  924.                 '2' => '<span>Tinta</span>',
  925.                 default => ""
  926.             };
  927.             $uso = match ($impresora->getUso()) {
  928.                 "1" => "Educativo",
  929.                 "2" => "Docente",
  930.                 "3" => "Administrativo",
  931.                 default => ""
  932.             };
  933.             $estatus = match ($impresora->getEstatus()) {
  934.                 "1" => "En operación",
  935.                 "2" => "Descompuesto",
  936.                 "3" => "Sin instalar",
  937.                 "4" => "En proceso de baja",
  938.                 "5" => "Baja",
  939.                 default => ""
  940.             };
  941.             $html .= <<<EOD
  942.             <tr style="font-size: 10px" nobr="true">
  943.                 <td style="width: 5%">{$n}</td>
  944.                 <td>{$estatus}</td>
  945.                 <td>{$impresora->getMarbete()}</td>
  946.                 <td>{$impresora->getMarca()}</td>
  947.                 <td>{$impresora->getModelo()}</td>
  948.                 <td>{$impresora->getSerie()}</td>
  949.                 <td>{$tipo}</td>
  950.                 <td>{$uso}</td>
  951.                 <td>{$ubicacion}</td>
  952.                 <td>{$usuario}</td>
  953.             </tr>
  954.             EOD;
  955.             $n++;
  956.         }
  957.         $html .= <<<EOD
  958.                 </tbody>  
  959.             </table>
  960.         EOD;
  961.         # Declaramos una nueva tipografía para el pie de página del contenido
  962.         $pdf->SetFont('freesans'''10''true);
  963.         # $pdf->write2DBarcode($cadenaOriginal, 'QRCODE,H', false, false, 20, 20, $styleQR, 'N')
  964.         $qr = new \TCPDF2DBarcode($cadenaOriginal'QRCODE,M');
  965.         $imgdata $qr->getBarcodePngData(2.52.5, array(000));
  966.         file_put_contents('img/sistema/qr.png'$imgdata);
  967.         $html .= <<<EOD
  968.             <br>
  969.             <br>
  970.             <br>
  971.             <table width="100%" cellpadding="5" border="0">
  972.                 <tbody>
  973.                     <tr>
  974.                         <td style="width: 30%; font-size: 11px"><strong>GENERÓ: </strong></td>
  975.                         <td style="width: 30%"><strong>Usuario: </strong>{$user->getNombre()} {$user->getPapellido()}</td>
  976.                         <td style="width: 30%"><strong>Correo: </strong>{$user->getCorreo()}</td>
  977.                         <td style="width: 9%" rowspan="2"><img src="img/sistema/qr.png" alt="QRCODE" /></td>
  978.                     </tr>
  979.                     <tr>
  980.                         <td colspan="2" style="width: 75%">{$cadena64}</td>
  981.                         <td style="width: 13%"><img src="img/sistema/logo.png" alt="LOGO"></td>
  982.                     </tr>
  983.                 </tbody>
  984.             </table>
  985.         EOD;
  986.         # Imprimimos el contenido como HTML
  987.         $pdf->writeHTMLCell($w 0$h 0$x ''$y ''$html$border 0$ln 1$fill 0$reseth true$align ''$autopadding true);
  988.         ob_end_clean();
  989.         # ---------------------------------------------------------
  990.         # Mostramos el resultado en pantalla
  991.         $pdf->Output($pdf->formato date('Ymd') . '.pdf''D');
  992.     }
  993.     #[Route('/otro-excel'name'app_reporte_otro_excel'methods: ['POST'])]
  994.     public function otroExcel(OtroRepository $otroRepositoryRequest $request): Response
  995.     {
  996.         ini_set('memory_limit''5120M');
  997.         ini_set('max_execution_time'0);
  998.         ini_set('output_buffering'0);
  999.         # Obtenemos los datos de la petición
  1000.         /** @var Usuario $user */
  1001.         $user $this->getUser();
  1002.         $parameters $request->request->get('unidad_filtro');
  1003.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  1004.         # Validar si la unidad está vacía 
  1005.         if ($user->getRol()->getIdRol() >&& empty($unidad)) {
  1006.             throw new \InvalidArgumentException('Debe seleccionar una unidad administrativa.');
  1007.         }
  1008.         
  1009.         # Obtenemos los datos del documento
  1010.         $otros $otroRepository->otroUnidad($unidad);
  1011.         # Definir el nombre temporal del archivo
  1012.         $filePath 'otro.xlsx';
  1013.         # Se definen las cabeceras del archivo
  1014.         $cabecera WriterEntityFactory::createRowFromArray([
  1015.             'No.',
  1016.             'Estatus',
  1017.             'Marbete',
  1018.             'Descripción',
  1019.             'Marca',
  1020.             'Modelo',
  1021.             'Serie',
  1022.             'Uso',
  1023.             'MAC',
  1024.             'IP',
  1025.             'Unidad',
  1026.             'Ubicación',
  1027.             'Usuario'
  1028.         ]);
  1029.         # Se crea el arreglo con los datos del cuerpo del documento
  1030.         $data = [];
  1031.         $n 1;
  1032.         foreach ($otros as $otro) {
  1033.             $u = ($otro->getUsuario()) ? $otro->getUsuario()->getNombre() . ' ' $otro->getUsuario()->getPapellido() : 'Sin usuario';
  1034.             $usuario $u;
  1035.             $ubicacion $otro->getUbicacion()->getArea();
  1036.             $unidad $otro->getUnidad()->getNombre();
  1037.             $uso = match ($otro->getUso()) {
  1038.                 "1" => "Educativo",
  1039.                 "2" => "Docente",
  1040.                 "3" => "Administrativo",
  1041.                 default => ""
  1042.             };
  1043.             $estatus = match ($otro->getEstatus()) {
  1044.                 "1" => "En operación",
  1045.                 "2" => "Descompuesto",
  1046.                 "3" => "Sin instalar",
  1047.                 "4" => "En proceso de baja",
  1048.                 "5" => "Baja",
  1049.                 default => ""
  1050.             };
  1051.             $data[] = WriterEntityFactory::createRowFromArray([
  1052.                 $n,
  1053.                 $estatus,
  1054.                 $otro->getMarbete(),
  1055.                 $otro->getDescripcion(),
  1056.                 $otro->getMarca(),
  1057.                 $otro->getModelo(),
  1058.                 $otro->getSerie(),
  1059.                 $uso,
  1060.                 $otro->getMac(),
  1061.                 $otro->getIp(),
  1062.                 $unidad,
  1063.                 $ubicacion,
  1064.                 $usuario
  1065.             ]);
  1066.             $n++;
  1067.         }
  1068.         # Se crea el documento en formato CSV
  1069.         $writer WriterEntityFactory::createXLSXWriter();
  1070.         $writer
  1071.             ->openToFile($filePath)
  1072.             ->addRow($cabecera)
  1073.             ->addRows($data)
  1074.             ->close();
  1075.         $response = new BinaryFileResponse($filePath);
  1076.         $response->setContentDisposition(
  1077.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  1078.             'otro' '_' date('Y-m-d') . '.xlsx'
  1079.         );
  1080.         $response->deleteFileAfterSend(true);
  1081.         return $response;
  1082.     }
  1083.     #[Route('/otro-pdf'name'app_reporte_otro_pdf'methods: ['POST'])]
  1084.     public function otroPDF(OtroRepository $otroRepositoryRequest $requestSelloDigital $sello)
  1085.     {
  1086.         ini_set('memory_limit''5120M');
  1087.         ini_set('max_execution_time'0);
  1088.         ini_set('output_buffering'0);
  1089.         date_default_timezone_set('America/Mexico_City');
  1090.         setlocale(LC_ALL'es_MX');
  1091.         # Obtenemos los datos de la petición
  1092.         /** @var Usuario $user */
  1093.         $user $this->getUser();
  1094.         $parameters $request->request->get('unidad_filtro');
  1095.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  1096.         $fecha date('d-m-Y H:i');
  1097.         # Declaración de la instancia de TCPDF con el encabezado personalizado
  1098.         $pdf = new DocumentoPDF();
  1099.         if (empty($unidad)) {
  1100.             $pdf->unidad "Todas las Unidades administrativas";
  1101.         } else {
  1102.             $uni $this->getDoctrine()->getRepository(Unidad::class)->findOneBy(['idUni' => $unidad]);
  1103.             $pdf->unidad $uni->getNombre();
  1104.         }
  1105.         $pdf->codigo '15-528-PO-15-F18';
  1106.         $pdf->revision '02';
  1107.         $pdf->faprobacion '30/10/2022';
  1108.         $pdf->fecha $fecha;
  1109.         $pdf->formato 'FORMATO CE-3';
  1110.         $pdf->nombre 'CONTROL DE OTROS BIENES INFORMÁTICOS';
  1111.         $pdf->setPrintFooter(false);
  1112.         # Obtenemos los datos del documento
  1113.         $otros $otroRepository->otroUnidad($unidad1);
  1114.         $cadenaOriginal $pdf->formato '||';
  1115.         $cadenaOriginal .= (empty($unidad)) ? "Todas las Unidades administrativas" $pdf->unidad;
  1116.         $cadenaOriginal .= '||' $user->getNombre() . ' ' $user->getPapellido() . '||' $user->getCorreo() . '||' $user->getRol()->getNombre();
  1117.         $cadenaOriginal .= '||' $fecha;
  1118.         $cadena64 $sello->generar($cadenaOriginal);
  1119.         # Información del documento
  1120.         $pdf->SetCreator('Conalep Estado de México');
  1121.         $pdf->SetAuthor('SIGMEC');
  1122.         $pdf->SetTitle('Reporte');
  1123.         # Definimos los saltos de página como automáticos
  1124.         #$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  1125.         #Nueva página con sus respectivas características
  1126.         $pdf->AddPage('L''LEGAL');
  1127.         $pdf->SetY(50);
  1128.         # Definimos la utilización de tipigrafías
  1129.         $pdf->setFontSubsetting(true);
  1130.         ### Generamos el contenido a mostrar ###
  1131.         ob_start();
  1132.         $html = <<<EOD
  1133.         <table cellpadding="2" border="0.1">
  1134.         <thead>
  1135.             <tr style="text-align: center; background-color: #e4e4e4; font-size: 11px">
  1136.                 <td style="width: 5%">No.</td>
  1137.                 <td>Estatus</td>
  1138.                 <td>Marbete</td>
  1139.                 <td>Descripción</td>
  1140.                 <td>Marca</td>
  1141.                 <td>Modelo</td>
  1142.                 <td>Serie</td>
  1143.                 <td>Uso</td>
  1144.                 <td>Ubicación</td>
  1145.                 <td>Usuario</td>
  1146.             </tr>
  1147.         </thead>
  1148.         <tbody>
  1149.         EOD;
  1150.         $pdf->setMargins(1050);
  1151.         $n 1;
  1152.         foreach ($otros as $otro) {
  1153.             $u = ($otro->getUsuario()) ? $otro->getUsuario()->getNombre() . ' ' $otro->getUsuario()->getPapellido() : 'Sin usuario';
  1154.             $usuario $u;
  1155.             $ubicacion $otro->getUbicacion()->getArea();
  1156.             $uso = match ($otro->getUso()) {
  1157.                 "1" => "Educativo",
  1158.                 "2" => "Docente",
  1159.                 "3" => "Administrativo",
  1160.                 default => ""
  1161.             };
  1162.             $estatus = match ($otro->getEstatus()) {
  1163.                 "1" => "En operación",
  1164.                 "2" => "Descompuesto",
  1165.                 "3" => "Sin instalar",
  1166.                 "4" => "En proceso de baja",
  1167.                 "5" => "Baja",
  1168.                 default => ""
  1169.             };
  1170.             $html .= <<<EOD
  1171.             <tr style="font-size: 10px" nobr="true">
  1172.                 <td style="width: 5%">{$n}</td>
  1173.                 <td>{$estatus}</td>
  1174.                 <td>{$otro->getMarbete()}</td>
  1175.                 <td>{$otro->getDescripcion()}</td>
  1176.                 <td>{$otro->getMarca()}</td>
  1177.                 <td>{$otro->getModelo()}</td>
  1178.                 <td>{$otro->getSerie()}</td>
  1179.                 <td>{$uso}</td>
  1180.                 <td>{$ubicacion}</td>
  1181.                 <td>{$usuario}</td>
  1182.             </tr>
  1183.             EOD;
  1184.             $n++;
  1185.         }
  1186.         $html .= <<<EOD
  1187.                 </tbody>  
  1188.             </table>
  1189.         EOD;
  1190.         # Declaramos una nueva tipografía para el pie de página del contenido
  1191.         $pdf->SetFont('freesans'''10''true);
  1192.         # $pdf->write2DBarcode($cadenaOriginal, 'QRCODE,H', false, false, 20, 20, $styleQR, 'N')
  1193.         $qr = new \TCPDF2DBarcode($cadenaOriginal'QRCODE,M');
  1194.         $imgdata $qr->getBarcodePngData(2.52.5, array(000));
  1195.         file_put_contents('img/sistema/qr.png'$imgdata);
  1196.         $html .= <<<EOD
  1197.             <br>
  1198.             <br>
  1199.             <br>
  1200.             <table width="100%" cellpadding="5" border="0">
  1201.                 <tbody>
  1202.                     <tr>
  1203.                         <td style="width: 30%; font-size: 11px"><strong>GENERÓ: </strong></td>
  1204.                         <td style="width: 30%"><strong>Usuario: </strong>{$user->getNombre()} {$user->getPapellido()}</td>
  1205.                         <td style="width: 30%"><strong>Correo: </strong>{$user->getCorreo()}</td>
  1206.                         <td style="width: 9%" rowspan="2"><img src="img/sistema/qr.png" alt="QRCODE" /></td>
  1207.                     </tr>
  1208.                     <tr>
  1209.                         <td colspan="2" style="width: 75%">{$cadena64}</td>
  1210.                         <td style="width: 13%"><img src="img/sistema/logo.png" alt="LOGO"></td>
  1211.                     </tr>
  1212.                 </tbody>
  1213.             </table>
  1214.         EOD;
  1215.         # Imprimimos el contenido como HTML
  1216.         $pdf->writeHTMLCell($w 0$h 0$x ''$y ''$html$border 0$ln 1$fill 0$reseth true$align ''$autopadding true);
  1217.         ob_end_clean();
  1218.         # ---------------------------------------------------------
  1219.         # Mostramos el resultado en pantalla
  1220.         $pdf->Output($pdf->formato date('Ymd') . '.pdf''D');
  1221.     }
  1222.     #[Route('/red-excel'name'app_reporte_red_excel'methods: ['POST'])]
  1223.     public function redExcel(RedRepository $redRepositoryRequest $request): Response
  1224.     {
  1225.         ini_set('memory_limit''5120M');
  1226.         ini_set('max_execution_time'0);
  1227.         ini_set('output_buffering'0);
  1228.         # Obtenemos los datos de la petición
  1229.         /** @var Usuario $user */
  1230.         $user $this->getUser();
  1231.         $parameters $request->request->get('unidad_filtro');
  1232.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  1233.         
  1234.         if ($user->getRol()->getIdRol() >&& empty($unidad)) {
  1235.             throw new \InvalidArgumentException('Debe seleccionar una unidad administrativa.');
  1236.         }
  1237.         # Obtenemos los datos del documento
  1238.         $redes $redRepository->redUnidad($unidad);
  1239.         # Definir el nombre temporal del archivo
  1240.         $filePath 'red.xlsx';
  1241.         # Se definen las cabeceras del archivo
  1242.         $cabecera WriterEntityFactory::createRowFromArray([
  1243.             'No.',
  1244.             'Estatus',
  1245.             'Marbete (opcional)',
  1246.             'Descripción',
  1247.             'Marca',
  1248.             'Modelo',
  1249.             'Serie',
  1250.             'Velocidad',
  1251.             'Puertos',
  1252.             'Uso',
  1253.             'MAC',
  1254.             'IP',
  1255.             'Unidad',
  1256.             'Ubicación',
  1257.             'Usuario'
  1258.         ]);
  1259.         # Se crea el arreglo con los datos del cuerpo del documento
  1260.         $data = [];
  1261.         $n 1;
  1262.         foreach ($redes as $red) {
  1263.             $u = ($red->getUsuario()) ? $red->getUsuario()->getNombre() . ' ' $red->getUsuario()->getPapellido() : 'Sin usuario';
  1264.             $usuario $u;
  1265.             $ubicacion $red->getUbicacion()->getArea();
  1266.             $unidad $red->getUnidad()->getNombre();
  1267.             $uso = match ($red->getUso()) {
  1268.                 "1" => "Educativo",
  1269.                 "2" => "Docente",
  1270.                 "3" => "Administrativo",
  1271.                 default => ""
  1272.             };
  1273.             $estatus = match ($red->getEstatus()) {
  1274.                 "1" => "En operación",
  1275.                 "2" => "Descompuesto",
  1276.                 "3" => "Sin instalar",
  1277.                 "4" => "En proceso de baja",
  1278.                 "5" => "Baja",
  1279.                 default => ""
  1280.             };
  1281.             $data[] = WriterEntityFactory::createRowFromArray([
  1282.                 $n,
  1283.                 $estatus,
  1284.                 $red->getMarbete(),
  1285.                 $red->getDescripcion(),
  1286.                 $red->getMarca(),
  1287.                 $red->getModelo(),
  1288.                 $red->getSerie(),
  1289.                 $red->getVelocidad(),
  1290.                 $red->getPuertos(),
  1291.                 $uso,
  1292.                 $red->getMac(),
  1293.                 $red->getIp(),
  1294.                 $unidad,
  1295.                 $ubicacion,
  1296.                 $usuario
  1297.             ]);
  1298.             $n++;
  1299.         }
  1300.         # Se crea el documento en formato CSV
  1301.         $writer WriterEntityFactory::createXLSXWriter();
  1302.         $writer
  1303.             ->openToFile($filePath)
  1304.             ->addRow($cabecera)
  1305.             ->addRows($data)
  1306.             ->close();
  1307.         $response = new BinaryFileResponse($filePath);
  1308.         $response->setContentDisposition(
  1309.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  1310.             'red' '_' date('Y-m-d') . '.xlsx'
  1311.         );
  1312.         $response->deleteFileAfterSend(true);
  1313.         return $response;
  1314.     }
  1315.     #[Route('/red-pdf'name'app_reporte_red_pdf'methods: ['POST'])]
  1316.     public function redPDF(RedRepository $redRepositoryRequest $requestSelloDigital $sello)
  1317.     {
  1318.         ini_set('memory_limit''5120M');
  1319.         ini_set('max_execution_time'0);
  1320.         ini_set('output_buffering'0);
  1321.         date_default_timezone_set('America/Mexico_City');
  1322.         setlocale(LC_ALL'es_MX');
  1323.         # Obtenemos los datos de la petición
  1324.         /** @var Usuario $user */
  1325.         $user $this->getUser();
  1326.         $parameters $request->request->get('unidad_filtro');
  1327.         $unidad = (array_key_exists('unidad'$request->request->all()['unidad_filtro'])) ? $parameters['unidad'] : $user->getUnidad();
  1328.         $fecha date('d-m-Y H:i');
  1329.         # Declaración de la instancia de TCPDF con el encabezado personalizado
  1330.         $pdf = new DocumentoPDF();
  1331.         if (empty($unidad)) {
  1332.             $pdf->unidad "Todas las Unidades administrativas";
  1333.         } else {
  1334.             $uni $this->getDoctrine()->getRepository(Unidad::class)->findOneBy(['idUni' => $unidad]);
  1335.             $pdf->unidad $uni->getNombre();
  1336.         }
  1337.         $pdf->codigo '15-528-PO-15-F18';
  1338.         $pdf->revision '02';
  1339.         $pdf->faprobacion '30/10/2022';
  1340.         $pdf->fecha $fecha;
  1341.         $pdf->formato 'FORMATO CE-4';
  1342.         $pdf->nombre 'CONTROL DE ACTIVOS DE COMUNICACIÓN';
  1343.         $pdf->setPrintFooter(false);
  1344.         # Obtenemos los datos del documento
  1345.         $redes $redRepository->redUnidad($unidad1);
  1346.         $cadenaOriginal $pdf->formato '||';
  1347.         $cadenaOriginal .= (empty($unidad)) ? "Todas las Unidades administrativas" $pdf->unidad;
  1348.         $cadenaOriginal .= '||' $user->getNombre() . ' ' $user->getPapellido() . '||' $user->getCorreo() . '||' $user->getRol()->getNombre();
  1349.         $cadenaOriginal .= '||' $fecha;
  1350.         $cadena64 $sello->generar($cadenaOriginal);
  1351.         # Información del documento
  1352.         $pdf->SetCreator('Conalep Estado de México');
  1353.         $pdf->SetAuthor('SIGMEC');
  1354.         $pdf->SetTitle('Reporte');
  1355.         # Definimos los saltos de página como automáticos
  1356.         #$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  1357.         #Nueva página con sus respectivas características
  1358.         $pdf->AddPage('L''LEGAL');
  1359.         $pdf->SetY(50);
  1360.         # Definimos la utilización de tipigrafías
  1361.         $pdf->setFontSubsetting(true);
  1362.         ### Generamos el contenido a mostrar ###
  1363.         ob_start();
  1364.         $html = <<<EOD
  1365.         <table cellpadding="2" border="0.1">
  1366.         <thead>
  1367.             <tr style="text-align: center; background-color: #e4e4e4; font-size: 11px">
  1368.                 <td style="width: 5%">No.</td>
  1369.                 <td>Estatus</td>
  1370.                 <td>Marbete (opcional)</td>
  1371.                 <td>Descripción</td>
  1372.                 <td>Marca</td>
  1373.                 <td>Modelo</td>
  1374.                 <td>Serie</td>
  1375.                 <td>Velocidad</td>
  1376.                 <td>Puertos</td>
  1377.                 <td>Uso</td>
  1378.                 <td>Ubicación</td>
  1379.                 <td>Usuario</td>
  1380.             </tr>
  1381.         </thead>
  1382.         <tbody>
  1383.         EOD;
  1384.         $pdf->setMargins(10,50);
  1385.         $n 1;
  1386.         foreach ($redes as $red) {
  1387.             $u = ($red->getUsuario()) ? $red->getUsuario()->getNombre() . ' ' $red->getUsuario()->getPapellido() : 'Sin usuario';
  1388.             $usuario $u;
  1389.             $ubicacion $red->getUbicacion()->getArea();
  1390.             $uso = match ($red->getUso()) {
  1391.                 "1" => "Educativo",
  1392.                 "2" => "Docente",
  1393.                 "3" => "Administrativo",
  1394.                 default => ""
  1395.             };
  1396.             $estatus = match ($red->getEstatus()) {
  1397.                 "1" => "En operación",
  1398.                 "2" => "Descompuesto",
  1399.                 "3" => "Sin instalar",
  1400.                 "4" => "En proceso de baja",
  1401.                 "5" => "Baja",
  1402.                 default => ""
  1403.             };
  1404.             $html .= <<<EOD
  1405.             <tr style="font-size: 10px" nobr="true">
  1406.                 <td style="width: 5%">{$n}</td>
  1407.                 <td>{$estatus}</td>
  1408.                 <td>{$red->getMarbete()}</td>
  1409.                 <td>{$red->getDescripcion()}</td>
  1410.                 <td>{$red->getMarca()}</td>
  1411.                 <td>{$red->getModelo()}</td>
  1412.                 <td>{$red->getSerie()}</td>
  1413.                 <td>{$red->getVelocidad()}</td>
  1414.                 <td>{$red->getPuertos()}</td>
  1415.                 <td>{$uso}</td>
  1416.                 <td>{$ubicacion}</td>
  1417.                 <td>{$usuario}</td>
  1418.             </tr>
  1419.             EOD;
  1420.             $n++;
  1421.         }
  1422.         $html .= <<<EOD
  1423.                 </tbody>  
  1424.             </table>
  1425.         EOD;
  1426.         # Declaramos una nueva tipografía para el pie de página del contenido
  1427.         $pdf->SetFont('freesans'''10''true);
  1428.         # $pdf->write2DBarcode($cadenaOriginal, 'QRCODE,H', false, false, 20, 20, $styleQR, 'N')
  1429.         $qr = new \TCPDF2DBarcode($cadenaOriginal'QRCODE,M');
  1430.         $imgdata $qr->getBarcodePngData(2.52.5, array(000));
  1431.         file_put_contents('img/sistema/qr.png'$imgdata);
  1432.         $html .= <<<EOD
  1433.             <br>
  1434.             <br>
  1435.             <br>
  1436.             <table width="100%" cellpadding="5" border="0">
  1437.                 <tbody>
  1438.                     <tr>
  1439.                         <td style="width: 30%; font-size: 11px"><strong>GENERÓ: </strong></td>
  1440.                         <td style="width: 30%"><strong>Usuario: </strong>{$user->getNombre()} {$user->getPapellido()}</td>
  1441.                         <td style="width: 30%"><strong>Correo: </strong>{$user->getCorreo()}</td>
  1442.                         <td style="width: 9%" rowspan="2"><img src="img/sistema/qr.png" alt="QRCODE" /></td>
  1443.                     </tr>
  1444.                     <tr>
  1445.                         <td colspan="2" style="width: 75%">{$cadena64}</td>
  1446.                         <td style="width: 13%"><img src="img/sistema/logo.png" alt="LOGO"></td>
  1447.                     </tr>
  1448.                 </tbody>
  1449.             </table>
  1450.         EOD;
  1451.         # Imprimimos el contenido como HTML
  1452.         $pdf->writeHTMLCell($w 0$h 0$x ''$y ''$html$border 0$ln 1$fill 0$reseth true$align ''$autopadding true);
  1453.         ob_end_clean();
  1454.         # ---------------------------------------------------------
  1455.         # Mostramos el resultado en pantalla
  1456.         $pdf->Output($pdf->formato date('Ymd') . '.pdf''I');
  1457.     }
  1458.     #[Route('/pamp-excel'name'app_reporte_pamp_excel'methods: ['POST'])]
  1459.     public function pampExcel(SolicitudRepository $solRepRequest $request): Response
  1460.     {
  1461.         ini_set('memory_limit''5120M');
  1462.         ini_set('max_execution_time'0);
  1463.         ini_set('output_buffering'0);
  1464.         # Obtenemos los datos de la petición
  1465.         /** @var Usuario $user */
  1466.         $user $this->getUser();
  1467.         $parameters $request->request->get('pamp_filtro');
  1468.         $unidad = (array_key_exists('unidad'$request->request->all()['pamp_filtro'])) ? $parameters['unidad'] : $user->getUnidad()->getIdUni();
  1469.         $finicio $parameters['anio'] . '-01-01';
  1470.         $ffin $parameters['anio'] . '-12-31';
  1471.         # Obtenemos los datos del documento
  1472.         $solicitudes $solRep->registroTipoEquipoUsuario(null4$unidad$finicio$ffin);
  1473.         # Definir el nombre temporal del archivo
  1474.         $filePath 'pamp.xlsx';
  1475.         # Se definen las cabeceras del archivo
  1476.         $cabecera WriterEntityFactory::createRowFromArray([
  1477.             'No.',
  1478.             'Solicitud',
  1479.             'Periodo',
  1480.             'Tipo equipo',
  1481.             'Marbete',
  1482.             'Marca',
  1483.             'Modelo',
  1484.             'Serie',
  1485.             'Descripción',
  1486.             'Unidad adminstrativa',
  1487.             'Ubicación',
  1488.             'Trabajo a realizar',
  1489.             'Fecha registro',
  1490.             'Fecha atención',
  1491.             'Fecha de finalización',
  1492.             'Servicio realizado',
  1493.             'Refacciones',
  1494.             'Resguardatario',
  1495.             'Correo resguardatario',
  1496.             'Gestor',
  1497.             'Correo gestor',
  1498.             'Estatus'
  1499.         ]);
  1500.         # Se crea el arreglo con los datos del cuerpo del documento
  1501.         $data = [];
  1502.         $n 1;
  1503.         foreach ($solicitudes as $solicitud) {
  1504.             if ($solicitud['tipo_mantenimiento'] == 'MP') {
  1505.                 $estatus = match ($solicitud['estatus']) {
  1506.                     "1" => "Pendiente",
  1507.                     "2" => "En Proceso",
  1508.                     "3" => "Atendido",
  1509.                     "4" => "Evaluado",
  1510.                     default => ""
  1511.                 };
  1512.                 $data[] = WriterEntityFactory::createRowFromArray([
  1513.                     $n,
  1514.                     $solicitud['id_sol'],
  1515.                     $solicitud['periodo'],
  1516.                     $solicitud['tipo_equipo'],
  1517.                     $solicitud['marbete'],
  1518.                     $solicitud['marca'],
  1519.                     $solicitud['modelo'],
  1520.                     $solicitud['serie'],
  1521.                     $solicitud['descripcion'],
  1522.                     $solicitud['nunidad'],
  1523.                     $solicitud['nubicacion'],
  1524.                     $solicitud['falla'],
  1525.                     $solicitud['fregistro'],
  1526.                     $solicitud['fatencion'],
  1527.                     $solicitud['ffin'],
  1528.                     $solicitud['srealizado'],
  1529.                     $solicitud['refacciones'],
  1530.                     $solicitud['unombre'] . ' ' $solicitud['uapellido'],
  1531.                     $solicitud['ucorreo'],
  1532.                     $solicitud['gnombre'] . ' ' $solicitud['gapellido'],
  1533.                     $solicitud['gcorreo'],
  1534.                     $estatus,
  1535.                 ]);
  1536.                 $n++;
  1537.             }
  1538.         }
  1539.         # Se crea el documento en formato CSV
  1540.         $writer WriterEntityFactory::createXLSXWriter();
  1541.         $writer
  1542.             ->openToFile($filePath)
  1543.             ->addRow($cabecera)
  1544.             ->addRows($data)
  1545.             ->close();
  1546.         $response = new BinaryFileResponse($filePath);
  1547.         $response->setContentDisposition(
  1548.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  1549.             'pamp' '_' date('Y-m-d') . '.xlsx'
  1550.         );
  1551.         $response->deleteFileAfterSend(true);
  1552.         return $response;
  1553.     }
  1554.     #[Route('/pamp-pdf'name'app_reporte_pamp_pdf'methods: ['POST'])]
  1555.     public function pampPDF(SolicitudRepository $solRepRequest $requestSelloDigital $sello)
  1556.     {
  1557.         ini_set('memory_limit''5120M');
  1558.         ini_set('max_execution_time'0);
  1559.         ini_set('output_buffering'0);
  1560.         date_default_timezone_set('America/Mexico_City');
  1561.         setlocale(LC_ALL'es_MX');
  1562.         # Se obtiene el nivel de acceso
  1563.         $perfil $request->getSession()->get('perfil');
  1564.         $nivel $perfil[9]["nivel"];
  1565.         # Obtenemos los datos de la petición
  1566.         /** @var Usuario $user */
  1567.         $user $this->getUser();
  1568.         $parameters $request->request->get('pamp_filtro');
  1569.         if (empty($parameters)) {
  1570.             $uni "";
  1571.             $year date('Y');
  1572.         } else {
  1573.             $uni = (array_key_exists('unidad'$request->request->all()['pamp_filtro'])) ? $parameters['unidad'] : $user->getUnidad()->getIdUni();
  1574.             $year $parameters['anio'];
  1575.         }
  1576.         $periodo date('d-m-Y H:i');
  1577.         # Declaración de la instancia de TCPDF con el encabezado personalizado
  1578.         $pdf = new DocumentoPDF();
  1579.         if (empty($uni)) {
  1580.             $pdf->unidad "Todas las Unidades administrativas";
  1581.         } else {
  1582.             $unidad $this->getDoctrine()->getRepository(Unidad::class)->findOneBy(['idUni' => $uni]);
  1583.             $pdf->unidad $unidad->getNombre();
  1584.         }
  1585.         $pdf->codigo '15-528-PO-15-F18';
  1586.         $pdf->revision '02';
  1587.         $pdf->faprobacion '30/10/2022';
  1588.         $pdf->fecha $year#$periodo
  1589.         $pdf->formato 'Diagrama de Gantt';
  1590.         $pdf->nombre 'Programa Anual de Mantenimiento Preventivo';
  1591.         $pdf->setPrintFooter(false);
  1592.         # Obtenemos los datos del documento
  1593.         if ($nivel == 2) {
  1594.             $solicitud $solRep->findByAnioUnidad($year$uni);
  1595.             $conteo $solRep->countByUnidad($uni);
  1596.         } else {
  1597.             $solicitud $solRep->findByAnioUnidad($year$user->getUnidad()->getIdUni());
  1598.             $conteo $solRep->countByUnidad($user->getUnidad()->getIdUni());
  1599.         }
  1600.         $cadenaOriginal $pdf->formato '||';
  1601.         $cadenaOriginal .= (empty($unidad)) ? "Todas las Unidades administrativas" $pdf->unidad;
  1602.         $cadenaOriginal .= '||' $user->getNombre() . ' ' $user->getPapellido() . '||' $user->getCorreo() . '||' $user->getRol()->getNombre();
  1603.         $cadenaOriginal .= '||' $pdf->fecha;
  1604.         $cadena64 $sello->generar($cadenaOriginal);
  1605.         # Información del documento
  1606.         $pdf->SetCreator('Conalep Estado de México');
  1607.         $pdf->SetAuthor('SIGMEC');
  1608.         $pdf->SetTitle('Programa Anual de Mantenimiento Preventivo');
  1609.         # Definimos los saltos de página como automáticos
  1610.         #$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  1611.         #Nueva página con sus respectivas características
  1612.         $pdf->AddPage('L''LEGAL');
  1613.         $pdf->SetY(50);
  1614.         # Definimos la utilización de tipigrafías
  1615.         $pdf->setFontSubsetting(true);
  1616.         # Obtiene datos de avance y equipos con mp
  1617.         $n 0;
  1618.         $atendido 0;
  1619.         $avance 0;
  1620.         $marbetes = [];
  1621.         foreach ($solicitud as $s) {
  1622.             if ($s["estatus"] == "4") {
  1623.                 $atendido $atendido 1;
  1624.             }
  1625.             if ($s["tipo_equipo"] == "Cómputo") {
  1626.                 if (!in_array($s["marbete"], $marbetes)) {
  1627.                     $marbetes[] = $s["marbete"];
  1628.                 }
  1629.             }
  1630.             $n++;
  1631.         }
  1632.         if ($atendido and $n 0) {
  1633.             $avance floor(($atendido $n) * 100);
  1634.         }
  1635.         $ecmp count($marbetes);
  1636.         ### Generamos el contenido a mostrar ###
  1637.         ob_start();
  1638.         $html = <<<EOD
  1639. <table cellpadding="2" border="0">
  1640.    <tbody>
  1641.    <tr>
  1642.        <td colspan="8"><strong>Unidad administrativa</strong>: {$pdf->unidad}</td>
  1643.    </tr>
  1644.    <tr>
  1645.        <td style="text-align: center">{$conteo["impresora"]}</td>
  1646.        <td style="text-align: center">{$conteo["red"]}</td>
  1647.        <td style="text-align: center">{$conteo["otro"]}</td>
  1648.        <td style="text-align: center">{$conteo["equipo"]}</td>
  1649.        <td style="text-align: center">{$conteo["emhv"]}</td>
  1650.        <td style="text-align: center">{$ecmp}</td>
  1651.        <td style="text-align: center">{$conteo["indice"]}%</td>
  1652.        <td style="text-align: center">{$avance}%</td>
  1653.    </tr>
  1654.    <tr>
  1655.        <td style="text-align: center"><strong>IMPRESORAS</strong></td>
  1656.        <td style="text-align: center"><strong>RED</strong></td>
  1657.        <td style="text-align: center"><strong>OTRO</strong></td>
  1658.        <td style="text-align: center"><strong>CÓMPUTO</strong></td>
  1659.        <td style="text-align: center"><strong>EMHV</strong></td>
  1660.        <td style="text-align: center"><strong>EQ. COMPUTO/MP</strong></td>
  1661.        <td style="text-align: center"><strong>ÍNDICE DE EMHV</strong></td>
  1662.        <td style="text-align: center"><strong>AVANCE ATENCIÓN</strong></td>
  1663.    </tr>
  1664.    </tbody>
  1665. </table>
  1666. <br><br>
  1667. EOD;
  1668.         $html .= <<<EOD
  1669.         <table cellpadding="2" border="0.1">
  1670.         <thead>
  1671.         <tr style="text-align: center; background-color: #e4e4e4; font-size: 10px">
  1672.             <th width="8.5mm">#</th>
  1673.             <th width="27mm">Marbete</th>
  1674.             <th width="45mm">Equipo</th>
  1675.             <th width="125mm">Trabajo a realizar</th>
  1676.             <th width="8mm"></th>
  1677.             <th width="10mm">Ene</th>
  1678.             <th width="10mm">Feb</th>
  1679.             <th width="10mm">Mar</th>
  1680.             <th width="10mm">Abr</th>
  1681.             <th width="10mm">May</th>
  1682.             <th width="10mm">Jun</th>
  1683.             <th width="10mm">Jul</th>
  1684.             <th width="10mm">Ago</th>
  1685.             <th width="10mm">Sep</th>
  1686.             <th width="10mm">Oct</th>
  1687.             <th width="10mm">Nov</th>
  1688.             <th width="10mm">Dic</th>
  1689.         </tr>
  1690.         </thead>
  1691.         <tbody>
  1692.         EOD;
  1693.         $pdf->setMargins(1050);
  1694.         $n 1;
  1695.         foreach ($solicitud as $i) {
  1696.             $mesP date('m'strtotime($i['fatencion']));
  1697.             $diaP date('d'strtotime($i['fatencion']));
  1698.             if (empty($i['fevaluacion'])) {
  1699.                 $mesR "00";
  1700.                 $diaR "00";
  1701.             } else {
  1702.                 $mesR date('m'strtotime($i['fevaluacion']));
  1703.                 $diaR date('d'strtotime($i['fevaluacion']));
  1704.             }
  1705.             if ($mesP == "01") {
  1706.                 $mesP01 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1707.                 $diaP01 $diaP;
  1708.             } else {
  1709.                 $mesP01 '';
  1710.                 $diaP01 '';
  1711.             }
  1712.             if ($mesP == "02") {
  1713.                 $mesP02 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1714.                 $diaP02 $diaP;
  1715.             } else {
  1716.                 $mesP02 '';
  1717.                 $diaP02 '';
  1718.             }
  1719.             if ($mesP == "03") {
  1720.                 $mesP03 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1721.                 $diaP03 $diaP;
  1722.             } else {
  1723.                 $mesP03 '';
  1724.                 $diaP03 '';
  1725.             }
  1726.             if ($mesP == "04") {
  1727.                 $mesP04 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1728.                 $diaP04 $diaP;
  1729.             } else {
  1730.                 $mesP04 '';
  1731.                 $diaP04 '';
  1732.             }
  1733.             if ($mesP == "05") {
  1734.                 $mesP05 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1735.                 $diaP05 $diaP;
  1736.             } else {
  1737.                 $mesP05 '';
  1738.                 $diaP05 '';
  1739.             }
  1740.             if ($mesP == "06") {
  1741.                 $mesP06 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1742.                 $diaP06 $diaP;
  1743.             } else {
  1744.                 $mesP06 '';
  1745.                 $diaP06 '';
  1746.             }
  1747.             if ($mesP == "07") {
  1748.                 $mesP07 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1749.                 $diaP07 $diaP;
  1750.             } else {
  1751.                 $mesP07 '';
  1752.                 $diaP07 '';
  1753.             }
  1754.             if ($mesP == "08") {
  1755.                 $mesP08 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1756.                 $diaP08 $diaP;
  1757.             } else {
  1758.                 $mesP08 '';
  1759.                 $diaP08 '';
  1760.             }
  1761.             if ($mesP == "09") {
  1762.                 $mesP09 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1763.                 $diaP09 $diaP;
  1764.             } else {
  1765.                 $mesP09 '';
  1766.                 $diaP09 '';
  1767.             }
  1768.             if ($mesP == "10") {
  1769.                 $mesP10 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1770.                 $diaP10 $diaP;
  1771.             } else {
  1772.                 $mesP10 '';
  1773.                 $diaP10 '';
  1774.             }
  1775.             if ($mesP == "11") {
  1776.                 $mesP11 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1777.                 $diaP11 $diaP;
  1778.             } else {
  1779.                 $mesP11 '';
  1780.                 $diaP11 '';
  1781.             }
  1782.             if ($mesP == "12") {
  1783.                 $mesP12 'style="background-color: #8b9cd0; text-align: center; color: #333333;"';
  1784.                 $diaP12 $diaP;
  1785.             } else {
  1786.                 $mesP12 '';
  1787.                 $diaP12 '';
  1788.             }
  1789.             if ($mesR == "01") {
  1790.                 $mesR01 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1791.                 $diaR01 $diaR;
  1792.             } else {
  1793.                 $mesR01 '';
  1794.                 $diaR01 '';
  1795.             }
  1796.             if ($mesR == "02") {
  1797.                 $mesR02 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1798.                 $diaR02 $diaR;
  1799.             } else {
  1800.                 $mesR02 '';
  1801.                 $diaR02 '';
  1802.             }
  1803.             if ($mesR == "03") {
  1804.                 $mesR03 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1805.                 $diaR03 $diaR;
  1806.             } else {
  1807.                 $mesR03 '';
  1808.                 $diaR03 '';
  1809.             }
  1810.             if ($mesR == "04") {
  1811.                 $mesR04 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1812.                 $diaR04 $diaR;
  1813.             } else {
  1814.                 $mesR04 '';
  1815.                 $diaR04 '';
  1816.             }
  1817.             if ($mesR == "05") {
  1818.                 $mesR05 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1819.                 $diaR05 $diaR;
  1820.             } else {
  1821.                 $mesR05 '';
  1822.                 $diaR05 '';
  1823.             }
  1824.             if ($mesR == "06") {
  1825.                 $mesR06 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1826.                 $diaR06 $diaR;
  1827.             } else {
  1828.                 $mesR06 '';
  1829.                 $diaR06 '';
  1830.             }
  1831.             if ($mesR == "07") {
  1832.                 $mesR07 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1833.                 $diaR07 $diaR;
  1834.             } else {
  1835.                 $mesR07 '';
  1836.                 $diaR07 '';
  1837.             }
  1838.             if ($mesR == "08") {
  1839.                 $mesR08 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1840.                 $diaR08 $diaR;
  1841.             } else {
  1842.                 $mesR08 '';
  1843.                 $diaR08 '';
  1844.             }
  1845.             if ($mesR == "09") {
  1846.                 $mesR09 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1847.                 $diaR09 $diaR;
  1848.             } else {
  1849.                 $mesR09 '';
  1850.                 $diaR09 '';
  1851.             }
  1852.             if ($mesR == "10") {
  1853.                 $mesR10 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1854.                 $diaR10 $diaR;
  1855.             } else {
  1856.                 $mesR10 '';
  1857.                 $diaR10 '';
  1858.             }
  1859.             if ($mesR == "11") {
  1860.                 $mesR11 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1861.                 $diaR11 $diaR;
  1862.             } else {
  1863.                 $mesR11 '';
  1864.                 $diaR11 '';
  1865.             }
  1866.             if ($mesR == "12") {
  1867.                 $mesR12 'style="background-color: #dce79b; text-align: center; color: #333333;"';
  1868.                 $diaR12 $diaR;
  1869.             } else {
  1870.                 $mesR12 '';
  1871.                 $diaR12 '';
  1872.             }
  1873.             $html .= <<<EOD
  1874.             <tr style="font-size: 9px">
  1875.                 <td width="8.5mm" rowspan="2" align="center">$n</td>
  1876.                 <td width="27mm" rowspan="2">{$i["marbete"]}</td>
  1877.                 <td width="45mm" rowspan="2">{$i["tipo_equipo"]}</td>
  1878.                 <td width="125mm" rowspan="2">{$i["falla"]}</td>
  1879.                 <td width="8mm">P</td>
  1880.                 <td width="10mm" {$mesP01}>{$diaP01}</td>
  1881.                 <td width="10mm" {$mesP02}>{$diaP02}</td>
  1882.                 <td width="10mm" {$mesP03}>{$diaP03}</td>
  1883.                 <td width="10mm" {$mesP04}>{$diaP04}</td>
  1884.                 <td width="10mm" {$mesP05}>{$diaP05}</td>
  1885.                 <td width="10mm" {$mesP06}>{$diaP06}</td>
  1886.                 <td width="10mm" {$mesP07}>{$diaP07}</td>
  1887.                 <td width="10mm" {$mesP08}>{$diaP08}</td>
  1888.                 <td width="10mm" {$mesP09}>{$diaP09}</td>
  1889.                 <td width="10mm" {$mesP10}>{$diaP10}</td>
  1890.                 <td width="10mm" {$mesP11}>{$diaP11}</td>
  1891.                 <td width="10mm" {$mesP12}>{$diaP12}</td>
  1892.             </tr>
  1893.             <tr style="font-size: 9px">
  1894.                 <td width="8mm">R</td>
  1895.                 <td width="10mm" {$mesR01}>{$diaR01}</td>
  1896.                 <td width="10mm" {$mesR02}>{$diaR02}</td>
  1897.                 <td width="10mm" {$mesR03}>{$diaR03}</td>
  1898.                 <td width="10mm" {$mesR04}>{$diaR04}</td>
  1899.                 <td width="10mm" {$mesR05}>{$diaR05}</td>
  1900.                 <td width="10mm" {$mesR06}>{$diaR06}</td>
  1901.                 <td width="10mm" {$mesR07}>{$diaR07}</td>
  1902.                 <td width="10mm" {$mesR08}>{$diaR08}</td>
  1903.                 <td width="10mm" {$mesR09}>{$diaR09}</td>
  1904.                 <td width="10mm" {$mesR10}>{$diaR10}</td>
  1905.                 <td width="10mm" {$mesR11}>{$diaR11}</td>
  1906.                 <td width="10mm" {$mesR12}>{$diaR12}</td>
  1907.             </tr>
  1908.             EOD;
  1909.             $n++;
  1910.         }
  1911.         $html .= <<<EOD
  1912.                 </tbody>  
  1913.             </table>
  1914.         EOD;
  1915.         # Declaramos una nueva tipografía para el pie de página del contenido
  1916.         $pdf->SetFont('freesans'''10''true);
  1917.         # $pdf->write2DBarcode($cadenaOriginal, 'QRCODE,H', false, false, 20, 20, $styleQR, 'N')
  1918.         $qr = new \TCPDF2DBarcode($cadenaOriginal'QRCODE,M');
  1919.         $imgdata $qr->getBarcodePngData(2.52.5, array(000));
  1920.         file_put_contents('img/sistema/qr.png'$imgdata);
  1921.         $html .= <<<EOD
  1922.             <br>
  1923.             <br>
  1924.             <br>
  1925.             <table width="100%" cellpadding="5" border="0">
  1926.                 <tbody>
  1927.                     <tr>
  1928.                         <td style="width: 30%; font-size: 11px"><strong>GENERÓ: </strong></td>
  1929.                         <td style="width: 30%"><strong>Usuario: </strong>{$user->getNombre()} {$user->getPapellido()}</td>
  1930.                         <td style="width: 30%"><strong>Correo: </strong>{$user->getCorreo()}</td>
  1931.                         <td style="width: 9%" rowspan="2"><img src="img/sistema/qr.png" alt="QRCODE" /></td>
  1932.                     </tr>
  1933.                     <tr>
  1934.                         <td colspan="2" style="width: 75%">{$cadena64}</td>
  1935.                         <td style="width: 13%"><img src="img/sistema/logo.png" alt="LOGO"></td>
  1936.                     </tr>
  1937.                 </tbody>
  1938.             </table>
  1939.         EOD;
  1940.         # Imprimimos el contenido como HTML
  1941.         $pdf->writeHTMLCell($w 0$h 0$x ''$y ''$html$border 0$ln 1$fill 0$reseth true$align ''$autopadding true);
  1942.         ob_end_clean();
  1943.         # ---------------------------------------------------------
  1944.         # Mostramos el resultado en pantalla
  1945.         $pdf->Output($pdf->formato date('Ymd') . '.pdf''D');
  1946.     }
  1947.     #[Route('/ubicacion-excel'name'app_reporte_ubicacion_excel'methods: ['POST'])]
  1948.     public function ubicacionExcel(UbicacionRepository $ubicacionRepositoryRequest $request): Response
  1949.     {
  1950.         ini_set('memory_limit''5120M');
  1951.         ini_set('max_execution_time'0);
  1952.         ini_set('output_buffering'0);
  1953.         # Obtenemos los datos de la petición
  1954.         /** @var Usuario $user */
  1955.         $user $this->getUser(); 
  1956.       
  1957.         $ubicaciones = [];
  1958.         if($user->getRol()->getIdRol() <= 2){
  1959.             $ubicaciones $ubicacionRepository->ubicaUnidad();
  1960.         }else{
  1961.             $ubicaciones $ubicacionRepository->ubicaUnidad($user->getUnidad());
  1962.         }
  1963.         # Obtenemos los datos del documento
  1964.         
  1965.         # Definir el nombre temporal del archivo
  1966.         $filePath 'otro.xlsx';
  1967.         # Se definen las cabeceras del archivo
  1968.         $cabecera WriterEntityFactory::createRowFromArray([
  1969.             'ID.',
  1970.             'Ubicación',
  1971.             'Unidad',
  1972.             'Estatus'
  1973.         ]);
  1974.         # Se crea el arreglo con los datos del cuerpo del documento
  1975.         $data = [];
  1976.         $n 1;
  1977.         foreach ($ubicaciones as $ubicacion) {
  1978.             /*$usuario = $ubicacion->getUsuario()->getNombre() . ' ' . $ubicacion->getUsuario()->getPapellido();
  1979.             $ubicacion1 = $ubicacion->getUbicacion()->getArea();*/
  1980.             $unidad $ubicacion->getUnidad()->getNombre();
  1981.             /*$activo = match ($ubicacion->getActivo()) {
  1982.                 "1" => 'Activo',
  1983.                 "0" => 'Inactivo',
  1984.                 default => ""
  1985.             };*/
  1986.             if ($ubicacion->getActivo() == 1) {
  1987.                 $activo "Activo";
  1988.             } else {
  1989.                 $activo "Inactivo";
  1990.             }
  1991.             $data[] = WriterEntityFactory::createRowFromArray([
  1992.                 $ubicacion->getIdUbi(),
  1993.                 $ubicacion->getArea(),
  1994.                 $unidad,
  1995.                 $activo
  1996.                 //$ubicacion->getActivo()
  1997.                 //$usuario,
  1998.             ]);
  1999.             $n++;
  2000.         }
  2001.         # Se crea el documento en formato CSV
  2002.         $writer WriterEntityFactory::createXLSXWriter();
  2003.         $writer
  2004.             ->openToFile($filePath)
  2005.             ->addRow($cabecera)
  2006.             ->addRows($data)
  2007.             ->close();
  2008.         $response = new BinaryFileResponse($filePath);
  2009.         $response->setContentDisposition(
  2010.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  2011.             'Ubicaciónes- ' '_' date('Y-m-d') . '.xlsx'
  2012.         );
  2013.         $response->deleteFileAfterSend(true);
  2014.         return $response;
  2015.     }
  2016.     #[Route('/componentes'name'app_bitacora_index'methods: ['GET''POST'])]
  2017.     public function componentes(Request $requestEntityManagerInterface $entityManager): Response
  2018.     {
  2019.         $movimientos '';
  2020.         $form $this->createFormBuilder()
  2021.             ->add('componente'EntityType::class, [
  2022.                 'class' => CatComponentes::class,
  2023.                 'attr' => ['class' => 'form-control'],
  2024.                 'placeholder' => 'Todo',
  2025.                 'query_builder' => function (EntityRepository $er) {
  2026.                     return $er->createQueryBuilder('cc')
  2027.                         ->orderBy('cc.tipo''ASC');
  2028.                 }
  2029.             ])
  2030.             ->add('unidad'EntityType::class, [
  2031.                 'class' => Unidad::class,
  2032.                 'attr' => ['class' => 'form-control'],
  2033.                 'placeholder' => 'Todo',
  2034.                 'query_builder' => function (EntityRepository $er) {
  2035.                     return $er->createQueryBuilder('u')
  2036.                         ->orderBy('u.nombre''ASC');
  2037.                 }
  2038.             ])
  2039.             ->add('finicio'DateType::class,[
  2040.                 'label' => 'Desde',
  2041.                 'attr' => ['class' => 'form-control''class' => 'js-datepicker'],
  2042.                 'widget' => 'single_text',
  2043.                 'format' => 'yyyy-MM-dd',
  2044.                 'data' => new \DateTime(date('Y') . '-01-01'),
  2045.             ])
  2046.             ->add('ffinal'DateType::class, [
  2047.                 'label' => 'Hasta',
  2048.                 'attr' => ['class' => 'form-control''class' => 'js-datepicker'],
  2049.                 'widget' => 'single_text',
  2050.                 'format' => 'yyyy-MM-dd',
  2051.                 'data'  =>  new \DateTime()
  2052.             ])
  2053.             ->getForm();
  2054.         $form->handleRequest($request);
  2055.         if ($request->isMethod('POST') && $form->isSubmitted() && $form->isValid()) {
  2056.             $conn $entityManager->getConnection();
  2057.             if ($form->get('componente')->getData() != '' && $form->get('unidad')->getData() != '' && $form->get('finicio')->getData() != '' && $form->get('ffinal')->getData() != '') {
  2058.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2059.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2060.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2061.                         FROM bitacora_movimientos bm
  2062.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2063.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2064.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2065.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2066.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2067.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2068.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2069.                         WHERE cc.id_componente = :tipo AND bm.id_uni = :id_uni AND bm.fecha_mov BETWEEN :finicio AND :ffinal;
  2070.                 ";
  2071.                 $stmt $conn->prepare($sql);
  2072.                 $stmt->bindValue('tipo'$form->get('componente')->getData()->getTipo());
  2073.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2074.                 $stmt->bindValue('finicio'$form->get('finicio')->getData()->format('Y-m-d H:i:s'));
  2075.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2076.             } elseif ($form->get('componente')->getData() != '' && $form->get('unidad')->getData() != '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() != '') {
  2077.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2078.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2079.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2080.                         FROM bitacora_movimientos bm
  2081.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2082.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2083.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2084.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2085.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2086.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2087.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2088.                     WHERE cc_tipo = :tipo AND bm.id_uni = :id_uni AND bm.fecha_mov <= :ffinal
  2089.                 ";
  2090.                 $stmt $conn->prepare($sql);
  2091.                 $stmt->bindValue('tipo'$form->get('componente')->getData()->getTipo());
  2092.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2093.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2094.             } elseif ($form->get('componente')->getData() != '' && $form->get('unidad')->getData() != '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() == '') {
  2095.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2096.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2097.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2098.                         FROM bitacora_movimientos bm
  2099.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2100.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2101.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2102.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2103.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2104.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2105.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2106.                     WHERE cc_tipo = :tipo AND bm.id_uni = :id_uni
  2107.                 ";
  2108.                 $stmt $conn->prepare($sql);
  2109.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2110.                 $stmt->bindValue('tipo'$form->get('componente')->getData()->getTipo());
  2111.             } elseif ($form->get('componente')->getData() != '' && $form->get('unidad')->getData() == '' && $form->get('finicio')->getData() != '' && $form->get('ffinal')->getData() != '') {
  2112.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2113.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2114.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2115.                         FROM bitacora_movimientos bm
  2116.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2117.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2118.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2119.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2120.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2121.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2122.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2123.                     WHERE cc_tipo = :tipo AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2124.                 ";
  2125.                 $stmt $conn->prepare($sql);
  2126.                 $stmt->bindValue('tipo'$form->get('componente')->getData()->getTipo());
  2127.                 $stmt->bindValue('finicio'$form->get('finicio')->getData()->format('Y-m-d'));
  2128.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new \DateInterval('P1D'))->format('Y-m-d'));
  2129.             } elseif ($form->get('componente')->getData() != '' && $form->get('unidad')->getData() == '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() != '') {
  2130.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2131.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2132.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2133.                         FROM bitacora_movimientos bm
  2134.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2135.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2136.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2137.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2138.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2139.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2140.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2141.                     WHERE cc_tipo = :tipo AND bm.fecha_mov <= :ffinal
  2142.                 ";
  2143.                 $stmt $conn->prepare($sql);
  2144.                 $stmt->bindValue('tipo'$form->get('componente')->getData()->getTipo());
  2145.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new \DateInterval('P1D'))->format('Y-m-d'));
  2146.             } elseif ($form->get('componente')->getData() != '' && $form->get('unidad')->getData() == '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() == '') {
  2147.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2148.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2149.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2150.                         FROM bitacora_movimientos bm
  2151.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2152.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2153.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2154.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2155.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2156.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2157.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2158.                     WHERE cc_tipo = :tipo
  2159.                 ";
  2160.                 $stmt $conn->prepare($sql);
  2161.                 $stmt->bindValue('tipo'$form->get('componente')->getData()->getTipo());
  2162.             } elseif ($form->get('componente')->getData() == '' && $form->get('unidad')->getData() != '' && $form->get('finicio')->getData() != '' && $form->get('ffinal')->getData() != '') {
  2163.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2164.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2165.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2166.                         FROM bitacora_movimientos bm
  2167.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2168.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2169.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2170.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2171.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2172.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2173.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2174.                     WHERE bm.id_uni = :id_uni AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2175.                 ";
  2176.                 $stmt $conn->prepare($sql);
  2177.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2178.                 $stmt->bindValue('finicio'$form->get('finicio')->getData()->format('Y-m-d H:i:s'));
  2179.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2180.             } elseif ($form->get('componente')->getData() == '' && $form->get('unidad')->getData() != '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() != '') {
  2181.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2182.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2183.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2184.                         FROM bitacora_movimientos bm
  2185.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2186.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2187.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2188.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2189.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2190.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2191.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2192.                     WHERE bm.id_uni = :id_uni AND bm.fecha_mov <= :ffinal
  2193.                 ";
  2194.                 $stmt $conn->prepare($sql);
  2195.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2196.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2197.             } elseif ($form->get('componente')->getData() == '' && $form->get('unidad')->getData() != '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() == '') {
  2198.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2199.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2200.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2201.                         FROM bitacora_movimientos bm
  2202.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2203.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2204.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2205.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2206.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2207.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2208.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2209.                     WHERE bm.id_uni = :id_uni
  2210.                 ";
  2211.                 $stmt $conn->prepare($sql);
  2212.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2213.             } elseif ($form->get('componente')->getData() == '' && $form->get('unidad')->getData() == '' && $form->get('finicio')->getData() != '' && $form->get('ffinal')->getData() != '') {
  2214.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2215.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2216.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2217.                         FROM bitacora_movimientos bm
  2218.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2219.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2220.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2221.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2222.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2223.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2224.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2225.                     WHERE bm.fecha_mov BETWEEN :finicio AND :ffinal
  2226.                 ";
  2227.                 $stmt $conn->prepare($sql);
  2228.                 $stmt->bindValue('finicio'$form->get('finicio')->getData()->format('Y-m-d H:i:s'));
  2229.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2230.             } elseif ($form->get('componente')->getData() == '' && $form->get('unidad')->getData() == '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() != '') {
  2231.                 $sql "SELECT DISTINCT *,  bm.tipo_equipo AS bm_equipo, 
  2232.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2233.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2234.                         FROM bitacora_movimientos bm
  2235.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2236.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2237.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2238.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2239.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2240.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2241.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2242.                     WHERE bm.fecha_mov <= :ffinal
  2243.                 ";
  2244.                 $stmt $conn->prepare($sql);
  2245.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d'));
  2246.             } else {
  2247.                 $sql "SELECT DISTINCT*,  bm.tipo_equipo AS bm_equipo, 
  2248.                                 bm.fecha_mov AS bm_fecha_movimiento,     bm.observacion AS bm_observacion,     u.u_nombre,   d.d_unidad,   s.id_sol AS s_solicitud,     s.tipo_equipo AS s_tipo_equipo,    s.id_equipo AS s_id_equipo,    s.ubicacion AS s_ubicacion,    s.usuario AS s_usuario,    s.gestor AS s_gestor,    s.periodo AS s_periodo,    s.tipo_mantenimiento AS s_tipo_mantenimiento,    s.falla AS s_falla,    s.srealizado AS s_srealizado,    s.fregistro AS s_fregistro,    s.fatencion AS s_fatencion,
  2249.                                 s.ffin AS s_ffin,    s.fevaluacion AS s_fevaluacion,    s.refacciones AS s_refacciones,    s.estatus AS s_estatus,    s.unidad AS s_unidad,    cc.cc_tipo,     cc.cc_descripcion,     i.i_marca,     i.i_modelo,     i.i_serie,    eq.marbete AS equipo_marbete,    eq.descripcion AS equipo_descripcion,    eq.marca AS equipo_marca,    eq.modelo AS equipo_modelo,    eq.serie AS equipo_serie, us.usuario_nombre
  2250.                         FROM bitacora_movimientos bm
  2251.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2252.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2253.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2254.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2255.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2256.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2257.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2258.                 ";
  2259.                 $stmt $conn->prepare($sql);
  2260.             }
  2261.             $resultSet $stmt->executeQuery();
  2262.             $movimientos $resultSet->fetchAll();
  2263.             return $this->render('consulta_solicitud/componentes.html.twig', [
  2264.                 'form' => $form->createView(),
  2265.                 'movimientos' => $movimientos
  2266.             ]);
  2267.         }
  2268.         return $this->render('consulta_solicitud/componentes.html.twig', [
  2269.             'form' => $form->createView(),
  2270.             'movimientos' => $movimientos
  2271.         ]);
  2272.     }
  2273.     #[Route('/componentes/reporte'name'app_componentes_reporte'methods: ['GET''POST'])]
  2274.     public function componentesReporte(Request $requestEntityManagerInterface $entityManager): Response
  2275.     {
  2276.         ini_set('memory_limit''5120M');
  2277.         ini_set('max_execution_time'0);
  2278.         ini_set('output_buffering'0);
  2279.         /** var Usuario $user */
  2280.         $user $this->getUser();
  2281.         date_default_timezone_set('America/Mexico_City');
  2282.         setlocale(LC_ALL'es_MX');
  2283.         $fecha date('Y-m-d H:i:s');
  2284.         # Obtenemos los datos de la petición
  2285.         /** @var Usuario $user */
  2286.         $user $this->getUser();
  2287.         $filtro $request->request->get('form');
  2288.         $filtro['ffinal'] = new DateTime($filtro['ffinal']);
  2289.         $filtro['ffinal'] = $filtro['ffinal']->add(new DateInterval('P1D'))->format('Y-m-d');
  2290.         $movimientos $this->filtroConsulta($filtro$entityManager);
  2291.         # Definir el nombre temporal del archivo
  2292.         $filePath 'reporteRefacciones.xlsx';
  2293.         # Se definen las cabeceras del archivo
  2294.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Reporte de bitácora de uso de refacciones por periodo',]);
  2295.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Unidad: ' $user->getUnidad()->getNombre()]);
  2296.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Fecha de creación: ' $fecha]);
  2297.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Usuario: ' $user->getNombre() . ' ' $user->getPapellido() . ' ' $user->getSapellido()]);
  2298.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Fecha inicial: ' $filtro['finicio']]);
  2299.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Fecha final: ' $filtro['ffinal']]);
  2300.         $cabecera[] = WriterEntityFactory::createRowFromArray(['']);
  2301.         $cabecera[] = WriterEntityFactory::createRowFromArray([
  2302.             'Unidad',
  2303.             'Componente',
  2304.             'Descripcion',
  2305.             'Equipo',
  2306.             'Marbete',
  2307.             'Usuario Asignado',
  2308.             'Fecha de asignación',
  2309.             'Marca',
  2310.             'Modelo',
  2311.             'Serie',
  2312.             'Usuario Gestor',
  2313.             'Solicitud',
  2314.             'Unidad'
  2315.         ]);
  2316.         # Se crea el arreglo con los datos del cuerpo del documento
  2317.         $data = [];
  2318.         foreach ($movimientos as $m) {
  2319.             $data[] = WriterEntityFactory::createRowFromArray([
  2320.                 $m['d_unidad'],
  2321.                 $m['cc_tipo'],
  2322.                 $m['cc_descripcion'],
  2323.                 $m['bm_equipo'],
  2324.                 $m['equipo_marbete'],
  2325.                 $m['usuario_nombre'],
  2326.                 $m['bm_fecha_movimiento'],
  2327.                 $m['i_marca'],
  2328.                 $m['i_modelo'],
  2329.                 $m['i_serie'],
  2330.                 $m['u_nombre'],
  2331.                 $m['s_solicitud'],
  2332.                 $m['d_unidad']
  2333.             ]);
  2334.         }
  2335.         # Se crea el documento en formato CSV
  2336.         $writer WriterEntityFactory::createXLSXWriter();
  2337.         $writer
  2338.             ->openToFile($filePath)
  2339.             ->addRows($cabecera)
  2340.             ->addRows($data)
  2341.             ->close();
  2342.         $response = new BinaryFileResponse($filePath);
  2343.         $response->setContentDisposition(
  2344.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  2345.             'reporteRefacciones' '_' date('Y-m-d') . '.xlsx'
  2346.         );
  2347.         $response->deleteFileAfterSend(true);
  2348.         return $response;
  2349.     }
  2350.     #[Route('/componentes/uso'name'app_bitacora_uso_index'methods: ['GET''POST'])]
  2351.     public function componentesUso(Request $requestEntityManagerInterface $entityManager): Response
  2352.     {
  2353.         $movimientos '';
  2354.         $form $this->createFormBuilder()
  2355.             ->add('unidad'EntityType::class, [
  2356.                 'class' => Unidad::class,
  2357.                 'attr' => ['class' => 'form-control'],
  2358.                 'placeholder' => 'Todo',
  2359.                 'query_builder' => function (EntityRepository $er) {
  2360.                     return $er->createQueryBuilder('u')
  2361.                         ->orderBy('u.nombre''ASC');
  2362.                 }
  2363.             ])
  2364.             ->add('finicio'DateType::class,[
  2365.                 'label' => 'Desde',
  2366.                 'attr' => ['class' => 'form-control''class' => 'js-datepicker'],
  2367.                 'widget' => 'single_text',
  2368.                 'format' => 'yyyy-MM-dd',
  2369.                 'data' => new \DateTime(date('Y') . '-01-01'),
  2370.             ])
  2371.             ->add('ffinal'DateType::class, [
  2372.                 'label' => 'Hasta',
  2373.                 'attr' => ['class' => 'form-control'],
  2374.                 'widget' => 'single_text',
  2375.                 'format' => 'yyyy-MM-dd',
  2376.                 'data'  =>  new \DateTime()
  2377.             ])
  2378.             ->getForm();
  2379.             
  2380.         $form->handleRequest($request);
  2381.         if ($request->isMethod('POST') && $form->isSubmitted() && $form->isValid()) {
  2382.             $conn $entityManager->getConnection();
  2383.             if ($form->get('unidad')->getData() != '' && $form->get('finicio')->getData() != '' && $form->get('ffinal')->getData() != '') {
  2384.                 $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2385.                     FROM bitacora_movimientos bm
  2386.                     LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2387.                     WHERE bm.id_uni = :id_uni AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2388.                     GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2389.                 ";
  2390.                 $stmt $conn->prepare($sql);
  2391.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2392.                 $stmt->bindValue('finicio'$form->get('finicio')->getData()->format('Y-m-d H:i:s'));
  2393.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2394.             } elseif ($form->get('unidad')->getData() != '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() != '') {
  2395.                 $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2396.                     FROM bitacora_movimientos bm
  2397.                     LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2398.                     WHERE bm.id_uni = :id_uni AND bm.fecha_mov <= :ffinal
  2399.                     GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2400.                 ";
  2401.                 $stmt $conn->prepare($sql);
  2402.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2403.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2404.             } elseif ($form->get('unidad')->getData() != '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() == '') {
  2405.                 $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2406.                     FROM bitacora_movimientos bm
  2407.                     LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2408.                     WHERE bm.id_uni = :id_uni
  2409.                     GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2410.                 ";
  2411.                 $stmt $conn->prepare($sql);
  2412.                 $stmt->bindValue('id_uni'$form->get('unidad')->getData()->getIdUni());
  2413.             } elseif ($form->get('unidad')->getData() == '' && $form->get('finicio')->getData() != '' && $form->get('ffinal')->getData() != '') {
  2414.                 $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2415.                     FROM bitacora_movimientos bm
  2416.                     LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2417.                     WHERE bm.fecha_mov BETWEEN :finicio AND :ffinal
  2418.                     GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2419.                 ";
  2420.                 $stmt $conn->prepare($sql);
  2421.                 $stmt->bindValue('finicio'$form->get('finicio')->getData()->format('Y-m-d H:i:s'));
  2422.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2423.             } elseif ($form->get('unidad')->getData() == '' && $form->get('finicio')->getData() == '' && $form->get('ffinal')->getData() != '') {
  2424.                 $sql "SELECT *, bm.tipo_equipo AS bm_equipo, bm.fecha_mov AS bm_fecha_movimiento, COUNT(*) AS x_count
  2425.                     FROM bitacora_movimientos bm
  2426.                     LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2427.                     WHERE bm.fecha_mov <= :ffinal
  2428.                     GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2429.                 ";
  2430.                 $stmt $conn->prepare($sql);
  2431.                 $stmt->bindValue('ffinal'$form->get('ffinal')->getData()->add(new DateInterval('P1D'))->format('Y-m-d H:i:s'));
  2432.             } else {
  2433.                 $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2434.                     FROM bitacora_movimientos bm
  2435.                     LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2436.                     GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2437.                 ";
  2438.                 $stmt $conn->prepare($sql);
  2439.             }
  2440.             
  2441.             $resultSet $stmt->executeQuery();
  2442.             $movimientos $resultSet->fetchAll();
  2443.             return $this->render('consulta_solicitud/uso.html.twig', [
  2444.                 'form' => $form->createView(),
  2445.                 'movimientos' => $movimientos
  2446.             ]);
  2447.         }
  2448.         return $this->render('consulta_solicitud/uso.html.twig', [
  2449.             'form' => $form->createView(),
  2450.             'movimientos' => $movimientos
  2451.         ]);
  2452.     }
  2453.     #[Route('/componentes/uso/reporte'name'app_componentes_uso_reporte'methods: ['GET''POST'])]
  2454.     public function componentesUsoReporte(Request $requestEntityManagerInterface $entityManager): Response
  2455.     {
  2456.         ini_set('memory_limit''5120M');
  2457.         ini_set('max_execution_time'0);
  2458.         ini_set('output_buffering'0);
  2459.         /** var Usuario $user */
  2460.         $user $this->getUser();
  2461.         date_default_timezone_set('America/Mexico_City');
  2462.         setlocale(LC_ALL'es_MX');
  2463.         $fecha date('Y-m-d H:i:s');
  2464.         # Obtenemos los datos de la petición
  2465.         /** @var Usuario $user */
  2466.         $user $this->getUser();
  2467.         $filtro $request->request->get('form');
  2468.         $filtro['ffinal'] = new DateTime($filtro['ffinal']);
  2469.         $filtro['ffinal'] = $filtro['ffinal']->add(new DateInterval('P1D'))->format('Y-m-d');
  2470.         $conn $entityManager->getConnection();
  2471.         if ($filtro['unidad'] != '' && $filtro['finicio'] != '' && $filtro['ffinal'] != '') {
  2472.             $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2473.                 FROM bitacora_movimientos bm
  2474.                 LEFT JOIN (SELECT id_componente, tipo AS cc_tipo FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2475.                 LEFT JOIN (SELECT id_uni, nombre AS u_nombre FROM unidad) AS u ON u.id_uni = bm.id_uni
  2476.                 WHERE bm.id_uni = :id_uni AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2477.                 GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2478.             ";
  2479.             $stmt $conn->prepare($sql);
  2480.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2481.             $stmt->bindValue('finicio'$filtro['finicio']);
  2482.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2483.         } elseif ($filtro['unidad'] != '' && $filtro['finicio'] == '' && $filtro['ffinal'] != '') {
  2484.             $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2485.                 FROM bitacora_movimientos bm
  2486.                 LEFT JOIN (SELECT id_componente, tipo AS cc_tipo FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2487.                 LEFT JOIN (SELECT id_uni, nombre AS u_nombre FROM unidad) AS u ON u.id_uni = bm.id_uni
  2488.                 WHERE bm.id_uni = :id_uni AND bm.fecha_mov <= :ffinal
  2489.                 GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2490.             ";
  2491.             $stmt $conn->prepare($sql);
  2492.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2493.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2494.         } elseif ($filtro['unidad'] != '' && $filtro['finicio'] == '' && $filtro['ffinal'] == '') {
  2495.             $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2496.                 FROM bitacora_movimientos bm
  2497.                 LEFT JOIN (SELECT id_componente, tipo AS cc_tipo FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2498.                 LEFT JOIN (SELECT id_uni, nombre AS u_nombre FROM unidad) AS u ON u.id_uni = bm.id_uni
  2499.                 WHERE bm.id_uni = :id_uni
  2500.                 GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2501.             ";
  2502.             $stmt $conn->prepare($sql);
  2503.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2504.         } elseif ($filtro['unidad'] == '' && $filtro['finicio'] != '' && $filtro['ffinal'] != '') {
  2505.             $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2506.                 FROM bitacora_movimientos bm
  2507.                 LEFT JOIN (SELECT id_componente, tipo AS cc_tipo FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2508.                 LEFT JOIN (SELECT id_uni, nombre AS u_nombre FROM unidad) AS u ON u.id_uni = bm.id_uni
  2509.                 WHERE bm.fecha_mov BETWEEN :finicio AND :ffinal
  2510.                 GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2511.             ";
  2512.             $stmt $conn->prepare($sql);
  2513.             $stmt->bindValue('finicio'$filtro['finicio']);
  2514.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2515.         } elseif ($filtro['unidad'] == '' && $filtro['finicio'] == '' && $filtro['ffinal'] != '') {
  2516.             $sql "SELECT *, bm.tipo_equipo AS bm_equipo, bm.fecha_mov AS bm_fecha_movimiento, COUNT(*) AS x_count
  2517.                 FROM bitacora_movimientos bm
  2518.                 LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2519.                 LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2520.                 LEFT JOIN (SELECT id_sol, id_sol AS s_solicitud FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2521.                 LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2522.                 LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2523.                 WHERE bm.fecha_mov <= :ffinal
  2524.                 GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2525.             ";
  2526.             $stmt $conn->prepare($sql);
  2527.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2528.         } else {
  2529.             $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2530.                 FROM bitacora_movimientos bm
  2531.                 LEFT JOIN (SELECT id_componente, tipo AS cc_tipo FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2532.                 LEFT JOIN (SELECT id_uni, nombre AS u_nombre FROM unidad) AS u ON u.id_uni = bm.id_uni
  2533.                 GROUP BY cc_tipo ORDER BY cc_tipo ASC
  2534.             ";
  2535.             $stmt $conn->prepare($sql);
  2536.         }
  2537.         
  2538.         $resultSet $stmt->executeQuery();
  2539.         $movimientos $resultSet->fetchAll();
  2540.         # Definir el nombre temporal del archivo
  2541.         $filePath 'reporteRefacciones.xlsx';
  2542.         # Se definen las cabeceras del archivo
  2543.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Reporte de bitácora de uso de refacciones por periodo',]);
  2544.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Unidad: ' $user->getUnidad()->getNombre()]);
  2545.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Fecha de creación: ' $fecha]);
  2546.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Usuario: ' $user->getNombre() . ' ' $user->getPapellido() . ' ' $user->getSapellido()]);
  2547.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Fecha inicial: ' $filtro['finicio']]);
  2548.         $cabecera[] = WriterEntityFactory::createRowFromArray(['Fecha final: ' $filtro['ffinal']]);
  2549.         $cabecera[] = WriterEntityFactory::createRowFromArray(['']);
  2550.         $cabecera[] = WriterEntityFactory::createRowFromArray([
  2551.             'Componente',
  2552.             'Total usados'
  2553.         ]);
  2554.         # Se crea el arreglo con los datos del cuerpo del documento
  2555.         $data = [];
  2556.         foreach ($movimientos as $m) {
  2557.             $data[] = WriterEntityFactory::createRowFromArray([
  2558.                 $m['cc_tipo'],
  2559.                 $m['x_count']
  2560.             ]);
  2561.         }
  2562.         # Se crea el documento en formato CSV
  2563.         $writer WriterEntityFactory::createXLSXWriter();
  2564.         $writer
  2565.             ->openToFile($filePath)
  2566.             ->addRows($cabecera)
  2567.             ->addRows($data)
  2568.             ->close();
  2569.         $response = new BinaryFileResponse($filePath);
  2570.         $response->setContentDisposition(
  2571.             ResponseHeaderBag::DISPOSITION_ATTACHMENT,
  2572.             'reporteRefacciones' '_' date('Y-m-d') . '.xlsx'
  2573.         );
  2574.         $response->deleteFileAfterSend(true);
  2575.         return $response;
  2576.     }
  2577.     #[Route('/componentes/uso/reporte-pdf'name'app_componentes_uso_reporte_pdf'methods: ['POST'])]
  2578.     public function componentesUsoReportePdf(Request $requestSelloDigital $selloEntityManagerInterface $entityManager): Response
  2579.     {
  2580.         ini_set('memory_limit''5120M');
  2581.         ini_set('max_execution_time'0);
  2582.         ini_set('output_buffering'0);
  2583.         date_default_timezone_set('America/Mexico_City');
  2584.         setlocale(LC_ALL'es_MX');
  2585.         // Obtener la fecha actual
  2586.         $fecha date('d-m-Y');
  2587.         // Obtener usuario autenticado
  2588.         /** @var Usuario $user */
  2589.         $user $this->getUser();
  2590.         // Obtener los filtros del formulario
  2591.         $filtro $request->request->get('form');
  2592.         // Obtener las fechas del formulario o establecer fechas predeterminadas
  2593.         $filtro['finicio'] = !empty($filtro['finicio']) ? new DateTime($filtro['finicio']) : new DateTime('first day of this month');
  2594.         $filtro['ffinal'] = !empty($filtro['ffinal']) ? new DateTime($filtro['ffinal']) : new DateTime('last day of this month');
  2595.         // Aumentar el final por un día para incluir la fecha final
  2596.         $filtro['ffinal'] = $filtro['ffinal']->add(new DateInterval('P1D'))->format('Y-m-d');
  2597.         // Determinar la unidad a usar
  2598.         $unidadId = !empty($filtro['unidad']) ? $filtro['unidad'] : $user->getUnidad()->getIdUni();
  2599.         // Consulta SQL
  2600.         $conn $entityManager->getConnection();
  2601.         $sql "SELECT *, bm.id_mov, COUNT(*) AS x_count
  2602.         FROM bitacora_movimientos bm
  2603.         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2604.         LEFT JOIN (SELECT id_uni, nombre AS u_nombre FROM unidad) AS u ON u.id_uni = bm.id_uni
  2605.         WHERE bm.id_uni = :id_uni AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2606.         GROUP BY cc_tipo ORDER BY cc_tipo ASC";
  2607.         // Ejecutar la consulta usando la unidad determinada
  2608.         $stmt $conn->prepare($sql);
  2609.         $stmt->bindValue('id_uni'$unidadId);
  2610.         $stmt->bindValue('finicio'$filtro['finicio']->format('Y-m-d'));
  2611.         $stmt->bindValue('ffinal'$filtro['ffinal']);
  2612.         $resultSet $stmt->executeQuery();
  2613.         $movimientos $resultSet->fetchAll();
  2614.         // Instanciar TCPDF y configurar el documento
  2615.         $pdf = new DocumentoPDF1();
  2616.         $pdf->setPrintFooter(false);
  2617.         $pdf->SetCreator('Conalep Estado de México');
  2618.         $pdf->SetAuthor('SIGMEC');
  2619.         $pdf->SetTitle('Reporte');
  2620.         $pdf->SetAutoPageBreak(TRUEPDF_MARGIN_BOTTOM);
  2621.         $pdf->AddPage('P''JIS_B4');
  2622.         $pdf->SetY(70);
  2623.         $pdf->setFontSubsetting(true);
  2624.         // Generar el contenido HTML dinámico para el PDF
  2625.         $html = <<<EOD
  2626. <h1>Reporte de Uso de Refacciones</h1>
  2627. <p>Fecha de creación: {$fecha}</p>
  2628. <p>Unidad: {$user->getUnidad()->getNombre()}</p>
  2629. <p>Gestor: {$user->getNombre()} {$user->getPapellido()} {$user->getSapellido()}</p>
  2630. <p>Fecha inicial: {$filtro['finicio']->format('Y-m-d')}</p>
  2631. <p>Fecha final: {$filtro['ffinal']}</p>
  2632. <table border="1" cellspacing="3" cellpadding="4">
  2633.     <thead>
  2634.         <tr>
  2635.             <th>Componente</th>
  2636.             <th>Total usados</th>
  2637.         </tr>
  2638.     </thead>
  2639.     <tbody>
  2640. EOD;
  2641.         // Agregar los datos de los movimientos al HTML
  2642.         foreach ($movimientos as $movimiento) {
  2643.             $html .= "<tr>
  2644.                 <td>{$movimiento['cc_tipo']}</td>
  2645.                 <td>{$movimiento['x_count']}</td>
  2646.               </tr>";
  2647.         }
  2648.         $html .= <<<EOD
  2649.     </tbody>
  2650. </table>
  2651. EOD;
  2652.         // Escribir el contenido HTML en el PDF
  2653.         $pdf->writeHTML($htmltrue0true0);
  2654.         // Enviar el PDF como respuesta para descarga
  2655.         $pdf->Output('reporte.pdf''D');
  2656.         // Retornar la respuesta para evitar errores
  2657.         return new Response();
  2658.     }
  2659.     #[Route('/inventario/reporte-pdf'name'app_componentes_reporte_pdf'methods: ['GET''POST'])]
  2660.     public function inventario_bitacora_pdf_componentes(Request $requestSelloDigital $selloEntityManagerInterface $entityManager): Response
  2661.     {
  2662.         ini_set('memory_limit''5120M');
  2663.         ini_set('max_execution_time'0);
  2664.         ini_set('output_buffering'0);
  2665.         date_default_timezone_set('America/Mexico_City');
  2666.         setlocale(LC_ALL'es_MX');
  2667.         $fecha date('d-m-Y');
  2668.         $filtro $request->request->get('form');
  2669.         $filtro['ffinal'] = new DateTime($filtro['ffinal']);
  2670.         $filtro['ffinal'] = $filtro['ffinal']->add(new DateInterval('P1D'))->format('Y-m-d');
  2671.         $movimientos $this->filtroConsulta($filtro$entityManager);
  2672.         // Declaración de la instancia de TCPDF
  2673.         $pdf = new DocumentoPDF1();
  2674.         $pdf->setPrintFooter(false);
  2675.         $pdf->SetCreator('Conalep Estado de México');
  2676.         $pdf->SetAuthor('SIGMEC');
  2677.         $pdf->SetTitle('Reporte');
  2678.         $pdf->SetAutoPageBreak(TRUEPDF_MARGIN_BOTTOM);
  2679.         $pdf->setFontSubsetting(true);
  2680.         // Dividir movimientos en grupos de 9 elementos
  2681.         $chunks array_chunk($movimientos9);
  2682.         // Iterar sobre cada grupo de 9 elementos para generar una nueva página por grupo
  2683.         foreach ($chunks as $i => $chunk) {
  2684.             // Agregar una nueva página para cada grupo de movimientos
  2685.             $pdf->AddPage('L''JIS_B4');
  2686.             $pdf->SetY(70); // Ajustar el margen superior
  2687.             // Crear tabla HTML
  2688.             $html '
  2689.         <table border="1" cellpadding="4">
  2690.             <thead>
  2691.                 <tr style="font-weight: bold; background-color: #f2f2f2;">
  2692.                     <th>Unidad</th>
  2693.                     <th>Tipo</th>
  2694.                     <th>Descripción</th>
  2695.                     <th>Equipo</th>
  2696.                     <th>Marbete</th>
  2697.                     <th>Usuario</th>
  2698.                     <th>Fecha Movimiento</th>
  2699.                     <th>Marca</th>
  2700.                     <th>Modelo</th>
  2701.                     <th>Serie</th>
  2702.                     <th>Unidad Origen</th>
  2703.                     <th>Solicitud</th>
  2704.                 </tr>
  2705.             </thead>
  2706.             <tbody>';
  2707.             // Agregar los movimientos del chunk actual a la tabla
  2708.             foreach ($chunk as $m) {
  2709.                 $html .= '
  2710.                 <tr>
  2711.                     <td>' htmlspecialchars($m['d_unidad']) . '</td>
  2712.                     <td>' htmlspecialchars($m['cc_tipo']) . '</td>
  2713.                     <td>' htmlspecialchars($m['cc_descripcion']) . '</td>
  2714.                     <td>' htmlspecialchars($m['bm_equipo']) . '</td>
  2715.                     <td>' htmlspecialchars($m['equipo_marbete']) . '</td>
  2716.                     <td>' htmlspecialchars($m['usuario_nombre']) . '</td>
  2717.                     <td>' htmlspecialchars($m['bm_fecha_movimiento']) . '</td>
  2718.                     <td>' htmlspecialchars($m['i_marca']) . '</td>
  2719.                     <td>' htmlspecialchars($m['i_modelo']) . '</td>
  2720.                     <td>' htmlspecialchars($m['i_serie']) . '</td>
  2721.                     <td>' htmlspecialchars($m['u_nombre']) . '</td>
  2722.                     <td>' htmlspecialchars($m['s_solicitud']) . '</td>
  2723.                 </tr>';
  2724.             }
  2725.             $html .= '
  2726.             </tbody>
  2727.         </table>';
  2728.             // Escribir el HTML de la tabla en la página actual
  2729.             $pdf->writeHTML($htmltruefalsetruefalse'');
  2730.         }
  2731.         // Enviar el PDF como respuesta para descarga
  2732.         $pdf->Output('reporte.pdf''I');
  2733.         return new Response(); // Este return evita un error, el PDF se envía directamente al navegador
  2734.     }
  2735.     public function filtroConsulta($filtroEntityManagerInterface $entityManager)
  2736.     {
  2737.         $conn $entityManager->getConnection();
  2738.         if ($filtro['componente'] != '' && $filtro['unidad'] != '' && $filtro['finicio'] != '' && $filtro['ffinal'] != '') {
  2739.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2740.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2741.                                bm.observacion AS bm_observacion, 
  2742.                                u.u_nombre,
  2743.                                d.d_unidad,
  2744.                                s.id_sol AS s_solicitud,
  2745.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2746.                                s.falla AS s_falla,
  2747.                                s.srealizado AS s_srealizado,
  2748.                                s.fevaluacion AS s_fevaluacion,
  2749.                                s.refacciones AS s_refacciones,
  2750.                                s.estatus AS s_estatus,
  2751.                                s.unidad AS s_unidad,
  2752.                                cc.cc_tipo, 
  2753.                                cc.cc_descripcion,
  2754.                                eq.marbete AS equipo_marbete,
  2755.                                eq.serie AS equipo_serie,
  2756.                                us.usuario_nombre
  2757.                         FROM bitacora_movimientos bm
  2758.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2759.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2760.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2761.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2762.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2763.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2764.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2765.                 WHERE cc.id_componente = :tipo AND bm.id_uni = :id_uni AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2766.             ";
  2767.             $stmt $conn->prepare($sql);
  2768.             $stmt->bindValue('tipo'$filtro['componente']);
  2769.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2770.             $stmt->bindValue('finicio'$filtro['finicio']);
  2771.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2772.         } elseif ($filtro['componente'] != '' && $filtro['unidad'] != '' && $filtro['finicio'] == '' && $filtro['ffinal'] != '') {
  2773.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2774.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2775.                                bm.observacion AS bm_observacion, 
  2776.                                u.u_nombre,
  2777.                                d.d_unidad,
  2778.                                s.id_sol AS s_solicitud,
  2779.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2780.                                s.falla AS s_falla,
  2781.                                s.srealizado AS s_srealizado,
  2782.                                s.fevaluacion AS s_fevaluacion,
  2783.                                s.refacciones AS s_refacciones,
  2784.                                s.estatus AS s_estatus,
  2785.                                s.unidad AS s_unidad,
  2786.                                cc.cc_tipo, 
  2787.                                cc.cc_descripcion,
  2788.                                eq.marbete AS equipo_marbete,
  2789.                                eq.serie AS equipo_serie,
  2790.                                us.usuario_nombre
  2791.                         FROM bitacora_movimientos bm
  2792.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2793.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2794.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2795.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2796.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2797.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2798.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2799.                 WHERE cc_tipo = :tipo AND bm.id_uni = :id_uni AND bm.fecha_mov <= :ffinal
  2800.             ";
  2801.             $stmt $conn->prepare($sql);
  2802.             $stmt->bindValue('tipo'$filtro['componente']);
  2803.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2804.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2805.         } elseif ($filtro['componente'] != '' && $filtro['unidad'] != '' && $filtro['finicio'] == '' && $filtro['ffinal'] == '') {
  2806.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2807.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2808.                                bm.observacion AS bm_observacion, 
  2809.                                u.u_nombre,
  2810.                                d.d_unidad,
  2811.                                s.id_sol AS s_solicitud,
  2812.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2813.                                s.falla AS s_falla,
  2814.                                s.srealizado AS s_srealizado,
  2815.                                s.fevaluacion AS s_fevaluacion,
  2816.                                s.refacciones AS s_refacciones,
  2817.                                s.estatus AS s_estatus,
  2818.                                s.unidad AS s_unidad,
  2819.                                cc.cc_tipo, 
  2820.                                cc.cc_descripcion,
  2821.                                eq.marbete AS equipo_marbete,
  2822.                                eq.serie AS equipo_serie,
  2823.                                us.usuario_nombre
  2824.                         FROM bitacora_movimientos bm
  2825.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2826.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2827.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2828.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2829.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2830.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2831.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2832.                 WHERE cc_tipo = :tipo AND bm.id_uni = :id_uni
  2833.             ";
  2834.             $stmt $conn->prepare($sql);
  2835.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2836.             $stmt->bindValue('tipo'$filtro['componente']);
  2837.         } elseif ($filtro['componente'] != '' && $filtro['unidad'] == '' && $filtro['finicio'] != '' && $filtro['ffinal'] != '') {
  2838.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2839.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2840.                                bm.observacion AS bm_observacion, 
  2841.                                u.u_nombre,
  2842.                                d.d_unidad,
  2843.                                s.id_sol AS s_solicitud,
  2844.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2845.                                s.falla AS s_falla,
  2846.                                s.srealizado AS s_srealizado,
  2847.                                s.fevaluacion AS s_fevaluacion,
  2848.                                s.refacciones AS s_refacciones,
  2849.                                s.estatus AS s_estatus,
  2850.                                s.unidad AS s_unidad,
  2851.                                cc.cc_tipo, 
  2852.                                cc.cc_descripcion,
  2853.                                eq.marbete AS equipo_marbete,
  2854.                                eq.serie AS equipo_serie,
  2855.                                us.usuario_nombre
  2856.                         FROM bitacora_movimientos bm
  2857.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2858.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2859.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2860.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2861.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2862.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2863.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2864.                 WHERE cc_tipo = :tipo AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2865.             ";
  2866.             $stmt $conn->prepare($sql);
  2867.             $stmt->bindValue('tipo'$filtro['componente']);
  2868.             $stmt->bindValue('finicio'$filtro['finicio']);
  2869.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2870.         } elseif ($filtro['componente'] != '' && $filtro['unidad'] == '' && $filtro['finicio'] == '' && $filtro['ffinal'] != '') {
  2871.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2872.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2873.                                bm.observacion AS bm_observacion, 
  2874.                                u.u_nombre,
  2875.                                d.d_unidad,
  2876.                                s.id_sol AS s_solicitud,
  2877.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2878.                                s.falla AS s_falla,
  2879.                                s.srealizado AS s_srealizado,
  2880.                                s.fevaluacion AS s_fevaluacion,
  2881.                                s.refacciones AS s_refacciones,
  2882.                                s.estatus AS s_estatus,
  2883.                                s.unidad AS s_unidad,
  2884.                                cc.cc_tipo, 
  2885.                                cc.cc_descripcion,
  2886.                                eq.marbete AS equipo_marbete,
  2887.                                eq.serie AS equipo_serie,
  2888.                                us.usuario_nombre
  2889.                         FROM bitacora_movimientos bm
  2890.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2891.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2892.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2893.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2894.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2895.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2896.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2897.                 WHERE cc_tipo = :tipo AND bm.fecha_mov <= :ffinal
  2898.             ";
  2899.             $stmt $conn->prepare($sql);
  2900.             $stmt->bindValue('tipo'$filtro['componente']);
  2901.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2902.         } elseif ($filtro['componente'] != '' && $filtro['unidad'] == '' && $filtro['finicio'] == '' && $filtro['ffinal'] == '') {
  2903.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2904.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2905.                                bm.observacion AS bm_observacion, 
  2906.                                u.u_nombre,
  2907.                                d.d_unidad,
  2908.                                s.id_sol AS s_solicitud,
  2909.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2910.                                s.falla AS s_falla,
  2911.                                s.srealizado AS s_srealizado,
  2912.                                s.fevaluacion AS s_fevaluacion,
  2913.                                s.refacciones AS s_refacciones,
  2914.                                s.estatus AS s_estatus,
  2915.                                s.unidad AS s_unidad,
  2916.                                cc.cc_tipo, 
  2917.                                cc.cc_descripcion,
  2918.                                eq.marbete AS equipo_marbete,
  2919.                                eq.serie AS equipo_serie,
  2920.                                us.usuario_nombre
  2921.                         FROM bitacora_movimientos bm
  2922.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2923.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2924.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2925.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2926.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2927.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2928.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2929.                 WHERE cc_tipo = :tipo
  2930.             ";
  2931.             $stmt $conn->prepare($sql);
  2932.             $stmt->bindValue('tipo'$filtro['componente']);
  2933.         } elseif ($filtro['componente'] == '' && $filtro['unidad'] != '' && $filtro['finicio'] != '' && $filtro['ffinal'] != '') {
  2934.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2935.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2936.                                bm.observacion AS bm_observacion, 
  2937.                                u.u_nombre,
  2938.                                d.d_unidad,
  2939.                                s.id_sol AS s_solicitud,
  2940.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2941.                                s.falla AS s_falla,
  2942.                                s.srealizado AS s_srealizado,
  2943.                                s.fevaluacion AS s_fevaluacion,
  2944.                                s.refacciones AS s_refacciones,
  2945.                                s.estatus AS s_estatus,
  2946.                                s.unidad AS s_unidad,
  2947.                                cc.cc_tipo, 
  2948.                                cc.cc_descripcion,
  2949.                                eq.marbete AS equipo_marbete,
  2950.                                eq.serie AS equipo_serie,
  2951.                                us.usuario_nombre
  2952.                         FROM bitacora_movimientos bm
  2953.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2954.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2955.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2956.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2957.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2958.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2959.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2960.                 WHERE bm.id_uni = :id_uni AND bm.fecha_mov BETWEEN :finicio AND :ffinal
  2961.             ";
  2962.             $stmt $conn->prepare($sql);
  2963.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2964.             $stmt->bindValue('finicio'$filtro['finicio']);
  2965.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2966.         } elseif ($filtro['componente'] == '' && $filtro['unidad'] != '' && $filtro['finicio'] == '' && $filtro['ffinal'] != '') {
  2967.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  2968.                                bm.fecha_mov AS bm_fecha_movimiento, 
  2969.                                bm.observacion AS bm_observacion, 
  2970.                                u.u_nombre,
  2971.                                d.d_unidad,
  2972.                                s.id_sol AS s_solicitud,
  2973.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  2974.                                s.falla AS s_falla,
  2975.                                s.srealizado AS s_srealizado,
  2976.                                s.fevaluacion AS s_fevaluacion,
  2977.                                s.refacciones AS s_refacciones,
  2978.                                s.estatus AS s_estatus,
  2979.                                s.unidad AS s_unidad,
  2980.                                cc.cc_tipo, 
  2981.                                cc.cc_descripcion,
  2982.                                eq.marbete AS equipo_marbete,
  2983.                                eq.serie AS equipo_serie,
  2984.                                us.usuario_nombre
  2985.                         FROM bitacora_movimientos bm
  2986.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  2987.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  2988.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  2989.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  2990.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  2991.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  2992.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  2993.                 WHERE bm.id_uni = :id_uni AND bm.fecha_mov <= :ffinal
  2994.             ";
  2995.             $stmt $conn->prepare($sql);
  2996.             $stmt->bindValue('id_uni'$filtro['unidad']);
  2997.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  2998.         } elseif ($filtro['componente'] == '' && $filtro['unidad'] != '' && $filtro['finicio'] == '' && $filtro['ffinal'] == '') {
  2999.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  3000.                                bm.fecha_mov AS bm_fecha_movimiento, 
  3001.                                bm.observacion AS bm_observacion, 
  3002.                                u.u_nombre,
  3003.                                d.d_unidad,
  3004.                                s.id_sol AS s_solicitud,
  3005.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  3006.                                s.falla AS s_falla,
  3007.                                s.srealizado AS s_srealizado,
  3008.                                s.fevaluacion AS s_fevaluacion,
  3009.                                s.refacciones AS s_refacciones,
  3010.                                s.estatus AS s_estatus,
  3011.                                s.unidad AS s_unidad,
  3012.                                cc.cc_tipo, 
  3013.                                cc.cc_descripcion,
  3014.                                eq.marbete AS equipo_marbete,
  3015.                                eq.serie AS equipo_serie,
  3016.                                us.usuario_nombre
  3017.                         FROM bitacora_movimientos bm
  3018.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  3019.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  3020.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  3021.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  3022.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  3023.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  3024.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  3025.                 WHERE bm.id_uni = :id_uni
  3026.             ";
  3027.             $stmt $conn->prepare($sql);
  3028.             $stmt->bindValue('id_uni'$filtro['unidad']);
  3029.         } elseif ($filtro['componente'] == '' && $filtro['unidad'] == '' && $filtro['finicio'] != '' && $filtro['ffinal'] != '') {
  3030.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  3031.                                bm.fecha_mov AS bm_fecha_movimiento, 
  3032.                                bm.observacion AS bm_observacion, 
  3033.                                u.u_nombre,
  3034.                                d.d_unidad,
  3035.                                s.id_sol AS s_solicitud,
  3036.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  3037.                                s.falla AS s_falla,
  3038.                                s.srealizado AS s_srealizado,
  3039.                                s.fevaluacion AS s_fevaluacion,
  3040.                                s.refacciones AS s_refacciones,
  3041.                                s.estatus AS s_estatus,
  3042.                                s.unidad AS s_unidad,
  3043.                                cc.cc_tipo, 
  3044.                                cc.cc_descripcion,
  3045.                                eq.marbete AS equipo_marbete,
  3046.                                eq.serie AS equipo_serie,
  3047.                                us.usuario_nombre
  3048.                         FROM bitacora_movimientos bm
  3049.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  3050.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  3051.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  3052.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  3053.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  3054.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  3055.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  3056.                 WHERE bm.fecha_mov BETWEEN :finicio AND :ffinal
  3057.             ";
  3058.             $stmt $conn->prepare($sql);
  3059.             $stmt->bindValue('finicio'$filtro['finicio']);
  3060.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  3061.         } elseif ($filtro['componente'] == '' && $filtro['unidad'] == '' && $filtro['finicio'] == '' && $filtro['ffinal'] != '') {
  3062.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  3063.                                bm.fecha_mov AS bm_fecha_movimiento, 
  3064.                                bm.observacion AS bm_observacion, 
  3065.                                u.u_nombre,
  3066.                                d.d_unidad,
  3067.                                s.id_sol AS s_solicitud,
  3068.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  3069.                                s.falla AS s_falla,
  3070.                                s.srealizado AS s_srealizado,
  3071.                                s.fevaluacion AS s_fevaluacion,
  3072.                                s.refacciones AS s_refacciones,
  3073.                                s.estatus AS s_estatus,
  3074.                                s.unidad AS s_unidad,
  3075.                                cc.cc_tipo, 
  3076.                                cc.cc_descripcion,
  3077.                                eq.marbete AS equipo_marbete,
  3078.                                eq.serie AS equipo_serie,
  3079.                                us.usuario_nombre
  3080.                         FROM bitacora_movimientos bm
  3081.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  3082.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  3083.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  3084.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  3085.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  3086.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  3087.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  3088.                 WHERE bm.fecha_mov <= :ffinal
  3089.             ";
  3090.             $stmt $conn->prepare($sql);
  3091.             $stmt->bindValue('ffinal'$filtro['ffinal']);
  3092.         } else {
  3093.             $sql "SELECT DISTINCT *, bm.tipo_equipo AS bm_equipo, 
  3094.                                bm.fecha_mov AS bm_fecha_movimiento, 
  3095.                                bm.observacion AS bm_observacion, 
  3096.                                u.u_nombre,
  3097.                                d.d_unidad,
  3098.                                s.id_sol AS s_solicitud,
  3099.                                s.tipo_mantenimiento AS s_tipo_mantenimiento,
  3100.                                s.falla AS s_falla,
  3101.                                s.srealizado AS s_srealizado,
  3102.                                s.fevaluacion AS s_fevaluacion,
  3103.                                s.refacciones AS s_refacciones,
  3104.                                s.estatus AS s_estatus,
  3105.                                s.unidad AS s_unidad,
  3106.                                cc.cc_tipo, 
  3107.                                cc.cc_descripcion,
  3108.                                eq.marbete AS equipo_marbete,
  3109.                                eq.serie AS equipo_serie,
  3110.                                us.usuario_nombre
  3111.                         FROM bitacora_movimientos bm
  3112.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS u_nombre FROM usuario) AS u ON u.id_usu = bm.id_usu
  3113.                         LEFT JOIN (SELECT id_uni, nombre AS d_unidad FROM unidad) AS d ON d.id_uni = bm.id_uni
  3114.                         LEFT JOIN (SELECT id_sol, tipo_equipo, id_equipo, ubicacion, usuario, gestor, periodo, tipo_mantenimiento, falla, srealizado, fregistro, fatencion, ffin, fevaluacion, refacciones, estatus, unidad FROM solicitud) AS s ON s.id_sol = bm.id_solicitud
  3115.                         LEFT JOIN (SELECT id_componente, tipo AS cc_tipo, descripcion AS cc_descripcion FROM cat_componentes) AS cc ON cc.id_componente = bm.id_componente
  3116.                         LEFT JOIN (SELECT id_componente, marca AS i_marca, modelo AS i_modelo, serie AS i_serie FROM inventario) AS i ON i.id_componente = cc.id_componente
  3117.                         LEFT JOIN equipo eq ON eq.id_equ = s.id_equipo
  3118.                         LEFT JOIN (SELECT id_usu, CONCAT(nombre, ' ', papellido, ' ', sapellido) AS usuario_nombre FROM usuario) AS us ON us.id_usu = eq.usuario
  3119.             ";
  3120.             $stmt $conn->prepare($sql);
  3121.         }
  3122.         $resultSet $stmt->executeQuery();
  3123.         return $resultSet->fetchAll();
  3124.     }
  3125. }