src/Controller/ProgManttoCorrectivoController.php line 109

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Equipo;
  4. use App\Entity\Evaluacion;
  5. use App\Entity\Impresora;
  6. use App\Entity\Otro;
  7. use App\Entity\Periodo;
  8. use App\Entity\Red;
  9. use App\Entity\Solicitud;
  10. use App\Entity\Usuario;
  11. use App\Form\EvaluacionSelecType;
  12. use App\Form\EvaluacionType;
  13. use App\Form\SolicitudType;
  14. use App\Form\SolicitudSelecType;
  15. use App\Service\VistaTipoEquipo;
  16. use DateTime;
  17. use Doctrine\ORM\EntityRepository;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  20. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  21. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  22. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  23. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  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\Serializer\SerializerInterface;
  30. use Symfony\Component\Validator\Constraints\NotBlank;
  31. #[Route('/programacion/correctivo')]
  32. class ProgManttoCorrectivoController extends AbstractController
  33. {
  34.     public EntityManagerInterface $entityManager;
  35.     public SerializerInterface $serializer;
  36.     /**
  37.      * @param EntityManagerInterface $entityManager
  38.      */
  39.     public function __construct(EntityManagerInterface $entityManager, SerializerInterface $serializer)
  40.     {
  41.         $this->entityManager = $entityManager;
  42.         $this->serializer = $serializer;
  43.     }
  44.     #[Route('/', name: 'prog_correctivo_index')]
  45.     public function index(Request $request): Response
  46.     {
  47.         /** @var Usuario $user */
  48.         $user = $this->getUser();
  49.         $solicitudes = $this->entityManager->getRepository(Solicitud::class)->registroTipoEquipoUsuario($user->getIdUsu(), 1);
  50.         $atendidas = array_reduce($solicitudes, function ($carry, $solicitud) {
  51.             return $solicitud['estatus'] == 3 ? $carry + 1 : $carry;
  52.         }, 0);
  53.         $invocation = $this->obtenerAtributoEntidad(null, null);
  54.         $solicitar = $this->createForm(SolicitudSelecType::class, null, ['opciones' => $invocation['opciones'], 'opciones_attr' => $invocation['opciones_attr']]);
  55.         $solicitar->handleRequest($request);
  56.         $evaluar = $this->createForm(EvaluacionSelecType::class, null, ['usuario' => $user]);
  57.         $evaluar->handleRequest($request);
  58.         if ($solicitar->isSubmitted() && $solicitar->isValid() && $request->isMethod('POST') && $solicitar->get('origen')->getData() === 'form-equipo-solicitud') {
  59.             $fallaValue = $solicitar->get('falla')->getData();
  60.             if ($fallaValue === null || trim((string) $fallaValue) === '') {
  61.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  62.             }
  63.             $invo = $this->mapeoTipoEquipo($solicitar->get('tipo')->getData());
  64.             $entidad = $this->consultaEntidad([
  65.                 'id' => $solicitar->get('marbete')->getData(),
  66.                 'tipo' => $solicitar->get('tipo')->getData(),
  67.                 'campo' => $invo['atributo']
  68.             ]);
  69.             if (!$entidad) {
  70.                 return new JsonResponse(['mensaje' => $solicitar->get('tipo')->getData() . ' no encontrado'], Response::HTTP_NOT_FOUND);
  71.             }
  72.             $info = $this->programarSolicitudSave($this->construirDatosEntidad($entidad, $solicitar->get('tipo')->getData(), $solicitar));
  73.             return new JsonResponse($info);
  74.         }
  75.         if ($solicitar->isSubmitted() && !$solicitar->isValid() && $solicitar->get('origen')->getData() === 'form-equipo-solicitud') {
  76.             $view = $this->renderView('prog_correctivo/index.html.twig', [
  77.                 'equipos' => $invocation['opciones_type'],
  78.                 'solicitudes' => $solicitudes,
  79.                 'atendidas' => $atendidas,
  80.                 'solicitar' => $solicitar->createView(),
  81.                 'evaluar' => $evaluar->createView()
  82.             ]);
  83.             $response = new JsonResponse(['form' => $view]);
  84.             return $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  85.         }
  86.         if ($evaluar->isSubmitted() && $evaluar->isValid() && $request->isMethod('POST') && $evaluar->get('origen')->getData() === 'form-equipo-evaluar'){
  87.             $solicitudData = $evaluar->get('marbete')->getData();
  88.             $solicitud = $this->entityManager->getRepository(Solicitud::class)->find($solicitudData->getIdSol());
  89.             
  90.             if (!$solicitud) {
  91.                 return new JsonResponse(['mensaje' => 'Solicitud no encontrada'], Response::HTTP_NOT_FOUND);
  92.             }
  93.             
  94.             $this->evaluarSolicitudSave([
  95.                 'reacta' => $evaluar->get('evalua1')->getData(),
  96.                 'reactb' => $evaluar->get('evalua2')->getData(),
  97.                 'reactc' => $evaluar->get('evalua3')->getData(),
  98.                 'reactd' => $evaluar->get('evalua4')->getData(),
  99.                 'reacte' => $evaluar->get('evalua5')->getData(),
  100.                 'solicitud' => $solicitud,
  101.                 'usuario' => $user
  102.             ]);
  103.             
  104.             return new JsonResponse(['message' => 'Evaluación guardada correctamente', 'id' => $solicitud->getIdSol()]);
  105.         }
  106.         if ($evaluar->isSubmitted() && !$evaluar->isValid() && $evaluar->get('origen')->getData() === 'form-equipo-evaluar'){
  107.             $view = $this->renderView('prog_correctivo/index.html.twig', [
  108.                 'equipos' => $invocation['opciones_type'],
  109.                 'solicitudes' => $solicitudes,
  110.                 'atendidas' => $atendidas,
  111.                 'solicitar' => $solicitar->createView(),
  112.                 'evaluar' => $evaluar->createView()
  113.             ]);
  114.             $response = new JsonResponse(['form' => $view]);
  115.             return $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  116.         }
  117.         return $this->render('prog_correctivo/index.html.twig', [
  118.             'equipos' => $invocation['opciones_type'],
  119.             'solicitudes' => $solicitudes,
  120.             'atendidas' => $atendidas,
  121.             'solicitar' => $solicitar->createView(),
  122.             'evaluar' => $evaluar->createView()
  123.         ]);
  124.     }
  125.     /**
  126.      * Vista detallada de solicitud
  127.      * @Route("/vista/solicitud/{id}", name="prog_correctivo_vista_solicitud", methods={"GET", "POST"})
  128.      * @param Request $request
  129.      * @return Response
  130.      */
  131.     public function vistaSolicitud(Request $request) :Response
  132.     {
  133.         $solicitud = $this->entityManager->getRepository(Solicitud::class)->detalleTipoEquipoSolicitud($request->get('id'));
  134.         return $this->render('prog_solicitud/informacion_solicitud.html.twig', ['info' => $solicitud]);
  135.     }
  136.     #[Route('/vista/contador', name: 'prog_correctivo_vista')]
  137.     public function vistaContador() :JsonResponse
  138.     {
  139.         /** @var Usuario $user */
  140.         $user = $this->getUser();
  141.         $cTodoEquipo = $this->entityManager->getRepository(Solicitud::class)->conteoEstatusTipoEquipoUsuario($user->getIdUsu(), 1);
  142.         return new JsonResponse(['data' => $cTodoEquipo], Response::HTTP_OK);
  143.     }
  144.     /**
  145.      * Vista detallada por tipo, equipo, impresora, red, otro
  146.      * @Route("/vista/{tipo}/{id}", name="prog_correctivo_vista_tipo", methods={"GET", "POST"})
  147.      * @param Request $request
  148.      * @return Response
  149.      */
  150.     public function vistaTipo(Request $request) :Response
  151.     {
  152.         $service = new VistaTipoEquipo($this->entityManager);
  153.         $info = $service->consultaInformacion($request->get('tipo'), $request->get('id'));
  154.         return $this->render('prog_solicitud/informacion_tipo.html.twig', ['tipo' => $request->get('tipo'),'info' => $info]);
  155.     }
  156.     /**
  157.      * Elimina campos innecesarios del formulario de solicitud
  158.      * @param \Symfony\Component\Form\FormInterface $form
  159.      */
  160.     private function eliminarCamposFormulario(\Symfony\Component\Form\FormInterface $form): void
  161.     {
  162.         $campos = ['tipoEquipo', 'idEquipo', 'periodo', 'tipoMantenimiento', 'srealizado', 
  163.                    'fregistro', 'fatencion', 'ffin', 'evaluacion', 'refacciones', 'estatus', 
  164.                    'usuario', 'ubicacion', 'gestor'];
  165.         
  166.         foreach ($campos as $campo) {
  167.             $form->remove($campo);
  168.         }
  169.     }
  170.     /**
  171.      * Consulta de solicitudes programadas por equipo, de tipo impresora
  172.      * @Route("/programada/consulta/{tipo}/{id}", name="prog_correctivo_programada_tipo", methods={"GET", "POST"})
  173.      * @return Response
  174.      */
  175.     public function consultaProgramadaTipo(Request $request) :Response
  176.     {
  177.         $info = [
  178.             'tipoEquipo' => $request->get('tipo'),
  179.             'tipoMantenimiento' => 'Correctivo',
  180.             'siglasMantenimiento' => 'MC'
  181.         ];
  182.         $programadas = $this->entityManager->getRepository(Solicitud::class)->registroEquipoSolicitud($request->get('tipo'), $info['tipoEquipo'], $info['siglasMantenimiento']);
  183.         return $this->renderForm('prog_solicitud/programado.html.twig', [
  184.             'info' => $info,
  185.             'solicitud' => $programadas
  186.         ]);
  187.     }
  188.     /**
  189.      * Programar solicitud por equipo, solo tipo equipo
  190.      * @Route("/solicitud/{tipo}/{id}", name="prog_correctivo_solicitud_tipo", methods={"GET", "POST"})
  191.      * @param Request $request
  192.      * @return Response
  193.      */
  194.     public function programarSolicitud(Request $request) :Response
  195.     {
  196.         $entidad = $this->obtenerAtributoEntidad(null, $request->get('tipo'));
  197.         $entidad = $this->consultaEntidad([
  198.             'id' => $request->get('id'),
  199.             'tipo' => $request->get('tipo'),
  200.             'campo' => $entidad['propiedad']['atributo']
  201.         ]);
  202.         $info = [
  203.             'tipoEquipo' => $request->get('tipo'),
  204.             'tipoMantenimiento' => 'Correctivo',
  205.             'marbete' => $entidad->getMarbete()
  206.         ];
  207.         $form = $this->createForm(SolicitudType::class);
  208.         $this->eliminarCamposFormulario($form);
  209.         $form->handleRequest($request);
  210.         if ($form->isSubmitted() && $form->isValid()) {
  211.             if($form->get('falla')->getData() == "" || $form->get('falla') == null){
  212.                 return new JsonResponse(['mensaje' => 'El campo no debe estar vacío'], Response::HTTP_BAD_REQUEST);
  213.             }
  214.             $data = $this->construirDatosEntidad($entidad, $request->get('tipo'), $form);
  215.             $info = $this->programarSolicitudSave($data);
  216.             return new JsonResponse($info);
  217.         }
  218.         if ($form->isSubmitted() && !$form->isValid()) {
  219.             $view = $this->renderView('prog_solicitud/programar.html.twig', [
  220.                 'form' => $form->createView(),
  221.                 'info' => $info
  222.             ]);
  223.             $response = new JsonResponse(['form' => $view]);
  224.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  225.             return $response;
  226.         }
  227.         return $this->renderForm('prog_solicitud/programar.html.twig', [
  228.             'form' => $form,
  229.             'info' => $info
  230.         ]);
  231.     }
  232.     /**
  233.      * Función para crear objeto tipo solicitud e insertar en la base de datos
  234.      * @param array $data Array con la información específica a complementar
  235.      * @return array Para creación de botón en la vista
  236.      */
  237.     private function programarSolicitudSave($data)
  238.     {
  239.         date_default_timezone_set("America/Mexico_City");
  240.         $factual = new DateTime();
  241.         # Identificador de solicitud
  242.         $partA = date("y");
  243.         $partB = substr($data['unidad']->getIdUni(), 3, 3);
  244.         $partC = str_pad($data['unidad']->getConsecutivo(), 4,"0", STR_PAD_LEFT);
  245.         $idSolicitud = $partA.$partB.$partC;
  246.         $save = new Solicitud();
  247.         $save->setIdSol($idSolicitud);
  248.         $save->setIdEquipo($data['id']);
  249.         $save->setTipoEquipo($data['tipo']);
  250.         $save->setTipoMantenimiento("MC");
  251.         $save->setUnidad($data['unidad']);
  252.         $save->setUsuario($data['usuario']);
  253.         $save->setUbicacion($data['ubicacion']);
  254.         $save->setPeriodo($data['periodo']);
  255.         $save->setFalla($data['accion']);
  256.         $save->setFregistro($factual);
  257.         $save->setFatencion($factual);
  258.         $save->setEstatus(1);
  259.         $this->entityManager->persist($save);
  260.         $this->entityManager->flush();
  261.         $unidad = $data['unidad'];
  262.         $unidad->setConsecutivo($unidad->getConsecutivo() + 1);
  263.         $this->entityManager->persist($unidad);
  264.         $this->entityManager->flush();
  265.         $info = [
  266.             'mensaje' => 'Se ha generado la solicitud de mantenimiento, con el identificador ' . $save->getIdSol(),
  267.             'ver_solicitud' => $this->generateUrl('prog_correctivo_vista_solicitud', ['id' => $save->getIdSol()], UrlGeneratorInterface::ABSOLUTE_URL),
  268.             'solicitud' => $save->getIdSol(),
  269.             'tipo_equipo' => $save->getTipoEquipo(),
  270.             'equipo' => $save->getIdEquipo(),
  271.             'marbete' => $data['marbete'],
  272.             'marca' => $data['marca'],
  273.             'modelo' => $data['modelo'],
  274.             'falla' => $save->getFalla(),
  275.             'tipo_mantenimiento' => $save->getTipoMantenimiento(),
  276.             'fregistro' => $save->getFregistro()->format("d M Y, H:i"),
  277.             'estatus' => $save->getEstatus()
  278.         ];
  279.         return $info;
  280.     }
  281.     /**
  282.      * Evaluación de mantenimiento por solicitud
  283.      * @Route("/evaluacion/{idSol}", name="prog_correctivo_evaluacion", methods={"GET", "POST"})
  284.      * @param Solicitud $solicitud
  285.      * @param Request $request
  286.      * @return Response
  287.      */
  288.     public function evaluarSolicitud(Request $request, Solicitud $solicitud) :Response
  289.     {
  290.         /** @var Usuario $user */
  291.         $user = $this->getUser();
  292.         $contestada = $this->entityManager->getRepository(Evaluacion::class)->findOneBy(['solicitud' => $solicitud->getIdSol()]);
  293.         $nueva = 0;
  294.         $info = [
  295.             'solicitud' => $solicitud->getIdSol(),
  296.             'tipoMantenimiento' => $solicitud->getTipoMantenimiento(),
  297.         ];
  298.         if (empty($contestada) && $solicitud->getEstatus() == 3) {
  299.             $nueva = 1;
  300.             $form = $this->createForm(EvaluacionType::class);
  301.             $form->handleRequest($request);
  302.             if ($form->isSubmitted() && $form->isValid()) {
  303.                 $invocation = $this->evaluarSolicitudSave([
  304.                     'reacta' => $form->get('evalua1')->getData(),
  305.                     'reactb' => $form->get('evalua2')->getData(),
  306.                     'reactc' => $form->get('evalua3')->getData(),
  307.                     'reactd' => $form->get('evalua4')->getData(),
  308.                     'reacte' => $form->get('evalua5')->getData(),
  309.                     'solicitud' => $solicitud,
  310.                     'usuario' => $user
  311.                 ]);
  312.                 return new JsonResponse([
  313.                     'id' => $solicitud->getIdSol(),
  314.                     'estatus' => $invocation['estatus'],
  315.                     'mensaje' => 'Evaluación guardada correctamente'
  316.                 ]);
  317.             }
  318.         } else {
  319.             $form = $this->createForm(EvaluacionType::class, $contestada);
  320.             $form->handleRequest($request);
  321.         }
  322.         if ($form->isSubmitted() && !$form->isValid()) {
  323.             $view = $this->renderView('prog_correctivo/evaluacion.html.twig', [
  324.                 'form' => $form->createView(),
  325.                 'info' => $info,
  326.                 'nueva' => $nueva
  327.             ]);
  328.             $response = new JsonResponse(['form' => $view]);
  329.             $response->setStatusCode(Response::HTTP_BAD_REQUEST);
  330.             return $response;
  331.         }
  332.         return $this->renderForm('prog_correctivo/evaluacion.html.twig', [
  333.             'form' => $form,
  334.             'info' => $info,
  335.             'nueva' => $nueva
  336.         ]);
  337.     }
  338.     /**
  339.      * Función para crear objeto tipo evaluacion e insertar en la base de datos
  340.      * @param array $data Array con la información específica a complementar
  341.      * @return array Para creación de botón en la vista
  342.      */
  343.     private function evaluarSolicitudSave($data){
  344.         $evaluacion = new Evaluacion();
  345.         $evaluacion->setEvalua1($data['reacta']);
  346.         $evaluacion->setEvalua2($data['reactb']);
  347.         $evaluacion->setEvalua3($data['reactc']);
  348.         $evaluacion->setEvalua4($data['reactd']);
  349.         $evaluacion->setEvalua5($data['reacte']);
  350.         $evaluacion->setSolicitud($data['solicitud']);
  351.         $this->entityManager->persist($evaluacion);
  352.         $this->entityManager->flush();
  353.         date_default_timezone_set("America/Mexico_City");
  354.         $time = new DateTime();
  355.         $solicitud = $data['solicitud'];
  356.         $solicitud->setUsuario($data['usuario']);
  357.         $solicitud->setEstatus(4);
  358.         $solicitud->setFevaluacion($time);
  359.         $this->entityManager->persist($solicitud);
  360.         $this->entityManager->flush();
  361.         $estatus = "<span class='badge bg-gradient-danger d-block'>No evaluado</span>";
  362.         if ($solicitud->getEstatus() == 4){
  363.             $estatus="<span class='badge bg-gradient-green d-block'>Evaluado</span>";
  364.         }
  365.         return ['estatus' => $estatus];
  366.     }
  367.     
  368.     /**
  369.      * Construye el array de datos para la entidad según su tipo
  370.      * @param $entidad
  371.      * @param string $tipoEquipo
  372.      * @param \Symfony\Component\Form\FormInterface $form
  373.      * @param Periodo $periodo
  374.      * @return array
  375.      */
  376.     private function construirDatosEntidad($entidad, string $tipoEquipo, \Symfony\Component\Form\FormInterface $form): array
  377.     {
  378.         $periodo = $this->entityManager->getRepository(Periodo::class)->findOneBy(['activo' => 1, 'actual' => 1]);
  379.         if (!$periodo) {
  380.             return new JsonResponse(['mensaje' => 'No existe periodo activo'], Response::HTTP_BAD_REQUEST);
  381.         }
  382.         $data = $this->obtenerAtributoEntidad($entidad, $tipoEquipo);
  383.         
  384.         if (is_object($data['marca'])) {
  385.             $marca = $this->serializer->serialize($data['marca'], 'json');
  386.         } else {
  387.             $marca = $data['marca'];
  388.         }
  389.         
  390.         $data = [
  391.             "tipo" => $tipoEquipo,
  392.             "id" => $data['id'],
  393.             "marbete" => $entidad->getMarbete(),
  394.             "marca" => $marca,
  395.             "modelo" => $entidad->getModelo(),
  396.             "iduni" => $entidad->getUnidad()->getIdUni(),
  397.             "consuni" => $entidad->getUnidad()->getConsecutivo(),
  398.             "unidad" => $entidad->getUnidad(),
  399.             "usuario" => $entidad->getUsuario(),
  400.             "ubicacion" => $entidad->getUbicacion(),
  401.             "accion" => $form->get('falla')->getData(),
  402.             "periodo" => $periodo->getIdPrd()
  403.         ];
  404.         return $data;
  405.     }
  406.     private function obtenerAtributoEntidad(Equipo|Impresora|Red|Otro|null $entidad, string|null $tipoEquipo) 
  407.     {
  408.         /** @var Usuario $user */
  409.         $user = $this->getUser();
  410.         $mappings = $this->mapeoTipoEquipo($tipoEquipo);
  411.         
  412.         if (!$entidad && !$tipoEquipo) {
  413.             //throw new \Exception('Categoría de equipo indefinida');
  414.             foreach ($this->mapeoTipoEquipo($tipoEquipo) as $tipo) {
  415.                 $entidad = $this->consultaEntidad([
  416.                     'id' => $user->getIdUsu(),
  417.                     'tipo' => $tipo['singular'],
  418.                     'campo' => null,
  419.                     'usuario' => $user->getIdUsu()
  420.                 ], 'multiple');
  421.                 foreach ($entidad as $item) {
  422.                     $nombreMetodo = $tipo['metodo_id'];
  423.                     $data['opciones'][$tipo['plural']][$item->getMarbete() . ': ' . $item->getDescripcion()] = $item->$nombreMetodo();
  424.                     $data['opciones_attr'][$item->$nombreMetodo()] = ['data-tipo' => $tipo['singular'], 'data-id' => $item->getMarbete()];
  425.                     $data['opciones_type'][$tipo['singular']][$item->$nombreMetodo()] = $item;
  426.                 }
  427.             }
  428.             return $data;
  429.         }
  430.         // Extraemos la configuración específica
  431.         $metodoId = $mappings['metodo_id'];
  432.         $metodoMarca = $mappings['metodo_marca'];
  433.         $data['propiedad'] = $mappings;
  434.         $data['id'] = null; // Inicializar por seguridad
  435.         // Validación: Si $entidad es un objeto (no null y es object)
  436.         if ($entidad instanceof \stdClass || is_object($entidad)) {
  437.             if (!method_exists($entidad, $metodoId)) {
  438.                 throw new \Exception("El objeto no tiene el método: " . $metodoId);
  439.             }
  440.             
  441.             // CORRECCIÓN: Usamos $nombreMetodo (string) en lugar del array
  442.             $data['id'] = $entidad->$metodoId();
  443.             $data['marca'] = $entidad->$metodoMarca();
  444.         }
  445.         return $data;
  446.     }
  447.     private function consultaEntidad($data = null, string $control = null)
  448.     {
  449.         try {
  450.             $claseEntity = $this->entityManager->getClassMetadata('App\\Entity\\' . $data['tipo'])->name;
  451.         } catch (\Exception $e) {
  452.             throw new \Exception("Entidad no encontrada: " . $data['tipo']);
  453.         }
  454.         $qb = $this->entityManager->createQueryBuilder();
  455.         $qb = $qb->select('e');
  456.         $qb = $qb->from($claseEntity, 'e');
  457.         if (!empty($data['campo'])) {
  458.             $qb = $qb->where($qb->expr()->eq('e.' . $data['campo'], ':valor'))
  459.                 ->setParameter('valor', $data['id']);
  460.         }
  461.         if (!empty($data['usuario'])) {
  462.             $qb = $qb->addSelect('u')
  463.                 ->join('e.usuario', 'u')
  464.                 ->where('u.idUsu = :usuario')
  465.                 ->setParameter('usuario', $data['usuario']);
  466.         }
  467.         $qb = $qb->getQuery();
  468.         if($control === 'multiple'){
  469.             $qb = $qb->getResult();
  470.         } else {
  471.             $qb = $qb->getOneOrNullResult();
  472.         }
  473.         return $qb;
  474.     }
  475.     private function mapeoTipoEquipo(string|null $tipo){
  476.         $mappings = [
  477.             'Equipo'   => ['metodo_id' => 'getIdEqu', 'metodo_marca' => 'getIdMarca',  'atributo' => 'idEqu', 'singular' => 'Equipo', 'plural' => 'Equipos'],
  478.             'Impresora'=> ['metodo_id' => 'getIdImp', 'metodo_marca' => 'getMarca',  'atributo' => 'idImp', 'singular' => 'Impresora', 'plural' => 'Impresoras'],
  479.             'Red'      => ['metodo_id' => 'getIdRed', 'metodo_marca' => 'getMarca',  'atributo' => 'idRed', 'singular' => 'Red', 'plural' => 'Redes'],
  480.             'Otro'     => ['metodo_id' => 'getIdOtro', 'metodo_marca' => 'getMarca', 'atributo' => 'idOtro', 'singular' => 'Otro', 'plural' => 'Otros'],
  481.         ];
  482.         if (!in_array($tipo, ['Equipo', 'Impresora', 'Red', 'Otro'], true)) {
  483.             //throw new \InvalidArgumentException("Tipo de equipo no válido: " . $tipo);
  484.             return $mappings;
  485.         } else {
  486.             return $mappings[$tipo];
  487.         }
  488.     }
  489. }