-- =============================================================================
-- Migración:    0015_create_precios_uf_table
-- Sprint:       1.3 — schema del catálogo
-- Tabla:        precios_uf
-- Aplica en:    BD de cada tenant (innovium_<slug>)
-- Dependencias: 0001 (users).
--
-- Descripción:
--   Cache local del valor UF (Unidad de Fomento) en CLP. Los contratos
--   en NF se cobran en UF y necesitamos saber el valor del día.
--
--   Sprint 1.3: se siembra UN valor inicial (hoy con UF≈$38.500).
--   Sprint 1.4: UI para que el admin actualice diariamente.
--   Sprint 2.x: integración con API real (BCCh / mindicador.cl) +
--               cron diario.
--
-- Notas de diseño:
--   - fecha UNIQUE: un solo valor por día. Si el admin actualiza dos
--     veces el mismo día, se hace UPDATE (manejado por el model).
--   - valor_clp DECIMAL(10,2): la UF nunca pasó de los $40.000, da
--     margen amplio sin overflow.
--   - fuente: trazabilidad de origen ('manual', 'api_sii', 'api_bcch').
--   - actualizado_por FK a users.id ON DELETE SET NULL: si el user
--     que cargó el valor se elimina físicamente, el registro histórico
--     persiste con NULL en lugar de cascadearse (los precios UF son
--     históricos, no deben perderse).
--   - idx_precios_uf_fecha_desc: para el query "valor más reciente
--     con fecha <= hoy" del helper PrecioUf::getValorActual().
--   - Sin actualizado_en ni eliminado_en: tabla append-only por
--     convención. Reemplazar valor del día = INSERT/UPDATE (UNIQUE
--     fecha lo fuerza).
-- =============================================================================

CREATE TABLE precios_uf (
    id                  BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                        COMMENT 'PK auto-incremental.',
    fecha               DATE            NOT NULL
                        COMMENT 'Fecha del valor (zona horaria del CEDIS — Chile = America/Santiago).',
    valor_clp           DECIMAL(10,2)   NOT NULL
                        COMMENT 'Valor de 1 UF en CLP ese día.',
    fuente              VARCHAR(100)    NOT NULL DEFAULT 'manual'
                        COMMENT 'Origen del valor: "manual", "api_sii", "api_bcch", etc.',
    actualizado_por     BIGINT UNSIGNED     NULL
                        COMMENT 'FK → users.id (SET NULL). NULL si fue automático o el user fue borrado.',
    creado_en           DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                        COMMENT 'UTC de creación. Inmutable.',
    PRIMARY KEY (id),
    UNIQUE KEY uq_precios_uf_fecha (fecha),
    KEY idx_precios_uf_fecha_desc (fecha DESC),
    KEY idx_precios_uf_actualizado_por (actualizado_por),
    CONSTRAINT fk_precios_uf_actualizado_por
        FOREIGN KEY (actualizado_por) REFERENCES users (id)
        ON DELETE SET NULL ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Cache local del valor UF en CLP. Sprint 2.x integra API real + cron.';
