<?php
namespace App\Controller;
use App\Entity\Red;
use App\Entity\Usuario;
use App\Form\RedType;
use App\Form\UnidadFiltroType;
use App\Repository\RedRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
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('/red')]
class RedController extends AbstractController
{
#[Route('/', name: 'app_red_index', methods: ['GET', 'POST'])]
public function index(Request $request, RedRepository $redRepository): Response
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[6]["nivel"];
$redes = [];
# 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 comunicación" 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
(in_array($nivel, [1, 2, 3, 4, 5, 6
])) ? $uni = true : $uni = false;/*2,3*/
$form = $this->createForm(UnidadFiltroType::class, null, ['unidad' => $uni, 'tipo' => 'comunicacion']);
$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
$redes = empty($criteria) ? $redRepository->findAll() : $redRepository->findBy($criteria);
$data = [];
foreach ($redes as $red) {
$uso = match ($red->getUso()) {
'0' => '<span>Docente</span>',
'1' => '<span>Educativo</span>',
'2' => '<span>Administrativo</span>',
default => ""
};
$estatus = match ($red->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_red_show', ['idRed' => $red->getIdRed()]);
$editar = $this->generateUrl('app_red_edit', ['idRed' => $red->getIdRed()]);
$editar_resguardo = $this->generateUrl('app_red_edit_resguardo', ['idRed' => $red->getIdRed()]);
$data[] = [
'idRed' => $red->getIdRed(),
'marbete' => $red->getMarbete(),
'descripcion' => $red->getDescripcion(),
'marca' => $red->getMarca(),
'modelo' => $red->getModelo(),
# 'serie' => $red->getSerie(),
'velocidad' => $red->getVelocidad(),
'puertos' => $red->getPuertos(),
'uso' => $uso,
'estatus' => $estatus,
'unidad' => $red->getUnidad()->getNombre(),
'usuario' => $red->getUsuario()->getNombre() . ' ' . $red->getUsuario()->getPapellido(),
'ubicacion' => substr($red->getUnidad()->getIdUni(), 3, 3) . ' - ' . $red->getUbicacion()->getArea(),
# 'ver' => $ver,
'editar' => $editar,
'editar_resguardo' => $editar_resguardo
];
}
return new JsonResponse($data, Response::HTTP_OK);
}
if ($nivel == 1) {
$redes = $redRepository->findBy(['unidad' => $user->getUnidad()]);
}
if (in_array($nivel, [2, 3])) {
$redes = $redRepository->findAll();
}
return $this->render('red/index.html.twig', [
'url' => $this->generateUrl('app_red_index'),
'redes' => $redes,
'form' => $form->createView(),
'nivel' => $nivel,
'unidadActiva' => $unidadActiva,
'rol' => $rol,
]);
}
#[Route('/new', name: 'app_red_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response #Request $request, RedRepository $redRepository
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[6]["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 comunicación" 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
$red = new Red();
$form = $this->createForm(RedType::class, $red,['unidad' => true]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$red->setUnidad($red->getUbicacion()->getUnidad());
$red->setFactualizacion($fecha);
$red->setFalta($fecha);
$entityManager->persist($red);
$entityManager->flush();
return $this->redirectToRoute('app_red_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('red/new.html.twig', [
'red' => $red,
'form' => $form,
]);
}
#[Route('/show', name: 'app_red_show', methods: ['POST'])]
public function show(Request $request, RedRepository $redRepository): Response
{
$idRed = $request->request->get('idRed');
$red = $redRepository->findOneBy(['idRed' => $idRed]);
return $this->render('red/show.html.twig', [
'red' => $red,
]);
}
#[Route('/{idRed}/edit', name: 'app_red_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Red $red, EntityManagerInterface $entityManager): Response
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[6]["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;
//$form = $this->createForm(RedType::class, $red);
//$form->handleRequest($request);
$form = $this->createForm(RedType::class, $red,['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()) {
$red->setUnidad($red->getUbicacion()->getUnidad());
//$otroRepository->add($otro, true);
$red->setFactualizacion($fecha);
$red->setUnidad($red->getUbicacion()->getUnidad());
$entityManager->persist($red);
$entityManager->flush();
if ($red->getEstatus()==2){
$estatus="Descompuesto";
}else if ($red->getEstatus()==1){
$estatus="En operación";
}else if ($red->getEstatus()==3){
$estatus="Sin instalar";
}else if ($red->getEstatus()==4){
$estatus="En proceso de baja";
}else if ($red->getEstatus()==5){
$estatus="Baja";
}
$data = array(
'idRed' => $red->getIdRed(),
'marbete' => $red->getMarbete(),
'descripcion' => $red->getDescripcion(),
'marca' => $red->getMarca(),
'modelo' => $red->getModelo(),
'estatus' => $estatus,
/*'factualizacion' => $red->setFactualizacion(new DateTime()),*/
'usuario' => $red->getUsuario()->getNombre() . ' ' . $red->getUsuario()->getPapellido(),
'ubicacion' => substr($red->getUnidad()->getIdUni(), 3, 3) . ' - ' . $red->getUbicacion()->getArea(),
//'unidad' => $red->getUnidad(),
'mensaje' => 'Se actualizo correctamente',
);
return new JsonResponse($data);
//return $this->redirectToRoute('app_otro_index', [], Response::HTTP_SEE_OTHER);
}
if($form->isSubmitted() && !$form->isValid()){
$view = $this->renderView('red/modal.html.twig', [
'red' => $red,
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('red/modal.html.twig', [
'red' => $red,
'form' => $form,
]);
/*if ($form->isSubmitted() && $form->isValid()) {
$redRepository->add($red, true);
return $this->redirectToRoute('app_red_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('red/modal.html.twig', [
'red' => $red,
'form' => $form,
]);*/
}
#[Route('/{idRed}', name: 'app_red_delete', methods: ['POST'])]
public function delete(Request $request, Red $red, RedRepository $redRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$red->getIdRed(), $request->request->get('_token'))) {
$redRepository->remove($red, true);
}
return $this->redirectToRoute('app_red_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/pdf/{idRed}', name: 'red_pdf')]
public function generaResguardoPdf(Red $red): Response
{
// Configura Dompdf
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Arial');
// Inicializa Dompdf
$dompdf = new Dompdf($pdfOptions);
// Renderiza la plantilla Twig
$html = $this->renderView('red/pdf.html.twig', [
'red' => $red
]);
// 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="red' . $red->getIdRed() . '.pdf"',
]);
}
#[Route('/{idRed}/edit_resguardo', name: 'app_red_edit_resguardo', methods: ['GET', 'POST'])]
public function edit_resguardo(Request $request, Red $red, EntityManagerInterface $entityManager): Response
{
# Se obtiene el nivel de acceso
$perfil = $request->getSession()->get('perfil');
$nivel = $perfil[6]["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;
//$form = $this->createForm(RedType::class, $red);
//$form->handleRequest($request);
$form = $this->createForm(RedType::class, $red,['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()) {
$red->setUnidad($red->getUbicacion()->getUnidad());
//$otroRepository->add($otro, true);
$red->setFactualizacion($fecha);
$red->setUnidad($red->getUbicacion()->getUnidad());
$entityManager->persist($red);
$entityManager->flush();
if ($red->getEstatus()==2){
$estatus="Descompuesto";
}else if ($red->getEstatus()==1){
$estatus="En operación";
}else if ($red->getEstatus()==3){
$estatus="Sin instalar";
}else if ($red->getEstatus()==4){
$estatus="En proceso de baja";
}else if ($red->getEstatus()==5){
$estatus="Baja";
}
$data = array(
'idRed' => $red->getIdRed(),
'marbete' => $red->getMarbete(),
'descripcion' => $red->getDescripcion(),
'marca' => $red->getMarca(),
'modelo' => $red->getModelo(),
'estatus' => $estatus,
/*'factualizacion' => $red->setFactualizacion(new DateTime()),*/
'usuario' => $red->getUsuario()->getNombre() . ' ' . $red->getUsuario()->getPapellido(),
'ubicacion' => substr($red->getUnidad()->getIdUni(), 3, 3) . ' - ' . $red->getUbicacion()->getArea(),
//'unidad' => $red->getUnidad(),
'mensaje' => 'Se actualizo correctamente',
);
return new JsonResponse($data);
//return $this->redirectToRoute('app_otro_index', [], Response::HTTP_SEE_OTHER);
}
if($form->isSubmitted() && !$form->isValid()){
$view = $this->renderView('red/modalresguardo.html.twig', [
'red' => $red,
'form' => $form->createView(),
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('red/modalresguardo.html.twig', [
'red' => $red,
'form' => $form,
]);
/*if ($form->isSubmitted() && $form->isValid()) {
$redRepository->add($red, true);
return $this->redirectToRoute('app_red_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('red/modal.html.twig', [
'red' => $red,
'form' => $form,
]);*/
}
//Para subir formulario
}