67 lines
4.0 KiB
SQL
67 lines
4.0 KiB
SQL
-- V41: 수금수수료 (collection_commission_rule + collection_commission_ledger)
|
|
-- 보험료 수납 단위(매월)로 발생하는 수금수수료. 납입주기별 차등 적용.
|
|
|
|
-- ============================================================
|
|
-- 1. collection_commission_rule — 납입주기별 수금수수료율 마스터
|
|
-- ============================================================
|
|
|
|
CREATE TABLE collection_commission_rule (
|
|
rule_id BIGSERIAL PRIMARY KEY,
|
|
product_id BIGINT NOT NULL REFERENCES product(product_id),
|
|
payment_cycle VARCHAR(20) NOT NULL,
|
|
commission_rate NUMERIC(7,4) NOT NULL,
|
|
effective_from DATE NOT NULL,
|
|
effective_to DATE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
created_by BIGINT,
|
|
updated_at TIMESTAMP,
|
|
UNIQUE (product_id, payment_cycle, effective_from),
|
|
CHECK (payment_cycle IN ('MONTHLY','QUARTERLY','SEMI','ANNUAL')),
|
|
CHECK (commission_rate >= 0 AND commission_rate <= 1)
|
|
);
|
|
|
|
COMMENT ON TABLE collection_commission_rule IS '수금수수료율 마스터 — 상품/납입주기별 수금수수료율 정의';
|
|
COMMENT ON COLUMN collection_commission_rule.product_id IS '적용 상품 FK';
|
|
COMMENT ON COLUMN collection_commission_rule.payment_cycle IS '납입주기 (MONTHLY=월납/QUARTERLY=분기납/SEMI=반기납/ANNUAL=연납)';
|
|
COMMENT ON COLUMN collection_commission_rule.commission_rate IS '수금수수료율 (소수, 예: 0.005 = 0.5%)';
|
|
COMMENT ON COLUMN collection_commission_rule.effective_from IS '적용 시작일';
|
|
COMMENT ON COLUMN collection_commission_rule.effective_to IS '적용 종료일 (NULL=현재 유효)';
|
|
|
|
CREATE INDEX idx_ccr_product ON collection_commission_rule(product_id, effective_from);
|
|
|
|
-- ============================================================
|
|
-- 2. collection_commission_ledger — 수금수수료 원장
|
|
-- 매월 수납 확인 후 발생. paid_at 기준으로 정산월 귀속.
|
|
-- ============================================================
|
|
|
|
CREATE TABLE collection_commission_ledger (
|
|
ledger_id BIGSERIAL PRIMARY KEY,
|
|
contract_id BIGINT NOT NULL REFERENCES contract(contract_id),
|
|
agent_id BIGINT NOT NULL REFERENCES agent(agent_id),
|
|
settle_month CHAR(6) NOT NULL,
|
|
premium_amount NUMERIC(15,2) NOT NULL,
|
|
commission_rate NUMERIC(7,4) NOT NULL,
|
|
commission_amount NUMERIC(15,2) NOT NULL,
|
|
payment_cycle VARCHAR(20) NOT NULL,
|
|
paid_at DATE NOT NULL,
|
|
status VARCHAR(20) NOT NULL DEFAULT 'CALCULATED',
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP,
|
|
CHECK (payment_cycle IN ('MONTHLY','QUARTERLY','SEMI','ANNUAL')),
|
|
CHECK (status IN ('CALCULATED','CONFIRMED','PAID','CANCELLED'))
|
|
);
|
|
|
|
COMMENT ON TABLE collection_commission_ledger IS '수금수수료 원장 — 매월 보험료 수납 단위로 발생';
|
|
COMMENT ON COLUMN collection_commission_ledger.contract_id IS '대상 계약 FK';
|
|
COMMENT ON COLUMN collection_commission_ledger.agent_id IS '수금 담당 설계사 FK';
|
|
COMMENT ON COLUMN collection_commission_ledger.settle_month IS '정산 귀속월 (YYYYMM)';
|
|
COMMENT ON COLUMN collection_commission_ledger.premium_amount IS '수납 보험료';
|
|
COMMENT ON COLUMN collection_commission_ledger.commission_rate IS '적용 수금수수료율';
|
|
COMMENT ON COLUMN collection_commission_ledger.commission_amount IS '수금수수료 = premium_amount * commission_rate';
|
|
COMMENT ON COLUMN collection_commission_ledger.payment_cycle IS '납입주기';
|
|
COMMENT ON COLUMN collection_commission_ledger.paid_at IS '실 보험료 납입일';
|
|
|
|
CREATE INDEX idx_ccl_agent_month ON collection_commission_ledger(agent_id, settle_month);
|
|
CREATE INDEX idx_ccl_contract ON collection_commission_ledger(contract_id);
|
|
CREATE INDEX idx_ccl_status ON collection_commission_ledger(status, settle_month);
|