-- ---------------------------------------------------------------------------
-- cl 모듈 (마감/closing) - 일/월/분기/연 마감 로그 + 스냅샷 + 기간잠금 (prefix 45)
-- Loaded after 40-lg.sql by docker-entrypoint-initdb.d.
-- cl 서비스/배치가 채우는 마감이력(close_log) + 마감스냅샷(snapshot) 테이블.
-- ---------------------------------------------------------------------------

-- 마감 이력 (close_log) - 하나의 마감 실행(일/월/분기/연/중간)의 헤더
CREATE SEQUENCE IF NOT EXISTS cl_close_seq;
CREATE TABLE IF NOT EXISTS cl_close_log (
    close_id     BIGINT PRIMARY KEY,
    close_type   TEXT NOT NULL,               -- DAILY/MONTHLY/QUARTER/YEAREND/MID
    period_key   TEXT NOT NULL,               -- YYYY-MM-DD / YYYY-MM / YYYY-Qn / YYYY
    biz_date     DATE NOT NULL,
    status       TEXT NOT NULL DEFAULT 'O',   -- O=개시, C=마감완료, R=재마감, A=승인, L=잠금, X=취소
    txn_count    BIGINT NOT NULL DEFAULT 0,
    total_amount BIGINT NOT NULL DEFAULT 0,
    memo         TEXT NOT NULL DEFAULT '',
    created_at   TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at   TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_cl_close_period ON cl_close_log(close_type, period_key);

-- 마감 스냅샷 (snapshot) - 마감 시점 가맹점별 집계 고정
CREATE SEQUENCE IF NOT EXISTS cl_snapshot_seq;
CREATE TABLE IF NOT EXISTS cl_snapshot (
    snapshot_id  BIGINT PRIMARY KEY,
    close_id     BIGINT NOT NULL,
    period_key   TEXT NOT NULL,
    biz_date     DATE NOT NULL,
    merchant_id  TEXT NOT NULL,
    gross_amount BIGINT NOT NULL DEFAULT 0,
    fee_amount   BIGINT NOT NULL DEFAULT 0,
    net_amount   BIGINT NOT NULL DEFAULT 0,
    txn_count    BIGINT NOT NULL DEFAULT 0,
    created_at   TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_cl_snapshot_close ON cl_snapshot(close_id);

-- 기간 잠금 (period lock) - 마감된 기간의 추가 정정 차단
CREATE TABLE IF NOT EXISTS cl_period_lock (
    period_key   TEXT PRIMARY KEY,
    locked       BOOLEAN NOT NULL DEFAULT true,
    locked_at    TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 마감 시퀀스 관리 (close_type 별 마지막 순번)
CREATE TABLE IF NOT EXISTS cl_seq_reg (
    close_type   TEXT PRIMARY KEY,
    last_seq     BIGINT NOT NULL DEFAULT 0,
    updated_at   TIMESTAMPTZ NOT NULL DEFAULT now()
);
