src/Controller/ProgManttoPreventivoController.php line 42

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Red;
  4. use App\Entity\Otro;
  5. use App\Entity\Equipo;
  6. use App\Entity\Impresora;
  7. use App\Entity\Periodo;
  8. use App\Entity\Solicitud;
  9. use App\Entity\Ubicacion;
  10. use App\Entity\Usuario;
  11. use App\Form\PAMPFiltroType;
  12. use App\Form\SolicitudType;
  13. use App\Repository\SolicitudRepository;
  14. use DateTime;
  15. use Doctrine\DBAL\Exception;
  16. use Doctrine\ORM\EntityManagerInterface;
  17. use Doctrine\ORM\EntityRepository;
  18. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\Routing\Annotation\Route;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. use Symfony\Component\HttpFoundation\JsonResponse;
  24. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  25. #[Route('/programacion/preventivo')]
  26. class ProgManttoPreventivoController extends AbstractController
  27. {
  28.     public EntityManagerInterface $entityManager;
  29.     /**
  30.      * @param EntityManagerInterface $entityManager
  31.      */
  32.     public function __construct(EntityManagerInterface $entityManager)
  33.     {
  34.         $this->entityManager = $entityManager;
  35.     }
  36.     #[Route('/', name: 'prog_preventivo_index')]
  37.     public function index(Request $request): Response
  38.     {
  39.         /** @var Usuario $user */
  40.         $user = $this->getUser();
  41.         $perfil = $request->getSession()->get('perfil');
  42.         $nivel = $perfil[8]['nivel'];
  43.         if ($nivel == 0) {
  44.             $this->addFlash('danger', 'El acceso al módulo de "Programación de Mantenimiento Preventivo" está restringido.');
  45.             return $this->redirectToRoute('homepage');
  46.         }
  47.         $equipo = $this->entityManager->getRepository(Equipo::class)->findBy([
  48.             'unidad' => $user->getUnidad()->getIdUni()
  49.         ]);
  50.         $red = $this->entityManager->getRepository(Red::class)->findBy([
  51.             'unidad' => $user->getUnidad()->getIdUni()
  52.         ]);
  53.         $impresora = $this->entityManager->getRepository(Impresora::class)->findBy([
  54.             'unidad' => $user->getUnidad()->getIdUni()
  55.         ]);
  56.         $otro = $this->entityManager->getRepository(Otro::class)->findBy([
  57.             'unidad' => $user->getUnidad()->getIdUni()
  58.         ]);
  59.         $solicitud = $this->entityManager->getRepository(Solicitud::class)->findBy([
  60.             'unidad' => $user->getUnidad()->getIdUni()
  61.         ]);
  62.         $cTodoEquipo = $this->vistaContador();
  63.         $form = $this->createFormBuilder()
  64.             ->add('ubicacion', EntityType::class, [
  65.                 'class' => Ubicacion::class,
  66.                 'attr' => ['class' => 'form-control'],
  67.                 'placeholder' => 'Todo',
  68.                 'query_builder' => function (EntityRepository $er) use ($user) {
  69.                     return $er->createQueryBuilder('u')
  70.                         ->where('u.unidad = :unidad')
  71.                         ->andWhere('u.activo = :estatus')
  72.                         ->orderBy('u.area', 'ASC')
  73.                         ->setParameter('unidad', $user->getUnidad()->getIdUni())
  74.                         ->setParameter('estatus', 1)
  75.                         ;
  76.                 }
  77.             ])
  78.             ->getForm();
  79.         $form->handleRequest($request);
  80.         if ($request->isMethod('POST')) {
  81.             if (empty($form['ubicacion']->getData())) {
  82.                 $equipos = $this->entityManager->getRepository(Equipo::class)->findBy([
  83.                     'unidad' => $user->getUnidad()->getIdUni()
  84.                 ]);
  85.                 $impresoras = $this->entityManager->getRepository(Impresora::class)->findBy([
  86.                     'unidad' => $user->getUnidad()->getIdUni()
  87.                 ]);
  88.                 $redes = $this->entityManager->getRepository(Red::class)->findBy([
  89.                     'unidad' => $user->getUnidad()->getIdUni()
  90.                 ]);
  91.                 $otros = $this->entityManager->getRepository(Otro::class)->findBy([
  92.                     'unidad' => $user->getUnidad()->getIdUni()
  93.                 ]);
  94.             } else {
  95.                 $equipos = $this->entityManager->getRepository(Equipo::class)->findBy([
  96.                     'unidad' => $user->getUnidad()->getIdUni(),
  97.                     'ubicacion' => $form['ubicacion']->getData()
  98.                 ]);
  99.                 $impresoras = $this->entityManager->getRepository(Impresora::class)->findBy([
  100.                     'unidad' => $user->getUnidad()->getIdUni(),
  101.                     'ubicacion' => $form['ubicacion']->getData()
  102.                 ]);
  103.                 $redes = $this->entityManager->getRepository(Red::class)->findBy([
  104.                     'unidad' => $user->getUnidad()->getIdUni(),
  105.                     'ubicacion' => $form['ubicacion']->getData()
  106.                 ]);
  107.                 $otros = $this->entityManager->getRepository(Otro::class)->findBy([
  108.                     'unidad' => $user->getUnidad()->getIdUni(),
  109.                     'ubicacion' => $form['ubicacion']->getData()
  110.                 ]);
  111.             }
  112.             $data = [];
  113.             foreach ($equipos as $e){
  114.                 $newUrl = $this->generateUrl('prog_preventivo_solicitud_tipoa', ['id' => $e->getIdEqu()], UrlGeneratorInterface::ABSOLUTE_URL);
  115.                 $viewUrl = $this->generateUrl('prog_preventivo_programada_tipoa', ['id' => $e->getIdEqu()], UrlGeneratorInterface::ABSOLUTE_URL);
  116.                 $data[] = [
  117.                     'tipo' => 'Equipo',
  118.                     'id' => $e->getIdEqu(),
  119.                     'marbete' => $e->getMarbete(),
  120.                     'descripcion' => $e->getDescripcion(),
  121.                     'marca' => $e->getIdMarca()->getMarca(),
  122.                     'ubicacion' => substr($e->getUnidad()->getIdUni(), 3, 3) . " - " . $e->getUbicacion()->getArea(),
  123.                     'usuario' => $e->getUsuario()->getNombre() . " " . $e->getUsuario()->getPapellido() . " " . $e->getUsuario()->getSapellido(),
  124.                     'mpe' => 'Por hacer',
  125.                     'fevaluacion' => $this->entityManager->getRepository(Solicitud::class)
  126.                         ->obtenerUltimaFevaluacionPorEquipo($e->getIdEqu(), 'Equipo', 'MP') ?? '',
  127.                     'nuevo' => $newUrl,
  128.                     'ver' => $viewUrl
  129.                 ];
  130.             }
  131.             foreach ($impresoras as $e){
  132.                 $newUrl = $this->generateUrl('prog_preventivo_solicitud_tipob', ['id' => $e->getIdImp()], UrlGeneratorInterface::ABSOLUTE_URL);
  133.                 $viewUrl = $this->generateUrl('prog_preventivo_programada_tipob', ['id' => $e->getIdImp()], UrlGeneratorInterface::ABSOLUTE_URL);
  134.                 $data[] = [
  135.                     'tipo' => 'Impresora',
  136.                     'id' => $e->getIdImp(),
  137.                     'marbete' => $e->getMarbete(),
  138.                     'descripcion' => $e->getDescripcion(),
  139.                     'marca' => $e->getMarca(),
  140.                     'ubicacion' => substr($e->getUnidad()->getIdUni(), 3, 3) . " - " . $e->getUbicacion()->getArea(),
  141.                     'usuario' => $e->getUsuario()->getNombre() . " " . $e->getUsuario()->getPapellido() . " " . $e->getUsuario()->getSapellido(),
  142.                     'mpe' => 'Por hacer',
  143.                     'fevaluacion' => $this->entityManager->getRepository(Solicitud::class)
  144.                         ->obtenerUltimaFevaluacionPorEquipo($e->getIdImp(), 'Impresora', 'MP') ?? '',
  145.                     'nuevo' => $newUrl,
  146.                     'ver' => $viewUrl
  147.                 ];
  148.             }
  149.             foreach ($redes as $e){
  150.                 $newUrl = $this->generateUrl('prog_preventivo_solicitud_tipoc', ['id' => $e->getIdRed()], UrlGeneratorInterface::ABSOLUTE_URL);
  151.                 $viewUrl = $this->generateUrl('prog_preventivo_programada_tipoc', ['id' => $e->getIdRed()], UrlGeneratorInterface::ABSOLUTE_URL);
  152.                 $data[] = [
  153.                     'tipo' => 'Red',
  154.                     'id' => $e->getIdRed(),
  155.                     'marbete' => $e->getMarbete(),
  156.                     'descripcion' => $e->getDescripcion(),
  157.                     'marca' => $e->getMarca(),
  158.                     'ubicacion' => substr($e->getUnidad()->getIdUni(), 3, 3) . " - " . $e->getUbicacion()->getArea(),
  159.                     'usuario' => $e->getUsuario()->getNombre() . " " . $e->getUsuario()->getPapellido() . " " . $e->getUsuario()->getSapellido(),
  160.                     'mpe' => 'Por hacer',
  161.                     'fevaluacion' => $this->entityManager->getRepository(Solicitud::class)
  162.                         ->obtenerUltimaFevaluacionPorEquipo($e->getIdRed(), 'Red', 'MP') ?? '',
  163.                     'nuevo' => $newUrl,
  164.                     'ver' => $viewUrl
  165.                 ];
  166.             }
  167.             foreach ($otros as $e){
  168.                 $newUrl = $this->generateUrl('prog_preventivo_solicitud_tipod', ['id' => $e->getIdOtro()], UrlGeneratorInterface::ABSOLUTE_URL);
  169.                 $viewUrl = $this->generateUrl('prog_preventivo_programada_tipod', ['id' => $e->getIdOtro()], UrlGeneratorInterface::ABSOLUTE_URL);
  170.                 $data[] = [
  171.                     'tipo' => 'Otro',
  172.                     'id' => $e->getIdOtro(),
  173.                     'marbete' => $e->getMarbete(),
  174.                     'descripcion' => $e->getDescripcion(),
  175.                     'marca' => $e->getMarca(),
  176.                     'ubicacion' => substr($e->getUnidad()->getIdUni(), 3, 3) . " - " . $e->getUbicacion()->getArea(),
  177.                     'usuario' => $e->getUsuario()->getNombre() . " " . $e->getUsuario()->getPapellido() . " " . $e->getUsuario()->getSapellido(),
  178.                     'mpe' => 'Por hacer',
  179.                     'fevaluacion' => $this->entityManager->getRepository(Solicitud::class)
  180.                         ->obtenerUltimaFevaluacionPorEquipo($e->getIdOtro(), 'Otro', 'MP') ?? '',
  181.                     'nuevo' => $newUrl,
  182.                     'ver' => $viewUrl
  183.                 ];
  184.             }
  185.             return new JsonResponse($data, Response::HTTP_OK);
  186.         }
  187.         // Agregar fevaluacion (última evaluación) a cada elemento para el GET inicial
  188.         /** @var SolicitudRepository $solRepo */
  189.         $solRepo = $this->entityManager->getRepository(Solicitud::class);
  190.         foreach ($equipo as $e) {
  191.             $e->fevaluacion = $solRepo->obtenerUltimaFevaluacionPorEquipo($e->getIdEqu(), 'Equipo', 'MP') ?? '';
  192.         }
  193.         $this->ordenarPorFevaluacionAsc($equipo);
  194.         foreach ($impresora as $e) {
  195.             $e->fevaluacion = $solRepo->obtenerUltimaFevaluacionPorEquipo($e->getIdImp(), 'Impresora', 'MP') ?? '';
  196.         }
  197.         $this->ordenarPorFevaluacionAsc($impresora);
  198.         foreach ($red as $e) {
  199.             $e->fevaluacion = $solRepo->obtenerUltimaFevaluacionPorEquipo($e->getIdRed(), 'Red', 'MP') ?? '';
  200.         }
  201.         $this->ordenarPorFevaluacionAsc($red);
  202.         foreach ($otro as $e) {
  203.             $e->fevaluacion = $solRepo->obtenerUltimaFevaluacionPorEquipo($e->getIdOtro(), 'Otro', 'MP') ?? '';
  204.         }
  205.         $this->ordenarPorFevaluacionAsc($otro);
  206.         return $this->render('prog_preventivo/index.html.twig', [
  207.             'equipo' => $equipo,
  208.             'red' => $red,
  209.             'impresora' => $impresora,
  210.             'otro' => $otro,
  211.             'cTodoEquipo' => $cTodoEquipo,
  212.             'form' => $form->createView()
  213.         ]);
  214.     }
  215.     /**
  216.      * Programa Anual de Mantenimiento Preventivo
  217.      * @throws Exception
  218.      */
  219.     #[Route('/pamp', name: 'pamp', methods: ['GET', 'POST'])]
  220.     public function pamp(SolicitudRepository $solRep, Request $request): Response
  221.     {
  222.         # Se obtiene el nivel de acceso
  223.         $perfil = $request->getSession()->get('perfil');
  224.         $nivel = $perfil[9]["nivel"];
  225.         # Si el nivel de acceso es 0 entonces se retorna a página de inicio
  226.         if ($nivel == 0) {
  227.             $this->addFlash('danger', 'El acceso al "Programa Anual de Mantenimiento Preventivo" está restringido.');
  228.             return $this->redirectToRoute('homepage');
  229.         }
  230.         date_default_timezone_set("America/Mexico_City");
  231.         /** @var Usuario $user */
  232.         $user = $this->getUser();
  233.         $parameters = $request->request->get('pamp_filtro');
  234.         if (empty($parameters)) {
  235.             $uni = "";
  236.             $year = date('Y');
  237.         } else {
  238.             $uni = (array_key_exists('unidad', $request->request->all()['pamp_filtro'])) ? $parameters['unidad'] : "";
  239.             $year = $parameters['anio'];
  240.         }
  241.         $data = [];
  242.         if ($nivel == 2) {
  243.             $unidad = true;
  244.             $solicitud = $solRep->findByAnioUnidad($year, $uni);
  245.             $conteo = $solRep->countByUnidad($uni);
  246.         } else {
  247.             $unidad = false;
  248.             $solicitud = $solRep->findByAnioUnidad($year, $user->getUnidad()->getIdUni());
  249.             $conteo = $solRep->countByUnidad($user->getUnidad()->getIdUni());
  250.         }
  251.         if ($request->isMethod('POST')) {
  252.             $response = [];
  253.             $cont = 1;
  254.             foreach ($solicitud as $i) {
  255.                 $url = $this->generateUrl('prog_preventivo_reprogramar', ['id' => $i['id_sol']]);
  256.                 $mesP = date('m', strtotime($i['fatencion']));
  257.                 $diaP = date('d', strtotime($i['fatencion']));
  258.                 if (empty($i['fevaluacion'])) {
  259.                     $mesR = "00";
  260.                     $diaR = "00";
  261.                 } else {
  262.                     $mesR = date('m', strtotime($i['fevaluacion']));
  263.                     $diaR = date('d', strtotime($i['fevaluacion']));
  264.                 }
  265.                 $response[] = [
  266.                     'n' => $cont,
  267.                     'id_sol' => $i['id_sol'],
  268.                     'marbete' => $i['marbete'],
  269.                     'usuario' => $i['usuario'],
  270.                     'tipo_equipo' => $i['tipo_equipo'],
  271.                     'falla' => $i['falla'],
  272.                     'estatus' => $i['estatus'],
  273.                     'emhv' => $i['emhv'],
  274.                     'mesP' => $mesP,
  275.                     'diaP' => $diaP,
  276.                     'mesR' => $mesR,
  277.                     'diaR' => $diaR,
  278.                     'url' => $url
  279.                 ];
  280.                 $cont++;
  281.             }
  282.             return new JsonResponse(['conteo' => $conteo, 'data' => $response], Response::HTTP_OK);
  283.         }
  284.         #Se construye el formulario
  285.         $anios = $solRep->obtenerAnios();
  286.         foreach ($anios as $anio) {
  287.             $data[$anio[1]] = $anio[1];
  288.         }
  289.         $form = $this->createForm(PAMPFiltroType::class, null, ['anios' => $data, 'unidad' => $unidad]);
  290.         $form->handleRequest($request);
  291.         return $this->render('prog_preventivo/pamp.html.twig', [
  292.             'solicitud' => $solicitud,
  293.             'conteo' => $conteo,
  294.             'form' => $form->createView(),
  295.             'nivel' => $nivel
  296.         ]);
  297.     }
  298.     #[Route('/vista/contador', name: 'prog_preventivo_vista')]
  299.     public function vistaContador() :JsonResponse
  300.     {
  301.         $em = $this->getDoctrine()->getManager();
  302.         $query = $em->createQuery(
  303.             'SELECT s.tipoEquipo, s.idEquipo, count(s) AS equipoCont 
  304.             FROM App:Solicitud s
  305.             WHERE s.tipoMantenimiento = :mantenimiento
  306.             AND YEAR(s.fatencion) = :anio
  307.             GROUP BY s.idEquipo, s.tipoEquipo
  308.         '
  309.         );
  310.         $query->setParameter(':mantenimiento', 'MP');
  311.         $query->setParameter(':anio', date('Y'));
  312.         $cTodoEquipo = $query->getResult();
  313.         return new JsonResponse(['data' => $cTodoEquipo], Response::HTTP_OK);
  314.         /*$em = $this->getDoctrine()->getManager();
  315.         $query = $em->createQuery(
  316.             'SELECT s.tipoEquipo, s.idEquipo, count(s) AS equipoCont 
  317.                 FROM App:Solicitud s
  318.                 WHERE s.tipoMantenimiento = :mantenimiento
  319.                 GROUP BY s.idEquipo, s.tipoEquipo
  320.             '
  321.         );
  322.         $query->setParameter(':mantenimiento', 'MP');
  323.         $cTodoEquipo = $query->getResult();
  324.         return new JsonResponse(['data' => $cTodoEquipo], Response::HTTP_OK);*/
  325.     }
  326.     /**
  327.      * Programar solicitudes en relación con los checkbox activos, sin importar el tipo de equipo
  328.      * @Route("/solicitud/lote", name="prog_preventivo_solicitud_lote", methods={"GET", "POST"})
  329.      * @param Request $request
  330.      * @return JsonResponse
  331.      */
  332.     public function programarSolicitudLote(Request $request) :JsonResponse
  333.     {
  334.         $a = (array)$request->request->get('equipo');
  335.         $b = (array)$request->request->get('impresora');
  336.         $c = (array)$request->request->get('red');
  337.         $d = (array)$request->request->get('otro');
  338.         $nSolicitud[count($a) + count($b) + count($c) + count($d)][] = [];
  339.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  340.         $accion = $request->request->get('accion');
  341.         $fatencion = $request->request->get('fecha');
  342.         $fecha = new DateTime($fatencion);
  343.         //$currentYear = date("d M Y");
  344.         $mensaje = '';
  345.         $ns = 0;
  346.         $estatus = Response::HTTP_OK;
  347.         if ($accion == ""){
  348.             $mensaje = 'El campo "Acción a realizar" no debe estar vacío';
  349.             $estatus = Response::HTTP_NOT_FOUND;
  350.             return new JsonResponse(['mensaje' => $mensaje], $estatus);
  351.         }
  352.         /*if (substr($fatencion, 0, 4) >= $currentYear){
  353.             $mensaje = $mensaje . ' La fecha introducida debe coincidir con el año en curso';
  354.             $estatus = Response::HTTP_NOT_FOUND;
  355.             return new JsonResponse(['mensaje' => $mensaje], $estatus);
  356.         }*/
  357.         if ($fatencion == ""){
  358.             $mensaje = $mensaje . ' El campo "Fecha de registro" no debe estar vacío';
  359.             $estatus = Response::HTTP_NOT_FOUND;
  360.             return new JsonResponse(['mensaje' => $mensaje], $estatus);
  361.         }
  362.         if ($request->request->get('equipo'))
  363.         {
  364.             $equipos = (array)$request->request->get('equipo');
  365.             $limite = count($equipos);
  366.             for ($i = 0; $i < $limite; $i++){
  367.                 $equipo = $this->entityManager->getRepository(Equipo::class)->findOneBy(['idEqu' => $equipos[$i]]);
  368.                 $data = [
  369.                     "accion" => $accion,
  370.                     "fatencion" => $fecha,
  371.                     "periodo" => $periodo->getIdPrd()
  372.                 ];
  373.                 $ids = $this->solicitudProgramacionTipoA($equipo, $data);
  374.                 $reproUrl = $this->generateUrl('prog_preventivo_reprogramar', ['id' => $ids], UrlGeneratorInterface::ABSOLUTE_URL);
  375.                 $nSolicitud[$ns] = [
  376.                     'tipoequipo' => 'Equipo',
  377.                     'idequipo' => $equipo->getIdEqu(),
  378.                     'fregistro' => $fecha->format('d M Y'),
  379.                     'tipomantenimiento' => 'MP',
  380.                     'accion' => $accion,
  381.                     'unidad' => $equipo->getUnidad()->getNombre(),
  382.                     'reprogramar' => $reproUrl
  383.                 ];
  384.                 $ns++;
  385.             }
  386.             $mensaje = $mensaje . ' Se programarón ' . $limite . ' servicios de mantenimiento a equipos de computo';
  387.         }
  388.         if ($request->request->get('impresora'))
  389.         {
  390.             $impresoras = (array)$request->request->get('impresora');
  391.             $limite = count($impresoras);
  392.             for ($i = 0; $i < $limite; $i++)
  393.             {
  394.                 $impresora = $this->entityManager->getRepository(Impresora::class)->findOneBy(['idImp' => $impresoras[$i]]);
  395.                 $data = [
  396.                     "accion" => $accion,
  397.                     "fatencion" => $fecha,
  398.                     "periodo" => $periodo->getIdPrd()
  399.                 ];
  400.                 $ids = $this->solicitudProgramacionTipoB($impresora, $data);
  401.                 $reproUrl = $this->generateUrl('prog_preventivo_reprogramar', ['id' => $ids], UrlGeneratorInterface::ABSOLUTE_URL);
  402.                 $nSolicitud[$ns] = [
  403.                     'tipoequipo' => 'Impresora',
  404.                     'idequipo' => $impresora->getIdImp(),
  405.                     'fregistro' => $fecha->format('d M Y'),
  406.                     'tipomantenimiento' => 'MP',
  407.                     'accion' => $accion,
  408.                     'unidad' => $impresora->getUnidad()->getNombre(),
  409.                     'reprogramar' => $reproUrl
  410.                 ];
  411.                 $ns++;
  412.             }
  413.             $mensaje = $mensaje . ' Se programarón ' . $limite . ' servicios de mantenimiento a impresoras';
  414.         }
  415.         if ($request->request->get('red'))
  416.         {
  417.             $redes = (array)$request->request->get('red');
  418.             $limite = count($redes);
  419.             for ($i = 0; $i < $limite; $i++)
  420.             {
  421.                 $red = $this->entityManager->getRepository(Red::class)->findOneBy(['idRed' => $redes[$i]]);
  422.                 $data = [
  423.                     "accion" => $accion,
  424.                     "fatencion" => $fecha,
  425.                     "periodo" => $periodo->getIdPrd()
  426.                 ];
  427.                 $ids = $this->solicitudProgramacionTipoC($red, $data);
  428.                 $reproUrl = $this->generateUrl('prog_preventivo_reprogramar', ['id' => $ids], UrlGeneratorInterface::ABSOLUTE_URL);
  429.                 $nSolicitud[$ns] = [
  430.                     'tipoequipo' => 'Red',
  431.                     'idequipo' => $red->getIdRed(),
  432.                     'fregistro' => $fecha->format('d M Y'),
  433.                     'tipomantenimiento' => 'MP',
  434.                     'accion' => $accion,
  435.                     'unidad' => $red->getUnidad()->getNombre(),
  436.                     'reprogramar' => $reproUrl
  437.                 ];
  438.                 $ns++;
  439.             }
  440.             $mensaje = $mensaje . ' Se programarón ' . $limite . ' servicios de mantenimiento a equipos de red';
  441.         }
  442.         if ($request->request->get('otro'))
  443.         {
  444.             $otros = (array)$request->request->get('otro');
  445.             $limite = count($otros);
  446.             for ($i = 0; $i < $limite; $i++)
  447.             {
  448.                 $otro = $this->entityManager->getRepository(Otro::class)->findOneBy(['idOtro' => $otros[$i]]);
  449.                 $data = [
  450.                     "accion" => $accion,
  451.                     "fatencion" => $fecha,
  452.                     "periodo" => $periodo->getIdPrd()
  453.                 ];
  454.                 $ids = $this->solicitudProgramacionTipoD($otro, $data);
  455.                 $reproUrl = $this->generateUrl('prog_preventivo_reprogramar', ['id' => $ids], UrlGeneratorInterface::ABSOLUTE_URL);
  456.                 $nSolicitud[$ns] = [
  457.                     'tipoequipo' => 'Otro',
  458.                     'idequipo' => $otro->getIdOtro(),
  459.                     'fregistro' => $fecha->format('d M Y'),
  460.                     'tipomantenimiento' => 'MP',
  461.                     'accion' => $accion,
  462.                     'unidad' => $otro->getUnidad()->getNombre(),
  463.                     'reprogramar' => $reproUrl
  464.                 ];
  465.                 $ns++;
  466.             }
  467.             $mensaje = $mensaje . ' Se programarón ' . $limite . ' servicios de mantenimiento a otros';
  468.         }
  469.         return new JsonResponse([
  470.             'mensaje' => $mensaje,
  471.             'info' => $nSolicitud,
  472.         ], $estatus);
  473.     }
  474.     /**
  475.      * Programar solicitud por equipo, solo tipo equipo
  476.      * @Route("/solicitud/equipo/{id}", name="prog_preventivo_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' => 'Preventivo',
  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('fregistro');
  495.         $form->remove('ffin');
  496.         $form->remove('fevaluacion');
  497.         $form->remove('refacciones');
  498.         $form->remove('estatus');
  499.         $form->remove('usuario');
  500.         $form->remove('ubicacion');
  501.         $form->remove('gestor');
  502.         $form->handleRequest($request);
  503.         if ($form->isSubmitted() && $form->isValid()) {
  504.             if($form->get('falla')->getData() == "" || $form->get('srealizado')->getData() == "" || $form->get('fatencion')->getData() == ""){
  505.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  506.             }
  507.             $y = $form->get('fatencion')->getData()->format('Y/m/d');
  508.             $fecha = new DateTime($y);
  509.             $data = [
  510.                 "accion" => $form->get('falla')->getData(),
  511.                 "fatencion" => $fecha,
  512.                 "periodo" => $periodo->getIdPrd()
  513.             ];
  514.             $this->solicitudProgramacionTipoA($equipo, $data);
  515.             return new JsonResponse(['mensaje' => 'Se ha programado el mantenimiento para equipo de cómputo']);
  516.         }
  517.         if ($form->isSubmitted() && !$form->isValid()) {
  518.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  519.                 'form' => $form->createView(),
  520.                 'info' => $info
  521.             ]);
  522.             $response = new JsonResponse(['form' => $view]);
  523.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  524.             return $response;
  525.         }
  526.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  527.             'form' => $form,
  528.             'info' => $info
  529.         ]);
  530.     }
  531.     /**
  532.      * Programar solicitud por equipo, solo tipo impresora
  533.      * @Route("/solicitud/impresora/{id}", name="prog_preventivo_solicitud_tipob", methods={"GET", "POST"})
  534.      * @param Impresora $impresora
  535.      * @param Request $request
  536.      * @return Response
  537.      */
  538.     public function programarSolicitudTipoB(Request $request, Impresora $impresora) :Response
  539.     {
  540.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  541.         $info = [
  542.             'tipoEquipo' => 'Impresora',
  543.             'tipoMantenimiento' => 'Preventivo',
  544.             'marbete' => $impresora->getMarbete()
  545.         ];
  546.         $form = $this->createForm(SolicitudType::class);
  547.         $form->remove('tipoEquipo');
  548.         $form->remove('idEquipo');
  549.         $form->remove('periodo');
  550.         $form->remove('tipoMantenimiento');
  551.         $form->remove('fregistro');
  552.         $form->remove('ffin');
  553.         $form->remove('fevaluacion');
  554.         $form->remove('refacciones');
  555.         $form->remove('estatus');
  556.         $form->remove('usuario');
  557.         $form->remove('ubicacion');
  558.         $form->remove('gestor');
  559.         $form->handleRequest($request);
  560.         if ($form->isSubmitted() && $form->isValid()) {
  561.             if($form->get('falla')->getData() == "" || $form->get('srealizado')->getData() == "" || $form->get('fatencion')->getData() == null){
  562.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  563.             }
  564.             $y = $form->get('fatencion')->getData()->format('Y/m/d');
  565.             $fecha = new DateTime($y);
  566.             $data = [
  567.                 "accion" => $form->get('falla')->getData(),
  568.                 "fatencion" => $fecha,
  569.                 "periodo" => $periodo->getIdPrd()
  570.             ];
  571.             $this->solicitudProgramacionTipoB($impresora, $data);
  572.             return new JsonResponse(['mensaje' => 'Se ha programado el mantenimiento para impresora']);
  573.         }
  574.         if ($form->isSubmitted() && !$form->isValid()) {
  575.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  576.                 'form' => $form->createView(),
  577.                 'info' => $info
  578.             ]);
  579.             $response = new JsonResponse(['form' => $view]);
  580.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  581.             return $response;
  582.         }
  583.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  584.             'form' => $form,
  585.             'info' => $info
  586.         ]);
  587.     }
  588.     /**
  589.      * Programar solicitud por equipo, solo tipo red
  590.      * @Route("/solicitud/red/{id}", name="prog_preventivo_solicitud_tipoc", methods={"GET", "POST"})
  591.      * @param Red $red
  592.      * @param Request $request
  593.      * @return Response
  594.      */
  595.     public function programarSolicitudTipoC(Request $request, Red $red) :Response
  596.     {
  597.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  598.         $info = [
  599.             'tipoEquipo' => 'Red',
  600.             'tipoMantenimiento' => 'Preventivo',
  601.             'marbete' => $red->getMarbete()
  602.         ];
  603.         $form = $this->createForm(SolicitudType::class);
  604.         $form->remove('tipoEquipo');
  605.         $form->remove('idEquipo');
  606.         $form->remove('periodo');
  607.         $form->remove('tipoMantenimiento');
  608.         $form->remove('fregistro');
  609.         $form->remove('ffin');
  610.         $form->remove('fevaluacion');
  611.         $form->remove('refacciones');
  612.         $form->remove('estatus');
  613.         $form->remove('usuario');
  614.         $form->remove('ubicacion');
  615.         $form->remove('gestor');
  616.         $form->handleRequest($request);
  617.         if ($form->isSubmitted() && $form->isValid()) {
  618.             if($form->get('falla')->getData() == "" || $form->get('srealizado')->getData() == "" || $form->get('fatencion')->getData() == null){
  619.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  620.             }
  621.             $y = $form->get('fatencion')->getData()->format('Y/m/d');
  622.             $fecha = new DateTime($y);
  623.             $data = [
  624.                 "accion" => $form->get('falla')->getData(),
  625.                 "fatencion" => $fecha,
  626.                 "periodo" => $periodo->getIdPrd()
  627.             ];
  628.             $this->solicitudProgramacionTipoC($red, $data);
  629.             return new JsonResponse(['mensaje' => 'Se ha programado el mantenimiento para red']);
  630.         }
  631.         if ($form->isSubmitted() && !$form->isValid()) {
  632.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  633.                 'form' => $form->createView(),
  634.                 'info' => $info
  635.             ]);
  636.             $response = new JsonResponse(['form' => $view]);
  637.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  638.             return $response;
  639.         }
  640.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  641.             'form' => $form,
  642.             'info' => $info
  643.         ]);
  644.     }
  645.     /**
  646.      * Programar solicitud por equipo, solo tipo otro
  647.      * @Route("/solicitud/otro/{id}", name="prog_preventivo_solicitud_tipod", methods={"GET", "POST"})
  648.      * @param Otro $otro
  649.      * @param Request $request
  650.      * @return Response
  651.      */
  652.     public function programarSolicitudTipoD(Request $request, Otro $otro) :Response
  653.     {
  654.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  655.         $info = [
  656.             'tipoEquipo' => 'Otro',
  657.             'tipoMantenimiento' => 'Correctivo',
  658.             'marbete' => $otro->getMarbete()
  659.         ];
  660.         $form = $this->createForm(SolicitudType::class);
  661.         $form->remove('tipoEquipo');
  662.         $form->remove('idEquipo');
  663.         $form->remove('periodo');
  664.         $form->remove('tipoMantenimiento');
  665.         $form->remove('fregistro');
  666.         $form->remove('ffin');
  667.         $form->remove('fevaluacion');
  668.         $form->remove('refacciones');
  669.         $form->remove('estatus');
  670.         $form->remove('usuario');
  671.         $form->remove('ubicacion');
  672.         $form->remove('gestor');
  673.         $form->handleRequest($request);
  674.         if ($form->isSubmitted() && $form->isValid()) {
  675.             if($form->get('falla')->getData() == "" || $form->get('srealizado')->getData() == "" || $form->get('fatencion')->getData() == null){
  676.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  677.             }
  678.             $y = $form->get('fatencion')->getData()->format('Y/m/d');
  679.             $fecha = new DateTime($y);
  680.             $data = [
  681.                 "accion" => $form->get('falla')->getData(),
  682.                 "fatencion" => $fecha,
  683.                 "periodo" => $periodo->getIdPrd()
  684.             ];
  685.             $this->solicitudProgramacionTipoD($otro, $data);
  686.             return new JsonResponse(['mensaje' => 'Se ha programado el mantenimiento para otro tipo de equipo']);
  687.         }
  688.         if ($form->isSubmitted() && !$form->isValid()) {
  689.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  690.                 'form' => $form->createView(),
  691.                 'info' => $info
  692.             ]);
  693.             $response = new JsonResponse(['form' => $view]);
  694.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  695.             return $response;
  696.         }
  697.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  698.             'form' => $form,
  699.             'info' => $info
  700.         ]);
  701.     }
  702.     /**
  703.      * Reprogramar solicitud, solo disponibilidad de modificación para el campo falla
  704.      * @Route("/reprogramar/solicitud/{id}", name="prog_preventivo_reprogramar", methods={"GET", "POST"})
  705.      * @param Solicitud $solicitud
  706.      * @param Request $request
  707.      * @return JsonResponse
  708.      */
  709.     public function reprogramarSolicitud(Request $request, Solicitud $solicitud) :JsonResponse
  710.     {
  711.         $a = $request->request->get($request->get('id'). '-falla');
  712.         $b = $request->request->get($request->get('id'). '-fregistro');
  713.         $solicitud->setFalla($a);
  714.         $solicitud->setFatencion(new DateTime($b));
  715.         $this->entityManager->persist($solicitud);
  716.         $this->entityManager->flush();
  717.         return new JsonResponse([
  718.             'mensaje' => 'Se ha editado la solicitud ' . $solicitud->getIdSol() . ', Acción a realizar: ' . $a . '.',
  719.             'idsol' => $solicitud->getIdSol(),
  720.             'falla' => $a,
  721.             'fregistro' => $solicitud->getFregistro()->format('d M Y'),
  722.         ], Response::HTTP_OK);
  723.     }
  724.     /**
  725.      * Función para crear objeto tipo equipo e insertar en la base de datos
  726.      * @param Equipo $equipo Referencia a la entidad
  727.      * @param array $data Array con la información específica a complementar
  728.      * @return string Para creación de botón en la vista
  729.      */
  730.     /**
  731.      * @param array<int, object> $entidades
  732.      */
  733.     private function ordenarPorFevaluacionAsc(array &$entidades): void
  734.     {
  735.         usort($entidades, function (object $a, object $b): int {
  736.             $fa = $a->fevaluacion ?? '';
  737.             $fb = $b->fevaluacion ?? '';
  738.             if ($fa === '' && $fb === '') {
  739.                 return 0;
  740.             }
  741.             if ($fa === '') {
  742.                 return 1;
  743.             }
  744.             if ($fb === '') {
  745.                 return -1;
  746.             }
  747.             return strtotime((string) $fa) <=> strtotime((string) $fb);
  748.         });
  749.     }
  750.     private function solicitudProgramacionTipoA(Equipo $equipo, $data)
  751.     {
  752.         date_default_timezone_set("America/Mexico_City");
  753.         /** @var Usuario $user */
  754.         $user = $this->getUser();
  755.         # Identificador de solicitud
  756.         $partA = date("y");
  757.         $partB = substr($equipo->getUnidad()->getIdUni(), 3, 3);
  758.         $partC = str_pad($equipo->getUnidad()->getConsecutivo(), 4,"0", STR_PAD_LEFT);
  759.         $idSolicitud = $partA.$partB.$partC;
  760.         $save = new Solicitud();
  761.         $save->setIdSol($idSolicitud);
  762.         $save->setIdEquipo($equipo->getIdEqu());
  763.         $save->setTipoEquipo("Equipo");
  764.         $save->setTipoMantenimiento("MP");
  765.         $save->setUnidad($equipo->getUnidad());
  766.         $save->setUsuario($equipo->getUsuario());
  767.         $save->setUbicacion($equipo->getUbicacion());
  768.         $save->setGestor($user);
  769.         $save->setPeriodo($data['periodo']);
  770.         $save->setFalla($data['accion']);
  771.         $save->setFregistro(new DateTime());
  772.         $save->setFatencion($data['fatencion']);
  773.         $save->setEstatus(1);
  774.         $this->entityManager->persist($save);
  775.         $this->entityManager->flush();
  776.         $unidad = $equipo->getUnidad();
  777.         $unidad->setConsecutivo($unidad->getConsecutivo() + 1);
  778.         $this->entityManager->persist($unidad);
  779.         $this->entityManager->flush();
  780.         return $idSolicitud;
  781.     }
  782.     /**
  783.      * Función para crear objeto tipo impresora e insertar en la base de datos
  784.      * @param Impresora $impresora Referencia a la entidad
  785.      * @param array $data Array con la información específica a complementar
  786.      * @return string Para creación de botón en la vista
  787.      */
  788.     private function solicitudProgramacionTipoB(Impresora $impresora, $data)
  789.     {
  790.         date_default_timezone_set("America/Mexico_City");
  791.         /** @var Usuario $user */
  792.         $user = $this->getUser();
  793.         # Identificador de solicitud
  794.         $partA = date("y");
  795.         $partB = substr($impresora->getUnidad()->getIdUni(), 3, 3);
  796.         $partC = str_pad($impresora->getUnidad()->getConsecutivo(), 4,"0", STR_PAD_LEFT);
  797.         $idSolicitud = $partA.$partB.$partC;
  798.         $save = new Solicitud();
  799.         $save->setIdSol($idSolicitud);
  800.         $save->setIdEquipo($impresora->getIdImp());
  801.         $save->setTipoEquipo("Impresora");
  802.         $save->setTipoMantenimiento("MP");
  803.         $save->setUnidad($impresora->getUnidad());
  804.         $save->setUsuario($impresora->getUsuario());
  805.         $save->setUbicacion($impresora->getUbicacion());
  806.         $save->setGestor($user);
  807.         $save->setPeriodo($data['periodo']);
  808.         $save->setFalla($data['accion']);
  809.         $save->setFregistro(new DateTime());
  810.         $save->setFatencion($data['fatencion']);
  811.         $save->setEstatus(1);
  812.         $this->entityManager->persist($save);
  813.         $this->entityManager->flush();
  814.         $unidad = $impresora->getUnidad();
  815.         $unidad->setConsecutivo($unidad->getConsecutivo() + 1);
  816.         $this->entityManager->persist($unidad);
  817.         $this->entityManager->flush();
  818.         return $idSolicitud;
  819.     }
  820.     /**
  821.      * Función para crear objeto tipo red e insertar en la base de datos
  822.      * @param Red $red Referencia a la entidad
  823.      * @param array $data Array con la información específica a complementar
  824.      * @return string Para creación de botón en la vista
  825.      */
  826.     private function solicitudProgramacionTipoC(Red $red, $data)
  827.     {
  828.         date_default_timezone_set("America/Mexico_City");
  829.         /** @var Usuario $user */
  830.         $user = $this->getUser();
  831.         # Identificador de solicitud
  832.         $partA = date("y");
  833.         $partB = substr($red->getUnidad()->getIdUni(), 3, 3);
  834.         $partC = str_pad($red->getUnidad()->getConsecutivo(), 4,"0", STR_PAD_LEFT);
  835.         $idSolicitud = $partA.$partB.$partC;
  836.         $save = new Solicitud();
  837.         $save->setIdSol($idSolicitud);
  838.         $save->setIdEquipo($red->getIdRed());
  839.         $save->setTipoEquipo("Red");
  840.         $save->setTipoMantenimiento("MP");
  841.         $save->setUnidad($red->getUnidad());
  842.         $save->setUsuario($red->getUsuario());
  843.         $save->setUbicacion($red->getUbicacion());
  844.         $save->setGestor($user);
  845.         $save->setPeriodo($data['periodo']);
  846.         $save->setFalla($data['accion']);
  847.         $save->setFregistro(new DateTime());
  848.         $save->setFatencion($data['fatencion']);
  849.         $save->setEstatus(1);
  850.         $this->entityManager->persist($save);
  851.         $this->entityManager->flush();
  852.         $unidad = $red->getUnidad();
  853.         $unidad->setConsecutivo($unidad->getConsecutivo() + 1);
  854.         $this->entityManager->persist($unidad);
  855.         $this->entityManager->flush();
  856.         return $idSolicitud;
  857.     }
  858.     /**
  859.      * Función para crear objeto tipo otro e insertar en la base de datos
  860.      * @param Otro $otro Referencia a la entidad
  861.      * @param array $data Array con la información específica a complementar
  862.      * @return string Para creación de botón en la vista
  863.      */
  864.     private function solicitudProgramacionTipoD(Otro $otro, $data)
  865.     {
  866.         date_default_timezone_set("America/Mexico_City");
  867.         /** @var Usuario $user */
  868.         $user = $this->getUser();
  869.         # Identificador de solicitud
  870.         $partA = date("y");
  871.         $partB = substr($otro->getUnidad()->getIdUni(), 3, 3);
  872.         $partC = str_pad($otro->getUnidad()->getConsecutivo(), 4,"0", STR_PAD_LEFT);
  873.         $idSolicitud = $partA.$partB.$partC;
  874.         $save = new Solicitud();
  875.         $save->setIdSol($idSolicitud);
  876.         $save->setIdEquipo($otro->getIdOtro());
  877.         $save->setTipoEquipo("Otro");
  878.         $save->setTipoMantenimiento("MP");
  879.         $save->setUnidad($otro->getUnidad());
  880.         $save->setUsuario($otro->getUsuario());
  881.         $save->setUbicacion($otro->getUbicacion());
  882.         $save->setGestor($user);
  883.         $save->setPeriodo($data['periodo']);
  884.         $save->setFalla($data['accion']);
  885.         $save->setFregistro(new DateTime());
  886.         $save->setFatencion($data['fatencion']);
  887.         $save->setEstatus(1);
  888.         $this->entityManager->persist($save);
  889.         $this->entityManager->flush();
  890.         $unidad = $otro->getUnidad();
  891.         $unidad->setConsecutivo($unidad->getConsecutivo() + 1);
  892.         $this->entityManager->persist($unidad);
  893.         $this->entityManager->flush();
  894.         return $idSolicitud;
  895.     }
  896.     /**
  897.      * Consulta de solicitudes programadas por equipo, de tipo equipo
  898.      * @Route("/programada/consulta/equipo/{id}", name="prog_preventivo_programada_tipoa", methods={"GET", "POST"})
  899.      * @param Equipo $equipo
  900.      * @param Request $request
  901.      * @return Response
  902.      */
  903.     public function consultaProgramadaTipoA(Request $request, Equipo $equipo) :Response
  904.     {
  905.         $info = [
  906.             'tipoEquipo' => 'Equipo',
  907.             'tipoMantenimiento' => 'Preventivo'
  908.         ];
  909.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($equipo->getIdEqu(), $info['tipoEquipo'], 'MP');
  910.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  911.             'info' => $info,
  912.             'solicitud' => $programadas
  913.         ]);
  914.     }
  915.     /**
  916.      * Consulta de solicitudes programadas por equipo, de tipo impresora
  917.      * @Route("/programada/consulta/impresora/{id}", name="prog_preventivo_programada_tipob", methods={"GET", "POST"})
  918.      * @param impresora $impresora
  919.      * @param Request $request
  920.      * @return Response
  921.      */
  922.     public function consultaProgramadaTipoB(Request $request, Impresora $impresora) :Response
  923.     {
  924.         $info = [
  925.             'tipoEquipo' => 'Impresora',
  926.             'tipoMantenimiento' => 'Preventivo'
  927.         ];
  928.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($impresora->getIdImp(), $info['tipoEquipo'], 'MP');
  929.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  930.             'info' => $info,
  931.             'solicitud' => $programadas
  932.         ]);
  933.     }
  934.     /**
  935.      * Consulta de solicitudes programadas por equipo, de tipo red
  936.      * @Route("/programada/consulta/red/{id}", name="prog_preventivo_programada_tipoc", methods={"GET", "POST"})
  937.      * @param Red $red
  938.      * @param Request $request
  939.      * @return Response
  940.      */
  941.     public function consultaProgramadaTipoC(Request $request, Red $red) :Response
  942.     {
  943.         $info = [
  944.             'tipoEquipo' => 'Red',
  945.             'tipoMantenimiento' => 'Preventivo'
  946.         ];
  947.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($red->getIdRed(), $info['tipoEquipo'], 'MP');
  948.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  949.             'info' => $info,
  950.             'solicitud' => $programadas
  951.         ]);
  952.     }
  953.     /**
  954.      * Consulta de solicitudes programadas por equipo, de tipo otro
  955.      * @Route("/programada/consulta/otro/{id}", name="prog_preventivo_programada_tipod", methods={"GET", "POST"})
  956.      * @param Otro $otro
  957.      * @param Request $request
  958.      * @return Response
  959.      */
  960.     public function consultaProgramadaTipoD(Request $request, Otro $otro) :Response
  961.     {
  962.         $info = [
  963.             'tipoEquipo' => 'Otro',
  964.             'tipoMantenimiento' => 'Preventivo'
  965.         ];
  966.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($otro->getIdOtro(), $info['tipoEquipo'], 'MP');
  967.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  968.             'info' => $info,
  969.             'solicitud' => $programadas
  970.         ]);
  971.     }
  972. }