Appearance
04_acciones.sql
Objetivo
Crear las ACCIONES de un módulo existente.
Este script:
- Inserta acciones en
modulos_acciones. - DISPARA el trigger que asigna automáticamente esas acciones a los roles que ya tengan el módulo asignado en
roles_modulos.
Precondiciones obligatorias
Antes de ejecutar este script:
- El módulo YA existe (
02_modulo.sql). - El módulo YA está asignado a roles (
03_roles_modulos.sql).
Si este script se ejecuta antes del paso 2:
El trigger NO asignará las acciones a ningún rol.
Quedarán huecos invisibles.
Idempotencia
- No duplica acciones (por
modulo_id + nombre). - Puede ejecutarse múltiples veces sin efectos adversos.
Script completo
sql
-- ============================================================
-- 04_acciones.sql
-- ============================================================
-- OBJETIVO
-- --------
-- Crear las ACCIONES de un módulo existente.
--
-- Este script:
-- - Inserta acciones en modulos_acciones
-- - DISPARA el trigger que asigna automáticamente
-- esas acciones a los roles que ya tengan el módulo
--
-- PRECONDICIONES (OBLIGATORIAS)
-- -----------------------------
-- - El módulo YA existe (02_modulo.sql)
-- - El módulo YA está asignado a roles (03_roles_modulos.sql)
--
-- IDempotencia:
-- -------------
-- - No duplica acciones (modulo_id + nombre)
-- ============================================================
WITH
-- ============================================================
-- PARAMETROS DEL MODULO (EDITAR SOLO ACA)
-- ============================================================
params AS (
SELECT
'gestion'::text AS p_app_id,
'Tramos PP'::text AS p_modulo_nombre
),
-- ============================================================
-- RESOLVER 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
),
-- ============================================================
-- DEFINICION DE ACCIONES DEL MODULO
-- ============================================================
acciones_definidas AS (
SELECT *
FROM (VALUES
('Ver agentes PP'::text,
'Visualizar agentes de Planta Permanente'::text,
'Ver agentes PP'::text,
false::boolean,
'habilitada'::text),
('Ver tramitaciones'::text,
'Visualizar tramitaciones de tramos'::text,
'Ver tramitaciones'::text,
false::boolean,
'habilitada'::text),
('Editar perfiles'::text,
'Modificar perfiles de tramos'::text,
'Editar perfiles'::text,
false::boolean,
'habilitada'::text),
('Exportar'::text,
'Exportar listados y reportes'::text,
'Exportar'::text,
false::boolean,
'habilitada'::text)
) AS t(nombre, descripcion, nombre_menu, en_desarrollo, estado)
),
-- ============================================================
-- INSERTAR ACCIONES
-- - El trigger se ejecuta acá
-- ============================================================
insert_acciones AS (
INSERT INTO public.modulos_acciones (
id,
modulo_id,
nombre,
descripcion,
nombre_menu,
en_desarrollo,
en_mantenimiento,
estado
)
SELECT
gen_random_uuid(),
m.id,
a.nombre,
a.descripcion,
a.nombre_menu,
a.en_desarrollo,
false,
a.estado
FROM modulo_resuelto m
CROSS JOIN acciones_definidas a
WHERE NOT EXISTS (
SELECT 1
FROM public.modulos_acciones ma
WHERE ma.modulo_id = m.id
AND ma.nombre = a.nombre
)
RETURNING id, nombre
)
-- ============================================================
-- SALIDA DE CONTROL / AUDITORIA
-- ============================================================
SELECT
ma.nombre,
ma.descripcion,
ma.estado,
ma.en_desarrollo,
ma.en_mantenimiento
FROM public.modulos_acciones ma
JOIN modulo_resuelto m ON m.id = ma.modulo_id
ORDER BY ma.nombre;