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; } }