<?php
namespace App\Controller;
use App\Entity\Equipo;
use App\Entity\Usuario;
use App\Form\EquipoType;
use App\Form\UnidadFiltroType;
use App\Repository\EquipoRepository;
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\Routing\Annotation\Route;
use DateInterval;
use DateTime;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use PhpOffice\PhpSpreadsheet\IOFactory;
/*
------------- 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"];
//$equipos = [];
# 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();
# Formulario de filtro por unidad
(in_array($nivel, [2, 3])) ? $uni = true : $uni = false;
$form = $this->createForm(UnidadFiltroType::class, null, ['unidad' => $uni]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if (empty($form['unidad']->getData())) {
$equipos = $equipoRepository->findAll();
} else {
$equipos = $equipoRepository->findBy(['unidad' => $form['unidad']->getData()]);
}
$data = [];
foreach ($equipos as $equipo) {
$estatus = match ($equipo->getEstatus()) {
'0' => '<span class="badge bg-gradient-orange d-block">Descompuesto</span>',
'1' => '<span class="badge bg-gradient-green d-block">En operación</span>',
'2' => '<span class="badge bg-gradient-primary d-block">Sin instalar</span>',
'3' => '<span class="badge bg-gradient-yellow d-block">En proceso de baja</span>',
'4' => '<span class="badge bg-gradient-danger d-block">Baja</span>',
default => ""
};
$ver = $this->generateUrl('app_equipo_show', ['idEqu' => $equipo->getIdEqu()]);
$editar = $this->generateUrl('app_equipo_edit', ['idEqu' => $equipo->getIdEqu()]);
$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(),
'ver' => $ver,
'editar' => $editar
];
}
return new JsonResponse($data, Response::HTTP_OK);
}
if ($nivel == 1) {
$equipos = $equipoRepository->findBy(['unidad' => $user->getUnidad()]);
}
if (in_array($nivel, [2, 3])) {
$equipos = $equipoRepository->findAll();
}
return $this->render('equipo/index.html.twig', [
'equipos' => $equipos,
'form' => $form->createView(),
'nivel' => $nivel
]);
}
#[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' => false, '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('/{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}', 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("/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,
]);
}
}