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