-- ============================================================
--  Migración 2026-10-09_01 · Permisos especiales por rol y usuario
-- ------------------------------------------------------------
--  Permisos especiales = facultades que no son de una pestaña
--  (catálogo en app/models/PermisoEspecial.php):
--    gerente_ventas · cotizador
--  - rol_permiso_especial: los que un rol trae predefinidos.
--  - usuario_permiso_especial: excepción del usuario sobre su rol.
--    activo = 1 → se le da aunque su rol no lo tenga.
--    activo = 0 → se le quita aunque su rol lo tenga.
--    sin fila  → según sus roles.
--  Reemplaza las columnas usuarios.es_gerente_ventas / es_cotizador
--  (2026-10-07_01): los valores marcados pasan a excepciones.
--  Predefinidos: Administrador = todos; Gerente de ventas = gerente_ventas.
-- ============================================================
USE tinsa_db;

CREATE TABLE `rol_permiso_especial` (
  `id_rol` int(10) unsigned NOT NULL,
  `clave` varchar(50) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id_rol`, `clave`),
  CONSTRAINT `fk_rpe_rol` FOREIGN KEY (`id_rol`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `usuario_permiso_especial` (
  `id_usuario` int(10) unsigned NOT NULL,
  `clave` varchar(50) NOT NULL,
  `activo` tinyint(1) NOT NULL,
  `usuario_modifico` int(10) unsigned DEFAULT NULL,
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id_usuario`, `clave`),
  KEY `fk_upe_modifico` (`usuario_modifico`),
  CONSTRAINT `fk_upe_usuario` FOREIGN KEY (`id_usuario`) REFERENCES `usuarios` (`id_usuario`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_upe_modifico` FOREIGN KEY (`usuario_modifico`) REFERENCES `usuarios` (`id_usuario`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- Predefinidos por rol
INSERT INTO rol_permiso_especial (id_rol, clave)
SELECT r.id, p.clave
  FROM roles r
  JOIN (SELECT 'gerente_ventas' AS clave UNION ALL SELECT 'cotizador') p
 WHERE r.nombre = 'Administrador';

INSERT INTO rol_permiso_especial (id_rol, clave)
SELECT id, 'gerente_ventas' FROM roles WHERE nombre = 'Gerente de ventas';

-- Lo marcado a mano en usuarios pasa a excepción solo si su rol no lo da ya
INSERT INTO usuario_permiso_especial (id_usuario, clave, activo)
SELECT u.id_usuario, 'gerente_ventas', 1 FROM usuarios u
 WHERE u.es_gerente_ventas = 1
   AND NOT EXISTS (SELECT 1 FROM usuario_roles ur JOIN rol_permiso_especial rp ON rp.id_rol = ur.id_rol
                    WHERE ur.id_usuario = u.id_usuario AND rp.clave = 'gerente_ventas');

INSERT INTO usuario_permiso_especial (id_usuario, clave, activo)
SELECT u.id_usuario, 'cotizador', 1 FROM usuarios u
 WHERE u.es_cotizador = 1
   AND NOT EXISTS (SELECT 1 FROM usuario_roles ur JOIN rol_permiso_especial rp ON rp.id_rol = ur.id_rol
                    WHERE ur.id_usuario = u.id_usuario AND rp.clave = 'cotizador');

ALTER TABLE `usuarios`
  DROP COLUMN `es_cotizador`,
  DROP COLUMN `es_gerente_ventas`;

UPDATE roles
   SET descripcion = 'Pestañas de ventas (ve todos los clientes) y permiso especial Gerente de ventas'
 WHERE nombre = 'Gerente de ventas';
