RALPH PROGRESS — GA 수수료 공식 갭 보완 + 8종 신규모듈 (세션 930c39aa, 2026-06-06)

[BASELINE]
- 캐노니컬 레포 ga-commission-system, schema V115, ./gradlew build+test GREEN (47 test files).
- 수수료 공식 레퍼런스: docs/수수료_계산공식_전체레퍼런스.md (25+종 구현 확인).

[갭 감사 — 5 에이전트 병렬]
- 확정 버그 3건(아래 GAP-1/2/3), 오탐 반려(BranchAllowance net=SQL이 이미 차감, Referral RATE우선=정상, scale-0환수=의도적).
- 개념적 빠진 모듈 8종 → 사용자 "전부 풀스택" 결정.

[작업 로그]
- GAP-1/2/3 PL 직접수정+테스트 완료(:ga-batch:test/:ga-api:test GREEN). PRD passes=true.
- 8종 모듈 5-Wave 위임:
  - Wave1 DBA: V116~V123 작성(dba-architect). 실명 검증(commission_rate/payout_rule, company_id, clawback WRITTEN_OFF 기존존재).
  - Wave2 CORE: VO/Mapper/Enum 40+파일(core-architect). :ga-core 컴파일 GREEN.
  - Wave3 API+BATCH 병렬: api 14파일(:ga-api GREEN), batch AggregateStep 11종집계+선지급상계+MOD-8채널요율.
    **PL 버그수정**: 선지급 멱등 reverse가 no-op였음(reverseAdvanceRecoveryForAgent 미호출) → 월단위 selectAdvanceIdsBySettleMonth 추가 후 reverseAdvanceRecovery 정상 구현, dead code 제거. :ga-batch:test GREEN(CommissionCalculator/CalcRecruit/Scenario 무손상).
  - Wave4 FRONTEND: 7페이지+7라우트+MOD-8 ContractList 채널필드(frontend-developer). tsc 0오류.
- Wave5: full ./gradlew build(test) GREEN. Flyway V116~V123 운영DB 적용 성공(schema v123). 라이브 스모크: 8 GET=200, /api/statute 시드노출, MOD-1 원장 RATE공식 실측 50000.00(룰권위), MOD-6 expire=200, MOD-7 create+검증=200 → 5xx 0건(테스트데이터 psql 정리).
- 적대적 리뷰(general-purpose) → BLOCKING 1건: MOD-8 채널요율이 계산기에 미연결(컬럼만 추가, RuleMapper SQL/CommissionCalculator 미반영=inert). 나머지(GAP-1/2/3, MOD-2 멱등, 정산무결성, 마이그레이션) CORRECT 판정.
  **PL 수정**: RuleMapper.xml findCompanyRate/findPayoutRate에 `(sales_channel=#{x} OR sales_channel IS NULL) ORDER BY (sales_channel IS NULL) ASC`(findChargebackRate 패턴) + RuleMapper.java salesChannel param + CommissionCalculator c.getSalesChannel() 전달 + 테스트스텁 갱신 + recruit_passesSalesChannel 신규테스트(채널요율 실적용 40000 검증). full build GREEN. 재리뷰 진행중.
- 재리뷰 **APPROVED**(MOD-8 채널 NULL폴백 backward-compat·pass-through·무회귀 확인). deslop 클린(데드코드 1건 이미 제거, 디버그/TODO/console.log 0). post-deslop 회귀 build GREEN.
- ✅ PRD 11/11 passes. 미커밋(사용자 커밋/푸시 지시 대기). 마이그레이션 V116~V123 운영DB 적용됨.

[학습/패턴]
- 9종 지급성 수수료는 *Mapper.xml aggregateByAgent에서 net을 SQL로 계산(award/life/settling=net_amount, branch=allowance-clawback, reinstatement=net_commission). VO에 net 컬럼 없어도 정상.
- 1200% 한도: BatchRegulatoryLimitChecker.checkContractTotal(TOTAL_RATIO)/checkFirstYear(FIRST_YEAR_RATIO) 둘 다 존재. resolveLimitKrw가 PERCENT를 연환산보험료×율/100 KRW로 환산.
- 분급: fullSchedule(비율합100%)이면 마지막 회차가 잔차 흡수.
- 풀스택 패턴: dba(V+메뉴+공통코드+권한) → core(VO/Mapper/Enum/MapStruct) → api(Service/Controller @RequirePermission/@DataChangeLog/ApiResponse/PageResponse/PageHelper) → batch(필요시 Step) → frontend(AG Grid/DataTable+api+App.tsx 라우트).
