-- V020__add_chargeable_chars_permission.sql -- PRC-001: permiso RBAC para ABM de caracteres tasables. -- -- Cambios: -- 1. Agrega permiso 'tasacion:caracteres_especiales:gestionar' al catálogo. -- 2. Asigna el permiso al rol 'admin'. -- -- Convención RBAC: modulo:recurso:accion. -- Patrón: V007 (MERGE idempotente). -- Idempotente: seguro para re-ejecutar. -- Reversa: V020_ROLLBACK.sql. -- Run on: SIGCM2 (dev), SIGCM2_Test_App, SIGCM2_Test_Api. -- -- NOTA: V020 se ejecuta ANTES de V021 (tabla) porque el permiso debe existir -- antes de que la API arranque con [RequirePermission(...)]. -- V021 crea la tabla dbo.ChargeableCharConfig. -- V022 siembra las 4 filas globales por defecto. -- -- SDD Design: engram sdd/prc-001-word-counter-spike/design (D16/D17) SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON; SET NOCOUNT ON; GO -- Agregar permiso al catálogo (idempotente via MERGE). MERGE dbo.Permiso AS t USING (VALUES ('tasacion:caracteres_especiales:gestionar', N'Gestionar caracteres tasables', N'Crear, editar precio y desactivar la configuración de caracteres especiales para tasación.', 'tasacion') ) AS s (Codigo, Nombre, Descripcion, Modulo) ON t.Codigo = s.Codigo WHEN NOT MATCHED BY TARGET THEN INSERT (Codigo, Nombre, Descripcion, Modulo) VALUES (s.Codigo, s.Nombre, s.Descripcion, s.Modulo); GO -- Asignar a rol 'admin' (idempotente via MERGE). MERGE dbo.RolPermiso AS t USING ( SELECT r.Id AS RolId, p.Id AS PermisoId FROM dbo.Rol r CROSS JOIN dbo.Permiso p WHERE r.Codigo = 'admin' AND p.Codigo = 'tasacion:caracteres_especiales:gestionar' ) AS s ON t.RolId = s.RolId AND t.PermisoId = s.PermisoId WHEN NOT MATCHED BY TARGET THEN INSERT (RolId, PermisoId) VALUES (s.RolId, s.PermisoId); GO PRINT 'V020 applied — tasacion:caracteres_especiales:gestionar added to catalog and assigned to admin.'; GO