feat(db): BATCH 1 - V005/V006 Permiso y RolPermiso + seed [UDT-005]
This commit is contained in:
65
database/migrations/V005__create_permiso.sql
Normal file
65
database/migrations/V005__create_permiso.sql
Normal file
@@ -0,0 +1,65 @@
|
||||
-- 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
|
||||
Reference in New Issue
Block a user