-- V005__create_permiso.sql -- Tabla catálogo de permisos atómicos RBAC (18 permisos iniciales §2.4.2). -- Requerimiento: ejecutar ANTES de V006 (FK PermisoId). -- Run on: SIGCM2 (prod) and SIGCM2_Test (integration tests) SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON; SET NOCOUNT ON; GO IF OBJECT_ID(N'dbo.Permiso', N'U') IS NULL BEGIN CREATE TABLE dbo.Permiso ( Id INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Permiso PRIMARY KEY, Codigo VARCHAR(60) NOT NULL, Nombre NVARCHAR(100) NOT NULL, Descripcion NVARCHAR(500) NULL, Modulo VARCHAR(30) NOT NULL, Activo BIT NOT NULL CONSTRAINT DF_Permiso_Activo DEFAULT(1), FechaCreacion DATETIME2(3) NOT NULL CONSTRAINT DF_Permiso_FC DEFAULT(SYSUTCDATETIME()), CONSTRAINT UQ_Permiso_Codigo UNIQUE (Codigo), -- Formato: segmentos en minúsculas separados por ':', p.ej. ventas:contado:crear -- Usa collation binaria para forzar case-sensitivity (igual que CK_Rol_Codigo_Format). CONSTRAINT CK_Permiso_Codigo_Format CHECK ( PATINDEX('[a-z]%', Codigo COLLATE Latin1_General_BIN2) = 1 AND PATINDEX('%[^a-z0-9_:]%', Codigo COLLATE Latin1_General_BIN2) = 0 ) ); PRINT 'Table dbo.Permiso created.'; END ELSE PRINT 'Table dbo.Permiso already exists — skip.'; GO -- Seed 18 permisos canónicos (idempotente via MERGE). -- Convención RBAC: cada permiso nuevo → asignar a admin en la misma migración (V006+). MERGE dbo.Permiso AS t USING (VALUES ('ventas:contado:crear', N'Cargar orden contado', NULL, 'ventas'), ('ventas:contado:modificar', N'Modificar orden contado', NULL, 'ventas'), ('ventas:contado:cobrar', N'Cobrar orden contado', NULL, 'ventas'), ('ventas:contado:facturar', N'Facturar orden contado', NULL, 'ventas'), ('ventas:ctacte:crear', N'Cargar orden cuenta corriente', NULL, 'ventas'), ('ventas:ctacte:facturar', N'Facturar lote cuenta corriente', NULL, 'ventas'), ('textos:editar', N'Editar textos', NULL, 'textos'), ('textos:reclamos:ver', N'Ver reclamos de textos', NULL, 'textos'), ('pauta:azanu:ver', N'Ver AZANU en pauta', NULL, 'pauta'), ('pauta:limpiar', N'Limpieza de pauta', NULL, 'pauta'), ('pauta:recursos:fueradehora', N'Recursos fuera de hora', NULL, 'pauta'), ('productores:deuda:ver', N'Ver deuda propia de productores', NULL, 'productores'), ('productores:pendientes:crear', N'Cargar pendientes de productores', NULL, 'productores'), ('productores:deuda:bypass', N'Bypass de deuda de productores', NULL, 'productores'), ('administracion:usuarios:gestionar', N'Gestionar usuarios del sistema', N'Crear, editar y desactivar usuarios', 'administracion'), ('administracion:tarifarios:gestionar', N'Gestionar tarifarios', N'Crear y modificar tarifarios de publicidad', 'administracion'), ('administracion:medios:gestionar', N'Gestionar medios publicitarios', N'Alta y configuración de medios', 'administracion'), ('administracion:auditoria:ver', N'Ver logs de auditoría', N'Acceso al dashboard de auditoría', 'administracion') ) 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 PRINT 'Permiso seeds applied (18 permisos).'; GO