-- ============================================================
-- GEOSTARK NOMINA - SQL OPCIONAL V6 BLINDAJE DE NOMINA
-- Ejecutar solo si la migración automática no crea las tablas/columnas.
-- Recomendado: respaldo completo antes de correr.
-- ============================================================

CREATE TABLE IF NOT EXISTS nomina_corrida_trabajador_snapshot (
    id INT AUTO_INCREMENT PRIMARY KEY,
    corrida_id INT NOT NULL,
    persona_id INT NOT NULL,
    nombre VARCHAR(255) NULL,
    apellido VARCHAR(255) NULL,
    cedula VARCHAR(50) NULL,
    cargo VARCHAR(120) NULL,
    id_cargo INT NULL,
    fecha_ingreso DATE NULL,
    estatus_laboral VARCHAR(30) NULL,
    salario_origen VARCHAR(30) NULL,
    salario_moneda VARCHAR(10) NULL,
    salario_monto_original DECIMAL(18,4) NOT NULL DEFAULT 0,
    salario_mensual_bs DECIMAL(18,4) NOT NULL DEFAULT 0,
    salario_diario_bs DECIMAL(18,4) NOT NULL DEFAULT 0,
    salario_hora_bs DECIMAL(18,4) NOT NULL DEFAULT 0,
    bono_extra_usd_mensual DECIMAL(18,4) NOT NULL DEFAULT 0,
    tasa_bcv_usada DECIMAL(18,6) NOT NULL DEFAULT 0,
    snapshot_json JSON NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uniq_corrida_persona_snapshot (corrida_id, persona_id),
    KEY idx_persona (persona_id),
    KEY idx_corrida (corrida_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS nomina_corrida_conceptos_snapshot (
    id INT AUTO_INCREMENT PRIMARY KEY,
    corrida_id INT NOT NULL,
    concepto_id INT NOT NULL,
    codigo VARCHAR(30) NOT NULL,
    nombre VARCHAR(180) NOT NULL,
    tipo VARCHAR(20) NOT NULL,
    incide_salario_normal TINYINT(1) NOT NULL DEFAULT 0,
    incide_base_cotizacion TINYINT(1) NOT NULL DEFAULT 0,
    modo_calculo VARCHAR(30) NULL,
    tasa DECIMAL(18,6) NULL,
    monto_fijo DECIMAL(18,4) NULL,
    moneda_monto_fijo VARCHAR(10) NULL,
    aplica_global TINYINT(1) NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    regla_json JSON NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uniq_corrida_concepto_snapshot (corrida_id, concepto_id),
    KEY idx_corrida_codigo (corrida_id, codigo),
    KEY idx_concepto (concepto_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS nomina_corrida_ajustes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    corrida_id INT NOT NULL,
    periodo_id INT NULL,
    persona_id INT NULL,
    concepto_id INT NULL,
    tipo VARCHAR(30) NOT NULL DEFAULT 'AJUSTE',
    signo VARCHAR(10) NOT NULL DEFAULT 'AJUSTE',
    monto DECIMAL(18,2) NOT NULL DEFAULT 0,
    cantidad DECIMAL(18,4) NULL,
    motivo VARCHAR(255) NOT NULL,
    referencia VARCHAR(120) NULL,
    estado VARCHAR(30) NOT NULL DEFAULT 'REGISTRADO',
    usuario VARCHAR(120) NULL,
    ip VARCHAR(64) NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    KEY idx_corrida (corrida_id),
    KEY idx_periodo (periodo_id),
    KEY idx_persona (persona_id),
    KEY idx_tipo_estado (tipo, estado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Columnas nuevas en nomina_corridas con verificación segura, sin error por columna duplicada.
DROP PROCEDURE IF EXISTS gs_nomina_add_column_if_missing;
DELIMITER $$
CREATE PROCEDURE gs_nomina_add_column_if_missing(
    IN p_table VARCHAR(64),
    IN p_column VARCHAR(64),
    IN p_definition TEXT
)
BEGIN
    IF NOT EXISTS (
        SELECT 1
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE()
          AND TABLE_NAME = p_table
          AND COLUMN_NAME = p_column
    ) THEN
        SET @sql_add_col = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN ', p_definition);
        PREPARE stmt FROM @sql_add_col;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;
END$$
DELIMITER ;

CALL gs_nomina_add_column_if_missing('nomina_corridas', 'tipo_corrida', 'tipo_corrida VARCHAR(30) NOT NULL DEFAULT \'ORDINARIA\' AFTER estado');
CALL gs_nomina_add_column_if_missing('nomina_corridas', 'corrida_origen_id', 'corrida_origen_id INT NULL AFTER tipo_corrida');
CALL gs_nomina_add_column_if_missing('nomina_corridas', 'bloqueada', 'bloqueada TINYINT(1) NOT NULL DEFAULT 0 AFTER corrida_origen_id');

DROP PROCEDURE IF EXISTS gs_nomina_add_column_if_missing;

-- Verificación rápida:
SHOW TABLES LIKE 'nomina_corrida_%';
SHOW COLUMNS FROM nomina_corridas LIKE 'bloqueada';
