Skip to content

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:

  1. El módulo YA existe (02_modulo.sql).
  2. 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;