동기화

This commit is contained in:
GA Pro
2026-05-14 01:21:27 +09:00
parent acea2afce5
commit 958fe6b980
379 changed files with 21786 additions and 423 deletions
@@ -0,0 +1,66 @@
-- 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);