<?php
namespace App\Controller;
use App\Entity\Otro;
use App\Entity\Solicitud;
use App\Entity\Usuario;
use App\Form\OtroType;
use App\Form\UnidadFiltroType;
use App\Repository\OtroRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use DateTime;
use TCPDF;
use App\Service\DocumentoPDF;
use Dompdf\Dompdf;
use Dompdf\Options;
/*
------------- COMPORTAMIENTOS -------------
0 = Sin acceso
1 = Administración de equipo del plantel
2 = Administración de equipo universal
3 = Visualización universal
*/
#[Route('/otro')]
class OtroController extends AbstractController
{
public EntityManagerInterface $emi;
public function __construct(EntityManagerInterface $entityManager)
{
$this->emi = $entityManager;
}
#[Route('/', name: 'app_otro_index', methods: ['GET', 'POST'])]
public function index(Request $request, OtroRepository $otroRepository): Response #
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[7]["nivel"];
//$otros = [];
# 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 "Otros equipos" 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.');
}
$marca = '';
$modelo = '';
# Formulario de filtro por unidad
(in_array($nivel, [1,2,3,4,5,6])) ? $uni = true : $uni = false ? $marca = true : $marca = false ? $modelo = true : $modelo = false;/*2,3*/
$form = $this->createForm(UnidadFiltroType::class, null, ['unidad' => $uni, 'marca'=>$marca, 'modelo'=>$modelo, 'tipo'=> 'otro']);
$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
$otros = empty($criteria) ? $otroRepository->findAll() : $otroRepository->findBy($criteria);
$data = [];
foreach ($otros as $otro) {
$uso = match ($otro->getUso()) {
'0' => '<span>Docente</span>',
'1' => '<span>Educativo</span>',
'2' => '<span>Administrativo</span>',
default => ""
};
$estatus = match ($otro->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 => ""
};
$ver = $this->generateUrl('app_otro_show', ['idOtro' => $otro->getIdOtro()]);
$editar = $this->generateUrl('app_otro_edit', ['idOtro' => $otro->getIdOtro()]);
$editar_resguardo = $this->generateUrl('app_otro_edit_resguardo', ['idOtro' => $otro->getIdOtro()]);
$eliminar = $this->generateUrl('app_otro_delete', ['idOtro' => $otro->getIdOtro()]);
$u = ($otro->getUsuario()) ? $otro->getUsuario()->getNombre() . ' ' . $otro->getUsuario()->getPapellido() : 'Sin usuario';
$data[] = [
'idOtro' => $otro->getIdOtro(),
'marbete' => $otro->getMarbete(),
'descripcion' => $otro->getDescripcion(),
'marca' => $otro->getMarca(),
'modelo' => $otro->getModelo(),
'uso' => $uso,
'unidad' => $otro->getUnidad()->getNombre(),
'estatus' => $estatus,
'usuario' => $u,
'ubicacion' => substr($otro->getUnidad()->getIdUni(), 3, 3) . ' - ' . $otro->getUbicacion()->getArea(),
'ver' => $ver,
'editar' => $editar,
'editar_resguardo' => $editar_resguardo,
'eliminar' => $eliminar
];
}
return new JsonResponse($data, Response::HTTP_OK);
}
if ($nivel == 1) {
$otros = $otroRepository->findBy(['unidad' => $user->getUnidad()]);
}
if (in_array($nivel, [2, 3])) {
$otros = $otroRepository->findAll();
}
$otros = [];
return $this->render('otro/index.html.twig', [
//'url' => $this->generateUrl('app_otro_index'),
'otros' => $otros,
'form' => $form->createView(),
'nivel' => $nivel,
'unidadActiva' => $unidadActiva,
'rol' => $rol,
]);
}
#[Route('/new', name: 'app_otro_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response #Request $request, OtroRepository $otroRepository
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[7]["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 "Otros equipos" está restringido.');
return $this->redirectToRoute('homepage');
}
/** @var Usuario $user */
$user = $this->getUser();
date_default_timezone_set("America/Mexico_City");
$fecha = new DateTime();
#Se construye el formulario
$otro = new Otro();
$form = $this->createForm(OtroType::class, $otro,['unidad' => true/*, 'mantenimientoCount' => false*/]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$otro->setUnidad($otro->getUbicacion()->getUnidad());
$otro->setFactualizacion($fecha);
$otro->setFalta($fecha);
$entityManager->persist($otro);
$entityManager->flush();
return $this->redirectToRoute('app_otro_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('otro/new.html.twig', [
'otro' => $otro,
'form' => $form,
]);
}
#[Route('/show', name: 'app_otro_show', methods: ['POST'])]
public function show(Request $request, OtroRepository $otroRepository): Response
{
$idOtro = $request->request->get('idOtro');
$otro = $otroRepository->findOneBy(['idOtro' => $idOtro]);
return $this->render('otro/show.html.twig', [
'otro' => $otro,
]);
}
#[Route('/{idOtro}/edit', name: 'app_otro_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Otro $otro, EntityManagerInterface $entityManager): Response #Request $request, Otro $otro, OtroRepository $otroRepository
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[7]["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;
$uanterior = $otro->getUsuario()->getNombre() .' '. $otro->getUsuario()->getPapellido() .' '. $otro->getUsuario()->getSapellido();
$form = $this->createForm(OtroType::class, $otro, ['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()) {
$s = $entityManager->getRepository(Solicitud::class)->findBy(['idEquipo' => $otro->getIdOtro(), 'estatus' =>[1,2,3], 'tipoEquipo' => 'Otro']);
$usu = $form->get('usuario')->getData();
$ubi = $form->get('ubicacion')->getData();
$otro->setFactualizacion($fecha);
$otro->setUnidad($otro->getUbicacion()->getUnidad());
$entityManager->persist($otro);
if($s != []){
$solicitudesArray = [];
foreach ($s as $solicitud) {
if ($solicitud->getEstatus() == 1){
$estatus1 = "Pendiente";
}elseif ($solicitud->getEstatus() == 2){
$estatus1 = "Proceso";
}elseif ($solicitud->getEstatus() == 3){
$estatus1 = "Atendido";
}elseif ($solicitud->getEstatus() == 4){
$estatus1 = "Evaluado";
}
$solicitud->setUsuario($usu);
$solicitud->setUbicacion($ubi);
$entityManager->persist($solicitud);
$e = array(
'idSolicitud' => $solicitud-> getIdSol(),
'estatus' => $estatus1,
'usuAnterior' => $uanterior,
'usuNuevo' => $solicitud->getUsuario()->getNombre() .' '. $solicitud->getUsuario()->getPapellido() .' '. $solicitud->getUsuario()->getSapellido()
);
$solicitudesArray[] = $e;
}
}else{
$solicitudesArray = array(
'idSolicitud' => 0
);
}
$entityManager->flush();
if ($otro->getEstatus()==2){
$estatus="Descompuesto";
}else if ($otro->getEstatus()==1){
$estatus="En operación";
}else if ($otro->getEstatus()==3){
$estatus="Sin instalar";
}else if ($otro->getEstatus()==4){
$estatus="En proceso de baja";
}else if ($otro->getEstatus()==5){
$estatus="Baja";
}
$data = array(
'idOtro' => $otro->getIdOtro(),
'marbete' => $otro->getMarbete(),
'descripcion' => $otro->getDescripcion(),
'marca' => $otro->getMarca(),
'modelo' => $otro->getModelo(),
'estatus' => $estatus,
'usuario' => $otro->getUsuario()->getNombre() . ' ' . $otro->getUsuario()->getPapellido(),
'ubicacion' => substr($otro->getUnidad()->getIdUni(), 3, 3) . ' - ' . $otro->getUbicacion()->getArea(),
'mensaje' => 'Se actualizo correctamente',
);
//Combina ambos arrays
$responseData = array_merge($data, ['solicitudes'=>$solicitudesArray]);
// Retorna el array combinado como respuesta JSON
return new JsonResponse($responseData);
}
if($form->isSubmitted() && !$form->isValid()){
$view = $this->renderView('otro/modal.html.twig', [
'otro' => $otro,
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('otro/modal.html.twig', [
'otro' => $otro,
'form' => $form,
]);
}
#[Route('/{idOtro}', name: 'app_otro_delete', methods: ['POST'])]
public function delete(Request $request, Otro $otro, OtroRepository $otroRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$otro->getIdOtro(), $request->request->get('_token'))) {
$otroRepository->remove($otro, true);
}
return $this->redirectToRoute('app_otro_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/pdf/{idOtro}', name: 'otro_pdf')]
public function generaResguardoPdf(Otro $otro): Response
{
// Configura Dompdf
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
// Inicializa Dompdf
$dompdf = new Dompdf($pdfOptions);
// Renderiza la plantilla Twig
$html = $this->renderView('otro/pdf.html.twig', [
'otro' => $otro
]);
// 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="otro' . $otro->getIdOtro() . '.pdf"',
]);
}
#[Route('/{idOtro}/edit_resguardo', name: 'app_otro_edit_resguardo', methods: ['GET', 'POST'])]
public function editresguardo(Request $request, Otro $otro, EntityManagerInterface $entityManager): Response #Request $request, Otro $otro, OtroRepository $otroRepository
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[7]["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;
$uanterior = $otro->getUsuario()->getNombre() .' '. $otro->getUsuario()->getPapellido() .' '. $otro->getUsuario()->getSapellido();
$form = $this->createForm(OtroType::class, $otro, ['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()) {
$s = $entityManager->getRepository(Solicitud::class)->findBy(['idEquipo' => $otro->getIdOtro(), 'estatus' => [1,2,3] , 'tipoEquipo' => 'Otro']);
$usu = $form->get('usuario')->getData();
$ubi = $form->get('ubicacion')->getData();
$uni= $form->get('unidad')->getData();
$otro->setFactualizacion($fecha);
$otro->setUnidad($otro->getUbicacion()->getUnidad());
$entityManager->persist($otro);
if($s != []){
$solicitudesArray = [];
foreach ($s as $solicitud) {
if ($solicitud->getEstatus() == 1){
$estatus1 = "Pendiente";
}elseif ($solicitud->getEstatus() == 2){
$estatus1 = "Proceso";
}elseif ($solicitud->getEstatus() == 3){
$estatus1 = "Atendido";
}elseif ($solicitud->getEstatus() == 4){
$estatus1 = "Evaluado";
}
$solicitud->setUsuario($usu);
$solicitud->setUbicacion($ubi);
$solicitud->setUnidad($uni);
$entityManager->persist($solicitud);
$e = array(
'idSolicitud' => $solicitud-> getIdSol(),
'estatus' => $estatus1,
'usuAnterior' => $uanterior,
'usuNuevo' => $solicitud->getUsuario()->getNombre() .' '. $solicitud->getUsuario()->getPapellido() .' '. $solicitud->getUsuario()->getSapellido()
);
$solicitudesArray[] = $e;
}
}else{
$solicitudesArray = array(
'idSolicitud' => 0
);
}
$entityManager->flush();
if ($otro->getEstatus()==2){
$estatus="Descompuesto";
}else if ($otro->getEstatus()==1){
$estatus="En operación";
}else if ($otro->getEstatus()==3){
$estatus="Sin instalar";
}else if ($otro->getEstatus()==4){
$estatus="En proceso de baja";
}else if ($otro->getEstatus()==5){
$estatus="Baja";
}
$data = array(
'idOtro' => $otro->getIdOtro(),
'marbete' => $otro->getMarbete(),
'descripcion' => $otro->getDescripcion(),
'marca' => $otro->getMarca(),
'modelo' => $otro->getModelo(),
'estatus' => $estatus,
'usuario' => $otro->getUsuario()->getNombre() . ' ' . $otro->getUsuario()->getPapellido(),
'ubicacion' => substr($otro->getUnidad()->getIdUni(), 3, 3) . ' - ' . $otro->getUbicacion()->getArea(),
'mensaje' => 'Se actualizo correctamente',
);
//Combina ambos arrays
$responseData = array_merge($data, ['solicitudes'=>$solicitudesArray]);
// Retorna el array combinado como respuesta JSON
return new JsonResponse($responseData);
}
if($form->isSubmitted() && !$form->isValid()){
$view = $this->renderView('otro/modalresguardo.html.twig', [
'otro' => $otro,
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('otro/modalresguardo.html.twig', [
'otro' => $otro,
'form' => $form,
]);
}
//Para subir formulario
}