-- ═══════════════════════════════════════════════════════════════════════
-- 2026-10-19_03 · Bitácora central de cambios + permiso "ver historial"
--
-- Pedido del usuario: un permiso nuevo para que, en las pestañas de los
-- módulos, quien lo tenga vea con un botón el historial de quién hizo
-- cambios. Decisión del usuario: el permiso es POR PESTAÑA (4.ª casilla
-- junto a leer / escribir / eliminar, en roles y en usuarios).
--
--   bitacora         una fila por acción que modifica (POST/PUT/DELETE) en
--                    una pestaña: usuario, pestaña, ruta, respuesta, datos
--                    enviados (sin contraseñas), éxito, IP.
--   bitacora_cambio  campos cambiados (antes → después) que pasan por el
--                    modelo base (Model::create/update/delete).
-- El registro empieza con esta migración: no hay historial anterior.
--
-- Respaldo previo: backups/tinsa_db_pre-bitacora_2026-10-19.sql
-- Reversa: database/rollback/2026-10-19_03_bitacora_historial.sql
-- ═══════════════════════════════════════════════════════════════════════

ALTER TABLE permisos_roles ADD COLUMN puede_ver_historial TINYINT(1) NOT NULL DEFAULT 0 AFTER puede_eliminar;
ALTER TABLE permisos       ADD COLUMN puede_ver_historial TINYINT(1) NOT NULL DEFAULT 0 AFTER puede_eliminar;

-- El Administrador lo tiene en todas las pestañas que ya puede leer
UPDATE permisos_roles SET puede_ver_historial = 1 WHERE id_rol = 1 AND puede_leer = 1;

CREATE TABLE bitacora (
  id            INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_usuario    INT(10) UNSIGNED DEFAULT NULL,
  ruta_pestana  VARCHAR(150) NOT NULL,
  metodo        VARCHAR(6) NOT NULL,
  uri           VARCHAR(255) NOT NULL,
  id_registro   VARCHAR(40) DEFAULT NULL COMMENT 'primer parámetro {id} de la ruta',
  accion        VARCHAR(500) DEFAULT NULL COMMENT 'mensaje de la respuesta',
  exito         TINYINT(1) DEFAULT NULL,
  codigo_http   SMALLINT UNSIGNED DEFAULT NULL,
  datos         MEDIUMTEXT DEFAULT NULL COMMENT 'JSON de lo enviado, sin contraseñas',
  ip            VARCHAR(45) DEFAULT NULL,
  created_at    TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_bitacora_pestana (ruta_pestana, created_at),
  KEY idx_bitacora_usuario (id_usuario, created_at),
  CONSTRAINT fk_bitacora_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios (id_usuario) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE bitacora_cambio (
  id           INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  id_bitacora  INT(10) UNSIGNED NOT NULL,
  tabla        VARCHAR(64) NOT NULL,
  id_fila      VARCHAR(40) DEFAULT NULL,
  operacion    ENUM('crear','editar','eliminar') NOT NULL,
  campo        VARCHAR(64) NOT NULL,
  antes        TEXT DEFAULT NULL,
  despues      TEXT DEFAULT NULL,
  KEY fk_bitacora_cambio (id_bitacora),
  CONSTRAINT fk_bitacora_cambio FOREIGN KEY (id_bitacora) REFERENCES bitacora (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
