From f6142a171f0eb62a1a83fa1b8e1590252e4970f5 Mon Sep 17 00:00:00 2001 From: GA Pro Date: Wed, 13 May 2026 00:53:01 +0900 Subject: [PATCH] =?UTF-8?q?fix(api):=20RegulatoryLimitChecker=20TODO=20?= =?UTF-8?q?=ED=95=B4=EC=86=8C=20=E2=80=94=20=EC=8B=A4=EC=A0=9C=20=EB=88=84?= =?UTF-8?q?=EC=A0=81=20=ED=95=A9=EC=82=B0=20=EC=A0=81=EC=9A=A9=20(P1=20?= =?UTF-8?q?=EB=B3=B4=EA=B0=95=20=ED=9B=84=EC=86=8D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P1-1-c에서 TODO로 두었던 누적 수수료 합산을 ga-core의 신규 메서드로 교체. 기존 (BigDecimal.ZERO 반환 — 모든 결과 한도 미만): - sumPaidByContract() - sumFirstYearPaidByContract() 교체: - sumPaidByContract = recruit.sumByContract + maintain.sumByContract - sumFirstYearPaidByContract = recruit.sumFirstYearByContract (maintain은 1차년 개념 없음) - null-safe 헬퍼 추가 checkContractTotal / checkFirstYear가 이제 실제 누적값 기반 검증 동작. --- .../regulatory/RegulatoryLimitChecker.java | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/ga-api/src/main/java/com/ga/api/service/regulatory/RegulatoryLimitChecker.java b/ga-api/src/main/java/com/ga/api/service/regulatory/RegulatoryLimitChecker.java index 130f090..ff185aa 100644 --- a/ga-api/src/main/java/com/ga/api/service/regulatory/RegulatoryLimitChecker.java +++ b/ga-api/src/main/java/com/ga/api/service/regulatory/RegulatoryLimitChecker.java @@ -1,5 +1,7 @@ package com.ga.api.service.regulatory; +import com.ga.core.mapper.ledger.MaintainLedgerMapper; +import com.ga.core.mapper.ledger.RecruitLedgerMapper; import com.ga.core.mapper.regulatory.RegulatoryLimitMapper; import com.ga.core.vo.regulatory.RegulatoryLimitVO; import lombok.RequiredArgsConstructor; @@ -18,13 +20,10 @@ public class RegulatoryLimitChecker { private static final DateTimeFormatter DATE_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); private final RegulatoryLimitMapper limitMapper; + private final RecruitLedgerMapper recruitLedgerMapper; + private final MaintainLedgerMapper maintainLedgerMapper; - /** - * 누적 수수료율 한도 체크 (1200%). - * NOTE [gap]: RecruitLedgerMapper에 sumByContract(contractId) 미존재. - * core-architect가 추가하면 sumPaidByContract 메서드 구현 완료 예정. - * 현재는 additionalAmount만으로 단순 비교 (currentTotal = 0 임시 처리). - */ + /** 누적 수수료율 한도 체크 (1200%). 신계약 + 유지 원장 합산. */ public ViolationResult checkContractTotal(Long contractId, BigDecimal additionalAmount, LocalDate baseDate) { String baseDateStr = baseDate.format(DATE_FMT); RegulatoryLimitVO limit = limitMapper.selectActiveByType(TOTAL_RATIO, null, baseDateStr); @@ -47,10 +46,7 @@ public class RegulatoryLimitChecker { return ViolationResult.ok(currentTotal, limit.getLimitValue(), TOTAL_RATIO); } - /** - * 1차년 수수료율 한도 체크. - * NOTE [gap]: 동일하게 sumByContract 부재로 currentTotal = 0 임시 처리. - */ + /** 1차년 수수료율 한도 체크. 신계약 원장 1차년도만 (유지는 1차년 개념 없음). */ public ViolationResult checkFirstYear(Long contractId, BigDecimal additionalAmount, LocalDate baseDate) { String baseDateStr = baseDate.format(DATE_FMT); RegulatoryLimitVO limit = limitMapper.selectActiveByType(FIRST_YEAR_RATIO, null, baseDateStr); @@ -73,21 +69,17 @@ public class RegulatoryLimitChecker { return ViolationResult.ok(currentTotal, limit.getLimitValue(), FIRST_YEAR_RATIO); } - /** - * [gap] core-architect에게 RecruitLedgerMapper.sumByContract(Long contractId) 추가 요청 필요. - * 추가되면 아래 0 대신 실제 합산값으로 교체. - */ private BigDecimal sumPaidByContract(Long contractId) { - // TODO: limitMapper 대신 recruitLedgerMapper.sumByContract(contractId) 사용 예정 - return BigDecimal.ZERO; + BigDecimal recruit = recruitLedgerMapper.sumByContract(contractId); + BigDecimal maintain = maintainLedgerMapper.sumByContract(contractId); + return nullSafe(recruit).add(nullSafe(maintain)); } - /** - * [gap] core-architect에게 RecruitLedgerMapper.sumFirstYearByContract(Long contractId) 추가 요청 필요. - * commissionYear = 1 조건 포함. - */ private BigDecimal sumFirstYearPaidByContract(Long contractId) { - // TODO: recruitLedgerMapper.sumFirstYearByContract(contractId) 사용 예정 - return BigDecimal.ZERO; + return nullSafe(recruitLedgerMapper.sumFirstYearByContract(contractId)); + } + + private BigDecimal nullSafe(BigDecimal value) { + return value != null ? value : BigDecimal.ZERO; } }