<?php
namespace App\Controller;
use App\Entity\BitacoraMovimientos;
use App\Entity\CatComponentes;
use App\Entity\CatTiposMovimientos;
use App\Entity\Equipo;
use App\Entity\Unidad;
use App\Entity\Usuario;
use App\Form\EquipoType;
use App\Form\UnidadFiltroType;
use App\Repository\EquipoRepository;
use App\Repository\BitacoraMovimientosRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use DateTime;
use Dompdf\Dompdf;
use Dompdf\Options;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use App\Entity\Inventario;
/*
------------- COMPORTAMIENTOS -------------
0 = Sin acceso
1 = Administración de equipo del plantel
2 = Administración de equipo universal
3 = Visualización universal
*/
#[Route('/equipo')]
class EquipoController extends AbstractController
{
#[Route('/', name: 'app_equipo_index', methods: ['GET', 'POST'])]
public function index(Request $request, EquipoRepository $equipoRepository): RedirectResponse|JsonResponse|Response
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[4]["nivel"];
# Si el nivel de acceso es 0 = "Sin acceso" entonces se retorna a página de inicio
if ($nivel == 0) {
$this->addFlash('danger', 'El acceso a agregar "Equipos de cómputo" está restringido.');
return $this->redirectToRoute('homepage');
}
# Usuario que está autenticado
/** @var Usuario $user */
$user = $this->getUser();
$rol = $user->getRol() ? $user->getRol()->getIdRol() : null;
# Verifica el estado de la unidad del usuario
$unidad = $user->getUnidad();
/*if ($unidad && !$unidad->getActiva()) {
// Agrega una notificación persistente
$this->addFlash('warning', 'La unidad a la que está asociado está inactiva. Solicite al administrador la activación de la unidad.');
//return $this->redirectToRoute('homepage');
}*/
$unidadActiva = true; // Asume que la unidad está activa
if ($unidad && !$unidad->getActiva()) {
$unidadActiva = false; // Cambia el estado si la unidad no está activa
//$this->addFlash('warning', 'En este momento no tiene privilegios para editar sus inventarios, si lo requiere, por favor solicítelo al Administrador.');
}
# Formulario de filtro por unidad
$uni = in_array($nivel, [1, 2, 3, 4, 5, 6]);
$form = $this->createForm(UnidadFiltroType::class, null, ['unidad' => $uni, 'tipo' => 'equipo']);
$form->handleRequest($request);
if ($request->isMethod('POST')) {
$criteria = [];
# Verifica y añade los criterios de búsqueda
if ($form['unidad']->getData()) {
$criteria['unidad'] = $form['unidad']->getData()->getIdUni();
}
if ($form['marca']->getData()) {
$criteria['marca'] = $form['marca']->getData()->getMarca();
}
if ($form['modelo']->getData()) {
$criteria['modelo'] = $form['modelo']->getData()->getModelo();
}
if ($form['uso']->getData()) {
$criteria['uso'] = $form['uso']->getData();
}
if ($form['estatus']->getData()) {
$criteria['estatus'] = $form['estatus']->getData();
}
# Obtiene los equipos según los criterios
$equipos = empty($criteria) ? $equipoRepository->findAll() : $equipoRepository->findBy($criteria);
# Procesa los datos para JSON
$data = [];
foreach ($equipos as $equipo) {
$estatus = match ($equipo->getEstatus()) {
'1' => '<span class="badge bg-gradient-green d-block">En operación</span>',
'2' => '<span class="badge bg-gradient-orange d-block">Descompuesto</span>',
'3' => '<span class="badge bg-gradient-primary d-block">Sin instalar</span>',
'4' => '<span class="badge bg-gradient-yellow d-block">En proceso de baja</span>',
'5' => '<span class="badge bg-gradient-danger d-block">Baja</span>',
default => ""
};
$uso = match ($equipo->getUso()) {
'1' => '<span>Educativo</span>',
'2' => '<span>Docente</span>',
'3' => '<span>Administrativo</span>',
default => ""
};
$ver = $this->generateUrl('app_equipo_show', ['idEqu' => $equipo->getIdEqu()]);
$editar = $this->generateUrl('app_equipo_edit', ['idEqu' => $equipo->getIdEqu()]);
$resguardo_editar = $this->generateUrl('app_equipo_edit_resguardo', ['idEqu' => $equipo->getIdEqu()]);
$data[] = [
'idEqu' => $equipo->getIdEqu(),
'marbete' => $equipo->getMarbete(),
'descripcion' => $equipo->getDescripcion(),
'marca' => $equipo->getMarca(),
'modelo' => $equipo->getModelo(),
'uso' => $uso,
'estatus' => $estatus,
'emhv' => ($equipo->isEmhv()) ? '<span class="badge bg-gradient-green d-block">Cumple</span>' : '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
'unidad' => $equipo->getUnidad()->getNombre(),
'usuario' => $equipo->getUsuario()->getNombre() . ' ' . $equipo->getUsuario()->getPapellido(),
'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 3, 3) . ' - ' . $equipo->getUbicacion()->getArea(),
'ver' => $ver,
'editar' => $editar,
'editar_resguardo' => $resguardo_editar
];
}
return new JsonResponse($data, Response::HTTP_OK);
}
# Lógica para determinar la lista de equipos basada en el nivel de acceso
if ($nivel == 1) {
$equipos = $equipoRepository->findBy(['unidad' => $user->getUnidad()]);
} elseif (in_array($nivel, [2, 3])) {
$equipos = $equipoRepository->findAll();
} else {
$equipos = [];
}
return $this->render('equipo/index.html.twig', [
'equipos' => $equipos,
'form' => $form->createView(),
'nivel' => $nivel,
'unidadActiva' => $unidadActiva,
'rol' => $rol,
]);
}
#[Route('/new', name: 'app_equipo_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response #Request $request, EquipoRepository $equipoRepository
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[4]["nivel"];
# Si el nivel de acceso es 0, 2 o 3 entonces se retorna a página de inicio
if (in_array($nivel, [0, 2, 3])) {
$this->addFlash('danger', 'El acceso a agregar "Equipos de cómputo" está restringido.');
return $this->redirectToRoute('homepage');
}
/** @var Usuario $user */
$user = $this->getUser();
date_default_timezone_set("America/Mexico_City");
$fecha = new DateTime();
# Se contruye el formulario
$equipo = new Equipo();
$form = $this->createForm(EquipoType::class, $equipo, ['unidad' => true, 'bloquear_edicion' => false]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$equipo->setUnidad($user->getUnidad());
$equipo->setFactualizacion($fecha);
$equipo->setFalta($fecha);
# Cálculo del Estandar Mínimo Hardware Vigente
$equipo->setEmhv(0);
if (intval($equipo->getRam()) >= 4) {
if (intval($equipo->getNucleos()) >= 4) {
if (floatval($equipo->getCpuVelocidad()) >= 3.2) {
$equipo->setEmhv(1);
}
}
}
$entityManager->persist($equipo);
$entityManager->flush();
return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('equipo/new.html.twig', [
'equipo' => $equipo,
'form' => $form
]);
}
/*#[Route('/show', name: 'app_equipo_show', methods: ['POST'])]
public function show(Request $request, EquipoRepository $equipoRepository): Response
{
$idEqu = $request->request->get('idEqu');
$equipo = $equipoRepository->findOneBy(['idEqu' => $idEqu]);
return $this->render('equipo/show.html.twig', [
'equipo' => $equipo,
]);
}*/
#[Route('/show', name: 'app_equipo_show', methods: ['POST'])]
public function show(Request $request, EquipoRepository $equipoRepository, BitacoraMovimientosRepository $bitacoraRepository): Response
{
$idEqu = $request->request->get('idEqu');
$equipo = $equipoRepository->findOneBy(['idEqu' => $idEqu]);
if (!$equipo) {
throw $this->createNotFoundException('No se encontró el equipo con el ID: ' . $idEqu);
}
// Obtener las bitácoras relacionadas con el equipo
$bitacoras = $bitacoraRepository->findBy(['idEqu' => $idEqu]);
// Ordenar las bitácoras por fecha en orden ascendente
usort($bitacoras, function ($a, $b) {
return $a->getFechaMov() <=> $b->getFechaMov();
});
return $this->render('equipo/show.html.twig', [
'equipo' => $equipo,
'bitacoras' => $bitacoras,
]);
}
#[Route('/{idEqu}/edit', name: 'app_equipo_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Equipo $equipo, EntityManagerInterface $entityManager): Response
{
// Datos de la solicitud
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[4]["nivel"];
# Bloqueo de edición de [Merbete, Descripción, Marca, Modelo, No. serie] exceptuando al comportamiento 2
$bloquear_edicion = true;
$unidad = true;
($nivel == 2) && $bloquear_edicion = false;
($nivel == 2) && $unidad = false;
# Se contruye el formulario
$form = $this->createForm(EquipoType::class, $equipo, ['unidad' => $unidad, 'bloquear_edicion' => $bloquear_edicion]);
$form->handleRequest($request);
/** @var Usuario $user */
$user = $this->getUser();
date_default_timezone_set("America/Mexico_City");
$fecha = new DateTime();
if ($form->isSubmitted() && $form->isValid()) {
$equipo->setFactualizacion($fecha);
$equipo->setUnidad($equipo->getUbicacion()->getUnidad());
# Cálculo del Estandar Mínimo Hardware Vigente
$equipo->setEmhv(0);
if (intval($equipo->getRam()) >= 4) {
if (intval($equipo->getNucleos()) >= 4) {
if (floatval($equipo->getCpuVelocidad()) >= 3.2) {
$equipo->setEmhv(1);
}
}
}
$entityManager->persist($equipo);
$entityManager->flush();
//$equipoRepository->add($equipo, true);
if ($equipo->getEstatus() == 2){
$estatus = "Descompuesto";
}elseif ($equipo->getEstatus() == 1){
$estatus = "En operacion";
}elseif ($equipo->getEstatus() == 3){
$estatus = "Sin instalar";
}elseif ($equipo->getEstatus() == 4){
$estatus = "En proceso de baja";
}elseif ($equipo->getEstatus() == 5){
$estatus = "Baja";
}
$data = array(
'idEqu' => $equipo->getIdEqu(),
'marbete' => $equipo->getMarbete(),
'descripcion' => $equipo->getDescripcion(),
'marca' => $equipo->getMarca(),
'modelo' => $equipo->getModelo(),
'estatus' => $estatus,
'emhv' => ($equipo->isEmhv()) ? '<span class="badge bg-gradient-green d-block">Cumple</span>' : '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
'usuario' => $equipo->getUsuario()->getNombre() . ' ' . $equipo->getUsuario()->getPapellido(),
'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 3, 3) . ' - ' . $equipo->getUbicacion()->getArea(),
'mensaje' => 'Se actualizo correctamente',
);
return new JsonResponse($data);
//return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
}
if($form->isSubmitted() && !$form->isValid()){
$view = $this->renderView('equipo/modal.html.twig', [
'equipo' => $equipo,
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
return $response;
}
return $this->renderForm('equipo/modal.html.twig', [
'equipo' => $equipo,
'form' => $form,
]);
}
#[Route('/{idEqu}/editrefaccion', name: 'app_equipo_editrefaccion', methods: ['GET', 'POST'])]
public function editRefaccion(Request $request, Equipo $equipo, EntityManagerInterface $entityManager): Response
{
/** @var Usuario $user */
$user = $this->getUser();
// Datos de la solicitud
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[4]["nivel"];
// Bloqueo de edición de los campos excepto al comportamiento 2
$bloquear_edicion = true;
$unidad = true;
if ($nivel == 2) {
$bloquear_edicion = false;
$unidad = false;
}
// Construir el formulario
$form = $this->createForm(EquipoType::class, $equipo, ['unidad' => $unidad, 'bloquear_edicion' => $bloquear_edicion]);
$form->remove('estatus');
$form->remove('usuario');
$form->remove('ubicacion');
$form->remove('gestor');
$form->remove('funcion'); // Remover el campo funcion
$form->remove('funcionDescripcion'); // Remover el campo funcionDescripcion
$form->remove('uso'); // Remover el campo uso
$form->remove('unidad'); // Remover el campo unidad
$form->handleRequest($request);
date_default_timezone_set("America/Mexico_City");
$fecha = new DateTime();
if ($form->isSubmitted() && $form->isValid()) {
if ($request->request->has('componente')){
date_default_timezone_set('America/Mexico_City');
$condicion = implode(',', $request->request->get('componente'));
$usuario = $entityManager->getRepository(Usuario::class)->findOneBy(['idUsu' => $user->getIdUsu()]);
$unidad = $entityManager->getRepository(Unidad::class)->findOneBy(['idUni' => $user->getUnidad()]);
$tMovimiento = $entityManager->getRepository(CatTiposMovimientos::class)->findOneBy(['idMov' => 5]);
$conn = $entityManager->getConnection();
$sql = "SELECT *
FROM inventario WHERE id_inventario IN (" . $condicion . ")
";
$stmt = $conn->prepare($sql);
$resultSet = $stmt->executeQuery();
$componentes = $resultSet->fetchAll();
$factual = new DateTime();
foreach ($componentes as $componente) {
$iComponente = $entityManager->getRepository(CatComponentes::class)->findOneBy(['idComponente' => $componente['id_componente']]);
$c = new BitacoraMovimientos();
$c->setTipoMov($tMovimiento);
$c->setFechaMov($factual);
$c->setIdUsu($usuario);
$c->setIdComponente($iComponente);
$c->setIdUni($unidad);
$c->setTipoEquipo('Equipo');
$c->setIdEqu($equipo->getIdEqu());
$entityManager->persist($c);
$entityManager->flush();
// Actualizar el campo en_uso en el registro de inventario
$inventario = $entityManager->getRepository(Inventario::class)->find($componente['id_inventario']);
if ($inventario) {
$inventario->setEnUso(0);
$entityManager->persist($inventario);
$entityManager->flush();
}
}
}
$equipo->setFactualizacion($fecha);
$equipo->setUnidad($equipo->getUbicacion()->getUnidad());
// Cálculo del Estándar Mínimo Hardware Vigente
$equipo->setEmhv(0);
if (intval($equipo->getRam()) >= 4 && intval($equipo->getNucleos()) >= 4 && floatval($equipo->getCpuVelocidad()) >= 3.2) {
$equipo->setEmhv(1);
}
$entityManager->persist($equipo);
$entityManager->flush();
$estatus = match ($equipo->getEstatus()) {
2 => "Descompuesto",
1 => "En operación",
3 => "Sin instalar",
4 => "En proceso de baja",
5 => "Baja",
default => "Desconocido",
};
$data = [
'idEqu' => $equipo->getIdEqu(),
'marbete' => $equipo->getMarbete(),
'descripcion' => $equipo->getDescripcion(),
'marca' => $equipo->getMarca(),
'modelo' => $equipo->getModelo(),
'estatus' => $estatus,
'emhv' => $equipo->isEmhv() ? '<span class="badge bg-gradient-green d-block">Cumple</span>' : '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
'usuario' => $equipo->getUsuario()->getNombre() . ' ' . $equipo->getUsuario()->getPapellido(),
'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 3, 3) . ' - ' . $equipo->getUbicacion()->getArea(),
'mensaje' => 'Se actualizó correctamente',
];
return new JsonResponse($data);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('equipo/modalrefaccion.html.twig', [
'equipo' => $equipo,
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
return $response;
}
return $this->renderForm('equipo/modalrefaccion.html.twig', [
'equipo' => $equipo,
'form' => $form,
]);
}
#[Route('/{idEqu}', name: 'app_equipo_delete', methods: ['POST'])]
public function delete(Request $request, Equipo $equipo, EquipoRepository $equipoRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$equipo->getIdEqu(), $request->request->get('_token'))) {
$equipoRepository->remove($equipo, true);
}
return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/pdf/{idEqu}', name: 'equipo_pdf')]
public function generaResguardoPdf(Equipo $equipo): Response
{
// Configura Dompdf
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
// Inicializa Dompdf
$dompdf = new Dompdf($pdfOptions);
// Renderiza la plantilla Twig
$html = $this->renderView('equipo/pdf.html.twig', [
'equipo' => $equipo
]);
// Carga el HTML en Dompdf
$dompdf->loadHtml($html);
// (Opcional) Configura el tamaño de papel y la orientación
$dompdf->setPaper('A4', 'portrait');
// Renderiza el PDF
$dompdf->render();
// Obtiene el contenido del PDF generado
$pdfOutput = $dompdf->output();
// Devuelve una respuesta con el contenido del PDF como un archivo adjunto
return new Response($pdfOutput, Response::HTTP_OK, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'attachment; filename="equipo_' . $equipo->getIdEqu() . '.pdf"',
]);
}
/**
* @Route("/upload-excel", name="xlsx")
* @param Request $request
* @throws \Exception
*/
#[Route('/{idEqu}', name: 'app_equipo_upload-excel', methods: ['POST'])]
public function upload(Equipo $equipo): Response
{
return $this->render('equipo/show.html.twig', [
'equipo' => $equipo,
]);
}
#[Route('/download/excel/{id}', name: 'app_equipo_download_excel', methods: ['GET'])]
public function downloadExcel(int $id, EquipoRepository $equipoRepository, BitacoraMovimientosRepository $bitacoraRepository): StreamedResponse
{
// Limpiar cualquier salida previa
ob_end_clean();
// Obtener el equipo por su ID
$equipo = $equipoRepository->find($id);
if (!$equipo) {
throw $this->createNotFoundException('No se encontró el equipo con el ID: ' . $id);
}
// Obtener las bitácoras relacionadas con el equipo
$bitacoras = $bitacoraRepository->findBy(['idEqu' => $id]);
// Ordenar las bitácoras por fecha en orden ascendente
usort($bitacoras, function ($a, $b) {
return $a->getFechaMov() <=> $b->getFechaMov();
});
// Obtener la información del usuario
/** @var Usuario $user */
$user = $this->getUser();
$nombreUsuario = $user->getNombre();
$unidadAdministrativa = $user->getUnidadAdministrativa(); // Ajusta el método según cómo obtengas la unidad administrativa
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Datos del Equipo y Bitacora');
// Establecer el encabezado principal
$sheet->setCellValue('A1', 'Reporte Asignación de Refacciones')
->mergeCells('A1:J1')
->getStyle('A1:J1')->applyFromArray([
'font' => ['bold' => true, 'size' => 16],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER]
]);
// Información adicional
$sheet->setCellValue('A2', 'Unidad Administrativa: ' . $unidadAdministrativa)
->mergeCells('A2:J2')
->getStyle('A2:J2')->applyFromArray([
'font' => ['italic' => true],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER]
]);
$sheet->setCellValue('A3', 'Usuario que Generó el Reporte: ' . $nombreUsuario)
->mergeCells('A3:J3')
->getStyle('A3:J3')->applyFromArray([
'font' => ['italic' => true],
'alignment' => ['horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER]
]);
// Establecer los encabezados de columna para datos del equipo
$sheet->setCellValue('A5', 'ID')
->setCellValue('B5', 'Marbete')
->setCellValue('C5', 'Descripción')
->setCellValue('D5', 'Marca')
->setCellValue('E5', 'Modelo')
->setCellValue('F5', 'Estatus')
->setCellValue('G5', 'Cumplimiento EMHV')
->setCellValue('H5', 'Usuario Resguardatario')
->setCellValue('I5', 'Ubicación');
// Llenar la hoja con los datos del equipo
$estatus = match ($equipo->getEstatus()) {
'0' => 'Descompuesto',
'1' => 'En operación',
'2' => 'Sin instalar',
'3' => 'En proceso de baja',
'4' => 'Baja',
default => ''
};
$emhv = $equipo->isEmhv() ? 'Cumple' : 'No Cumple';
$usuario = $equipo->getUsuario()->getNombre() . ' ' . $equipo->getUsuario()->getPapellido();
$ubicacion = substr($equipo->getUnidad()->getIdUni(), 3, 3) . ' - ' . $equipo->getUbicacion()->getArea();
$sheet->setCellValue('A6', $equipo->getIdEqu())
->setCellValue('B6', $equipo->getMarbete())
->setCellValue('C6', $equipo->getDescripcion())
->setCellValue('D6', $equipo->getMarca())
->setCellValue('E6', $equipo->getModelo())
->setCellValue('F6', $estatus)
->setCellValue('G6', $emhv)
->setCellValue('H6', $usuario)
->setCellValue('I6', $ubicacion);
// Encabezado para datos de bitacora
$sheet->setCellValue('A8', 'ID Mov')
->setCellValue('B8', 'Fecha Movimiento')
->setCellValue('C8', 'Tipo Equipo')
->setCellValue('D8', 'Componente')
->setCellValue('E8', 'Observación')
->setCellValue('F8', 'Núcleos')
->setCellValue('G8', 'Velocidad')
->setCellValue('H8', 'Capacidad Memoria')
->setCellValue('I8', 'Unidad')
->setCellValue('J8', 'Usuario Gestor');
// Llenar la hoja con los datos de bitacoras
$row = 9;
foreach ($bitacoras as $bitacora) {
$sheet->setCellValue('A' . $row, $bitacora->getIdMov())
->setCellValue('B' . $row, $bitacora->getFechaMov()->format('Y-m-d H:i:s'))
->setCellValue('C' . $row, $bitacora->getTipoEquipo())
->setCellValue('D' . $row, $bitacora->getIdComponente() ? $bitacora->getIdComponente()->getTipo() : 'N/A') // Reemplaza getNombre por getTipo
->setCellValue('E' . $row, $bitacora->getObservacion())
->setCellValue('F' . $row, $bitacora->getNucleos())
->setCellValue('G' . $row, $bitacora->getVelocidad())
->setCellValue('H' . $row, $bitacora->getCapacidadMemoria())
->setCellValue('I' . $row, $bitacora->getIdUni() ? $bitacora->getIdUni()->getNombre() : 'N/A')
->setCellValue('J' . $row, $bitacora->getIdUsu() ? $bitacora->getIdUsu()->getNombre() : 'N/A');
$row++;
}
// Crear la respuesta
$response = new StreamedResponse(function() use ($spreadsheet) {
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
});
// Configurar los encabezados de la respuesta
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', 'attachment;filename="datos_equipo_y_bitacora_' . $id . '.xlsx"');
$response->headers->set('Cache-Control', 'max-age=0');
return $response;
}
#[Route('/{idEqu}/edit_resguardo', name: 'app_equipo_edit_resguardo', methods: ['GET', 'POST'])]
public function edit_resguardo(Request $request, Equipo $equipo, EntityManagerInterface $entityManager): Response
{
// Datos de la solicitud
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[4]["nivel"];
# Bloqueo de edición de [Merbete, Descripción, Marca, Modelo, No. serie] exceptuando al comportamiento 2
$bloquear_edicion = true;
$unidad = true;
($nivel == 2) && $bloquear_edicion = false;
($nivel == 2) && $unidad = false;
# Se contruye el formulario
$form = $this->createForm(EquipoType::class, $equipo, ['unidad' => $unidad, 'bloquear_edicion' => $bloquear_edicion]);
$form->handleRequest($request);
/** @var Usuario $user */
$user = $this->getUser();
date_default_timezone_set("America/Mexico_City");
$fecha = new DateTime();
if ($form->isSubmitted() && $form->isValid()) {
$equipo->setFactualizacion($fecha);
$equipo->setUnidad($equipo->getUbicacion()->getUnidad());
# Cálculo del Estandar Mínimo Hardware Vigente
$equipo->setEmhv(0);
if (intval($equipo->getRam()) >= 4) {
if (intval($equipo->getNucleos()) >= 4) {
if (floatval($equipo->getCpuVelocidad()) >= 3.2) {
$equipo->setEmhv(1);
}
}
}
$entityManager->persist($equipo);
$entityManager->flush();
//$equipoRepository->add($equipo, true);
if ($equipo->getEstatus() == 2){
$estatus = "Descompuesto";
}elseif ($equipo->getEstatus() == 1){
$estatus = "En operacion";
}elseif ($equipo->getEstatus() == 3){
$estatus = "Sin instalar";
}elseif ($equipo->getEstatus() == 4){
$estatus = "En proceso de baja";
}elseif ($equipo->getEstatus() == 5){
$estatus = "Baja";
}
$data = array(
'idEqu' => $equipo->getIdEqu(),
'marbete' => $equipo->getMarbete(),
'descripcion' => $equipo->getDescripcion(),
'marca' => $equipo->getMarca(),
'modelo' => $equipo->getModelo(),
'estatus' => $estatus,
'emhv' => ($equipo->isEmhv()) ? '<span class="badge bg-gradient-green d-block">Cumple</span>' : '<span class="badge bg-gradient-orange d-block">No Cumple</span>',
'usuario' => $equipo->getUsuario()->getNombre() . ' ' . $equipo->getUsuario()->getPapellido(),
'ubicacion' => substr($equipo->getUnidad()->getIdUni(), 3, 3) . ' - ' . $equipo->getUbicacion()->getArea(),
'mensaje' => 'Se actualizo correctamente',
);
return new JsonResponse($data);
//return $this->redirectToRoute('app_equipo_index', [], Response::HTTP_SEE_OTHER);
}
if($form->isSubmitted() && !$form->isValid()){
$view = $this->renderView('equipo/modalresguardo.html.twig', [
'equipo' => $equipo,
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY);
return $response;
}
return $this->renderForm('equipo/modalresguardo.html.twig', [
'equipo' => $equipo,
'form' => $form,
]);
}
//Para subir controllers
}