2026-06-03 16:41:36 +09:00
|
|
|
|
# 수수료 계산 공식 전체 레퍼런스 (코드 기준)
|
|
|
|
|
|
|
|
|
|
|
|
> 모든 수수료 종류의 **실제 구현 계산식**을 정리한 문서입니다.
|
|
|
|
|
|
> 출처는 각 `*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 + 원천세) 균형.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-06-08 21:27:26 +09:00
|
|
|
|
## 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`)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-06-03 16:41:36 +09:00
|
|
|
|
## 4. 실지급 흐름 한 장 요약
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
보험료 ─×보험사요율─▶ 보험사지급액 ─×지급률─▶ 설계사수수료(gross)
|
|
|
|
|
|
│
|
|
|
|
|
|
┌─ 1200%룰: 1차년 한도 clip + 초과분 7년 분급 이연 ─┐
|
|
|
|
|
|
└─ 조기해지: 차등환수(−) / 부활: 환수복원(+) ┘
|
|
|
|
|
|
▼
|
|
|
|
|
|
gross − 소득세 − 지방세 (+부가세) − 공제 = net(실지급) ──▶ 펌뱅킹 이체
|
|
|
|
|
|
│
|
|
|
|
|
|
회계분개: (차)지급수수료 / (대)미지급금 net + 예수금 원천세
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
*기준 코드: CommissionCalculator, TaxCalculator, ChargebackCalculator, InstallmentPlanGenerator,
|
|
|
|
|
|
RegulatoryLimitChecker, CalcRecruit/Maintain/OverrideStep, AggregateStep, AccountingEntryGenerateStep,
|
2026-06-08 21:27:26 +09:00
|
|
|
|
P7/P8 12개 commission Service. schema v126. 2026-06 수수료 감사 수정 + 갭보완 4종(§3-7) 반영.*
|