From d0843d6f82cbada03f257cde48cc28ae027c6759 Mon Sep 17 00:00:00 2001 From: Desktop Date: Mon, 4 May 2026 00:35:33 +0900 Subject: [PATCH 1/2] fix(workrecord): calculate expected salary for SCHEDULED records MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SCHEDULED 상태의 근무 기록도 예상 급여를 계산하여 저장하도록 수정. 이전에는 COMPLETED 상태만 급여를 계산하여 주간 캘린더의 '이번 주 예상 근무비'가 완료된 근무만 반영되는 버그가 있었음. - createWorkRecordByEmployer: SCHEDULED 생성 시에도 예상 급여 계산 - createWorkRecordsBatch: 전체 레코드 예상 급여 일괄 계산 후 저장 - updateWorkRecord: SCHEDULED 수정 시에도 예상 급여 재계산 - WorkRecordGenerationService: 자동 생성 레코드에도 예상 급여 계산 적용 --- .../service/WorkRecordCommandService.java | 26 ++++++++----------- .../service/WorkRecordGenerationService.java | 2 ++ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandService.java b/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandService.java index bd105030..f1f0385f 100644 --- a/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandService.java +++ b/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandService.java @@ -95,12 +95,12 @@ public WorkRecordDto.Response createWorkRecordByEmployer(WorkRecordDto.CreateReq WorkRecord savedRecord = workRecordRepository.save(workRecord); - // COMPLETED 상태면 정확한 휴일 정보와 사업장 규모를 반영하여 재계산 + // 예상 급여 계산 (SCHEDULED, COMPLETED 모두 적용) + calculationService.calculateWorkRecordDetails(savedRecord); if (status == WorkRecordStatus.COMPLETED) { - calculationService.calculateWorkRecordDetails(savedRecord); calculationService.validateWorkRecordConsistency(savedRecord); - workRecordRepository.save(savedRecord); } + workRecordRepository.save(savedRecord); // 도메인 간 협력 처리 if (status == WorkRecordStatus.COMPLETED) { @@ -174,12 +174,12 @@ public WorkRecordDto.Response updateWorkRecord(Long workRecordId, WorkRecordDto. workRecordRepository.save(workRecord); - // COMPLETED 상태면 정확한 휴일 정보와 사업장 규모를 반영하여 재계산 + // 예상 급여 계산 (SCHEDULED, COMPLETED 모두 적용) + calculationService.calculateWorkRecordDetails(workRecord); if (workRecord.getStatus() == WorkRecordStatus.COMPLETED) { - calculationService.calculateWorkRecordDetails(workRecord); calculationService.validateWorkRecordConsistency(workRecord); - workRecordRepository.save(workRecord); } + workRecordRepository.save(workRecord); // 도메인 간 협력 처리 coordinatorService.handleWorkRecordUpdate(workRecord, oldWeeklyAllowance, newWeeklyAllowance); @@ -349,20 +349,16 @@ public WorkRecordDto.BatchCreateResponse createWorkRecordsBatch(WorkRecordDto.Ba // 5. WorkRecord 일괄 저장 (saveAll 사용) List savedRecords = workRecordRepository.saveAll(workRecordsToSave); - // 6. COMPLETED 상태 WorkRecord 상세 일괄 계산 + // 6. 전체 WorkRecord 예상 급여 일괄 계산 (SCHEDULED, COMPLETED 모두) + calculationService.calculateWorkRecordDetailsBatch(savedRecords); + List completedRecords = savedRecords.stream() .filter(wr -> wr.getStatus() == WorkRecordStatus.COMPLETED) .collect(Collectors.toList()); - - calculationService.calculateWorkRecordDetailsBatch(completedRecords); - for (WorkRecord completedRecord : completedRecords) { - calculationService.validateWorkRecordConsistency(completedRecord); - } + completedRecords.forEach(calculationService::validateWorkRecordConsistency); // 7. 계산된 WorkRecord 일괄 업데이트 - if (!completedRecords.isEmpty()) { - workRecordRepository.saveAll(completedRecords); - } + workRecordRepository.saveAll(savedRecords); // 8. 도메인 협력 처리 일괄 수행 (기존 handleBatchWorkRecordCreation 활용) coordinatorService.handleBatchWorkRecordCreation(savedRecords); diff --git a/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationService.java b/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationService.java index 8f90b243..3bebe0c9 100644 --- a/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationService.java +++ b/src/main/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationService.java @@ -25,6 +25,7 @@ public class WorkRecordGenerationService { private final WorkRecordRepository workRecordRepository; private final ObjectMapper objectMapper; + private final WorkRecordCalculationService calculationService; /** * 계약 생성 시 2개월치 WorkRecord 생성 @@ -93,6 +94,7 @@ public void generateWorkRecordsForPeriod(WorkerContract contract, LocalDate star } if (!workRecords.isEmpty()) { + calculationService.calculateWorkRecordDetailsBatch(workRecords); workRecordRepository.saveAll(workRecords); log.info("WorkRecord 생성 완료: {} 개 생성됨 (Contract ID={})", workRecords.size(), contract.getId()); } From c364516e29933d5e2c950f661e17d025b83e84e4 Mon Sep 17 00:00:00 2001 From: geunyong16 Date: Mon, 4 May 2026 15:10:07 +0900 Subject: [PATCH 2/2] test(workrecord): fix missing mock and verify count for SCHEDULED calculation --- .../workrecord/service/WorkRecordCommandServiceTest.java | 2 +- .../workrecord/service/WorkRecordGenerationServiceTest.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandServiceTest.java b/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandServiceTest.java index a7c0d95f..e6c425b2 100644 --- a/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandServiceTest.java +++ b/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordCommandServiceTest.java @@ -116,7 +116,7 @@ void createWorkRecordByEmployer_Success_Future() { // then assertThat(result).isNotNull(); - verify(workRecordRepository).save(any(WorkRecord.class)); + verify(workRecordRepository, times(2)).save(any(WorkRecord.class)); } @Test diff --git a/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationServiceTest.java b/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationServiceTest.java index 9bdc8d46..a23dd513 100644 --- a/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationServiceTest.java +++ b/src/test/java/com/example/paycheck/domain/workrecord/service/WorkRecordGenerationServiceTest.java @@ -32,6 +32,9 @@ class WorkRecordGenerationServiceTest { @Mock private WorkRecordRepository workRecordRepository; + @Mock + private WorkRecordCalculationService calculationService; + @Spy private ObjectMapper objectMapper = new ObjectMapper();