src/Controller/SolicitudController.php line 98

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Bitacora;
  4. use App\Entity\BitacoraMovimientos;
  5. use App\Entity\CatComponentes;
  6. use App\Entity\CatTiposMovimientos;
  7. use App\Entity\CMarcas;
  8. use App\Entity\Equipo;
  9. use App\Entity\Impresora;
  10. use App\Entity\Inventario;
  11. use App\Entity\Otro;
  12. use App\Entity\Periodo;
  13. use App\Entity\Red;
  14. use App\Entity\Solicitud;
  15. use App\Entity\Unidad;
  16. use App\Entity\Usuario;
  17. use App\Form\SolicitudType;
  18. use App\Repository\SolicitudRepository;
  19. use App\Security\EmailVerifier;
  20. use App\Service\VistaTipoEquipo;
  21. use DateTime;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\HttpFoundation\JsonResponse;
  25. use Symfony\Component\HttpFoundation\Request;
  26. use Symfony\Component\HttpFoundation\Response;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  29. use Symfony\Component\Mailer\MailerInterface;
  30. use Symfony\Component\Mime\Address;
  31. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  32. #[Route('/solicitud')]
  33. class SolicitudController extends AbstractController
  34. {
  35.     private $mailer;
  36.     private EmailVerifier $emailVerifier;
  37.     public function __construct(EntityManagerInterface $entityManager, MailerInterface $mailer)
  38.     {
  39.         $this->entityManager = $entityManager;
  40.         $this->mailer = $mailer;
  41.     }
  42.     public EntityManagerInterface $entityManager;
  43.     /**
  44.      * @param EntityManagerInterface $entityManager
  45.      */
  46.     #[Route('/', name: 'app_solicitud_index', methods: ['GET', 'POST'])]
  47.     public function index(SolicitudRepository $solicitudRepository, Request $request): Response
  48.     {
  49.         //Seccion filtro
  50.         date_default_timezone_set('America/Mexico_City');
  51.         setlocale(LC_ALL, 'es_MX');
  52.         /** @var Usuario $user */
  53.         $user = $this->getUser();
  54.         //Seccion filtro
  55.         $perfil = $request->getSession()->get('perfil');
  56.         $nivel = $perfil[12]["nivel"];
  57.         if($user->getRol()->getIdRol() == 3){
  58.             $solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario(0, 6, $user->getUnidad()->getIdUni());
  59.         }
  60.         return $this->render('solicitud/index.html.twig', [
  61.             'solicitudes' => $solicitudes
  62.         ]);
  63.     }
  64.     #[Route('/{idSol}/edit', name: 'app_solicitud_edit', methods: ['GET', 'POST'])]
  65.     public function edit(Request $request, Solicitud $solicitud, SolicitudRepository $solicitudRepository, EntityManagerInterface $entityManager): Response
  66.     {
  67.         /** @var Usuario $user */
  68.         $user = $this->getUser();
  69.         date_default_timezone_set('America/Mexico_City');
  70.         setlocale(LC_ALL, 'es_MX');
  71.         $factual = new DateTime();
  72.         $form = $this->createForm(SolicitudType::class, $solicitud);
  73.         $form->remove('fregistro');
  74.         $form->remove('fatencion');
  75.         $form->remove('ffin');
  76.         $form->remove('gestor');
  77.         $form->remove('usuario');
  78.         $form->remove('ubicacion');
  79.         $form->remove('periodo');
  80.         $form->remove('idEquipo');
  81.         if ($solicitud ->getTipoMantenimiento() == 'MP'){
  82.             $form->remove('tipoMantenimiento');
  83.         }
  84.         $estatusAnterior = $solicitud->getEstatus();
  85.         $form->handleRequest($request);
  86.         // El equipo se consulta según su tipo, no siempre es de la tabla 'equipo'
  87.         $tipoEquipo = $solicitud->getTipoEquipo();
  88.         $equipo = null;
  89.         switch ($tipoEquipo) {
  90.             case 'Equipo':
  91.                 $equipo = $entityManager->getRepository(Equipo::class)->find($solicitud->getIdEquipo());
  92.                 break;
  93.             case 'Impresora':
  94.                 $equipo = $entityManager->getRepository(Impresora::class)->find($solicitud->getIdEquipo());
  95.                 break;
  96.             case 'Red':
  97.                 $equipo = $entityManager->getRepository(Red::class)->find($solicitud->getIdEquipo());
  98.                 break;
  99.             case 'Otro':
  100.                 $equipo = $entityManager->getRepository(Otro::class)->find($solicitud->getIdEquipo());
  101.                 break;
  102.         }
  103.         if($form->isSubmitted() && !$form->isValid()){
  104.             $view = $this->renderView('solicitud/modal.html.twig', [
  105.                 'solicitud' => $solicitud,
  106.                 'equipo' => $equipo,
  107.                 'form' => $form->createView()
  108.             ]);
  109.             $response = new JsonResponse(['form' => $view], Response::HTTP_UNPROCESSABLE_ENTITY);
  110.             return $response;
  111.         }
  112.         if ($form->isSubmitted() && $form->isValid()) {
  113.             if ($solicitud->getEstatus()==1){
  114.                 $estatus="Pendiente";
  115.             }else if ($solicitud->getEstatus()==2){
  116.                 $estatus="En proceso";
  117.             }else if ($solicitud->getEstatus()==3){
  118.                 $estatus="Atendido";
  119.                 // Solo se notifica por correo cuando el estatus pasa a "Atendido",
  120.                 // evitar reenvíos al guardar una solicitud que ya estaba atendida.
  121.                 if ((string) $estatusAnterior !== '3' && $solicitud->getEstatus() == 3){
  122.                     // Modificación para enviar correo a una dirección específica
  123.                     $correo = $solicitud->getUsuario()?->getCorreo();
  124.     
  125.                 if(!filter_var($correo, FILTER_VALIDATE_EMAIL)){
  126.                     return new JsonResponse(['message' => '0'], Response::HTTP_CONFLICT);
  127.                 }else{
  128.                     $correoDestino = $solicitud->getUsuario()->getCorreo();
  129.                     $gestor = $solicitud->getGestor();
  130.                     $tecnicoResponsable = $gestor ? sprintf(
  131.                         '%s %s %s',
  132.                         $gestor->getNombre() ?? '',
  133.                         $gestor->getPapellido() ?? '',
  134.                         $gestor->getSApellido() ?? ''
  135.                         ) : 'No tiene un técnico responsable';
  136.                         $rutaImagen = $request->server->get('CONTEXT_DOCUMENT_ROOT') . '/img/sistema/CGTI_EMAIL.png';
  137.                         
  138.                         $email = (new TemplatedEmail())
  139.                         ->from(new Address('no-reply-ti@conalepmex.edu.mx', 'Sistema de Gestión de Mantenimiento para Equipos de Computo'))
  140.                         ->to($correoDestino)
  141.                         ->subject('Solicitud Atendida')
  142.                         ->embedFromPath($rutaImagen, 'firma_cid')
  143.                         ->htmlTemplate('solicitud/estatus.html.twig')
  144.                         ->context([
  145.                             'solicitud' => $solicitud,
  146.                             'usuarioNombre' => sprintf(
  147.                                 '%s %s %s',
  148.                                 $solicitud->getUsuario()->getNombre(),
  149.                                 $solicitud->getUsuario()->getPapellido(),
  150.                                 $solicitud->getUsuario()->getSApellido()
  151.                             ),
  152.                             'numeroSolicitud' => $solicitud->getIdSol(),
  153.                             'fechaSolicitud' => $solicitud->getFregistro()->format('d-m-Y'),
  154.                             'descripcionProblema' => $solicitud->getFalla(),
  155.                             'tipoProblema' => (
  156.                                 ($solicitud->getTipoMantenimiento() == 'MP') 
  157.                                 ? 'Mantenimiento Preventivo' 
  158.                                 : (
  159.                                     ($solicitud->getTipoMantenimiento() == 'MC') 
  160.                                     ? 'Mantenimiento Correctivo' 
  161.                                     : 'Soporte Técnico'
  162.                                 )
  163.                             ),   
  164.                             'tecnicoResponsable' => $tecnicoResponsable,
  165.                             'enlaceEncuesta' => 'https://mi.conalepmex.edu.mx/?redirect=/prog_correctivo_index',
  166.                             
  167.                             // 2. Pasar el CID a Twig para usarlo en el src="cid:..."
  168.                             'firmaCid' => 'firma_cid', 
  169.                         ]);
  170.                         
  171.                     $this->mailer->send($email);
  172.                 }
  173.                 }
  174.             } else if ($solicitud->getEstatus()==4) {
  175.                 $estatus="Evaluado";
  176.             }
  177.             // Las refacciones únicamente aplican a equipos de cómputo
  178.             if ($equipo instanceof Equipo && $request->request->has('componente')){
  179.                 date_default_timezone_set('America/Mexico_City');
  180.                 // Se sanitizan los identificadores para evitar inyección SQL
  181.                 $idsComponentes = array_values(array_filter(array_map('intval', $request->request->all('componente'))));
  182.                 $usuario = $this->entityManager->getRepository(Usuario::class)->findOneBy(['idUsu' => $user->getIdUsu()]);
  183.                 $unidad = $this->entityManager->getRepository(Unidad::class)->findOneBy(['idUni' => $user->getUnidad()]);
  184.                 $tMovimiento = $this->entityManager->getRepository(CatTiposMovimientos::class)->findOneBy(['idMov' => 5]);
  185.                 if ($idsComponentes !== []){
  186.                     $condicion = implode(',', $idsComponentes);
  187.                     $conn = $this->entityManager->getConnection();
  188.                     $sql = "SELECT * 
  189.                         FROM inventario i
  190.                         JOIN cat_componentes cc ON i.id_componente = cc.id_componente WHERE i.id_inventario IN (" . $condicion . ")
  191.                     ";
  192.                     $stmt = $conn->prepare($sql);
  193.                     $resultSet = $stmt->executeQuery();
  194.                     $componentes = $resultSet->fetchAll();
  195.                     $factual = new DateTime();
  196.                     foreach ($componentes as $componente){
  197.                         // Los ids corresponden al catálogo cat_componentes:
  198.                         // 1=CPU, 3=RAM, 4=HDD, 5=SSD, 6=NVMe, 11=Teclado, 12=Ratón, 13=Monitor
  199.                         if($componente['id_componente'] == 1){
  200.                             $equipo->setNucleos($componente['nucleos']);
  201.                             $equipo->setCpuVelocidad($componente['velocidad']);
  202.                         }
  203.                         if($componente['id_componente'] == 3){
  204.                             $equipo->setRam($componente['capacidad_memoria']);
  205.                         }
  206.                         if($componente['id_componente'] == 4){
  207.                             $equipo->setHhd($componente['capacidad_memoria']);
  208.                         }
  209.                         if($componente['id_componente'] == 5 || $componente['id_componente'] == 6){
  210.                             $equipo->setSsd($componente['capacidad_memoria']);
  211.                         }
  212.                         // La marca en el equipo es una referencia a c_marcas,
  213.                         // inventario.marca es texto libre, se busca la marca existente.
  214.                         $marcaRef = !empty($componente['marca'])
  215.                             ? $entityManager->getRepository(CMarcas::class)->findOneBy(['marca' => $componente['marca']])
  216.                             : null;
  217.                         if($componente['id_componente'] == 11){
  218.                             if ($marcaRef) {
  219.                                 $equipo->setTecladoMarca($marcaRef);
  220.                             }
  221.                             $equipo->setTecladoModelo($componente['modelo']);
  222.                         }
  223.                         if($componente['id_componente'] == 12){
  224.                             if ($marcaRef) {
  225.                                 $equipo->setMouseMarca($marcaRef);
  226.                             }
  227.                             $equipo->setMouseModelo($componente['modelo']);
  228.                         }if($componente['id_componente'] == 13){
  229.                             if ($marcaRef) {
  230.                                 $equipo->setMonitorMarca($marcaRef);
  231.                             }
  232.                             $equipo->setMonitorModelo($componente['modelo']);
  233.                         }
  234.                         
  235.                         $comp = $entityManager->getRepository(CatComponentes::class)->findOneBy(['idComponente' => $componente['id_componente']]);
  236.                         $c = new BitacoraMovimientos();
  237.                         $c->setTipoMov($tMovimiento);
  238.                         $c->setFechaMov($factual);
  239.                         $c->setIdUsu($usuario);
  240.                         $c->setIdComponente($comp);
  241.                         $c->setIdUni($unidad);
  242.                         $c->setIdSolicitud($solicitud);
  243.                         $c->setTipoEquipo($solicitud->getTipoEquipo());
  244.                         $c->setIdEqu($solicitud->getIdEquipo());
  245.                         $entityManager->persist($c);
  246.                         $entityManager->flush();
  247.                         // Actualizar el campo en_uso en el registro de inventario
  248.                         $inventario = $entityManager->getRepository(Inventario::class)->find($componente['id_inventario']);
  249.                         if ($inventario) {
  250.                             $inventario->setEnUso(0);
  251.                             $entityManager->persist($inventario);
  252.                             $entityManager->flush();
  253.                         }
  254.                     }
  255.                 }
  256.             }
  257.             if ($estatusAnterior != 3 && $solicitud->getEstatus() == 3){
  258.                 $solicitud->setGestor($user);
  259.                 $solicitud->setFfin($factual);
  260.             }
  261.             $entityManager->persist($solicitud);
  262.             $entityManager->flush();
  263.             
  264.             if (null === $equipo) {
  265.                 return new JsonResponse(['message' => '0'], Response::HTTP_CONFLICT);
  266.             }
  267.             $info = $equipo;
  268.             $marca = ($info instanceof Equipo)
  269.                 ? ($info->getIdMarca()?->getMarca() ?? '')
  270.                 : $info->getMarca();
  271.             $data = array(
  272.                 'idSol' => $solicitud->getIdSol(),
  273.                 'tipoEquipo' => $solicitud->getTipoEquipo(),
  274.                 'idEquipo' => $info->getMarbete(),
  275.                 'marca' => $marca,
  276.                 'modelo' => $info->getModelo(),
  277.                 'tipoMantenimiento' => $solicitud->getTipoMantenimiento(),
  278.                 'falla' => $solicitud->getFalla(),
  279.                 'estatus' => $estatus,
  280.                 'mensaje' => 'Se actualizo correctamente',
  281.             );
  282.             return new JsonResponse($data);
  283.         }
  284.         return $this->renderForm('solicitud/modal.html.twig', [
  285.             'solicitud' => $solicitud,
  286.             'equipo' => $equipo,
  287.             'form' => $form
  288.         ]);
  289.     }
  290.     #[Route('/new', name: 'app_solicitud_new', methods: ['GET', 'POST'])]
  291.     public function new(Request $request, SolicitudRepository $solicitudRepository): Response
  292.     {
  293.         $solicitud = new Solicitud();
  294.         $form = $this->createForm(SolicitudType::class, $solicitud);
  295.         $form->remove('fregistro');
  296.         $form->remove('fatencion');
  297.         $form->remove('ffin');
  298.         $form->handleRequest($request);
  299.         if ($form->isSubmitted() && $form->isValid()) {
  300.             $solicitudRepository->add($solicitud, true);
  301.             return $this->redirectToRoute('app_solicitud_index', [], Response::HTTP_SEE_OTHER);
  302.         }
  303.         return $this->renderForm('solicitud/new.html.twig', [
  304.             'solicitud' => $solicitud,
  305.             'form' => $form,
  306.         ]);
  307.     }
  308.     #[Route('/{idSol}', name: 'app_solicitud_show', methods: ['GET'])]
  309.     public function show(Request $request, Solicitud $solicitud, SolicitudRepository $solicitudRepository, EntityManagerInterface $entityManager): Response
  310.     {
  311.         return $this->render('solicitud/show.html.twig', [
  312.             'solicitud' => $solicitud,
  313.         ]);
  314.     }
  315.     #[Route('/{idSol}', name: 'app_solicitud_delete', methods: ['POST'])]
  316.     public function delete(Request $request, Solicitud $solicitud, SolicitudRepository $solicitudRepository): Response
  317.     {
  318.         if ($this->isCsrfTokenValid('delete'.$solicitud->getIdSol(), $request->request->get('_token'))) {
  319.             $solicitudRepository->remove($solicitud, true);
  320.         }
  321.         return $this->redirectToRoute('app_solicitud_index', [], Response::HTTP_SEE_OTHER);
  322.     }
  323.     #[Route('/modal/componente', name: 'app_solicitud_modal')]
  324.     public function modalComponente(Request $request) :JsonResponse
  325.     {
  326.         /** @var Usuario $user */
  327.         // $user = $this->getUser();
  328.         // if($user->getRol()->getIdRol() == 3) {
  329.             $conn = $this->entityManager->getConnection();
  330.             $sql = "SELECT cc.*, i.*
  331.                 FROM inventario i
  332.                 LEFT JOIN cat_componentes cc ON cc.id_componente = i.id_componente
  333.                 WHERE i.en_uso = 1
  334.                 ORDER BY cc.tipo ASC
  335.             ";
  336.             $stmt = $conn->prepare($sql);
  337.             $resultSet = $stmt->executeQuery();
  338.         // }
  339.         return new JsonResponse(['catComponente' => $resultSet->fetchAll()], Response::HTTP_OK);
  340.     }
  341.     #[Route('/vista/contador', name: 'app_solicitud_vista')]
  342.     public function vistaContador() :JsonResponse
  343.     {
  344.         /** @var Usuario $user */
  345.         $user = $this->getUser();
  346.         if($user->getRol()->getIdRol() == 3) {
  347.             $cTodoEquipo = $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario(0, 5, $user->getUnidad()->getIdUni());
  348.         }
  349.         return new JsonResponse(['data' => $cTodoEquipo], Response::HTTP_OK);
  350.     }
  351.     #[Route('/vista/solicitud/{id}', name: 'app_solicitud_vista_detalle')]
  352.     public function vistaSolicitud(Request $request, Solicitud $solicitud,EntityManagerInterface $entityManager) :Response
  353.     {
  354.         $a = $this->entityManager->getRepository(Solicitud::class)->findOneBy(['idSol' => $request->get('id')]);
  355.         if ($a->getEstatus() == 1) {
  356.             $a->setEstatus(2);
  357.             $this->entityManager->persist($a);
  358.             $this->entityManager->flush();
  359.         }
  360.         $solicitud = $this->entityManager->getRepository(Solicitud::class)->detalleTipoEquipoSolicitud($request->get('id'));
  361.         return $this->render('prog_solicitud/informacion_solicitud.html.twig', ['info' => $solicitud]);
  362.     }
  363.     #[Route('/registro/vista', name: 'app_solicitud_actualiza_vista', methods: ['GET', 'POST'])]
  364.     public function infoSolicitud(EntityManagerInterface $entityManager): Response
  365.     {
  366.         $solicitudes = $entityManager->getRepository(Solicitud::class)->findAll();
  367.         $data = [];
  368.         $i = 0;
  369.         foreach ($solicitudes as $s) {
  370.             $data[$i]['ver_equipo'] = $this->generateUrl('prog_correctivo_vista_tipo', ['tipo' => $s['tipo_equipo'], 'id' => $s['id_equipo']], UrlGeneratorInterface::ABSOLUTE_URL);
  371.             $data[$i]['ver_solicitud'] = $this->generateUrl('consulta_solicitud_vista_solicitud', ['id' => $s['id_sol']], UrlGeneratorInterface::ABSOLUTE_URL);
  372.             $data[$i]['editar'] = $this->generateUrl('app_solicitud_edit', ['idSol' => $s['id_sol']], UrlGeneratorInterface::ABSOLUTE_URL);
  373.             $data[$i]['id_sol'] = $s['id_sol'];
  374.             $data[$i]['tipo_equipo'] = $s['tipo_equipo'];
  375.             $data[$i]['marbete'] = $s['marbete'];
  376.             $data[$i]['marca'] = $s['marca'];
  377.             $data[$i]['modelo'] = $s['modelo'];
  378.             $data[$i]['tipo_mantenimiento'] = $s['tipo_mantenimiento'];
  379.             $data[$i]['falla'] = $s['falla'];
  380.             $data[$i]['estatus'] = $s['estatus'];
  381.             $data[$i]['id_equipo'] = $s['id_equipo'];
  382.             $i++;
  383.         }
  384.         return new JsonResponse($data);
  385.     }
  386.     /**
  387.      * Vista detallada por tipo, equipo, impresora, red, otro
  388.      * @Route("/vista/{tipo}/{id}", name="app_solicitud_vista_tipo", methods={"GET", "POST"})
  389.      * @param Request $request
  390.      * @return Response
  391.      */
  392.     public function vistaTipo(Request $request) :Response
  393.     {
  394.         $service = new VistaTipoEquipo($this->entityManager);
  395.         $info = $service->consultaInformacion($request->get('tipo'), $request->get('id'));
  396.         return $this->render('prog_solicitud/informacion_tipo.html.twig', ['tipo' => $request->get('tipo'),'info' => $info]);
  397.     }
  398.     /**
  399.      * Consulta de solicitudes programadas por equipo, de tipo equipo
  400.      * @Route("/programada/consulta/equipo/{id}", name="prog_correctivo_programada_tipoa", methods={"GET", "POST"})
  401.      * @param Equipo $equipo
  402.      * @return Response
  403.      */
  404.     public function consultaProgramadaTipoA(Equipo $equipo) :Response
  405.     {
  406.         $info = [
  407.             'tipoEquipo' => 'Equipo',
  408.             'tipoMantenimiento' => 'Correctivo',
  409.             'siglasMantenimiento' => 'MC'
  410.         ];
  411.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($equipo->getIdEqu(), $info['tipoEquipo'], $info['siglasMantenimiento']);
  412.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  413.             'info' => $info,
  414.             'solicitud' => $programadas
  415.         ]);
  416.     }
  417.     /**
  418.      * Consulta de solicitudes programadas por equipo, de tipo impresora
  419.      * @Route("/programada/consulta/impresora/{id}", name="prog_correctivo_programada_tipob", methods={"GET", "POST"})
  420.      * @param impresora $impresora
  421.      * @return Response
  422.      */
  423.     public function consultaProgramadaTipoB(Impresora $impresora) :Response
  424.     {
  425.         $info = [
  426.             'tipoEquipo' => 'Impresora',
  427.             'tipoMantenimiento' => 'Correctivo',
  428.             'siglasMantenimiento' => 'MC'
  429.         ];
  430.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($impresora->getIdImp(), $info['tipoEquipo'], $info['siglasMantenimiento']);
  431.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  432.             'info' => $info,
  433.             'solicitud' => $programadas
  434.         ]);
  435.     }
  436.     /**
  437.      * Consulta de solicitudes programadas por equipo, de tipo red
  438.      * @Route("/programada/consulta/red/{id}", name="prog_correctivo_programada_tipoc", methods={"GET", "POST"})
  439.      * @param Red $red
  440.      * @return Response
  441.      */
  442.     public function consultaProgramadaTipoC(Red $red) :Response
  443.     {
  444.         $info = [
  445.             'tipoEquipo' => 'Red',
  446.             'tipoMantenimiento' => 'Correctivo',
  447.             'siglasMantenimiento' => 'MC'
  448.         ];
  449.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($red->getIdRed(), $info['tipoEquipo'], $info['siglasMantenimiento']);
  450.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  451.             'info' => $info,
  452.             'solicitud' => $programadas
  453.         ]);
  454.     }
  455.     /**
  456.      * Consulta de solicitudes programadas por equipo, de tipo otro
  457.      * @Route("/programada/consulta/otro/{id}", name="prog_correctivo_programada_tipod", methods={"GET", "POST"})
  458.      * @param Otro $otro
  459.      * @return Response
  460.      */
  461.     public function consultaProgramadaTipoD(Otro $otro) :Response
  462.     {
  463.         $info = [
  464.             'tipoEquipo' => 'Otro',
  465.             'tipoMantenimiento' => 'Correctivo',
  466.             'siglasMantenimiento' => 'MC'
  467.         ];
  468.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($otro->getIdOtro(), $info['tipoEquipo'], $info['siglasMantenimiento']);
  469.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  470.             'info' => $info,
  471.             'solicitud' => $programadas
  472.         ]);
  473.     }
  474.     /**
  475.      * Programar solicitud por equipo, solo tipo equipo
  476.      * @Route("/solicitud/equipo/{id}", name="app_solicitud_tipoa", methods={"GET", "POST"})
  477.      * @param Equipo $equipo
  478.      * @param Request $request
  479.      * @return Response
  480.      */
  481.     public function programarSolicitudTipoA(Request $request, Equipo $equipo) :Response
  482.     {
  483.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  484.         $info = [
  485.             'tipoEquipo' => 'Equipo',
  486.             'tipoMantenimiento' => 'Correctivo',
  487.             'marbete' => $equipo->getMarbete()
  488.         ];
  489.         $form = $this->createForm(SolicitudType::class);
  490.         $form->remove('tipoEquipo');
  491.         $form->remove('idEquipo');
  492.         $form->remove('periodo');
  493.         $form->remove('tipoMantenimiento');
  494.         $form->remove('srealizado');
  495.         $form->remove('fregistro');
  496.         $form->remove('fatencion');
  497.         $form->remove('ffin');
  498.         $form->remove('evaluacion');
  499.         $form->remove('refacciones');
  500.         $form->remove('estatus');
  501.         $form->remove('usuario');
  502.         $form->remove('ubicacion');
  503.         $form->remove('gestor');
  504.         $form->handleRequest($request);
  505.         if ($form->isSubmitted() && $form->isValid()) {
  506.             if($form->get('falla')->getData() == "" || $form->get('falla') == null){
  507.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  508.             }
  509.             $equipo->incrementMantenimientoCount();
  510.             $data = [
  511.                 "tipo" => $info['tipoEquipo'],
  512.                 "id" => $equipo->getIdEqu(),
  513.                 "marbete" => $equipo->getMarbete(),
  514.                 "iduni" => $equipo->getUnidad()->getIdUni(),
  515.                 "consuni" => $equipo->getUnidad()->getConsecutivo(),
  516.                 "unidad" => $equipo->getUnidad(),
  517.                 "usuario" => $equipo->getUsuario(),
  518.                 "ubicacion" => $equipo->getUbicacion(),
  519.                 "accion" => $form->get('falla')->getData(),
  520.                 "periodo" => $periodo
  521.             ];
  522.             $info = $this->solicitudProgramacion($data);
  523.             return new JsonResponse($info);
  524.         }
  525.         if ($form->isSubmitted() && !$form->isValid()) {
  526.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  527.                 'form' => $form->createView(),
  528.                 'info' => $info
  529.             ]);
  530.             $response = new JsonResponse(['form' => $view]);
  531.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  532.             return $response;
  533.         }
  534.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  535.             'form' => $form,
  536.             'info' => $info
  537.         ]);
  538.     }
  539.     /**
  540.      * Programar solicitud por equipo, solo tipo impresora
  541.      * @Route("/solicitud/impresora/{id}", name="app_solicitud_tipob", methods={"GET", "POST"})
  542.      * @param Impresora $impresora
  543.      * @param Request $request
  544.      * @return Response
  545.      */
  546.     public function programarSolicitudTipoB(Request $request, Impresora $impresora) :Response
  547.     {
  548.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  549.         $info = [
  550.             'tipoEquipo' => 'Impresora',
  551.             'tipoMantenimiento' => 'Correctivo',
  552.             'marbete' => $impresora->getMarbete()
  553.         ];
  554.         $form = $this->createForm(SolicitudType::class);
  555.         $form->remove('tipoEquipo');
  556.         $form->remove('idEquipo');
  557.         $form->remove('periodo');
  558.         $form->remove('tipoMantenimiento');
  559.         $form->remove('srealizado');
  560.         $form->remove('fregistro');
  561.         $form->remove('fatencion');
  562.         $form->remove('ffin');
  563.         $form->remove('evaluacion');
  564.         $form->remove('refacciones');
  565.         $form->remove('estatus');
  566.         $form->remove('usuario');
  567.         $form->remove('ubicacion');
  568.         $form->remove('gestor');
  569.         $form->handleRequest($request);
  570.         if ($form->isSubmitted() && $form->isValid()) {
  571.             if($form->get('falla')->getData() == "" || $form->get('falla') == null){
  572.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  573.             }
  574.             $impresora->incrementMantenimientoCount();
  575.             $data = [
  576.                 "tipo" => $info['tipoEquipo'],
  577.                 "id" => $impresora->getIdImp(),
  578.                 "marbete" => $impresora->getMarbete(),
  579.                 "iduni" => $impresora->getUnidad()->getIdUni(),
  580.                 "consuni" => $impresora->getUnidad()->getConsecutivo(),
  581.                 "unidad" => $impresora->getUnidad(),
  582.                 "usuario" => $impresora->getUsuario(),
  583.                 "ubicacion" => $impresora->getUbicacion(),
  584.                 "accion" => $form->get('falla')->getData(),
  585.                 "periodo" => $periodo
  586.             ];
  587.             $info = $this->solicitudProgramacion($data);
  588.             return new JsonResponse($info);
  589.         }
  590.         if ($form->isSubmitted() && !$form->isValid()) {
  591.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  592.                 'form' => $form->createView(),
  593.                 'info' => $info
  594.             ]);
  595.             $response = new JsonResponse(['form' => $view]);
  596.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  597.             return $response;
  598.         }
  599.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  600.             'form' => $form,
  601.             'info' => $info
  602.         ]);
  603.     }
  604.     /**
  605.      * Programar solicitud por equipo, solo tipo red
  606.      * @Route("/solicitud/red/{id}", name="app_solicitud_tipoc", methods={"GET", "POST"})
  607.      * @param Red $red
  608.      * @param Request $request
  609.      * @return Response
  610.      */
  611.     public function programarSolicitudTipoC(Request $request, Red $red) :Response
  612.     {
  613.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  614.         $info = [
  615.             'tipoEquipo' => 'Red',
  616.             'tipoMantenimiento' => 'Correctivo',
  617.             'marbete' => $red->getMarbete()
  618.         ];
  619.         $form = $this->createForm(SolicitudType::class);
  620.         $form->remove('tipoEquipo');
  621.         $form->remove('idEquipo');
  622.         $form->remove('periodo');
  623.         $form->remove('tipoMantenimiento');
  624.         $form->remove('srealizado');
  625.         $form->remove('fregistro');
  626.         $form->remove('fatencion');
  627.         $form->remove('ffin');
  628.         $form->remove('evaluacion');
  629.         $form->remove('refacciones');
  630.         $form->remove('estatus');
  631.         $form->remove('usuario');
  632.         $form->remove('ubicacion');
  633.         $form->remove('gestor');
  634.         $form->handleRequest($request);
  635.         if ($form->isSubmitted() && $form->isValid()) {
  636.             if($form->get('falla')->getData() == "" || $form->get('falla') == null){
  637.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  638.             }
  639.             $red->incrementMantenimientoCount();
  640.             $data = [
  641.                 "tipo" => $info['tipoEquipo'],
  642.                 "id" => $red->getIdRed(),
  643.                 "marbete" => $red->getMarbete(),
  644.                 "iduni" => $red->getUnidad()->getIdUni(),
  645.                 "consuni" => $red->getUnidad()->getConsecutivo(),
  646.                 "unidad" => $red->getUnidad(),
  647.                 "usuario" => $red->getUsuario(),
  648.                 "ubicacion" => $red->getUbicacion(),
  649.                 "accion" => $form->get('falla')->getData(),
  650.                 "fatencion" => null,
  651.                 "periodo" => $periodo
  652.             ];
  653.             $info = $this->solicitudProgramacion($data);
  654.             return new JsonResponse($info);
  655.         }
  656.         if ($form->isSubmitted() && !$form->isValid()) {
  657.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  658.                 'form' => $form->createView(),
  659.                 'info' => $info
  660.             ]);
  661.             $response = new JsonResponse(['form' => $view]);
  662.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  663.             return $response;
  664.         }
  665.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  666.             'form' => $form,
  667.             'info' => $info
  668.         ]);
  669.     }
  670.     /**
  671.      * Programar solicitud por equipo, solo tipo otro
  672.      * @Route("/solicitud/otro/{id}", name="app_solicitud_tipod", methods={"GET", "POST"})
  673.      * @param Otro $otro
  674.      * @param Request $request
  675.      * @return Response
  676.      */
  677.     public function programarSolicitudTipoD(Request $request, Otro $otro) :Response
  678.     {
  679.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  680.         $info = [
  681.             'tipoEquipo' => 'Otro',
  682.             'tipoMantenimiento' => 'Correctivo',
  683.             'marbete' => $otro->getMarbete()
  684.         ];
  685.         $form = $this->createForm(SolicitudType::class);
  686.         $form->remove('tipoEquipo');
  687.         $form->remove('idEquipo');
  688.         $form->remove('periodo');
  689.         $form->remove('tipoMantenimiento');
  690.         $form->remove('srealizado');
  691.         $form->remove('fregistro');
  692.         $form->remove('fatencion');
  693.         $form->remove('ffin');
  694.         $form->remove('evaluacion');
  695.         $form->remove('refacciones');
  696.         $form->remove('estatus');
  697.         $form->remove('usuario');
  698.         $form->remove('ubicacion');
  699.         $form->remove('gestor');
  700.         $form->handleRequest($request);
  701.         if ($form->isSubmitted() && $form->isValid()) {
  702.             if($form->get('falla')->getData() == "" || $form->get('falla') == null){
  703.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  704.             }
  705.             $otro->incrementMantenimientoCount();
  706.             $data = [
  707.                 "tipo" => $info['tipoEquipo'],
  708.                 "id" => $otro->getIdOtro(),
  709.                 "marbete" => $otro->getMarbete(),
  710.                 "iduni" => $otro->getUnidad()->getIdUni(),
  711.                 "consuni" => $otro->getUnidad()->getConsecutivo(),
  712.                 "unidad" => $otro->getUnidad(),
  713.                 "usuario" => $otro->getUsuario(),
  714.                 "ubicacion" => $otro->getUbicacion(),
  715.                 "accion" => $form->get('falla')->getData(),
  716.                 "periodo" => $periodo
  717.             ];
  718.             $info = $this->solicitudProgramacion($data);
  719.             return new JsonResponse($info);
  720.         }
  721.         if ($form->isSubmitted() && !$form->isValid()) {
  722.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  723.                 'form' => $form->createView(),
  724.                 'info' => $info
  725.             ]);
  726.             $response = new JsonResponse(['form' => $view]);
  727.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  728.             return $response;
  729.         }
  730.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  731.             'form' => $form,
  732.             'info' => $info
  733.         ]);
  734.     }
  735.     /**
  736.      * Función para crear objeto tipo equipo especificado e insertar en la base de datos
  737.      * @param array $data Array con la información específica a complementar
  738.      * @return array Para creación de botón en la vista
  739.      */
  740.     private function solicitudProgramacion($data)
  741.     {
  742.         date_default_timezone_set("America/Mexico_City");
  743.         $factual = new DateTime();
  744.         # Identificador de solicitud
  745.         $partA = date("y");
  746.         $partB = substr($data['iduni'], 3, 3);
  747.         $partC = str_pad($data['consuni'], 4,"0", STR_PAD_LEFT);
  748.         $idSolicitud = $partA.$partB.$partC;
  749.         $save = new Solicitud();
  750.         $save->setIdSol($idSolicitud);
  751.         $save->setIdEquipo($data['id']);
  752.         $save->setTipoEquipo($data['tipo']);
  753.         $save->setTipoMantenimiento("MC");
  754.         $save->setUnidad($data['unidad']);
  755.         $save->setUsuario($data['usuario']);
  756.         $save->setUbicacion($data['ubicacion']);
  757.         $save->setPeriodo($data['periodo']);
  758.         $save->setFalla($data['accion']);
  759.         $save->setFregistro($factual);
  760.         $save->setFatencion($factual);
  761.         $save->setEstatus(1);
  762.         $this->entityManager->persist($save);
  763.         $this->entityManager->flush();
  764.         $unidad = $data['unidad'];
  765.         $unidad->setConsecutivo($unidad->getConsecutivo() + 1);
  766.         $this->entityManager->persist($unidad);
  767.         $this->entityManager->flush();
  768.         $info = [
  769.             'mensaje' => 'Se ha generado la solicitud de mantenimiento, con el identificador ' . $save->getIdSol(),
  770.             'ver_solicitud' => $this->generateUrl('prog_correctivo_vista_solicitud', ['id' => $save->getIdSol()], UrlGeneratorInterface::ABSOLUTE_URL),
  771.             'solicitud' => $save->getIdSol(),
  772.             'tipo_equipo' => $save->getTipoEquipo(),
  773.             'equipo' => $save->getIdEquipo(),
  774.             'marbete' => $data['marbete'],
  775.             'marca' => $data['marca'],
  776.             'modelo' => $data['modelo'],
  777.             'falla' => $save->getFalla(),
  778.             'tipo_mantenimiento' => $save->getTipoMantenimiento(),
  779.             'mantenimiento_count' => $data->getMantenimientoCount(),
  780.             'fregistro' => $save->getFregistro()->format("d M Y, H:m"),
  781.             'estatus' => $save->getEstatus()
  782.         ];
  783.         return $info;
  784.     }
  785. //Para subir formulario
  786. }