Files
ga-commission-system/ga-common/src/main/resources/db/migration/V89__소개이관수수료.sql
T
GA Pro bfc724669b feat: incar 갭 반영 수수료/운영 14개 도메인 풀스택 + 배치통합 + 신입교육자료
incar CMS(116메뉴) 벤치마킹 갭분석으로 ga-pro에 없던 14개 도메인을 풀스택 추가.

P7 수수료 계산 7종 (V88~V96):
- 수입수수료+수지차, 소개·이관수수료, 정착지원금, 인정실적+환산율,
  시상, 생보운영지원수수료, 지점장수당
- 각 rule/ledger + 공식(보험료×요율, 수입−지급 등) Service 내장

P8 운영/정산 7종 (V97~V105):
- 단계마감, 본사정산, 등급평가, 공동계약, 보증보험, 적립금, 수수료시뮬레이터
- close/reopen/apply/simulate/upsert 등 액션 + 손익·잔액·등급 산정 로직

배치 통합 (V106):
- settle_master.other_commission_total 컬럼 추가(DEFAULT 0, 백필)
- 설계사 지급성 9종 원장 aggregateByAgent → AggregateStep gross 합산
- 빈 원장 0 → 기존 정산결과·무결성 불변(비파괴적)

테스트: P7/P8 Service 공식 단위테스트 21건(ga-api:test 57건 전체 통과)
프론트: 화면 14개 + React.lazy 코드 스플리팅(단일 4MB → 130+ 청크)
문서: DOMAIN_GAP_P7/P8.md, 신입교육_보험과수수료_완전기초.md, DOMAIN_KNOWLEDGE/HANDOFF 갱신

검증: 전체 ./gradlew build(test 포함) SUCCESSFUL, Flyway V88~V106 success,
GET+액션POST smoke 5xx 0건, 9개 집계쿼리 SQL 유효성 확인, 공식 런타임 실측.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 15:45:10 +09:00

73 lines
4.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- V89: 소개·이관수수료 (referral_commission_rule + referral_commission_ledger)
-- 계약을 소개(REFERRAL)하거나 이관(TRANSFER)한 설계사에게 지급하는 수수료.
-- 정률(RATE): commission_amount = base_amount × commission_rate
-- 정액(FIXED): commission_amount = fixed_amount
-- ============================================================
-- 1. referral_commission_rule — 소개·이관수수료 룰 마스터
-- ============================================================
CREATE TABLE referral_commission_rule (
rule_id BIGSERIAL PRIMARY KEY,
referral_type VARCHAR(20) NOT NULL,
calc_type VARCHAR(10) NOT NULL,
commission_rate NUMERIC(7,4),
fixed_amount NUMERIC(15,2),
effective_from DATE NOT NULL,
effective_to DATE,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by BIGINT,
updated_at TIMESTAMP,
CHECK (referral_type IN ('REFERRAL','TRANSFER')),
CHECK (calc_type IN ('RATE','FIXED')),
CHECK (commission_rate IS NULL OR (commission_rate >= 0 AND commission_rate <= 1)),
CHECK (fixed_amount IS NULL OR fixed_amount >= 0)
);
COMMENT ON TABLE referral_commission_rule IS '소개·이관수수료 룰 마스터 — 소개/이관 유형별 수수료율 또는 정액 정의';
COMMENT ON COLUMN referral_commission_rule.rule_id IS '룰 PK';
COMMENT ON COLUMN referral_commission_rule.referral_type IS '유형 (REFERRAL=소개 / TRANSFER=이관)';
COMMENT ON COLUMN referral_commission_rule.calc_type IS '계산방식 (RATE=정률 / FIXED=정액)';
COMMENT ON COLUMN referral_commission_rule.commission_rate IS '정률 요율 (소수, calc_type=RATE 일 때 사용)';
COMMENT ON COLUMN referral_commission_rule.fixed_amount IS '정액 금액 (calc_type=FIXED 일 때 사용)';
COMMENT ON COLUMN referral_commission_rule.effective_from IS '적용 시작일';
COMMENT ON COLUMN referral_commission_rule.effective_to IS '적용 종료일 (NULL=현재 유효)';
CREATE INDEX idx_rfcr_type_from ON referral_commission_rule(referral_type, effective_from);
-- ============================================================
-- 2. referral_commission_ledger — 소개·이관수수료 원장
-- ============================================================
CREATE TABLE referral_commission_ledger (
ledger_id BIGSERIAL PRIMARY KEY,
contract_id BIGINT NOT NULL REFERENCES contract(contract_id),
referrer_agent_id BIGINT NOT NULL REFERENCES agent(agent_id),
settle_month CHAR(6) NOT NULL,
referral_type VARCHAR(20) NOT NULL,
base_amount NUMERIC(15,2) NOT NULL,
commission_rate NUMERIC(7,4),
commission_amount NUMERIC(15,2) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'CALCULATED',
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP,
CHECK (referral_type IN ('REFERRAL','TRANSFER')),
CHECK (status IN ('CALCULATED','CONFIRMED','CANCELLED')),
CHECK (base_amount >= 0),
CHECK (commission_amount >= 0)
);
COMMENT ON TABLE referral_commission_ledger IS '소개·이관수수료 원장 — 소개/이관 설계사에게 지급하는 수수료 발생 이력';
COMMENT ON COLUMN referral_commission_ledger.ledger_id IS '원장 PK';
COMMENT ON COLUMN referral_commission_ledger.contract_id IS '대상 계약 FK';
COMMENT ON COLUMN referral_commission_ledger.referrer_agent_id IS '소개/이관한 설계사 FK';
COMMENT ON COLUMN referral_commission_ledger.settle_month IS '정산 귀속월 (YYYYMM)';
COMMENT ON COLUMN referral_commission_ledger.referral_type IS '유형 (REFERRAL=소개 / TRANSFER=이관)';
COMMENT ON COLUMN referral_commission_ledger.base_amount IS '기준금액 (수수료 또는 보험료)';
COMMENT ON COLUMN referral_commission_ledger.commission_rate IS '적용 정률 요율 (RATE 방식 시)';
COMMENT ON COLUMN referral_commission_ledger.commission_amount IS '수수료액 = base×rate (RATE) 또는 fixed_amount (FIXED)';
COMMENT ON COLUMN referral_commission_ledger.status IS '상태 (CALCULATED/CONFIRMED/CANCELLED)';
CREATE INDEX idx_rfcl_agent_month ON referral_commission_ledger(referrer_agent_id, settle_month);
CREATE INDEX idx_rfcl_contract ON referral_commission_ledger(contract_id);