feat: 1200%룰 이연 분급 도래월 지급(PayInstallmentStep) + 코드베이스 신입교육 주석
PayInstallmentStep(Step 4.5): 1200%룰로 이연된 분급(installment_plan SCHEDULED)을 도래월(settle_month=정산월)에 recruit_ledger로 편입해 실제 지급. 이전엔 이연만 되고 도래월 지급 절차가 없어 차액이 영구 미지급되던 갭을 메움. - BatchConfig job flow에 step4b(calcRecruit→payInstallment→calcMaintain) 등록 - InstallmentPlanMapper.resetPaidToScheduledByMonth(+XML)로 재실행 멱등 (진입 시 PAID→SCHEDULED 역산, Step4 deleteBySettleMonth가 원장 정리) - RecruitLedgerMapper insert에 reconcile_status 컬럼, SettlementContext.installmentPaidCount - 단위테스트 3건(정상지급/멱등/계약미존재) GREEN 신입교육 주석: 컨트롤러/서비스/공통/프론트 전반에 도메인·코드 설명 주석 추가 (동작 변경 없음 — 빌드/테스트/타입체크 전부 GREEN으로 무회귀 확인). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -14,42 +14,59 @@ import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* 시스템 설정값 조회/수정 서비스.
|
||||
* <p>
|
||||
* 신입 메모: 코드 배포 없이 운영 중 바꿀 수 있는 설정값(키-값)을 DB에서 읽어 온다.
|
||||
* 값은 DB에 전부 문자열로 저장되므로, 쓰는 쪽 편의를 위해 getInt/getDecimal/getBoolean 등으로
|
||||
* 타입 변환해 꺼내며, 값이 없으면 호출자가 준 기본값을 돌려준다.
|
||||
* 자주 조회되는 값은 {@code @Cacheable}로 캐싱하고 수정 시 해당 키 캐시를 비운다.
|
||||
* isEditable='N'인 설정은 보호 항목이라 수정이 막혀 있다.
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class SystemConfigService {
|
||||
|
||||
private final SystemConfigMapper mapper;
|
||||
|
||||
/** 전체 설정 목록 (관리 화면용). */
|
||||
public List<SystemConfigVO> listAll() {
|
||||
return mapper.selectAll();
|
||||
}
|
||||
|
||||
/** 특정 그룹의 설정 목록. */
|
||||
public List<SystemConfigVO> listByGroup(String group) {
|
||||
return mapper.selectByGroup(group);
|
||||
}
|
||||
|
||||
/** 키로 설정값(문자열)을 조회. 없으면 빈 Optional. 결과는 캐시된다. */
|
||||
@Cacheable(value = "systemConfig", key = "#key")
|
||||
public Optional<String> getValue(String key) {
|
||||
SystemConfigVO vo = mapper.selectByKey(key);
|
||||
return Optional.ofNullable(vo).map(SystemConfigVO::getConfigValue);
|
||||
}
|
||||
|
||||
/** 문자열 설정값 (없으면 기본값). */
|
||||
public String getString(String key, String defaultValue) {
|
||||
return getValue(key).orElse(defaultValue);
|
||||
}
|
||||
|
||||
/** 정수 설정값 (없으면 기본값). */
|
||||
public int getInt(String key, int defaultValue) {
|
||||
return getValue(key).map(Integer::parseInt).orElse(defaultValue);
|
||||
}
|
||||
|
||||
/** 금액/비율용 BigDecimal 설정값 (없으면 기본값). */
|
||||
public BigDecimal getDecimal(String key, BigDecimal defaultValue) {
|
||||
return getValue(key).map(BigDecimal::new).orElse(defaultValue);
|
||||
}
|
||||
|
||||
/** 불리언 설정값 ("true"/"Y"를 참으로 인정, 없으면 기본값). */
|
||||
public boolean getBoolean(String key, boolean defaultValue) {
|
||||
return getValue(key).map(s -> "true".equalsIgnoreCase(s) || "Y".equalsIgnoreCase(s)).orElse(defaultValue);
|
||||
}
|
||||
|
||||
/** 설정값 수정. 미존재 시 NOT_FOUND, isEditable='N'이면 수정 거부. 후 해당 키 캐시 무효화. */
|
||||
@Transactional
|
||||
@CacheEvict(value = "systemConfig", key = "#vo.configKey")
|
||||
public void update(SystemConfigVO vo) {
|
||||
|
||||
Reference in New Issue
Block a user