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

97 lines
4.2 KiB
MySQL
Raw Normal View History

-- 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