-- V44: 오버라이드 원장 보강 (override_ledger + override_summary)
--      기존 V3의 override_rule + V6의 override_settle은 정산 결과 집계용.
--      이 파일은 calcOverride 결과를 수수료 종류 단위로 추적하는 원장과
--      agent+settle_month 단위 합계 테이블을 추가한다.

-- ============================================================
-- 1. override_ledger — 오버라이드 수수료 상세 원장
--    source_commission_type 단위로 어떤 수수료가 오버라이드 원천인지 추적.
-- ============================================================

CREATE TABLE override_ledger (
    ledger_id              BIGSERIAL      PRIMARY KEY,
    from_agent_id          BIGINT         NOT NULL REFERENCES agent(agent_id),
    -- 원천 설계사 (수수료를 발생시킨 하위 설계사)
    to_agent_id            BIGINT         NOT NULL REFERENCES agent(agent_id),
    -- 오버라이드 수령 설계사 (상위 직급)
    org_id                 BIGINT         REFERENCES organization(org_id),
    settle_month           CHAR(6)        NOT NULL,
    source_commission_type VARCHAR(20)    NOT NULL,
    -- 원천 수수료 종류 (COMMISSION_TYPE 코드)
    source_ledger_table    VARCHAR(50),
    -- 원천 원장 테이블명 (recruit_ledger 등)
    source_ledger_id       BIGINT,
    -- 원천 원장 PK
    source_amount          NUMERIC(15,2)  NOT NULL,
    -- 오버라이드 계산 기준 수수료
    override_rate          NUMERIC(7,4)   NOT NULL,
    override_amount        NUMERIC(15,2)  NOT NULL,
    -- 최종 오버라이드 금액
    status                 VARCHAR(20)    NOT NULL DEFAULT 'CALCULATED',
    created_at             TIMESTAMP      NOT NULL DEFAULT NOW(),
    updated_at             TIMESTAMP,
    CHECK (source_commission_type IN ('RECRUIT','MAINTAIN','COLLECT','RENEWAL','REINSTATE','PERSIST','INCENTIVE')),
    CHECK (status IN ('CALCULATED','CONFIRMED','PAID','CANCELLED'))
);

COMMENT ON TABLE  override_ledger                       IS '오버라이드 원장 — calcOverride 결과를 수수료 종류 단위로 상세 추적';
COMMENT ON COLUMN override_ledger.from_agent_id         IS '원천 설계사 (오버라이드 기준 수수료 발생 설계사)';
COMMENT ON COLUMN override_ledger.to_agent_id           IS '오버라이드 수령 설계사 (상위 직급 관리자)';
COMMENT ON COLUMN override_ledger.source_commission_type IS '원천 수수료 종류 (COMMISSION_TYPE 코드)';
COMMENT ON COLUMN override_ledger.source_ledger_table   IS '원천 원장 테이블명';
COMMENT ON COLUMN override_ledger.source_amount         IS '오버라이드 계산 기준이 된 원천 수수료';
COMMENT ON COLUMN override_ledger.override_rate         IS '적용 오버라이드율';
COMMENT ON COLUMN override_ledger.override_amount       IS '최종 오버라이드 금액 = source_amount * override_rate';

CREATE INDEX idx_ol_to_agent_month  ON override_ledger(to_agent_id, settle_month);
CREATE INDEX idx_ol_from_agent      ON override_ledger(from_agent_id, settle_month);
CREATE INDEX idx_ol_org_month       ON override_ledger(org_id, settle_month);
CREATE INDEX idx_ol_status          ON override_ledger(status, settle_month);

-- ============================================================
-- 2. override_summary — agent+settle_month 단위 오버라이드 합계
--    Materialized View 후보이나 갱신 제어를 위해 일반 테이블로.
--    배치 완료 후 UPSERT 방식으로 집계.
-- ============================================================

CREATE TABLE override_summary (
    summary_id        BIGSERIAL      PRIMARY KEY,
    to_agent_id       BIGINT         NOT NULL REFERENCES agent(agent_id),
    settle_month      CHAR(6)        NOT NULL,
    total_source_amount  NUMERIC(15,2) NOT NULL DEFAULT 0,
    total_override_amount NUMERIC(15,2) NOT NULL DEFAULT 0,
    ledger_count      INT            NOT NULL DEFAULT 0,
    status            VARCHAR(20)    NOT NULL DEFAULT 'CALCULATED',
    calc_date         TIMESTAMP      NOT NULL DEFAULT NOW(),
    updated_at        TIMESTAMP,
    UNIQUE (to_agent_id, settle_month),
    CHECK (status IN ('CALCULATED','CONFIRMED','PAID'))
);

COMMENT ON TABLE  override_summary                       IS '오버라이드 합계 — agent+settle_month 단위 배치 집계 결과';
COMMENT ON COLUMN override_summary.to_agent_id           IS '오버라이드 수령 설계사 (상위 직급)';
COMMENT ON COLUMN override_summary.total_source_amount   IS '오버라이드 계산 기준 원천 수수료 합계';
COMMENT ON COLUMN override_summary.total_override_amount IS '최종 오버라이드 지급액 합계';
COMMENT ON COLUMN override_summary.ledger_count          IS '오버라이드 원장 건수';

CREATE INDEX idx_os_month ON override_summary(settle_month, status);
