/*
  GEOSTARK NOMINA MASTER v7
  Prestaciones sociales: historial salarial real + tasas/intereses BCV.
  Compatible MariaDB/MySQL. No modifica corridas ni movimientos de nómina.
*/

CREATE TABLE IF NOT EXISTS nomina_tasas_interes_bcv (
    id INT AUTO_INCREMENT PRIMARY KEY,
    periodo_ym CHAR(7) NOT NULL,
    anio SMALLINT NOT NULL,
    mes TINYINT NOT NULL,
    tasa_activa_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
    tasa_pasiva_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
    tasa_promedio_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
    fecha_publicacion DATE DEFAULT NULL,
    fuente_url VARCHAR(255) DEFAULT NULL,
    aplica_prestaciones TINYINT(1) NOT NULL DEFAULT 1,
    observacion VARCHAR(255) DEFAULT NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uniq_periodo_ym (periodo_ym),
    KEY idx_anio_mes (anio, mes),
    KEY idx_aplica (aplica_prestaciones)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS nomina_salario_historial (
    id INT AUTO_INCREMENT PRIMARY KEY,
    persona_id INT NOT NULL,
    fecha_desde DATE NOT NULL,
    fecha_hasta DATE DEFAULT NULL,
    salario_origen VARCHAR(30) DEFAULT NULL,
    salario_moneda VARCHAR(10) DEFAULT NULL,
    salario_monto_original DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
    tasa_bcv_usada DECIMAL(18,6) NOT NULL DEFAULT 0.000000,
    salario_mensual_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
    salario_diario_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
    salario_hora_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
    bono_extra_usd_mensual DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
    salario_normal_mensual_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
    salario_integral_mensual_bs DECIMAL(18,4) NOT NULL DEFAULT 0.0000,
    origen VARCHAR(40) NOT NULL DEFAULT 'CORRIDA_CERRADA',
    referencia_corrida_id INT DEFAULT NULL,
    snapshot_json JSON DEFAULT NULL,
    observacion VARCHAR(255) DEFAULT NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uniq_persona_corrida (persona_id, referencia_corrida_id),
    KEY idx_persona_fecha (persona_id, fecha_desde),
    KEY idx_origen (origen)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS nomina_prestaciones_intereses (
    id INT AUTO_INCREMENT PRIMARY KEY,
    persona_id INT NOT NULL,
    periodo_ym CHAR(7) NOT NULL,
    fecha_desde DATE NOT NULL,
    fecha_hasta DATE NOT NULL,
    metodo VARCHAR(30) NOT NULL DEFAULT 'PROMEDIO_ACTIVA_PASIVA',
    tasa_id INT DEFAULT NULL,
    tasa_anual DECIMAL(10,4) NOT NULL DEFAULT 0.0000,
    tasa_mensual DECIMAL(12,8) NOT NULL DEFAULT 0.00000000,
    capital_base_bs DECIMAL(18,2) NOT NULL DEFAULT 0.00,
    interes_bs DECIMAL(18,2) NOT NULL DEFAULT 0.00,
    fuente_url VARCHAR(255) DEFAULT NULL,
    observacion VARCHAR(255) DEFAULT NULL,
    estado VARCHAR(20) NOT NULL DEFAULT 'REGISTRADO',
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uniq_persona_periodo_metodo (persona_id, periodo_ym, metodo),
    KEY idx_persona_fecha (persona_id, fecha_hasta),
    KEY idx_estado (estado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

/* Columnas complementarias para dejar evidencia salarial del evento de prestaciones. */
SET @tbl := 'nomina_prestaciones_eventos';

SET @sql := IF((SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @tbl AND COLUMN_NAME = 'tasa_bcv_usada') = 0,
  'ALTER TABLE nomina_prestaciones_eventos ADD COLUMN tasa_bcv_usada DECIMAL(18,6) NOT NULL DEFAULT 0.000000 AFTER salario_integral_diario_bs',
  'SELECT "tasa_bcv_usada ya existe" AS info');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @sql := IF((SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @tbl AND COLUMN_NAME = 'salario_moneda') = 0,
  'ALTER TABLE nomina_prestaciones_eventos ADD COLUMN salario_moneda VARCHAR(10) DEFAULT NULL AFTER tasa_bcv_usada',
  'SELECT "salario_moneda ya existe" AS info');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @sql := IF((SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @tbl AND COLUMN_NAME = 'salario_monto_original') = 0,
  'ALTER TABLE nomina_prestaciones_eventos ADD COLUMN salario_monto_original DECIMAL(18,4) NOT NULL DEFAULT 0.0000 AFTER salario_moneda',
  'SELECT "salario_monto_original ya existe" AS info');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SET @sql := IF((SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = @tbl AND COLUMN_NAME = 'fuente_salario') = 0,
  'ALTER TABLE nomina_prestaciones_eventos ADD COLUMN fuente_salario VARCHAR(40) DEFAULT NULL AFTER salario_monto_original',
  'SELECT "fuente_salario ya existe" AS info');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

SELECT 'TABLAS V7' AS bloque,
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'nomina_tasas_interes_bcv') AS tasas_bcv,
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'nomina_salario_historial') AS salario_historial,
       (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'nomina_prestaciones_intereses') AS intereses;
