Files
ga-commission-system/docs/수수료_계산공식_전체레퍼런스.md
T
GA Pro 711f3b5e16 docs: 수수료 레퍼런스에 갭보완 4종(§3-7) 반영 + 간이지급명세서 주민번호 화면 마스킹
- 수수료_계산공식_전체레퍼런스.md: §3-7 감사 보완 4종(A 지급보류/B 환수원천세역분개/
  C 환수채권연체이자/D 간이지급명세서) 추가, schema v126 표기
- SimplifiedPaymentReport: 화면 표시용 주민번호 마스킹(생년월일+성별구분 이후 *).
  엑셀 export는 국세청 제출용이라 원본 유지

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 21:27:26 +09:00

183 lines
11 KiB
Markdown
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.
# 수수료 계산 공식 전체 레퍼런스 (코드 기준)
> 모든 수수료 종류의 **실제 구현 계산식**을 정리한 문서입니다.
> 출처는 각 `*Service` / `*Calculator` / Step 코드이며, 2026-06 수수료 감사 수정분이 반영돼 있습니다.
> 공통 규칙: 모든 금액 `BigDecimal`, 반올림 `HALF_UP`. 금액 `NUMERIC(15,2)`(소수 2자리),
> 율 `NUMERIC(7,4)`. 원천세·환수 등 일부 집계는 원단위(scale 0).
---
## 0. 가장 기본 — 모집/유지 "세 번 곱하기"
`CommissionCalculator` (모집·유지 공통, 회차만 다름)
```
① 보험사지급액 = 보험료(premium) × 보험사요율(company_rate %) / 100
② 설계사수수료 = 보험사지급액 × 지급률(payout_rate %) / 100 ← gross(agent_amount)
③ 원장 원천세 = 설계사수수료 × 3.3% ← tax_amount
```
- `company_rate`: 상품 × 회차(commission_year) × 기준일로 조회
- `payout_rate` : 설계사등급 × 보험종류 × 회차로 조회 (등급 높을수록 ↑)
- 율이 NULL이면 0 폴백 + **경보 로그**(과소지급 추적). 금액 pct는 scale 2.
- **숫자 예시**: 보험료 1,000,000 × 60% = 600,000 → × 75% = 450,000 → 세금 14,850
| 종류 | 코드 | 회차(commission_year) | 귀속 |
|---|---|---|---|
| **모집수수료** | recruit | 1 (초년도) | 원 모집설계사 (승계돼도 잔류) |
| **유지수수료** | maintain | 2~ (`monthsElapsed/12 + 1`) | 현재 관리설계사 (승계 시 후임) |
---
## 1. 설계사 지급성 수수료 (settle_master gross 에 합산되는 9종 + 본 2종)
| # | 종류 | 코드 | 계산 공식 | 비고 |
|---|---|---|---|---|
| 1 | 모집수수료 | recruit | `premium × company_rate × payout_rate` | §0 |
| 2 | 유지수수료 | maintain | 〃 (회차만 다름) | §0 |
| 3 | **수금수수료** | collection | `commission = 보험료(premium_amount) × 수수료율(commission_rate)` | `CollectionCommissionService:89` |
| 4 | **갱신수수료** | renewal | `commission = req.commissionAmount` (룰의 rateValue/fixedAmount 참조, 원장은 입력액) | `RenewalCommissionService:91` |
| 5 | **부활수수료** | reinstatement | `net = commissionAmount + chargebackReversal` (부활 시 기환수액 일부 복원) | `ReinstatementCommissionService:88,100` |
| 6 | **지속수당(유지보너스)** | persistency_bonus | 유지율 ≥ `retention_rate_threshold` 일 때 `bonus_value` (RATE형 base×율 / FIXED형 정액) | 룰: 등급별 임계유지율 |
| 7 | **소개·이관수수료** | referral | RATE형 `base × rate` / FIXED형 `fixed_amount`. (RATE는 룰 rate 우선, 없으면 req) | `ReferralCommissionService:103,110,114` |
| 8 | **정착지원금** | settling_support | `net = support_amount clawback`. **환수액 ≤ 지원금 검증**(net 음수 차단) | `SettlingSupportService` |
| 9 | **시상** | award | `threshold_amount 이상`일 때만: RATE `base × award_rate` / FIXED `award_fixed` | `AwardService` (threshold 게이트) |
| 10 | **생보운영지원수수료** | life_support | `support = base × support_rate`, `net = support clawback`. **환수 ≤ support 검증** | `LifeSupportService` |
| 11 | **지점장수당** | branch_allowance | `allowance = min(base × allowance_rate, cap)`. cap=NULL이면 무제한. `net = allowance clawback` | `BranchAllowanceService:85-93` |
> settle_master 집계 시 9종(3~11, 모집·유지 제외)은 `other_commission_total` 로 합산돼 gross 에 더해진다.
---
## 2. 조직·실적 기반
| 종류 | 코드 | 계산 공식 | 비고 |
|---|---|---|---|
| **오버라이드** | override | `amount = min(base × override_pct, cap)`. **base = 하위설계사 모집+유지 합** (룰에 `insurance_type_cond` 있으면 해당 보험종류만 집계) | `CalcOverrideStep`. cap NULL=무제한. 조직트리 상향 탐색해 가장 가까운 `to_grade` 1명에 귀속 |
| **인정실적(환산보험료)** | recognized | `converted = premium × conversion_rate`, `recognized = converted × recognition_rate` | `RecognizedPerformanceService:85,89`. 시상·등급 산정 기초 |
| **수입수수료** | income | `income = premium × company_rate`. 수지차 `margin = Σincome Σpayout`, `marginRate = margin / Σincome` | `IncomeCommissionService:47,83,86`. 보험사→GA 수입 원장 |
| **등급평가** | grade_eval | `performance_score``selectActiveRuleByScore` → 매칭 룰의 `gradeId`로 등급 결정 (없으면 기존등급 유지) | `GradeEvaluationService:95-97` |
| **공동계약 지분** | joint_contract | 계약별 `Σ share_rate ≤ 1.0` 검증 (초과 시 E411). 각 설계사 몫 = 수수료 × 본인 share_rate | `JointContractService` |
| **준비금** | reserve_fund | `balance = (직전월 balance or 0) + reserve_in reserve_out` | `ReserveFundService:50` |
| **수수료 시뮬레이션** | simulation | `사수 = premium×company_rate×payout_rate`, `원천세 = 사수×3.3%`, `net = 사수−원천세`, `예상환수 = 사수×기본환수율(or 입력)` | `CommissionSimulationService` (조회 전용 미리보기) |
---
## 3. 횡단(cross-cutting) 규제·정산 계산
### 3-1. 1200% 룰 (RegulatoryLimitChecker) — **단위 환산 + clip+이연**
```
한도(KRW) = 연환산보험료 × 한도율(%) / 100 ← unit=PERCENT 일 때 (1200%, 1차년 35%)
위반조건 = (기지급 누적 + 추가분) > 한도(KRW)
```
- 1차년 한도 초과 시: **한도잔여까지만 당월 지급(clip)**, 초과분만 분급(7년)으로 **이연**, 세액 재계산.
전액 이연되면 당월 원장 미생성. (`CalcRecruitStep`)
### 3-2. 분급 (InstallmentPlanGenerator) — 7년 분할
```
회차별 지급 = 총수수료 × 회차비율(%) / 100 (표준 35/25/15/10/7/5/3)
```
- 비율 합이 정확히 100%이면 **마지막 회차가 반올림 잔차를 흡수**(분급 합 = 원금 보장).
### 3-3. 차등환수 (ChargebackCalculator) — 조기해지
```
경과월 = MONTHS_BETWEEN(계약일, 해지일)
환수액 = 기지급 모집수수료 × 환수율(경과월 구간)
```
| 경과월 | 환수율 |
|---|---|
| 0 ~ 12 | 100% |
| 13 ~ 24 | 50% |
| 25 ~ 36 | 25% |
| 37 ~ 84 | 10% |
| 85 ~ | 0% |
- (0개월 즉시해지도 100% 구간에 포함 — V109 보정)
### 3-4. 세금 (TaxCalculator / BatchTaxCalculator)
```
소득세 = gross × 소득세율(사업 3.3% / 기타 8.8%) (scale 0, 원단위)
지방세 = 소득세 × 10% (scale 0)
부가세 = gross × 10% (과세사업자 TAXABLE 만, 그 외 0)
net = gross − 소득세 − 지방세 + 부가세
```
- **gross ≤ 0(환수>지급)이면 세금 0, net = gross** (음수 원천세가 신고에 전파되는 것 차단)
### 3-5. 집계 → 실지급 (AggregateStep, settle_master)
```
gross = 모집 + 유지 + 오버라이드 + 예외(+) − 환수 − 예외() + 기타9종(other_commission_total)
tax = 소득세 + 지방세
net = gross − 소득세 − 지방세 + 부가세 − 공제(deduction)
```
- net < 0(공제>지급)이면 경보 로그(차월 이월 검토 대상).
- 무결성: 8단계 후 `Σ원장 == Σsettle_master`.
### 3-6. 회계 분개 (AccountingEntryGenerateStep) — **원천세 예수금 분리**
```
(차) 8350 지급수수료 gross
(대) 2530 미지급금 net (= gross 원천세)
(대) 2540 예수금 원천세(tax_amount) ← 원천세>0 일 때 leg 분리
```
- 차변합(gross) = 대변합(net + 원천세) 균형.
---
## 3-7. 2026-06 감사 보완 4종 (V124~V126)
설계사 지급성 수수료 종류는 사실상 완비된 상태에서, 감사로 발견한 **실제 결함·규제 갭**만 보완.
### 3-7-A. 지급보류(HOLD) 지급배치 제외 — **버그 수정**
```
지급배치 대상 = settle_master WHERE payable_amount>0 AND status NOT IN ('PAID','HOLD')
```
- 종전엔 `status != 'PAID'` 만 검사 → 운영자가 지급보류(HOLD)한 설계사도 펌뱅킹 이체에 포함되던 결함.
(`PaymentBatchItemMapper.insertFromSettleMaster`)
### 3-7-B. 환수 원천세 역분개 — 교차월 환수 시 기납부 원천세 보정
```
gross<0(상계되지 않은 환수분)인 월:
역분개 기준액 = |gross|
소득세 역분개 = −(|gross| × 소득세율) ← withholding_tax_adjustment (음수)
지방세 역분개 = −(소득세 역분개액 × 10%)
분기 원천세신고 = Σpayment(원천세) + Σadjustment(역분개, 음수) ← 과대신고 해소
```
- gross≥0(당월 환수가 양수분으로 상계)인 달은 당월 과세에 이미 반영 → **역분개 미발생**(이중계상 없음).
- settle_master gross/net/carryover/payable 흐름은 **불변**(역분개는 신고보정용 별도 레코드).
(`AggregateStep` gross<0 분기, `WithholdingTaxReportMapper.upsertQuarterlyAggregate`)
### 3-7-C. 환수채권 연체이자 — 미수채권 이월 시 월 단리 적립
```
당월 적립이자 = 채권잔액(balance) × 연체이자율(%) / 1200 (월 단리, scale 0)
적립조건 = origin_settle_month ≤ 당월 (거치기간+1)
balance += 적립이자 (→ 기존 FIFO 상계가 이자까지 회수)
```
- 이자율 `CLAWBACK_OVERDUE_INTEREST_RATE`(기본 0=미적립 안전폴백), 거치기간 `CLAWBACK_INTEREST_GRACE_MONTHS`(기본 0).
- 멱등: `clawback_interest` 이력으로 당월 적립분 reverse 후 재적립. (`AggregateStep.reverseAndAccrueClawbackInterest`)
### 3-7-D. 사업소득 간이지급명세서(월별) — 국세청 제출 대응
```
간이지급명세서 = commission_statement(MONTHLY) ⋈ agent
(소득자·주민/사업자번호·지급액·소득세·지방소득세·차인지급액)
```
- 신규 데이터테이블 없음(읽기전용 리포트). 조회 + 엑셀 export. (`ReportMapper.selectSimplifiedPayment`)
---
## 4. 실지급 흐름 한 장 요약
```
보험료 ─×보험사요율─▶ 보험사지급액 ─×지급률─▶ 설계사수수료(gross)
┌─ 1200%룰: 1차년 한도 clip + 초과분 7년 분급 이연 ─┐
└─ 조기해지: 차등환수(−) / 부활: 환수복원(+) ┘
gross − 소득세 − 지방세 (+부가세) − 공제 = net(실지급) ──▶ 펌뱅킹 이체
회계분개: (차)지급수수료 / (대)미지급금 net + 예수금 원천세
```
---
*기준 코드: CommissionCalculator, TaxCalculator, ChargebackCalculator, InstallmentPlanGenerator,
RegulatoryLimitChecker, CalcRecruit/Maintain/OverrideStep, AggregateStep, AccountingEntryGenerateStep,
P7/P8 12개 commission Service. schema v126. 2026-06 수수료 감사 수정 + 갭보완 4종(§3-7) 반영.*