Skip to content

03_roles_modulos.sql

Objetivo

Asignar un MÓDULO existente a uno o más ROLES existentes.

Este script:

  • Une roles ↔ módulos (roles_modulos).
  • Define qué roles VEN el módulo en el menú.
  • Prepara el terreno para que el trigger de acciones funcione.

Concepto clave

Si un rol NO está en roles_modulos para un módulo:

  • El módulo NO aparece en el menú.
  • Las acciones del módulo NO se asignan por trigger.

Este paso SIEMPRE debe ejecutarse antes de crear acciones.


Idempotencia

  • ON CONFLICT DO NOTHING evita duplicados.
  • Puede ejecutarse múltiples veces sin efectos adversos.

Script completo

sql
-- ============================================================
-- 03_roles_modulos.sql
-- ============================================================
-- OBJETIVO
-- --------
-- Asignar un MÓDULO existente a uno o más ROLES existentes.
--
-- Este script:
-- - Une roles ↔ módulos (roles_modulos)
-- - Define qué roles VEN el módulo en el menú
-- - Prepara el terreno para que el trigger de acciones funcione
--
-- IDempotencia:
-- -------------
-- - ON CONFLICT DO NOTHING evita duplicados
-- ============================================================

WITH
-- ============================================================
-- PARAMETROS (EDITAR SOLO ACA)
-- ============================================================
params AS (
  SELECT
    'TRAMOS_GESTION'::text       AS rol_full_codigo,
    'TRAMOS_GESTION_LITE'::text  AS rol_lite_codigo,
    'gestion'::text              AS p_app_id,
    'Tramos PP'::text            AS p_modulo_nombre
),

-- ============================================================
-- RESOLVER IDS DE ROLES
-- ============================================================
roles_resueltos AS (
  SELECT r.id, r.codigo
  FROM public.roles r
  JOIN params p
    ON r.codigo IN (p.rol_full_codigo, p.rol_lite_codigo)
),

-- ============================================================
-- RESOLVER ID DEL MODULO
-- ============================================================
modulo_resuelto AS (
  SELECT m.id
  FROM public.apps_modulos m
  JOIN params p
    ON m.app_id = p.p_app_id
   AND m.nombre = p.p_modulo_nombre
),

-- ============================================================
-- ASIGNAR MODULO A ROLES
-- ============================================================
insert_roles_modulos AS (
  INSERT INTO public.roles_modulos (rol_id, modulo_id)
  SELECT
    r.id,
    m.id
  FROM roles_resueltos r
  CROSS JOIN modulo_resuelto m
  ON CONFLICT DO NOTHING
  RETURNING rol_id, modulo_id
)

-- ============================================================
-- SALIDA DE CONTROL / AUDITORIA
-- ============================================================
SELECT
  r.codigo      AS rol_codigo,
  m.app_id      AS app_id,
  m.nombre      AS modulo
FROM public.roles_modulos rm
JOIN public.roles r ON r.id = rm.rol_id
JOIN public.apps_modulos m ON m.id = rm.modulo_id
JOIN params p
  ON m.app_id = p.p_app_id
 AND m.nombre = p.p_modulo_nombre
 AND r.codigo IN (p.rol_full_codigo, p.rol_lite_codigo)
ORDER BY r.codigo;