src/Controller/SecUserController.php line 370

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\SecUser;
  4. use App\Form\SecUserType;
  5. use App\Repository\SecUserRepository;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. class SecUserController extends AbstractController {
  13.     private $entityManager;
  14.     private $requestStack;
  15.     #[Route('/sec_user'name'app_sec_user')]
  16.     public function index(): Response {
  17.         return $this->render('sec_user/index.html.twig', [
  18.                     'controller_name' => 'SecUserController',
  19.         ]);
  20.     }
  21.     public function __construct(EntityManagerInterface $entityManagerRequestStack $requestStack) {
  22.         $this->entityManager $entityManager;
  23.         $this->requestStack $requestStack;
  24.     }
  25.     #[Route('sec/ser/crear'name'sec_user_new')]
  26.     public function crearSecUser(Request $request): Response {
  27.         $secUser = new SecUser();
  28.         $form $this->createForm(SecUserType::class, $secUser);
  29.         $form->handleRequest($request);
  30.         if ($form->isSubmitted() && $form->isValid()) {
  31.             $entityManager $this->entityManager;
  32.             $entityManager->persist($secUser);
  33.             $entityManager->flush();
  34.             return $this->redirectToRoute('sec_user_view');
  35.         }
  36.         return $this->render('sec_user/crear.html.twig', [
  37.                     'secUser' => $secUser,
  38.                     'form' => $form->createView()
  39.         ]);
  40.     }
  41.     #[Route('sec/ser/ver'name'sec_user_view')]
  42.     public function verSecUser(SecUserRepository $sec_userRepository): Response {
  43.         $secUser $sec_userRepository->findAll();
  44.         return $this->render('sec_user/ver.html.twig', [
  45.                     'secUser' => $secUser
  46.         ]);
  47.     }
  48.     #[Route('sec/ser/editar/{id}'name'sec_user_edit')]
  49.     public function editarSecUser(Request $request$id): Response {
  50.         $entityManager $this->entityManager;
  51.         $secUser $entityManager->getRepository(SecUser::class)->find($id);
  52.         if (!$secUser) {
  53.             throw $this->createNotFoundException('');
  54.         }
  55.         $form $this->createForm(SecUserType::class, $secUser);
  56.         $form->handleRequest($request);
  57.         if ($form->isSubmitted() && $form->isValid()) {
  58.             $entityManager->flush();
  59.             return $this->redirectToRoute('sec_user_view');
  60.         }
  61.         return $this->render('sec_user/editar.html.twig', [
  62.                     'secUser' => $secUser,
  63.                     'form' => $form->createView()
  64.         ]);
  65.     }
  66.     public function MainMenu(): Response {
  67.         $em $this->entityManager;
  68.         $modulos $em->getRepository(\App\Entity\SecAccion::class)->MainMenuByUser($this->getUser()->getId());
  69.         $funciones = [];
  70.         $accionesMenu = [];
  71.         foreach ($modulos as $m) {
  72.             $funcionesMenu $this->entityManager->getRepository(\App\Entity\SecRol::class)->FuncionMenuByUser([$this->getUser()->getId()], $m['rutaInterna']);
  73.             //if(count($funcionesMenu) == 0){
  74.          //    $funcionesMenu2 = $this->entityManager->getRepository(\App\Entity\SecFuncion::class)->FuncionPadreMenuByUser([$this->getUser()->getId()], $m['rutaInterna']);
  75.             //}
  76. //            if ($this->getUser()->getUsername() == '1026250823' && $m['rutaInterna'] == 'ges_hum') {
  77. //                var_dump($funcionesMenu1);
  78. //                echo "<br>--------------<br>";
  79. //                var_dump($funcionesMenu2);
  80. //                exit;
  81. //            }
  82. //
  83. //            if ($m['rutaInterna'] == 'ges_hum') {
  84. //                $valuesRep = array_filter(array_column($funcionesMenu1, 'funcion'));
  85. //                foreach ($funcionesMenu2 as $key => $value) {
  86. //                    if (array_search($value['funcion'], $valuesRep) !== false) {
  87. //                        $funcionesMenu2[$key] = null;
  88. //                    }
  89. //                }
  90. //            }
  91. //            $funcionesMenu = array_merge($funcionesMenu1, array_filter($funcionesMenu2));
  92.             $funciones[$m['rutaInterna']] = $funcionesMenu;
  93.             $tipo array_unique(array_filter(array_column($funcionesMenu'tipoFuncion')));
  94.             if (in_array(10$tipo)) {
  95.                 foreach ($funcionesMenu as $f) {
  96.                     if ($f['tipoFuncion'] == 10) {
  97.                         $accionesMenu[$f['idFuncion']] = $this->entityManager->getRepository(\App\Entity\SecAccion::class)->AccionesMenuByUser([$this->getUser()->getId()], $f['idFuncion']);
  98.                     }
  99.                 }
  100.             }
  101.         }
  102.         $parentRequest $this->requestStack->getParentRequest();
  103.         $pageAct $parentRequest $parentRequest->get('_route') : '';
  104.         return $this->render('sec_security/mainMenu.html.twig', [
  105.                     'modulos' => $modulos,
  106.                     'funciones' => $funciones,
  107.                     'acciones' => $accionesMenu,
  108.                     'pageAct' => $pageAct,
  109.         ]);
  110.     }
  111.     public function ProcessMenu(Request $request): Response {
  112.         $em $this->entityManager;
  113.         $pageAct $this->requestStack->getParentRequest()->get('_route');
  114.         $accion $this->entityManager->getRepository(\App\Entity\SecAccion::class)->findOneBy(['ruta' => $pageAct]);
  115.         $permisos = [];
  116.         if ($accion) {
  117.             if ($accion->getFuncion()->getModulo() == null) {
  118.                 $funcion $this->entityManager->getRepository(\App\Entity\SecFuncion::class)->find($accion->getFuncion()->getFuncionPadre());
  119.                 if ($funcion->getFuncionPadre()) {
  120.                     $permisos $em->getRepository(\App\Entity\SecAccion::class)->ProccessMenuByUser($this->getUser()->getId(), [1], [$funcion->getFuncionPadre()]);
  121.                 } else {
  122.                     $permisos $em->getRepository(\App\Entity\SecAccion::class)->ProccessMenuByUser($this->getUser()->getId(), [1], [$accion->getFuncion()->getFuncionPadre()]);
  123.                 }
  124.             } else {
  125.                 $permisos $em->getRepository(\App\Entity\SecAccion::class)->ProccessMenuByUser($this->getUser()->getId(), [1], [$accion->getFuncion()->getId()]);
  126.             }
  127.         }
  128.         return $this->render('sec_security/processMenu.html.twig', [
  129.                     'permisos' => $permisos,
  130.                     'pageAct' => $pageAct,
  131.         ]);
  132.     }
  133.     public function RecordMenu(
  134.         Request $request,
  135.         Array $entities,   // Registros que se listan (array de arrays: cada fila es un registro, cada key es una columna)
  136.                 $id 0,           // ID principal (0 = vista listado, >0 = vista detalle o edición)
  137.                 $subId 0,        // Sub-identificador: decide qué conjunto de permisos cargar
  138.                 $tipoFiltro null,// Nombre de clase extra para filtros de tabla
  139.                 $dashMensajero false// Flag: si TRUE, cambia el layout a modo dashboard "mensajero"
  140.                 $claseTabla ''   // Clases CSS adicionales para la tabla
  141.     ): Response {
  142.         // -----------------------------
  143.         // 1. Inicializar EntityManager y usuario
  144.         // -----------------------------
  145.         $em $this->entityManager;
  146.         // Se consulta el usuario actual (aunque aquí no se usa el resultado)
  147.         $em->getRepository(SecUser::class)->find($this->getUser()->getId());
  148.         // -----------------------------
  149.         // 2. Sacar los nombres de columnas de los registros
  150.         // -----------------------------
  151.         $keys = [];
  152.         if (isset($entities) && !empty($entities)) {
  153.             // Extrae las llaves (alias de campos) de la primera fila
  154.             $keys array_keys($entities[0]);
  155.         }
  156.         // -----------------------------
  157.         // 3. Detectar ruta y controlador actual
  158.         // -----------------------------
  159.         // Ruta Symfony que se está ejecutando (ej: "app_com_hoja_vida_index")
  160.         $pageAct $this->requestStack->getParentRequest()->get('_route');
  161.         $referer $request->headers->get('referer');
  162.         // → http://logic.local/app/com/clientes_asociados_activos/index
  163.         $path parse_url($refererPHP_URL_PATH);
  164.         // → /app/com/clientes_asociados_activos/index
  165.         $rutaLimpia ltrim($path'/');
  166.         // → app/com/clientes_asociados_activos/index
  167.         //dump($rutaLimpia);
  168.         $dirAssets "";
  169.         // Extrae nombre del controlador (ej: "App\Controller\ComHojaVidaController")
  170.         $dirAssetsArr explode("\\"$this->requestStack->getParentRequest()->get('_controller'));
  171.         if (count($dirAssetsArr) >= 3) {
  172.             // Separa "ComHojaVidaController::index"
  173.             $dirAssetsArr2 explode("::"$dirAssetsArr[2]);
  174.             // Quita la palabra "Controller" → queda "ComHojaVida"
  175.             $dirAssets str_replace("Controller"""$dirAssetsArr2[0]);
  176.         }
  177.         // -----------------------------
  178.         // 4. Localizar acción actual en base a la ruta
  179.         // -----------------------------
  180.         // Puede haber varias acciones con la misma ruta (duplicadas en distintas funciones)
  181. //        $userId = $this->getUser()->getId();
  182. //
  183. //        $qb = $em->createQueryBuilder();
  184. //
  185. //        $qb->select('a')
  186. //            ->from(\App\Entity\SecAccion::class, 'a')
  187. //            ->join('a.rol', 'r')
  188. //            ->join('r.userId', 'u')
  189. //            ->where('u.id = :userId')
  190. //            ->andWhere('a.ruta = :ruta')
  191. //            ->setParameter('userId', $userId)
  192. //            ->setParameter('ruta', $pageAct)
  193. //            ->setMaxResults(1);
  194. //
  195. //        $accion = $qb->getQuery()->getOneOrNullResult();
  196. //
  197. //        $id = null;
  198. //
  199. //        if (!$accion) {
  200. //            dump('❌ No se encontró acción asociada al usuario y ruta');
  201. //        } else {
  202. //            $idFuncion = $accion->getFuncion()?->getId();
  203. //            dump($idFuncion);
  204. //        }
  205.         $acciones $this->entityManager->getRepository(\App\Entity\SecAccion::class)
  206.             ->findBy(['ruta' => $pageAct],['id'=>'ASC']);
  207. // Intentar emparejar con la función activa (idFuncion) si ya la tienes
  208.         foreach ($acciones as $acc) {
  209.             $accion $this->entityManager->getRepository(\App\Entity\SecAccion::class)
  210.                 ->findOneBy([
  211.                     'ruta' => $acc->getRuta(),
  212.                     'funcion' => $acc->getFuncion(),
  213.                 ]);
  214.             //dump($accion->getFuncion()->getId() ." - ". $accion->getRutaAuxiliar());
  215.             if($accion->getRutaAuxiliar() && $accion->getRutaAuxiliar() === $rutaLimpia){
  216.                 //dump("entra");
  217.                 break;
  218.             }
  219.         }
  220.         // -----------------------------
  221.         // 5. Extraer información de la acción actual
  222.         // -----------------------------
  223.         $grupo $accion->getGrupo();
  224.         $subGrupo $accion->getSubGrupo() ?: null;
  225.         $idFuncion $accion->getFuncion()->getId();      // ID de función vinculada
  226.         // Array de permisos: botones principales (nivel2) y menús de registros (nivel3)
  227.         $permisos = ['nivel2' => [], 'nivel3' => []];
  228.         // -----------------------------
  229.         // 6. Cargar permisos del usuario para la función actual
  230.         // -----------------------------
  231.         if ($accion) {
  232.             if ($id == 0) {
  233.                 // Vista LISTADO: cargar acciones de tipo 2 (botones) y 3/4 (acciones sobre registros)
  234.                 $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  235.                     ->ProccessMenuByUser($this->getUser()->getId(), [2], [$idFuncion]);
  236.                 $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  237.                     ->ProccessMenuByUser($this->getUser()->getId(), [34], [$idFuncion]);
  238.             } else {
  239.                 // Vista DETALLE: se filtra según subId → cada valor carga diferentes tipos de acciones
  240.                 if ($subId == 1) {
  241.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  242.                         ->ProccessMenuByUser($this->getUser()->getId(), [5], [$idFuncion]);
  243.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  244.                         ->ProccessMenuByUser($this->getUser()->getId(), [67], [$idFuncion]);
  245.                 } elseif ($subId == 2) {
  246.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  247.                         ->ProccessMenuByUser($this->getUser()->getId(), [8], [$idFuncion]);
  248.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  249.                         ->ProccessMenuByUser($this->getUser()->getId(), [910], [$idFuncion]);
  250.                 } elseif ($subId == 3) {
  251.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  252.                         ->ProccessMenuByUser($this->getUser()->getId(), [11], [$idFuncion]);
  253.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  254.                         ->ProccessMenuByUser($this->getUser()->getId(), [1213], [$idFuncion]);
  255.                 } elseif ($subId == 4) {
  256.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  257.                         ->ProccessMenuByUser($this->getUser()->getId(), [14], [$idFuncion]);
  258.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  259.                         ->ProccessMenuByUser($this->getUser()->getId(), [1516], [$idFuncion]);
  260.                 } elseif ($subId == 5) {
  261.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  262.                         ->ProccessMenuByUser($this->getUser()->getId(), [17], [$idFuncion]);
  263.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  264.                         ->ProccessMenuByUser($this->getUser()->getId(), [1819], [$idFuncion]);
  265.                 } elseif ($subId == 6) {
  266.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  267.                         ->ProccessMenuByUser($this->getUser()->getId(), [20], [$idFuncion]);
  268.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  269.                         ->ProccessMenuByUser($this->getUser()->getId(), [2122], [$idFuncion]);
  270.                 } elseif ($subId == 7) {
  271.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  272.                         ->ProccessMenuByUser($this->getUser()->getId(), [23], [$idFuncion]);
  273.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  274.                         ->ProccessMenuByUser($this->getUser()->getId(), [2425], [$idFuncion]);
  275.                 } elseif ($subId == 8) {
  276.                     $permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
  277.                         ->ProccessMenuByUser($this->getUser()->getId(), [26], [$idFuncion]);
  278.                     $permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
  279.                         ->ProccessMenuByUser($this->getUser()->getId(), [2728], [$idFuncion]);
  280.                 }
  281.             }
  282.         }
  283.         // -----------------------------
  284.         // 7. Generar identificador único para la tabla (ej: "202509261245")
  285.         // -----------------------------
  286.         $idTable date('YmdHi');
  287.         // -----------------------------
  288.         // 8. Renderizar plantilla Twig con todos los datos
  289.         // -----------------------------
  290.         return $this->render('sec_security/recordMenu.html.twig', [
  291.             'keys'         => $keys,        // Columnas de la tabla
  292.             'entities'     => $entities,    // Registros a mostrar
  293.             'id'           => $id,          // ID principal
  294.             'pageAct'      => $pageAct,     // Ruta actual
  295.             'grupo'        => $grupo,       // Grupo de acción
  296.             'subGrupo'     => $subGrupo,    // Subgrupo de acción
  297.             'permisosNivel'=> $permisos,    // Botones y menús dinámicos
  298.             'tipoFiltro'   => $tipoFiltro,  // Filtros CSS
  299.             'dirRepository'=> $dirAssets,   // Carpeta de repositorios/archivos
  300.             'idFuncion'    => $idFuncion,   // ID de la función asociada
  301.             'idTable'      => $idTable,     // Identificador único de tabla
  302.             'dashMensajero'=> $dashMensajero,// Flag: modo dashboard
  303.             'claseTabla'   => $claseTabla   // Clases CSS de tabla
  304.         ]);
  305.     }
  306.     public function TituloFuncion($tipo 'modal') {
  307.         $em $this->entityManager;
  308.         $pageAct $this->requestStack->getParentRequest()->get('_route');
  309.         $funAct $em->getRepository(\App\Entity\SecAccion::class)->findOneBy(['ruta' => $pageAct]);
  310.         $titulo "";
  311.         if (!$funAct) {
  312.             $tmp explode("_"$pageAct);
  313.             // Remove the first prefix (like app, ter, com) instead of wiping the whole array
  314.             if (count($tmp) > 1) {
  315.                 array_splice($tmp01);
  316.             }
  317.             if ($this->requestStack->getCurrentRequest()->isXmlHttpRequest()) {
  318.                 $titulo htmlentities('<i class="fa fa-refresh" aria-hidden="true"></i> ' ucwords(implode(" "$tmp)));
  319.             } else {
  320.                 $titulo ucwords(implode(" "$tmp));
  321.             }
  322.         } else {
  323.             $etiqueta $funAct->getEtiqueta();
  324.             switch ($tipo) {
  325.                 case'modal':
  326.                     $titulo htmlentities($funAct->getIcono());
  327.                     break;
  328.                 case'nombre':
  329.                     $titulo $funAct->getIcono();
  330.                     break;
  331.                 case'titulo':
  332.                     $titulo "";
  333.                     break;
  334.             }
  335.             if ($etiqueta === 'Creación en Sistemas') {
  336.                 // devolvemos solo el icono o nada
  337.                 return new Response('');
  338.             }
  339.             $titulo .= $funAct->getEtiqueta();
  340.         }
  341.         return new Response($titulo);
  342.     }
  343.     /**
  344.      * Renderiza el menú lateral del módulo Paramétricas.
  345.      * Los nuevos módulos param_* aparecen en el menú principal;
  346.      * este método queda como fallback para el módulo original 'param'.
  347.      */
  348.     public function ProcessMenuParametricas(Request $request): Response
  349.     {
  350.         $em       $this->entityManager;
  351.         $permisos $em->getRepository(\App\Entity\SecAccion::class)
  352.             ->FuncionMenuParametricasByUser($this->getUser()->getId(), ['param']);
  353.         return $this->render('sec_security/processMenuParametricas.html.twig', [
  354.             'permisos' => $permisos,
  355.         ]);
  356.     }
  357.     public function NotificationsMenu()
  358.     {
  359.         $usuarioAutenticado $this->getUser()->getPersona()->getId();
  360.         // todas las notificaciones del usuario
  361.         $allNotificaciones $this->entityManager
  362.             ->getRepository(\App\Entity\SecMensaje::class)
  363.             ->NotificacionPorUsuario($usuarioAutenticado);
  364.         // calcular total de no leídas
  365.         $totalNoLeidas count(array_filter($allNotificaciones, fn($n) => !$n['leido']));
  366.         // solo 3 últimas para el menú desplegable
  367.         $notificaciones array_slice($allNotificaciones03);
  368.         return $this->render('sec_security/notificationsMenu.html.twig', [
  369.             'notificaciones'   => $notificaciones,   // últimas 3
  370.             'totalNoLeidas'    => $totalNoLeidas,    // número en badge
  371.         ]);
  372.     }
  373. }