-- V30: 정산 정정 (settle_correction) — 확정된 정산의 정정 이력 관리

-- ============================================================
-- 1. settle_correction — 정산 정정 이력
-- ============================================================

CREATE TABLE settle_correction (
    correction_id       BIGSERIAL       PRIMARY KEY,
    original_settle_id  BIGINT          NOT NULL REFERENCES settle_master(settle_id),   -- 원본 정산 참조
    agent_id            BIGINT          NOT NULL REFERENCES agent(agent_id),
    settle_month        CHAR(6)         NOT NULL,               -- YYYYMM (원본과 동일)
    diff_amount         NUMERIC(15,2)   NOT NULL,               -- 차액 (양수=추가지급, 음수=환수)
    before_amount       NUMERIC(15,2)   NOT NULL,               -- 정정 전 순지급액
    after_amount        NUMERIC(15,2)   NOT NULL,               -- 정정 후 순지급액
    reason_code         VARCHAR(30)     NOT NULL,               -- 정정 사유 코드 (CORRECTION_REASON)
    reason_detail       VARCHAR(1000),                          -- 정정 사유 상세
    status              VARCHAR(20)     NOT NULL DEFAULT 'DRAFT', -- DRAFT/APPROVED/APPLIED/CANCELLED
    requested_by        BIGINT          NOT NULL,               -- 정정 신청자
    requested_at        TIMESTAMP       NOT NULL DEFAULT NOW(),
    approved_by         BIGINT,                                 -- 정정 승인자
    approved_at         TIMESTAMP,
    applied_settle_id   BIGINT          REFERENCES settle_master(settle_id), -- 정정이 반영된 정산 (다음 월 등)
    cancel_reason       VARCHAR(500),
    cancelled_by        BIGINT,
    cancelled_at        TIMESTAMP,
    created_at          TIMESTAMP       NOT NULL DEFAULT NOW(),
    updated_at          TIMESTAMP
);

COMMENT ON TABLE  settle_correction                  IS '정산 정정 이력 — 확정 정산에 대한 사후 정정';
COMMENT ON COLUMN settle_correction.original_settle_id IS '원본 settle_master 참조';
COMMENT ON COLUMN settle_correction.diff_amount      IS '정정 차액 (양수=추가, 음수=환수)';
COMMENT ON COLUMN settle_correction.before_amount    IS '정정 전 순지급액';
COMMENT ON COLUMN settle_correction.after_amount     IS '정정 후 순지급액';
COMMENT ON COLUMN settle_correction.reason_code      IS '정정 사유 코드 (CORRECTION_REASON 그룹)';
COMMENT ON COLUMN settle_correction.status           IS 'DRAFT/APPROVED/APPLIED/CANCELLED';
COMMENT ON COLUMN settle_correction.applied_settle_id IS '차액이 반영된 정산 settle_id (다음 정산월 등)';

CREATE INDEX idx_sc_original  ON settle_correction(original_settle_id);
CREATE INDEX idx_sc_agent     ON settle_correction(agent_id, settle_month);
CREATE INDEX idx_sc_status    ON settle_correction(status, requested_at DESC);

-- ============================================================
-- 2. 공통코드 CORRECTION_REASON / CORRECTION_STATUS
-- ============================================================

INSERT INTO common_code_group (group_code, group_name, description, is_system, sort_order) VALUES
    ('CORRECTION_REASON', '정정사유',  'DATA_ERROR/POLICY_CHANGE/LATE_DATA/MANUAL_ADJ/OTHER',   'Y', 300),
    ('CORRECTION_STATUS', '정정상태',  'DRAFT/APPROVED/APPLIED/CANCELLED',                       'Y', 310)
ON CONFLICT (group_code) DO NOTHING;

INSERT INTO common_code (group_code, code, code_name, code_desc, sort_order) VALUES
    ('CORRECTION_REASON', 'DATA_ERROR',     '데이터오류',   '원시 데이터 오류로 인한 정정',         10),
    ('CORRECTION_REASON', 'POLICY_CHANGE',  '정책변경',     '정산 정책 변경으로 인한 소급 정정',     20),
    ('CORRECTION_REASON', 'LATE_DATA',      '지연수신',     '보험사 데이터 지연 수신으로 인한 정정', 30),
    ('CORRECTION_REASON', 'MANUAL_ADJ',     '수동조정',     '관리자 수동 조정',                      40),
    ('CORRECTION_REASON', 'OTHER',          '기타',         '기타 사유',                             50),
    ('CORRECTION_STATUS', 'DRAFT',          '초안',         '정정 신청 초안',                        10),
    ('CORRECTION_STATUS', 'APPROVED',       '승인',         '정정 승인 완료',                        20),
    ('CORRECTION_STATUS', 'APPLIED',        '적용완료',     '정정 차액 정산 반영 완료',              30),
    ('CORRECTION_STATUS', 'CANCELLED',      '취소',         '정정 신청 취소',                        40)
ON CONFLICT (group_code, code) DO NOTHING;
