<?php
namespace App\Controller;
use App\Entity\Equipo;
use App\Entity\Evaluacion;
use App\Entity\Impresora;
use App\Entity\Otro;
use App\Entity\Periodo;
use App\Entity\Red;
use App\Entity\Solicitud;
use App\Entity\Usuario;
use App\Form\EvaluacionType;
use App\Form\SolicitudType;
use App\Service\VistaTipoEquipo;
use DateTime;
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 Symfony\Component\Routing\Generator\UrlGeneratorInterface;
#[Route('/programacion/correctivo')]
class ProgManttoCorrectivoController extends AbstractController
{
public EntityManagerInterface $entityManager;
/**
* @param EntityManagerInterface $entityManager
*/
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
#[Route('/', name: 'prog_correctivo_index')]
public function index(): Response
{
/** @var Usuario $user */
$user = $this->getUser();
$equipos = $this->entityManager->getRepository(Equipo::class)->findBy([
'usuario' => $user->getIdUsu()
]);
$impresoras = $this->entityManager->getRepository(Impresora::class)->findBy([
'usuario' => $user->getIdUsu()
]);
$redes = $this->entityManager->getRepository(Red::class)->findBy([
'usuario' => $user->getIdUsu()
]);
$otros = $this->entityManager->getRepository(Otro::class)->findBy([
'usuario' => $user->getIdUsu()
]);
$solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($user->getIdUsu(), 1);
return $this->render('prog_correctivo/index.html.twig', [
'equipos' => $equipos,
'impresoras' => $impresoras,
'redes' => $redes,
'otros' => $otros,
'solicitudes' => $solicitudes
]);
}
/**
* Vista detallada de solicitud
* @Route("/vista/solicitud/{id}", name="prog_correctivo_vista_solicitud", methods={"GET", "POST"})
* @param Request $request
* @return Response
*/
public function vistaSolicitud(Request $request) :Response
{
$solicitud = $this->entityManager->getRepository(Solicitud::class)->detalleTipoEquipoSolicitud($request->get('id'));
return $this->render('prog_solicitud/informacion_solicitud.html.twig', ['info' => $solicitud]);
}
#[Route('/vista/contador', name: 'prog_correctivo_vista')]
public function vistaContador() :JsonResponse
{
/** @var Usuario $user */
$user = $this->getUser();
$cTodoEquipo = $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario($user->getIdUsu(), 1);
return new JsonResponse(['data' => $cTodoEquipo], Response::HTTP_OK);
}
/**
* Vista detallada por tipo, equipo, impresora, red, otro
* @Route("/vista/{tipo}/{id}", name="prog_correctivo_vista_tipo", methods={"GET", "POST"})
* @param Request $request
* @return Response
*/
public function vistaTipo(Request $request) :Response
{
$service = new VistaTipoEquipo($this->entityManager);
$info = $service->consultaInformacion($request->get('tipo'), $request->get('id'));
return $this->render('prog_solicitud/informacion_tipo.html.twig', ['tipo' => $request->get('tipo'),'info' => $info]);
}
/**
* Programar solicitud por equipo, solo tipo equipo
* @Route("/solicitud/equipo/{id}", name="prog_correctivo_solicitud_tipoa", methods={"GET", "POST"})
* @param Equipo $equipo
* @param Request $request
* @return Response
*/
public function programarSolicitudTipoA(Request $request, Equipo $equipo) :Response
{
$periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
$info = [
'tipoEquipo' => 'Equipo',
'tipoMantenimiento' => 'Correctivo',
'marbete' => $equipo->getMarbete()
];
$form = $this->createForm(SolicitudType::class);
$form->remove('tipoEquipo');
$form->remove('idEquipo');
$form->remove('periodo');
$form->remove('tipoMantenimiento');
$form->remove('srealizado');
$form->remove('fregistro');
$form->remove('fatencion');
$form->remove('ffin');
$form->remove('evaluacion');
$form->remove('refacciones');
$form->remove('estatus');
$form->remove('usuario');
$form->remove('ubicacion');
$form->remove('gestor');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if($form->get('falla')->getData() == "" || $form->get('falla') == null){
return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
}
$data = [
"tipo" => $info['tipoEquipo'],
"id" => $equipo->getIdEqu(),
"marbete" => $equipo->getMarbete(),
"marca" => $equipo->getMarca(),
"modelo" => $equipo->getModelo(),
"iduni" => $equipo->getUnidad()->getIdUni(),
"consuni" => $equipo->getUnidad()->getConsecutivo(),
"unidad" => $equipo->getUnidad(),
"usuario" => $equipo->getUsuario(),
"ubicacion" => $equipo->getUbicacion(),
"accion" => $form->get('falla')->getData(),
"periodo" => $periodo->getIdPrd()
];
$info = $this->solicitudProgramacion($data);
return new JsonResponse($info);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('prog_solicitud/programar.html.twig', [
'form' => $form->createView(),
'info' => $info
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('prog_solicitud/programar.html.twig', [
'form' => $form,
'info' => $info
]);
}
/**
* Programar solicitud por equipo, solo tipo impresora
* @Route("/solicitud/impresora/{id}", name="prog_correctivo_solicitud_tipob", methods={"GET", "POST"})
* @param Impresora $impresora
* @param Request $request
* @return Response
*/
public function programarSolicitudTipoB(Request $request, Impresora $impresora) :Response
{
$periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
$info = [
'tipoEquipo' => 'Impresora',
'tipoMantenimiento' => 'Correctivo',
'marbete' => $impresora->getMarbete()
];
$form = $this->createForm(SolicitudType::class);
$form->remove('tipoEquipo');
$form->remove('idEquipo');
$form->remove('periodo');
$form->remove('tipoMantenimiento');
$form->remove('srealizado');
$form->remove('fregistro');
$form->remove('fatencion');
$form->remove('ffin');
$form->remove('evaluacion');
$form->remove('refacciones');
$form->remove('estatus');
$form->remove('usuario');
$form->remove('ubicacion');
$form->remove('gestor');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if($form->get('falla')->getData() == "" || $form->get('falla') == null){
return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
}
$data = [
"tipo" => $info['tipoEquipo'],
"id" => $impresora->getIdImp(),
"marbete" => $impresora->getMarbete(),
"marca" => $impresora->getMarca(),
"modelo" => $impresora->getModelo(),
"iduni" => $impresora->getUnidad()->getIdUni(),
"consuni" => $impresora->getUnidad()->getConsecutivo(),
"unidad" => $impresora->getUnidad(),
"usuario" => $impresora->getUsuario(),
"ubicacion" => $impresora->getUbicacion(),
"accion" => $form->get('falla')->getData(),
"periodo" => $periodo->getIdPrd()
];
$info = $this->solicitudProgramacion($data);
return new JsonResponse($info);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('prog_solicitud/programar.html.twig', [
'form' => $form->createView(),
'info' => $info
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('prog_solicitud/programar.html.twig', [
'form' => $form,
'info' => $info
]);
}
/**
* Programar solicitud por equipo, solo tipo red
* @Route("/solicitud/red/{id}", name="prog_correctivo_solicitud_tipoc", methods={"GET", "POST"})
* @param Red $red
* @param Request $request
* @return Response
*/
public function programarSolicitudTipoC(Request $request, Red $red) :Response
{
$periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
$info = [
'tipoEquipo' => 'Red',
'tipoMantenimiento' => 'Correctivo',
'marbete' => $red->getMarbete()
];
$form = $this->createForm(SolicitudType::class);
$form->remove('tipoEquipo');
$form->remove('idEquipo');
$form->remove('periodo');
$form->remove('tipoMantenimiento');
$form->remove('srealizado');
$form->remove('fregistro');
$form->remove('fatencion');
$form->remove('ffin');
$form->remove('evaluacion');
$form->remove('refacciones');
$form->remove('estatus');
$form->remove('usuario');
$form->remove('ubicacion');
$form->remove('gestor');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if($form->get('falla')->getData() == "" || $form->get('falla') == null){
return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
}
$data = [
"tipo" => $info['tipoEquipo'],
"id" => $red->getIdRed(),
"marbete" => $red->getMarbete(),
"marca" => $red->getMarca(),
"modelo" => $red->getModelo(),
"iduni" => $red->getUnidad()->getIdUni(),
"consuni" => $red->getUnidad()->getConsecutivo(),
"unidad" => $red->getUnidad(),
"usuario" => $red->getUsuario(),
"ubicacion" => $red->getUbicacion(),
"accion" => $form->get('falla')->getData(),
"periodo" => $periodo->getIdPrd()
];
$info = $this->solicitudProgramacion($data);
return new JsonResponse($info);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('prog_solicitud/programar.html.twig', [
'form' => $form->createView(),
'info' => $info
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('prog_solicitud/programar.html.twig', [
'form' => $form,
'info' => $info
]);
}
/**
* Programar solicitud por equipo, solo tipo otro
* @Route("/solicitud/otro/{id}", name="prog_correctivo_solicitud_tipod", methods={"GET", "POST"})
* @param Otro $otro
* @param Request $request
* @return Response
*/
public function programarSolicitudTipoD(Request $request, Otro $otro) :Response
{
$periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
$info = [
'tipoEquipo' => 'Otro',
'tipoMantenimiento' => 'Correctivo',
'marbete' => $otro->getMarbete()
];
$form = $this->createForm(SolicitudType::class);
$form->remove('tipoEquipo');
$form->remove('idEquipo');
$form->remove('periodo');
$form->remove('tipoMantenimiento');
$form->remove('srealizado');
$form->remove('fregistro');
$form->remove('fatencion');
$form->remove('ffin');
$form->remove('evaluacion');
$form->remove('refacciones');
$form->remove('estatus');
$form->remove('usuario');
$form->remove('ubicacion');
$form->remove('gestor');
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if($form->get('falla')->getData() == "" || $form->get('falla') == null){
return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
}
$data = [
"tipo" => $info['tipoEquipo'],
"id" => $otro->getIdOtro(),
"marbete" => $otro->getMarbete(),
"marca" => $otro->getMarca(),
"modelo" => $otro->getModelo(),
"iduni" => $otro->getUnidad()->getIdUni(),
"consuni" => $otro->getUnidad()->getConsecutivo(),
"unidad" => $otro->getUnidad(),
"usuario" => $otro->getUsuario(),
"ubicacion" => $otro->getUbicacion(),
"accion" => $form->get('falla')->getData(),
"periodo" => $periodo->getIdPrd()
];
$info = $this->solicitudProgramacion($data);
return new JsonResponse($info);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('prog_solicitud/programar.html.twig', [
'form' => $form->createView(),
'info' => $info
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('prog_solicitud/programar.html.twig', [
'form' => $form,
'info' => $info
]);
}
/**
* Función para crear objeto tipo equipo especificado e insertar en la base de datos
* @param array $data Array con la información específica a complementar
* @return array Para creación de botón en la vista
*/
private function solicitudProgramacion($data)
{
date_default_timezone_set("America/Mexico_City");
$factual = new DateTime();
# Identificador de solicitud
$partA = date("y");
$partB = substr($data['iduni'], 3, 3);
$partC = str_pad($data['consuni'], 4,"0", STR_PAD_LEFT);
$idSolicitud = $partA.$partB.$partC;
$save = new Solicitud();
$save->setIdSol($idSolicitud);
$save->setIdEquipo($data['id']);
$save->setTipoEquipo($data['tipo']);
$save->setTipoMantenimiento("MC");
$save->setUnidad($data['unidad']);
$save->setUsuario($data['usuario']);
$save->setUbicacion($data['ubicacion']);
$save->setPeriodo($data['periodo']);
$save->setFalla($data['accion']);
$save->setFregistro($factual);
$save->setFatencion($factual);
$save->setEstatus(1);
$this->entityManager->persist($save);
$this->entityManager->flush();
$unidad = $data['unidad'];
$unidad->setConsecutivo($unidad->getConsecutivo() + 1);
$this->entityManager->persist($unidad);
$this->entityManager->flush();
$info = [
'mensaje' => 'Se ha generado la solicitud de mantenimiento, con el identificador ' . $save->getIdSol(),
'ver_solicitud' => $this->generateUrl('prog_correctivo_vista_solicitud', ['id' => $save->getIdSol()], UrlGeneratorInterface::ABSOLUTE_URL),
'solicitud' => $save->getIdSol(),
'tipo_equipo' => $save->getTipoEquipo(),
'equipo' => $save->getIdEquipo(),
'marbete' => $data['marbete'],
'marca' => $data['marca'],
'modelo' => $data['modelo'],
'falla' => $save->getFalla(),
'tipo_mantenimiento' => $save->getTipoMantenimiento(),
'fregistro' => $save->getFregistro()->format("d M Y, H:m"),
'estatus' => $save->getEstatus()
];
return $info;
}
/**
* Consulta de solicitudes programadas por equipo, de tipo equipo
* @Route("/programada/consulta/equipo/{id}", name="prog_correctivo_programada_tipoa", methods={"GET", "POST"})
* @param Equipo $equipo
* @return Response
*/
public function consultaProgramadaTipoA(Equipo $equipo) :Response
{
$info = [
'tipoEquipo' => 'Equipo',
'tipoMantenimiento' => 'Correctivo',
'siglasMantenimiento' => 'MC'
];
$programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($equipo->getIdEqu(), $info['tipoEquipo'], $info['siglasMantenimiento']);
return $this->renderForm('prog_solicitud/programado.html.twig', [
'info' => $info,
'solicitud' => $programadas
]);
}
/**
* Consulta de solicitudes programadas por equipo, de tipo impresora
* @Route("/programada/consulta/impresora/{id}", name="prog_correctivo_programada_tipob", methods={"GET", "POST"})
* @param impresora $impresora
* @return Response
*/
public function consultaProgramadaTipoB(Impresora $impresora) :Response
{
$info = [
'tipoEquipo' => 'Impresora',
'tipoMantenimiento' => 'Correctivo',
'siglasMantenimiento' => 'MC'
];
$programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($impresora->getIdImp(), $info['tipoEquipo'], $info['siglasMantenimiento']);
return $this->renderForm('prog_solicitud/programado.html.twig', [
'info' => $info,
'solicitud' => $programadas
]);
}
/**
* Consulta de solicitudes programadas por equipo, de tipo red
* @Route("/programada/consulta/red/{id}", name="prog_correctivo_programada_tipoc", methods={"GET", "POST"})
* @param Red $red
* @return Response
*/
public function consultaProgramadaTipoC(Red $red) :Response
{
$info = [
'tipoEquipo' => 'Red',
'tipoMantenimiento' => 'Correctivo',
'siglasMantenimiento' => 'MC'
];
$programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($red->getIdRed(), $info['tipoEquipo'], $info['siglasMantenimiento']);
return $this->renderForm('prog_solicitud/programado.html.twig', [
'info' => $info,
'solicitud' => $programadas
]);
}
/**
* Consulta de solicitudes programadas por equipo, de tipo otro
* @Route("/programada/consulta/otro/{id}", name="prog_correctivo_programada_tipod", methods={"GET", "POST"})
* @param Otro $otro
* @return Response
*/
public function consultaProgramadaTipoD(Otro $otro) :Response
{
$info = [
'tipoEquipo' => 'Otro',
'tipoMantenimiento' => 'Correctivo',
'siglasMantenimiento' => 'MC'
];
$programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($otro->getIdOtro(), $info['tipoEquipo'], $info['siglasMantenimiento']);
return $this->renderForm('prog_solicitud/programado.html.twig', [
'info' => $info,
'solicitud' => $programadas
]);
}
/**
* Evaluación de mantenimiento por solicitud
* @Route("/evaluacion/{idSol}", name="prog_correctivo_evaluacion", methods={"GET", "POST"})
* @param Solicitud $solicitud
* @param Request $request
* @return Response
*/
public function evaluacionMantenimiento(Request $request, Solicitud $solicitud) :Response
{
/** @var Usuario $user */
$user = $this->getUser();
$contestada = $this->entityManager->getRepository(Evaluacion::class)->findOneBy(['solicitud' => $solicitud->getIdSol()]);
$nueva = 0;
$info = [
'solicitud' => $solicitud->getIdSol(),
'tipoMantenimiento' => $solicitud->getTipoMantenimiento(),
];
if (empty($contestada) && $solicitud->getEstatus() == 3) {
$nueva = 1;
$form = $this->createForm(EvaluacionType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$evaluacion = new Evaluacion();
$evaluacion->setEvalua1($form->get('evalua1')->getData());
$evaluacion->setEvalua2($form->get('evalua2')->getData());
$evaluacion->setEvalua3($form->get('evalua3')->getData());
$evaluacion->setEvalua4($form->get('evalua4')->getData());
$evaluacion->setEvalua5($form->get('evalua5')->getData());
$evaluacion->setSolicitud($solicitud);
$this->entityManager->persist($evaluacion);
$this->entityManager->flush();
date_default_timezone_set("America/Mexico_City");
$time = new DateTime();
$solicitud->setUsuario($user);
$solicitud->setEstatus(4);
$solicitud->setFevaluacion($time);
$this->entityManager->persist($solicitud);
$this->entityManager->flush();
if ($solicitud->getEstatus() == 4){
$estatus="<span class='badge bg-gradient-green d-block'>Evaluado</span>";
}
return new JsonResponse([
'id' => $solicitud->getIdSol(),
'estatus' => $estatus
]);
}
} else {
$form = $this->createForm(EvaluacionType::class, $contestada);
$form->handleRequest($request);
}
if ($form->isSubmitted() && !$form->isValid()) {
$view = $this->renderView('prog_correctivo/evaluacion.html.twig', [
'form' => $form->createView(),
'info' => $info,
'nueva' => $nueva
]);
$response = new JsonResponse(['form' => $view]);
$response->setStatusCode(Response::HTTP_BAD_REQUEST);
return $response;
}
return $this->renderForm('prog_correctivo/evaluacion.html.twig', [
'form' => $form,
'info' => $info,
'nueva' => $nueva
]);
}
}