-- =============================================================================
-- Migración:    0033_create_aportes_y_servicios_tables
-- Sprint:       1.5a — Necesidad Inmediata (NI)
-- Tablas:       contrato_aportes_previsionales, contrato_servicios_extra
-- Aplica en:    BD de cada tenant (innovium_<slug>)
-- Dependencias: 0024 (entidades_previsionales), 0032 (contratos).
--
-- Descripción:
--   Las dos tablas N:1 que cuelgan del contrato y representan los datos
--   variables (cantidad indeterminada) de un contrato NI:
--
--   · contrato_aportes_previsionales — hasta 3 entidades previsionales
--     (HABITAT, BICE VIDA, IPS, etc.) que aportan al funeral. El
--     límite de 3 viene del legacy y de la realidad chilena.
--
--   · contrato_servicios_extra — servicios adicionales con precio
--     (TRASLADO, EXHUMACIÓN, etc.) que no entraron en el plan base.
--
-- Notas de diseño:
--
--   · ON DELETE CASCADE en contrato_id: si el contrato se borra
--     físicamente (caso muy raro, post-anulación + cleanup), sus
--     aportes y servicios extra mueren con él. La regla de oro es que
--     contratos firmados NUNCA se borran físicamente, solo se anulan.
--
--   · ON DELETE RESTRICT en entidad_previsional_id: nunca se puede
--     borrar una entidad referenciada por un contrato vivo. La
--     trazabilidad histórica adicional vive en nombre_snapshot por
--     si la entidad después se desactiva (activo=0).
--
--   · nombre_snapshot: copia del nombre de la entidad al momento del
--     contrato. Si en 5 años "BICE VIDA" se renombra o desactiva, el
--     PDF del contrato 1149 sigue mostrando "BICE VIDA".
--
--   · fecha_verificada NULLable: el aporte se promete al firmar, pero
--     finanzas confirma cuando llega la plata. Hasta entonces NULL.
--
--   · orden: 1, 2, 3 para hasta 3 entidades. NO usamos UNIQUE
--     (contrato_id, orden) por flexibilidad — el código aplica la
--     restricción de 3 max.
--
--   · contrato_servicios_extra.orden: posición en la lista del PDF.
--     Sin UNIQUE; se asigna secuencialmente al guardar.
-- =============================================================================

CREATE TABLE contrato_aportes_previsionales (
    id                          BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                                COMMENT 'PK auto-incremental.',
    contrato_id                 BIGINT UNSIGNED NOT NULL
                                COMMENT 'FK → contratos.id (CASCADE).',
    entidad_previsional_id      BIGINT UNSIGNED NOT NULL
                                COMMENT 'FK → entidades_previsionales.id (RESTRICT).',
    nombre_snapshot             VARCHAR(80)     NOT NULL
                                COMMENT 'Snapshot del nombre de la entidad al momento del contrato.',
    monto_clp                   INT UNSIGNED    NOT NULL DEFAULT 0
                                COMMENT 'Monto del aporte en CLP.',
    fecha_verificada            DATE                NULL
                                COMMENT 'Fecha en que finanzas confirmó el cobro. NULL=pendiente.',
    orden                       TINYINT UNSIGNED NOT NULL DEFAULT 1
                                COMMENT 'Posición 1-3 (límite de 3 aportes por contrato, validado en código).',
    creado_en                   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    actualizado_en              DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                                                         ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_aportes_contrato_orden (contrato_id, orden),
    KEY idx_aportes_entidad (entidad_previsional_id),
    KEY idx_aportes_fecha_verificada (fecha_verificada),
    CONSTRAINT fk_aportes_contrato
        FOREIGN KEY (contrato_id) REFERENCES contratos (id)
        ON DELETE CASCADE ON UPDATE RESTRICT,
    CONSTRAINT fk_aportes_entidad
        FOREIGN KEY (entidad_previsional_id) REFERENCES entidades_previsionales (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Aportes previsionales por contrato (hasta 3). Snapshot del nombre.';


CREATE TABLE contrato_servicios_extra (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                    COMMENT 'PK auto-incremental.',
    contrato_id     BIGINT UNSIGNED NOT NULL
                    COMMENT 'FK → contratos.id (CASCADE).',
    nombre          VARCHAR(150)    NOT NULL
                    COMMENT 'Nombre del servicio adicional (ej: "TRASLADO", "EXHUMACIÓN").',
    monto_clp       INT UNSIGNED    NOT NULL DEFAULT 0
                    COMMENT 'Monto en CLP.',
    orden           INT UNSIGNED    NOT NULL DEFAULT 1
                    COMMENT 'Orden visual en el PDF (sin UNIQUE, asignado secuencialmente).',
    creado_en       DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_servicios_extra_contrato (contrato_id, orden),
    CONSTRAINT fk_servicios_extra_contrato
        FOREIGN KEY (contrato_id) REFERENCES contratos (id)
        ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Servicios adicionales del contrato (TRASLADO, etc.) que no entraron en el plan.';
