fix: 수수료 계산 전수감사 — 1200%룰 단위버그 외 5건 수정

적대적 코드감사(4영역)에서 검증된 정확성 결함 수정:
- fix(HIGH): 1200%룰 단위 불일치. regulatory_limit.limit_value(PERCENT:1200,35)를
  KRW 금액과 직접 비교 → 사실상 "1200원/35원 룰"로 망가져 거의 모든 계약이 위반
  처리. 연환산보험료×비율/100로 KRW 환산 후 비교. RegulatoryLimitChecker(api/batch)
  양쪽, ContractMapper 주입(시그니처 무변경).
- fix(HIGH): 음수 gross(환수>지급) 세금 계산이 음수 원천세 생성 → net 왜곡 +
  분기 원천세신고 SUM 잠식. gross<=0 시 세금0·net=원금 가드. Tax/BatchTaxCalculator.
- fix(HIGH): AwardService 시상 threshold_amount 미적용 → 기준 미달자에게 시상
  전액 지급. threshold 미만 차단 + FIXED award_fixed null 가드.
- fix(MED): 차등환수 최저구간 months_from 1→0(V109). 체결 1개월내 즉시해지가
  grade=null로 환수 0원 처리되던 누락 보정.
- fix(MED): company_rate/payout_rate NULL→0 폴백 무경보. log.warn 추가로
  데이터 공백에 의한 과소지급 추적 가능.

테스트 4건 추가(단위변환/음수세금/시상threshold 경계). 전체 build+test GREEN: 152건 0실패.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
GA Pro
2026-06-03 10:19:53 +09:00
parent 3d50286f4a
commit eac0b813d6
9 changed files with 200 additions and 23 deletions
@@ -0,0 +1,12 @@
-- V109: 차등환수 최저구간 months_from 1 → 0 보정
--
-- 문제: 기존 시드(V28)의 최저 환수구간이 months_from=1 이라,
-- 체결 후 1개월 미만 즉시 해지/실효(ChronoUnit.MONTHS.between=0)는
-- selectByMonths(0) 매칭 행이 없어 grade=null → 환수 0원으로 처리됐다.
-- 가장 환수율이 높아야 할(100%) 초단기 해지가 오히려 환수 면제되는 결함.
-- 수정: 100% 전액환수 구간의 시작을 0개월로 내려 0~12개월을 모두 커버.
UPDATE chargeback_grade
SET months_from = 0
WHERE months_from = 1
AND chargeback_percent = 100;