-- V48: 계약 변경 (contract_endorsement)
--      보험료/수익자/피보험자/주소 변경 등 계약 변경 이력.
--      requires_commission_recalc=true 이면 배치에서 수수료 재계산 트리거.

CREATE TABLE contract_endorsement (
    endorsement_id           BIGSERIAL    PRIMARY KEY,
    contract_id              BIGINT       NOT NULL REFERENCES contract(contract_id),
    agent_id                 BIGINT       NOT NULL REFERENCES agent(agent_id),
    endorsement_type         VARCHAR(30)  NOT NULL,
    changed_at               TIMESTAMP    NOT NULL DEFAULT NOW(),
    old_value                TEXT,
    -- 변경 전 값 (JSON 또는 텍스트)
    new_value                TEXT,
    -- 변경 후 값 (JSON 또는 텍스트)
    reason                   VARCHAR(500),
    requires_commission_recalc BOOLEAN    NOT NULL DEFAULT FALSE,
    -- TRUE이면 배치 수수료 재계산 대상
    processed                BOOLEAN      NOT NULL DEFAULT FALSE,
    -- 재계산 처리 완료 여부
    processed_at             TIMESTAMP,
    created_at               TIMESTAMP    NOT NULL DEFAULT NOW(),
    created_by               BIGINT,
    updated_at               TIMESTAMP,
    CHECK (endorsement_type IN ('PREMIUM_CHANGE','BENEFICIARY','INSURED','ADDRESS','OTHER'))
);

COMMENT ON TABLE  contract_endorsement                              IS '계약 변경 이력 — 변경 유형별 old/new 값 보관 + 수수료 재계산 트리거';
COMMENT ON COLUMN contract_endorsement.contract_id                 IS '대상 계약 FK';
COMMENT ON COLUMN contract_endorsement.agent_id                    IS '담당 설계사 FK';
COMMENT ON COLUMN contract_endorsement.endorsement_type            IS '변경 유형 (PREMIUM_CHANGE=보험료변경/BENEFICIARY=수익자/INSURED=피보험자/ADDRESS=주소/OTHER=기타)';
COMMENT ON COLUMN contract_endorsement.old_value                   IS '변경 전 값';
COMMENT ON COLUMN contract_endorsement.new_value                   IS '변경 후 값';
COMMENT ON COLUMN contract_endorsement.requires_commission_recalc  IS '수수료 재계산 필요 여부 (TRUE이면 배치 재처리 대상)';
COMMENT ON COLUMN contract_endorsement.processed                   IS '재계산 처리 완료 여부';

CREATE INDEX idx_ce_contract      ON contract_endorsement(contract_id, changed_at);
CREATE INDEX idx_ce_agent         ON contract_endorsement(agent_id, changed_at);
CREATE INDEX idx_ce_recalc        ON contract_endorsement(requires_commission_recalc, processed)
    WHERE requires_commission_recalc = TRUE AND processed = FALSE;
-- 재계산 미처리 건 빠른 조회용 부분 인덱스
