-- V40: 수수료 종류 코드(COMMISSION_TYPE) + 통합 마스터(commission_master)

-- ============================================================
-- 1. 공통코드 그룹 — COMMISSION_TYPE
-- ============================================================

INSERT INTO common_code_group (group_code, group_name, description, is_system, sort_order) VALUES
    ('COMMISSION_TYPE', '수수료종류', '모집/유지/수금/오버라이드/갱신/부활/유지보수수당/시책/위촉 9종', 'Y', 360)
ON CONFLICT (group_code) DO NOTHING;

INSERT INTO common_code (group_code, code, code_name, code_desc, sort_order) VALUES
    ('COMMISSION_TYPE', 'RECRUIT',   '모집수수료',     '신계약 체결 시 발생하는 기본 모집수수료',         10),
    ('COMMISSION_TYPE', 'MAINTAIN',  '유지수수료',     '계약 유지 기간 중 발생하는 유지수수료',           20),
    ('COMMISSION_TYPE', 'COLLECT',   '수금수수료',     '보험료 수납 단위로 발생하는 수금수수료',           30),
    ('COMMISSION_TYPE', 'OVERRIDE',  '오버라이드',     '하위 설계사 수수료 기반 상위 직급 오버라이드',     40),
    ('COMMISSION_TYPE', 'RENEWAL',   '갱신수수료',     '자동차/실비 등 갱신 계약 시 발생하는 수수료',     50),
    ('COMMISSION_TYPE', 'REINSTATE', '부활수수료',     '실효된 계약 부활 시 발생하는 수수료',             60),
    ('COMMISSION_TYPE', 'PERSIST',   '유지보수수당',   '13/25/37/49개월 유지율 충족 시 지급하는 수당',    70),
    ('COMMISSION_TYPE', 'INCENTIVE', '시책수수료',     '본사 시책 프로그램에 따른 인센티브',               80),
    ('COMMISSION_TYPE', 'ONBOARD',   '위촉수수료',     '보험사 위촉계약 체결 시 지급하는 위촉수수료',     90)
ON CONFLICT (group_code, code) DO NOTHING;

-- ============================================================
-- 2. commission_master — 전 수수료 종류 통합 마스터
--    모든 수수료 원장(recruit_ledger / maintain_ledger /
--    collection_commission_ledger / override_ledger / 등)에서
--    산출된 결과를 단일 뷰로 집계하기 위한 허브 테이블.
--    settle_master 조인 시 agent_id + settle_month 로 연결.
-- ============================================================

CREATE TABLE commission_master (
    master_id         BIGSERIAL       PRIMARY KEY,
    agent_id          BIGINT          NOT NULL REFERENCES agent(agent_id),
    commission_type   VARCHAR(20)     NOT NULL,
    settle_month      CHAR(6)         NOT NULL,
    source_table      VARCHAR(50)     NOT NULL,   -- 원본 원장 테이블명 (recruit_ledger 등)
    source_id         BIGINT          NOT NULL,   -- 원본 원장 PK
    gross_amount      NUMERIC(15,2)   NOT NULL DEFAULT 0,  -- 세전 수수료
    tax_amount        NUMERIC(15,2)   NOT NULL DEFAULT 0,  -- 원천세
    net_amount        NUMERIC(15,2)   NOT NULL DEFAULT 0,  -- 세후 지급액
    status            VARCHAR(20)     NOT NULL DEFAULT 'CALCULATED',
    created_at        TIMESTAMP       NOT NULL DEFAULT NOW(),
    updated_at        TIMESTAMP,
    UNIQUE (agent_id, commission_type, settle_month, source_id),
    CHECK (commission_type IN ('RECRUIT','MAINTAIN','COLLECT','OVERRIDE','RENEWAL','REINSTATE','PERSIST','INCENTIVE','ONBOARD')),
    CHECK (status IN ('CALCULATED','CONFIRMED','PAID','CANCELLED'))
);

COMMENT ON TABLE  commission_master IS '수수료 통합 마스터 — 전 수수료 종류를 단일 허브에서 집계. settle_master 와 agent_id+settle_month 로 조인';
COMMENT ON COLUMN commission_master.commission_type IS 'COMMISSION_TYPE 그룹 코드 (RECRUIT/MAINTAIN/COLLECT/OVERRIDE/RENEWAL/REINSTATE/PERSIST/INCENTIVE/ONBOARD)';
COMMENT ON COLUMN commission_master.source_table    IS '원본 원장 테이블명 (예: recruit_ledger)';
COMMENT ON COLUMN commission_master.source_id       IS '원본 원장 PK';
COMMENT ON COLUMN commission_master.gross_amount    IS '세전 수수료 금액';
COMMENT ON COLUMN commission_master.net_amount      IS '세후 실지급 금액';

CREATE INDEX idx_cm_agent_month  ON commission_master(agent_id, settle_month);
CREATE INDEX idx_cm_type_month   ON commission_master(commission_type, settle_month);
CREATE INDEX idx_cm_source       ON commission_master(source_table, source_id);
CREATE INDEX idx_cm_status       ON commission_master(status, settle_month);
