-- V006__create_rol_permiso.sql -- Tabla M:N Rol ↔ Permiso + seed inicial según matriz §2.4.2. -- Requiere: V003 (dbo.Rol), V005 (dbo.Permiso). -- Convención RBAC: cada permiso nuevo → asignar explícitamente a admin en la misma migración. -- 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.RolPermiso', N'U') IS NULL BEGIN CREATE TABLE dbo.RolPermiso ( Id INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_RolPermiso PRIMARY KEY, RolId INT NOT NULL CONSTRAINT FK_RolPermiso_Rol REFERENCES dbo.Rol(Id) ON DELETE CASCADE, PermisoId INT NOT NULL CONSTRAINT FK_RolPermiso_Permiso REFERENCES dbo.Permiso(Id) ON DELETE CASCADE, FechaAsignacion DATETIME2(3) NOT NULL CONSTRAINT DF_RolPermiso_FA DEFAULT(SYSUTCDATETIME()), CONSTRAINT UQ_RolPermiso UNIQUE (RolId, PermisoId) ); CREATE INDEX IX_RolPermiso_RolId ON dbo.RolPermiso (RolId); CREATE INDEX IX_RolPermiso_PermisoId ON dbo.RolPermiso (PermisoId); PRINT 'Table dbo.RolPermiso created.'; END ELSE PRINT 'Table dbo.RolPermiso already exists — skip.'; GO -- Seed: mapeo rol → permisos según matriz §2.4.2 -- admin: 18 permisos (explícito — sin wildcard, convención RBAC) -- cajero: 4 permisos (ventas contado) -- operador_ctacte: 2 permisos (ventas ctacte) -- picadora: 2 permisos (textos) -- jefe_publicidad: 7 permisos (textos + pauta + productores) -- productor: 2 permisos (productores) -- diagramacion: 1 permiso (pauta:azanu:ver) -- reportes: 0 permisos (solo lectura reportes — sin permisos en este catálogo) -- Total rows: 36 MERGE dbo.RolPermiso AS t USING ( SELECT r.Id AS RolId, p.Id AS PermisoId FROM (VALUES -- admin (18 permisos) ('admin', 'ventas:contado:crear'), ('admin', 'ventas:contado:modificar'), ('admin', 'ventas:contado:cobrar'), ('admin', 'ventas:contado:facturar'), ('admin', 'ventas:ctacte:crear'), ('admin', 'ventas:ctacte:facturar'), ('admin', 'textos:editar'), ('admin', 'textos:reclamos:ver'), ('admin', 'pauta:azanu:ver'), ('admin', 'pauta:limpiar'), ('admin', 'pauta:recursos:fueradehora'), ('admin', 'productores:deuda:ver'), ('admin', 'productores:pendientes:crear'), ('admin', 'productores:deuda:bypass'), ('admin', 'administracion:usuarios:gestionar'), ('admin', 'administracion:tarifarios:gestionar'), ('admin', 'administracion:medios:gestionar'), ('admin', 'administracion:auditoria:ver'), -- cajero (4 permisos) ('cajero', 'ventas:contado:crear'), ('cajero', 'ventas:contado:modificar'), ('cajero', 'ventas:contado:cobrar'), ('cajero', 'ventas:contado:facturar'), -- operador_ctacte (2 permisos) ('operador_ctacte', 'ventas:ctacte:crear'), ('operador_ctacte', 'ventas:ctacte:facturar'), -- picadora (2 permisos) ('picadora', 'textos:editar'), ('picadora', 'textos:reclamos:ver'), -- jefe_publicidad (7 permisos) ('jefe_publicidad', 'textos:editar'), ('jefe_publicidad', 'textos:reclamos:ver'), ('jefe_publicidad', 'pauta:azanu:ver'), ('jefe_publicidad', 'pauta:limpiar'), ('jefe_publicidad', 'pauta:recursos:fueradehora'), ('jefe_publicidad', 'productores:deuda:ver'), ('jefe_publicidad', 'productores:deuda:bypass'), -- productor (2 permisos) ('productor', 'productores:deuda:ver'), ('productor', 'productores:pendientes:crear'), -- diagramacion (1 permiso) ('diagramacion', 'pauta:azanu:ver') -- reportes: 0 permisos — no filas ) AS x (RolCodigo, PermisoCodigo) JOIN dbo.Rol r ON r.Codigo = x.RolCodigo JOIN dbo.Permiso p ON p.Codigo = x.PermisoCodigo ) 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 'RolPermiso seeds applied (36 rows: admin×18 + cajero×4 + operador_ctacte×2 + picadora×2 + jefe_publicidad×7 + productor×2 + diagramacion×1).'; GO