<?php
namespace App\Controller;
use App\Entity\SecUser;
use App\Form\SecUserType;
use App\Repository\SecUserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class SecUserController extends AbstractController {
private $entityManager;
private $requestStack;
#[Route('/sec_user', name: 'app_sec_user')]
public function index(): Response {
return $this->render('sec_user/index.html.twig', [
'controller_name' => 'SecUserController',
]);
}
public function __construct(EntityManagerInterface $entityManager, RequestStack $requestStack) {
$this->entityManager = $entityManager;
$this->requestStack = $requestStack;
}
#[Route('sec/ser/crear', name: 'sec_user_new')]
public function crearSecUser(Request $request): Response {
$secUser = new SecUser();
$form = $this->createForm(SecUserType::class, $secUser);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->entityManager;
$entityManager->persist($secUser);
$entityManager->flush();
return $this->redirectToRoute('sec_user_view');
}
return $this->render('sec_user/crear.html.twig', [
'secUser' => $secUser,
'form' => $form->createView()
]);
}
#[Route('sec/ser/ver', name: 'sec_user_view')]
public function verSecUser(SecUserRepository $sec_userRepository): Response {
$secUser = $sec_userRepository->findAll();
return $this->render('sec_user/ver.html.twig', [
'secUser' => $secUser
]);
}
#[Route('sec/ser/editar/{id}', name: 'sec_user_edit')]
public function editarSecUser(Request $request, $id): Response {
$entityManager = $this->entityManager;
$secUser = $entityManager->getRepository(SecUser::class)->find($id);
if (!$secUser) {
throw $this->createNotFoundException('');
}
$form = $this->createForm(SecUserType::class, $secUser);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
return $this->redirectToRoute('sec_user_view');
}
return $this->render('sec_user/editar.html.twig', [
'secUser' => $secUser,
'form' => $form->createView()
]);
}
public function MainMenu(): Response {
$em = $this->entityManager;
$modulos = $em->getRepository(\App\Entity\SecAccion::class)->MainMenuByUser($this->getUser()->getId());
$funciones = [];
$accionesMenu = [];
foreach ($modulos as $m) {
$funcionesMenu = $this->entityManager->getRepository(\App\Entity\SecRol::class)->FuncionMenuByUser([$this->getUser()->getId()], $m['rutaInterna']);
//if(count($funcionesMenu) == 0){
// $funcionesMenu2 = $this->entityManager->getRepository(\App\Entity\SecFuncion::class)->FuncionPadreMenuByUser([$this->getUser()->getId()], $m['rutaInterna']);
//}
// if ($this->getUser()->getUsername() == '1026250823' && $m['rutaInterna'] == 'ges_hum') {
// var_dump($funcionesMenu1);
// echo "<br>--------------<br>";
// var_dump($funcionesMenu2);
// exit;
// }
//
// if ($m['rutaInterna'] == 'ges_hum') {
// $valuesRep = array_filter(array_column($funcionesMenu1, 'funcion'));
// foreach ($funcionesMenu2 as $key => $value) {
// if (array_search($value['funcion'], $valuesRep) !== false) {
// $funcionesMenu2[$key] = null;
// }
// }
// }
// $funcionesMenu = array_merge($funcionesMenu1, array_filter($funcionesMenu2));
$funciones[$m['rutaInterna']] = $funcionesMenu;
$tipo = array_unique(array_filter(array_column($funcionesMenu, 'tipoFuncion')));
if (in_array(10, $tipo)) {
foreach ($funcionesMenu as $f) {
if ($f['tipoFuncion'] == 10) {
$accionesMenu[$f['idFuncion']] = $this->entityManager->getRepository(\App\Entity\SecAccion::class)->AccionesMenuByUser([$this->getUser()->getId()], $f['idFuncion']);
}
}
}
}
$parentRequest = $this->requestStack->getParentRequest();
$pageAct = $parentRequest ? $parentRequest->get('_route') : '';
return $this->render('sec_security/mainMenu.html.twig', [
'modulos' => $modulos,
'funciones' => $funciones,
'acciones' => $accionesMenu,
'pageAct' => $pageAct,
]);
}
public function ProcessMenu(Request $request): Response {
$em = $this->entityManager;
$pageAct = $this->requestStack->getParentRequest()->get('_route');
$accion = $this->entityManager->getRepository(\App\Entity\SecAccion::class)->findOneBy(['ruta' => $pageAct]);
$permisos = [];
if ($accion) {
if ($accion->getFuncion()->getModulo() == null) {
$funcion = $this->entityManager->getRepository(\App\Entity\SecFuncion::class)->find($accion->getFuncion()->getFuncionPadre());
if ($funcion->getFuncionPadre()) {
$permisos = $em->getRepository(\App\Entity\SecAccion::class)->ProccessMenuByUser($this->getUser()->getId(), [1], [$funcion->getFuncionPadre()]);
} else {
$permisos = $em->getRepository(\App\Entity\SecAccion::class)->ProccessMenuByUser($this->getUser()->getId(), [1], [$accion->getFuncion()->getFuncionPadre()]);
}
} else {
$permisos = $em->getRepository(\App\Entity\SecAccion::class)->ProccessMenuByUser($this->getUser()->getId(), [1], [$accion->getFuncion()->getId()]);
}
}
return $this->render('sec_security/processMenu.html.twig', [
'permisos' => $permisos,
'pageAct' => $pageAct,
]);
}
public function RecordMenu(
Request $request,
Array $entities, // Registros que se listan (array de arrays: cada fila es un registro, cada key es una columna)
$id = 0, // ID principal (0 = vista listado, >0 = vista detalle o edición)
$subId = 0, // Sub-identificador: decide qué conjunto de permisos cargar
$tipoFiltro = null,// Nombre de clase extra para filtros de tabla
$dashMensajero = false, // Flag: si TRUE, cambia el layout a modo dashboard "mensajero"
$claseTabla = '' // Clases CSS adicionales para la tabla
): Response {
// -----------------------------
// 1. Inicializar EntityManager y usuario
// -----------------------------
$em = $this->entityManager;
// Se consulta el usuario actual (aunque aquí no se usa el resultado)
$em->getRepository(SecUser::class)->find($this->getUser()->getId());
// -----------------------------
// 2. Sacar los nombres de columnas de los registros
// -----------------------------
$keys = [];
if (isset($entities) && !empty($entities)) {
// Extrae las llaves (alias de campos) de la primera fila
$keys = array_keys($entities[0]);
}
// -----------------------------
// 3. Detectar ruta y controlador actual
// -----------------------------
// Ruta Symfony que se está ejecutando (ej: "app_com_hoja_vida_index")
$pageAct = $this->requestStack->getParentRequest()->get('_route');
$referer = $request->headers->get('referer');
// → http://logic.local/app/com/clientes_asociados_activos/index
$path = parse_url($referer, PHP_URL_PATH);
// → /app/com/clientes_asociados_activos/index
$rutaLimpia = ltrim($path, '/');
// → app/com/clientes_asociados_activos/index
//dump($rutaLimpia);
$dirAssets = "";
// Extrae nombre del controlador (ej: "App\Controller\ComHojaVidaController")
$dirAssetsArr = explode("\\", $this->requestStack->getParentRequest()->get('_controller'));
if (count($dirAssetsArr) >= 3) {
// Separa "ComHojaVidaController::index"
$dirAssetsArr2 = explode("::", $dirAssetsArr[2]);
// Quita la palabra "Controller" → queda "ComHojaVida"
$dirAssets = str_replace("Controller", "", $dirAssetsArr2[0]);
}
// -----------------------------
// 4. Localizar acción actual en base a la ruta
// -----------------------------
// Puede haber varias acciones con la misma ruta (duplicadas en distintas funciones)
// $userId = $this->getUser()->getId();
//
// $qb = $em->createQueryBuilder();
//
// $qb->select('a')
// ->from(\App\Entity\SecAccion::class, 'a')
// ->join('a.rol', 'r')
// ->join('r.userId', 'u')
// ->where('u.id = :userId')
// ->andWhere('a.ruta = :ruta')
// ->setParameter('userId', $userId)
// ->setParameter('ruta', $pageAct)
// ->setMaxResults(1);
//
// $accion = $qb->getQuery()->getOneOrNullResult();
//
// $id = null;
//
// if (!$accion) {
// dump('❌ No se encontró acción asociada al usuario y ruta');
// } else {
// $idFuncion = $accion->getFuncion()?->getId();
// dump($idFuncion);
// }
$acciones = $this->entityManager->getRepository(\App\Entity\SecAccion::class)
->findBy(['ruta' => $pageAct],['id'=>'ASC']);
// Intentar emparejar con la función activa (idFuncion) si ya la tienes
foreach ($acciones as $acc) {
$accion = $this->entityManager->getRepository(\App\Entity\SecAccion::class)
->findOneBy([
'ruta' => $acc->getRuta(),
'funcion' => $acc->getFuncion(),
]);
//dump($accion->getFuncion()->getId() ." - ". $accion->getRutaAuxiliar());
if($accion->getRutaAuxiliar() && $accion->getRutaAuxiliar() === $rutaLimpia){
//dump("entra");
break;
}
}
// -----------------------------
// 5. Extraer información de la acción actual
// -----------------------------
$grupo = $accion->getGrupo();
$subGrupo = $accion->getSubGrupo() ?: null;
$idFuncion = $accion->getFuncion()->getId(); // ID de función vinculada
// Array de permisos: botones principales (nivel2) y menús de registros (nivel3)
$permisos = ['nivel2' => [], 'nivel3' => []];
// -----------------------------
// 6. Cargar permisos del usuario para la función actual
// -----------------------------
if ($accion) {
if ($id == 0) {
// Vista LISTADO: cargar acciones de tipo 2 (botones) y 3/4 (acciones sobre registros)
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [2], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [3, 4], [$idFuncion]);
} else {
// Vista DETALLE: se filtra según subId → cada valor carga diferentes tipos de acciones
if ($subId == 1) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [5], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [6, 7], [$idFuncion]);
} elseif ($subId == 2) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [8], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [9, 10], [$idFuncion]);
} elseif ($subId == 3) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [11], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [12, 13], [$idFuncion]);
} elseif ($subId == 4) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [14], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [15, 16], [$idFuncion]);
} elseif ($subId == 5) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [17], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [18, 19], [$idFuncion]);
} elseif ($subId == 6) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [20], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [21, 22], [$idFuncion]);
} elseif ($subId == 7) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [23], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [24, 25], [$idFuncion]);
} elseif ($subId == 8) {
$permisos['nivel2'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [26], [$idFuncion]);
$permisos['nivel3'] = $em->getRepository(\App\Entity\SecAccion::class)
->ProccessMenuByUser($this->getUser()->getId(), [27, 28], [$idFuncion]);
}
}
}
// -----------------------------
// 7. Generar identificador único para la tabla (ej: "202509261245")
// -----------------------------
$idTable = date('YmdHi');
// -----------------------------
// 8. Renderizar plantilla Twig con todos los datos
// -----------------------------
return $this->render('sec_security/recordMenu.html.twig', [
'keys' => $keys, // Columnas de la tabla
'entities' => $entities, // Registros a mostrar
'id' => $id, // ID principal
'pageAct' => $pageAct, // Ruta actual
'grupo' => $grupo, // Grupo de acción
'subGrupo' => $subGrupo, // Subgrupo de acción
'permisosNivel'=> $permisos, // Botones y menús dinámicos
'tipoFiltro' => $tipoFiltro, // Filtros CSS
'dirRepository'=> $dirAssets, // Carpeta de repositorios/archivos
'idFuncion' => $idFuncion, // ID de la función asociada
'idTable' => $idTable, // Identificador único de tabla
'dashMensajero'=> $dashMensajero,// Flag: modo dashboard
'claseTabla' => $claseTabla // Clases CSS de tabla
]);
}
public function TituloFuncion($tipo = 'modal') {
$em = $this->entityManager;
$pageAct = $this->requestStack->getParentRequest()->get('_route');
$funAct = $em->getRepository(\App\Entity\SecAccion::class)->findOneBy(['ruta' => $pageAct]);
$titulo = "";
if (!$funAct) {
$tmp = explode("_", $pageAct);
// Remove the first prefix (like app, ter, com) instead of wiping the whole array
if (count($tmp) > 1) {
array_splice($tmp, 0, 1);
}
if ($this->requestStack->getCurrentRequest()->isXmlHttpRequest()) {
$titulo = htmlentities('<i class="fa fa-refresh" aria-hidden="true"></i> ' . ucwords(implode(" ", $tmp)));
} else {
$titulo = ucwords(implode(" ", $tmp));
}
} else {
$etiqueta = $funAct->getEtiqueta();
switch ($tipo) {
case'modal':
$titulo = htmlentities($funAct->getIcono());
break;
case'nombre':
$titulo = $funAct->getIcono();
break;
case'titulo':
$titulo = "";
break;
}
if ($etiqueta === 'Creación en Sistemas') {
// devolvemos solo el icono o nada
return new Response('');
}
$titulo .= $funAct->getEtiqueta();
}
return new Response($titulo);
}
/**
* Renderiza el menú lateral del módulo Paramétricas.
* Los nuevos módulos param_* aparecen en el menú principal;
* este método queda como fallback para el módulo original 'param'.
*/
public function ProcessMenuParametricas(Request $request): Response
{
$em = $this->entityManager;
$permisos = $em->getRepository(\App\Entity\SecAccion::class)
->FuncionMenuParametricasByUser($this->getUser()->getId(), ['param']);
return $this->render('sec_security/processMenuParametricas.html.twig', [
'permisos' => $permisos,
]);
}
public function NotificationsMenu()
{
$usuarioAutenticado = $this->getUser()->getPersona()->getId();
// todas las notificaciones del usuario
$allNotificaciones = $this->entityManager
->getRepository(\App\Entity\SecMensaje::class)
->NotificacionPorUsuario($usuarioAutenticado);
// calcular total de no leídas
$totalNoLeidas = count(array_filter($allNotificaciones, fn($n) => !$n['leido']));
// solo 3 últimas para el menú desplegable
$notificaciones = array_slice($allNotificaciones, 0, 3);
return $this->render('sec_security/notificationsMenu.html.twig', [
'notificaciones' => $notificaciones, // últimas 3
'totalNoLeidas' => $totalNoLeidas, // número en badge
]);
}
}