Files
SIG-CM2.0/database/migrations/V006__create_rol_permiso.sql

97 lines
4.2 KiB
Transact-SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 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