From e317a61c8d829ded906ff83c005523a12511983b Mon Sep 17 00:00:00 2001
From: JaeYoon
Date: Thu, 20 Aug 2026 15:23:46 +0900
Subject: [PATCH] =?UTF-8?q?fix:=20=EC=A0=95=EC=82=B0=20=EA=B8=B0=EA=B0=84?=
=?UTF-8?q?=20=EA=B3=84=EC=82=B0=EC=9D=B4=20=EA=B3=B5=ED=9C=B4=EC=9D=BC/?=
=?UTF-8?q?=EC=A3=BC=EB=A7=90=20=EA=B7=BC=EB=AC=B4=EB=A5=BC=20=EB=86=93?=
=?UTF-8?q?=EC=B9=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95=20?=
=?UTF-8?q?(#N)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- DAILY: workDate 하루만 조회하던 걸 다음 영업일 직전까지로 확장
(공휴일/주말 연속 근무도 같은 정산일로 매칭되도록)
- WEEKLY: periodEnd 경계일이 공휴일이어도 기간 유지되게 보정
- WEEKLY: settlement_day_of_week 기준으로 예정 정산 요일 역산하도록 변경
(쿠팡이츠처럼 화~금 사이 공휴일로 정산일이 다음주로 밀려도 기간이 안 흔들림)
- 관련 테스트 추가, 전체 테스트/컴파일 통과 확인
---
.../client/SettlementBatchCommandClient.java | 15 ++++
.../internal/SettlementTestController.java | 46 +++++++++++
.../LocalSettlementBatchCommandClient.java | 22 ++++++
.../domain/SettlementPeriodCalculator.java | 76 +++++++++++++++++-
.../SettlementPeriodCalculatorTest.java | 78 +++++++++++++++++++
.../work/service/SettlementServiceTest.java | 28 ++++---
6 files changed, 251 insertions(+), 14 deletions(-)
create mode 100644 common/src/main/java/com/ntropy/common/client/SettlementBatchCommandClient.java
create mode 100644 services/bff-service/src/main/java/com/ntropy/bff/controller/internal/SettlementTestController.java
create mode 100644 services/work-service/src/main/java/com/ntropy/work/client/LocalSettlementBatchCommandClient.java
diff --git a/common/src/main/java/com/ntropy/common/client/SettlementBatchCommandClient.java b/common/src/main/java/com/ntropy/common/client/SettlementBatchCommandClient.java
new file mode 100644
index 00000000..395b2608
--- /dev/null
+++ b/common/src/main/java/com/ntropy/common/client/SettlementBatchCommandClient.java
@@ -0,0 +1,15 @@
+package com.ntropy.common.client;
+
+import java.time.LocalDate;
+
+/**
+ * 정산 배치(SettlementService)를 사용자·날짜 단위로 수동 실행하기 위한 계약.
+ * 원래는 SettlementScheduler가 매일 자동으로만 실행하는데, 테스트/디버깅 목적으로
+ * 특정 사용자·날짜 하나만 즉시 돌려보고 싶을 때 이 인터페이스를 통해 work-service의
+ * SettlementService.processSettlement()를 그대로 호출한다.
+ */
+public interface SettlementBatchCommandClient {
+
+ /** processDate 하루치 입금 거래를 매칭해 SETTLEMENT를 생성한다. 새로 생성됐으면 true. */
+ boolean runForDate(Long userId, LocalDate processDate);
+}
diff --git a/services/bff-service/src/main/java/com/ntropy/bff/controller/internal/SettlementTestController.java b/services/bff-service/src/main/java/com/ntropy/bff/controller/internal/SettlementTestController.java
new file mode 100644
index 00000000..fd0ea974
--- /dev/null
+++ b/services/bff-service/src/main/java/com/ntropy/bff/controller/internal/SettlementTestController.java
@@ -0,0 +1,46 @@
+package com.ntropy.bff.controller.internal;
+
+import java.time.LocalDate;
+
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ntropy.bff.dto.common.ApiResponse;
+import com.ntropy.common.client.SettlementBatchCommandClient;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * [테스트용] 정산 배치(SettlementService)를 특정 사용자·날짜로 즉시 실행해보는 컨트롤러.
+ * 원래 정산은 SettlementScheduler가 매일 새벽 1시 30분에만 자동 실행하는데,
+ * 그걸 기다리지 않고 로컬/개발 환경에서 바로 결과를 확인하려고 만든 것.
+ * 검증 끝나면 이 클래스와 SecurityConfig의 "/internal/test/**" permitAll 줄, common의
+ * SettlementBatchCommandClient, work-service의 LocalSettlementBatchCommandClient까지
+ * 같이 지울 것.
+ */
+@Api(tags = "[테스트용] 정산 배치 수동 실행")
+@RestController
+@RequestMapping("/internal/test/settlement")
+@RequiredArgsConstructor
+public class SettlementTestController {
+
+ private final SettlementBatchCommandClient settlementBatchCommandClient;
+
+ @ApiOperation("특정 사용자의 특정 날짜 입금 거래를 지금 바로 정산 매칭 시도한다")
+ @GetMapping("/run")
+ public ApiResponse run(
+ @RequestParam Long userId,
+ @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date
+ ) {
+ boolean created = settlementBatchCommandClient.runForDate(userId, date);
+ String message = created
+ ? "새 SETTLEMENT가 생성됐습니다."
+ : "생성된 SETTLEMENT가 없습니다 (그 날짜에 매칭할 거래가 없거나, 이미 처리된 거래뿐입니다).";
+ return ApiResponse.success(200, message, message);
+ }
+}
diff --git a/services/work-service/src/main/java/com/ntropy/work/client/LocalSettlementBatchCommandClient.java b/services/work-service/src/main/java/com/ntropy/work/client/LocalSettlementBatchCommandClient.java
new file mode 100644
index 00000000..0a826ec4
--- /dev/null
+++ b/services/work-service/src/main/java/com/ntropy/work/client/LocalSettlementBatchCommandClient.java
@@ -0,0 +1,22 @@
+package com.ntropy.work.client;
+
+import java.time.LocalDate;
+
+import org.springframework.stereotype.Component;
+
+import com.ntropy.common.client.SettlementBatchCommandClient;
+import com.ntropy.work.service.SettlementService;
+
+import lombok.RequiredArgsConstructor;
+
+@Component
+@RequiredArgsConstructor
+public class LocalSettlementBatchCommandClient implements SettlementBatchCommandClient {
+
+ private final SettlementService settlementService;
+
+ @Override
+ public boolean runForDate(Long userId, LocalDate processDate) {
+ return settlementService.processSettlement(userId, processDate);
+ }
+}
diff --git a/services/work-service/src/main/java/com/ntropy/work/domain/SettlementPeriodCalculator.java b/services/work-service/src/main/java/com/ntropy/work/domain/SettlementPeriodCalculator.java
index 6ab50079..30238c67 100644
--- a/services/work-service/src/main/java/com/ntropy/work/domain/SettlementPeriodCalculator.java
+++ b/services/work-service/src/main/java/com/ntropy/work/domain/SettlementPeriodCalculator.java
@@ -21,6 +21,18 @@
* offset일만큼 역산할 때 주말·공휴일을 건너뛴다. 주말 판정은 외부 데이터 없이 계산하고,
* 공휴일은 holidays 파라미터로 주입받는다 - 이 클래스는 순수 함수로 유지하고, 실제 공휴일
* 조회(홀리데이 API/캐시)는 호출부(SettlementService)의 책임으로 둔다.
+ *
+ * DAILY + BUSINESS_DAY 조합에서는 역산된 workDate 하루가 아니라, workDate부터 그 다음
+ * 영업일 직전까지를 기간으로 잡는다. 주말/공휴일은 오프셋 카운트에 안 들어가므로, 그 구간
+ * 안 어느 날에 일했든(예: 금·토·일 연속 근무, 또는 평일이지만 공휴일인 날) 순방향으로는
+ * 전부 같은 입금일로 수렴하기 때문이다 - workDate 하루만 조회하면 같은 날 입금될 다른 날의
+ * 근무일지를 놓친다.
+ *
+ * WEEKLY 정산은 PLATFORM.settlement_day_of_week(요일 고정, 예: 쿠팡이츠=FRI)가 있으면
+ * 실제 입금일이 아니라 그 요일 기준 "원래 예정된 정산일"로 오프셋을 계산한다. 실제로 쿠팡이츠는
+ * 정산 기간(화)과 정산일(금) 사이에 공휴일이 끼면 그 주 금요일 정산을 건너뛰고 다음 영업일(보통
+ * 다음 주 월요일)로 미룬다 - 실제 입금일 그대로 오프셋을 적용하면 밀린 만큼 정산 기간 전체가
+ * 같이 밀려버리므로, 항상 예정 요일부터 역산해야 한다.
*/
public final class SettlementPeriodCalculator {
@@ -43,18 +55,58 @@ public static SettlementPeriod calculate(Platform platform, LocalDate paymentDat
private static SettlementPeriod dailyPeriod(Platform platform, LocalDate paymentDate, Set holidays) {
int offset = platform.getSettlementOffsetDay() == null ? 0 : platform.getSettlementOffsetDay();
LocalDate workDate = subtractDays(paymentDate, offset, platform.getSettlementOffsetUnit(), holidays);
- return new SettlementPeriod(workDate, workDate);
+ LocalDate periodEnd = extendThroughTrailingNonBusinessDays(workDate, platform.getSettlementOffsetUnit(), holidays);
+ return new SettlementPeriod(workDate, periodEnd);
}
private static SettlementPeriod weeklyPeriod(Platform platform, LocalDate paymentDate, Set holidays) {
+ LocalDate scheduledPaymentDate = resolveScheduledPaymentDate(platform.getSettlementDayOfWeek(), paymentDate);
int offset = platform.getSettlementOffsetDay() == null
? DEFAULT_WEEKLY_OFFSET_DAY
: platform.getSettlementOffsetDay();
- LocalDate periodEnd = subtractDays(paymentDate, offset, platform.getSettlementOffsetUnit(), holidays);
+ LocalDate periodEndAnchor = subtractDays(scheduledPaymentDate, offset, platform.getSettlementOffsetUnit(), holidays);
+ // periodEnd 경계일 자체가 공휴일이면 subtractDays가 그 전 영업일로 밀어버려서, 정작
+ // 그 경계일(공휴일)에 일한 근무일지가 7일 범위 밖으로 빠진다 - DAILY와 같은 이유로
+ // 같은 헬퍼로 경계일을 다시 확장해준다.
+ LocalDate periodEnd = extendThroughTrailingNonBusinessDays(
+ periodEndAnchor, platform.getSettlementOffsetUnit(), holidays);
LocalDate periodStart = periodEnd.minusDays(6);
return new SettlementPeriod(periodStart, periodEnd);
}
+ /**
+ * settlement_day_of_week가 설정돼 있으면, 실제 입금일이 그 요일이 아닐 때(정산 요일과
+ * 다음 정산 요일 사이에 낀 공휴일 때문에 다음 영업일로 밀린 경우 등) 입금일 이전의
+ * 가장 최근 그 요일을 "원래 예정된 정산일"로 되돌린다. 오프셋은 항상 이 예정일 기준으로
+ * 계산해야 실제 입금이 밀려도 정산 기간(예: 쿠팡이츠의 전주 수~금주 화) 자체는 흔들리지
+ * 않는다 - 실제 입금일 그대로 오프셋을 적용하면 밀린 만큼 기간 전체가 같이 밀려버린다.
+ * 값이 없으면(플랫폼별로 아직 확인 안 된 경우) 기존처럼 실제 입금일을 그대로 쓴다.
+ */
+ private static LocalDate resolveScheduledPaymentDate(String settlementDayOfWeek, LocalDate actualPaymentDate) {
+ if (settlementDayOfWeek == null) {
+ return actualPaymentDate;
+ }
+ DayOfWeek scheduled = parseDayOfWeek(settlementDayOfWeek);
+ LocalDate date = actualPaymentDate;
+ while (date.getDayOfWeek() != scheduled) {
+ date = date.minusDays(1);
+ }
+ return date;
+ }
+
+ private static DayOfWeek parseDayOfWeek(String abbreviation) {
+ return switch (abbreviation.toUpperCase(java.util.Locale.ROOT)) {
+ case "MON" -> DayOfWeek.MONDAY;
+ case "TUE" -> DayOfWeek.TUESDAY;
+ case "WED" -> DayOfWeek.WEDNESDAY;
+ case "THU" -> DayOfWeek.THURSDAY;
+ case "FRI" -> DayOfWeek.FRIDAY;
+ case "SAT" -> DayOfWeek.SATURDAY;
+ case "SUN" -> DayOfWeek.SUNDAY;
+ default -> throw new IllegalArgumentException("알 수 없는 settlement_day_of_week 값입니다: " + abbreviation);
+ };
+ }
+
private static SettlementPeriod monthlyPeriod(LocalDate paymentDate) {
YearMonth previousMonth = YearMonth.from(paymentDate).minusMonths(1);
return new SettlementPeriod(previousMonth.atDay(1), previousMonth.atEndOfMonth());
@@ -79,6 +131,26 @@ private static LocalDate subtractDays(LocalDate date, int days, String unit, Set
return result;
}
+ /**
+ * BUSINESS_DAY 오프셋에서는 순방향으로 보면 "start부터 그 다음 영업일 직전까지"의
+ * 비영업일(주말/공휴일) 근무도 전부 같은 입금일로 수렴한다 - 영업일이 아닌 날은
+ * 오프셋 카운트에 안 들어가서, 그 구간 어느 날에 일했든 "그 다음 offset번째 영업일"은
+ * 똑같이 계산되기 때문이다(예: 금·토·일 연속 근무는 셋 다 같은 날 입금됨).
+ * start만 단일 조회 대상으로 삼으면 이 구간의 다른 날 근무일지를 놓치므로, start부터
+ * 다음 영업일 바로 전날까지로 기간을 넓힌다. CALENDAR_DAY는 애초에 하루 단위로 1:1
+ * 대응되므로 그대로 start를 반환한다.
+ */
+ private static LocalDate extendThroughTrailingNonBusinessDays(LocalDate start, String unit, Set holidays) {
+ if (!BUSINESS_DAY.equals(unit)) {
+ return start;
+ }
+ LocalDate end = start;
+ while (isWeekend(end.plusDays(1)) || holidays.contains(end.plusDays(1))) {
+ end = end.plusDays(1);
+ }
+ return end;
+ }
+
private static boolean isWeekend(LocalDate date) {
DayOfWeek dayOfWeek = date.getDayOfWeek();
return dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY;
diff --git a/services/work-service/src/test/java/com/ntropy/work/domain/SettlementPeriodCalculatorTest.java b/services/work-service/src/test/java/com/ntropy/work/domain/SettlementPeriodCalculatorTest.java
index 128ba475..b74c9ae7 100644
--- a/services/work-service/src/test/java/com/ntropy/work/domain/SettlementPeriodCalculatorTest.java
+++ b/services/work-service/src/test/java/com/ntropy/work/domain/SettlementPeriodCalculatorTest.java
@@ -115,6 +115,35 @@ void calculate_businessDayUnit_skipsInjectedHoliday() {
assertEquals(LocalDate.of(2026, 8, 13), period.start());
}
+ @Test
+ @DisplayName("DAILY+BUSINESS_DAY: 금·토·일 연속 근무는 전부 같은 입금일로 수렴하므로 기간이 셋을 다 포함해야 한다")
+ void calculate_dailyBusinessDay_periodCoversWeekendRun() {
+ // 금(08/14)에 일하고 3영업일 후 입금 = 월/화/수(08/17~19) 지나 수요일(08/19) 입금
+ Platform platform = Platform.builder()
+ .settlementCycle("DAILY").settlementOffsetDay(3).settlementOffsetUnit("BUSINESS_DAY").build();
+
+ SettlementPeriod period = SettlementPeriodCalculator.calculate(platform, LocalDate.of(2026, 8, 19), Set.of());
+
+ // workDate(금, 08/14)부터 다음 영업일(월, 08/17) 직전인 일요일(08/16)까지 - 금/토/일 전부 포함
+ assertEquals(LocalDate.of(2026, 8, 14), period.start());
+ assertEquals(LocalDate.of(2026, 8, 16), period.end());
+ }
+
+ @Test
+ @DisplayName("DAILY+BUSINESS_DAY: 공휴일이 껴도 기간이 그 공휴일까지 포함해야 한다 (8/17 대체공휴일 실사례)")
+ void calculate_dailyBusinessDay_periodCoversHolidayRun() {
+ // 목(08/20) 입금, 3영업일 전 역산: 수(08/19)-1, 화(08/18)-2, 월(08/17,공휴일)은 건너뛰고 금(08/14)-3
+ Platform platform = Platform.builder()
+ .settlementCycle("DAILY").settlementOffsetDay(3).settlementOffsetUnit("BUSINESS_DAY").build();
+ Set holidays = Set.of(LocalDate.of(2026, 8, 17));
+
+ SettlementPeriod period = SettlementPeriodCalculator.calculate(platform, LocalDate.of(2026, 8, 20), holidays);
+
+ // workDate(금, 08/14)부터 다음 영업일(화, 08/18) 직전인 08/17(월, 공휴일)까지 - 금/토/일/월(공휴일) 다 포함
+ assertEquals(LocalDate.of(2026, 8, 14), period.start());
+ assertEquals(LocalDate.of(2026, 8, 17), period.end());
+ }
+
@Test
@DisplayName("WEEKLY + BUSINESS_DAY도 offset 역산 시 주말을 건너뛴다 (쿠팡이츠 배달파트너 실제 offset=3)")
void calculate_weeklyBusinessDay_skipsWeekendForPeriodEnd() {
@@ -127,4 +156,53 @@ void calculate_weeklyBusinessDay_skipsWeekendForPeriodEnd() {
assertEquals(LocalDate.of(2026, 8, 5), period.end());
assertEquals(LocalDate.of(2026, 7, 30), period.start());
}
+
+ @Test
+ @DisplayName("WEEKLY + BUSINESS_DAY: periodEnd 경계일 자체가 공휴일이어도 그 경계일이 그대로 기간에 포함돼야 한다 (쿠팡이츠 화요일 마감일이 공휴일인 경우)")
+ void calculate_weeklyBusinessDay_periodEndBoundaryIsHoliday() {
+ // 금요일(08/14) 정산, offset=3이면 원래 화요일(08/11)이 periodEnd여야 하는데
+ // 08/11을 공휴일로 주입하면 subtractDays는 그 전 영업일(월, 08/10)로 밀어버린다.
+ // 경계일 확장 보정이 없으면 정작 화요일(08/11, 공휴일)에 일한 근무일지가 기간 밖으로 빠진다.
+ Platform platform = Platform.builder()
+ .settlementCycle("WEEKLY").settlementOffsetDay(3).settlementOffsetUnit("BUSINESS_DAY").build();
+ Set holidays = Set.of(LocalDate.of(2026, 8, 11));
+
+ SettlementPeriod period = SettlementPeriodCalculator.calculate(platform, LocalDate.of(2026, 8, 14), holidays);
+
+ // 공휴일이 없을 때와 동일하게 화(08/11)~그 7일 전 수(08/05)여야 한다
+ assertEquals(LocalDate.of(2026, 8, 5), period.start());
+ assertEquals(LocalDate.of(2026, 8, 11), period.end());
+ }
+
+ @Test
+ @DisplayName("WEEKLY: settlement_day_of_week가 있으면 정산 기간이 화~금 사이 공휴일로 실제 입금이 다음 영업일로 밀려도 흔들리지 않는다 (쿠팡이츠 실제 사례)")
+ void calculate_weekly_dayOfWeekSet_ignoresActualDelayFromHoliday() {
+ // 원래는 금요일(08/21) 정산이어야 하는데, 화~금 사이 공휴일 때문에 실제로는
+ // 다음 주 월요일(08/24)에 입금됐다고 가정. settlement_day_of_week=FRI가 있으면
+ // 실제 입금일(월)이 아니라 그 이전 가장 최근 금요일(08/21)을 기준으로 오프셋을 계산해야
+ // 정산 기간(전주 수~금주 화)이 밀리지 않는다.
+ Platform platform = Platform.builder()
+ .settlementCycle("WEEKLY").settlementOffsetDay(3).settlementOffsetUnit("BUSINESS_DAY")
+ .settlementDayOfWeek("FRI").build();
+
+ SettlementPeriod period = SettlementPeriodCalculator.calculate(platform, LocalDate.of(2026, 8, 24), Set.of());
+
+ // 원래 예정일(금, 08/21) 기준 3영업일 전 = 화(08/18), 그 7일 전 = 수(08/12)
+ assertEquals(LocalDate.of(2026, 8, 12), period.start());
+ assertEquals(LocalDate.of(2026, 8, 18), period.end());
+ }
+
+ @Test
+ @DisplayName("WEEKLY: 실제 입금일이 이미 예정 요일과 같으면(정상 케이스) settlement_day_of_week가 있어도 결과가 그대로다")
+ void calculate_weekly_dayOfWeekSet_noDelay_matchesUnsetBehavior() {
+ Platform platform = Platform.builder()
+ .settlementCycle("WEEKLY").settlementOffsetDay(3).settlementOffsetUnit("BUSINESS_DAY")
+ .settlementDayOfWeek("FRI").build();
+
+ // 08/14은 이미 금요일이라 실제 입금일 == 예정 요일
+ SettlementPeriod period = SettlementPeriodCalculator.calculate(platform, LocalDate.of(2026, 8, 14), Set.of());
+
+ assertEquals(LocalDate.of(2026, 8, 5), period.start());
+ assertEquals(LocalDate.of(2026, 8, 11), period.end());
+ }
}
diff --git a/services/work-service/src/test/java/com/ntropy/work/service/SettlementServiceTest.java b/services/work-service/src/test/java/com/ntropy/work/service/SettlementServiceTest.java
index 2714e836..daceef8d 100644
--- a/services/work-service/src/test/java/com/ntropy/work/service/SettlementServiceTest.java
+++ b/services/work-service/src/test/java/com/ntropy/work/service/SettlementServiceTest.java
@@ -251,12 +251,13 @@ void processSettlement_onDemandPlatform_settlesToJobWithoutTouchingWorkLog() {
}
@Test
- @DisplayName("BUSINESS_DAY 플랫폼은 HolidayService에서 조회한 공휴일까지 건너뛰고 기간을 계산한다")
- void processSettlement_businessDayPlatform_skipsInjectedHoliday() {
+ @DisplayName("BUSINESS_DAY 플랫폼은 공휴일까지 건너뛰어 workDate를 역산하고, 그 공휴일에 일한 근무일지도 같은 기간으로 매칭한다")
+ void processSettlement_businessDayPlatform_skipsInjectedHolidayAndCoversItInPeriod() {
Long businessDayPlatformId = 40L;
LocalDate paymentDate = LocalDate.of(2026, 8, 17); // 월요일
LocalDate holiday = LocalDate.of(2026, 8, 14); // 금요일 - 공휴일로 주입
- LocalDate expectedWorkDate = LocalDate.of(2026, 8, 13); // 목요일 - 공휴일까지 건너뛴 결과
+ LocalDate expectedWorkDate = LocalDate.of(2026, 8, 13); // 목요일 - 공휴일까지 건너뛴 역산 결과
+ LocalDate expectedPeriodEnd = LocalDate.of(2026, 8, 16); // 일요일 - 다음 영업일(월, 8/17) 직전까지 확장
platformMapper.seed(Platform.builder()
.platformId(businessDayPlatformId)
@@ -270,22 +271,25 @@ void processSettlement_businessDayPlatform_skipsInjectedHoliday() {
holidayMapperForTest.seed(Holiday.builder()
.holidayDate(holiday).name("임시공휴일").build());
- WorkLog expectedLog = workLog(expectedWorkDate, "CONFIRMED", 40_000L);
- WorkLog fridayLog = workLog(holiday, "CONFIRMED", 40_000L);
- workLogMapper.insert(expectedLog);
- workLogMapper.insert(fridayLog);
- insertIncome(expectedLog, businessDayPlatformId, 40_000L, SettlementStatus.PENDING);
+ WorkLog thursdayLog = workLog(expectedWorkDate, "CONFIRMED", 40_000L);
+ // 공휴일(8/14, 금)에 실제로 일한 근무일지 - 기간이 확장되면서 같이 매칭돼야 한다
+ WorkLog holidayWorkLog = workLog(holiday, "CONFIRMED", 25_000L);
+ workLogMapper.insert(thursdayLog);
+ workLogMapper.insert(holidayWorkLog);
+ insertIncome(thursdayLog, businessDayPlatformId, 40_000L, SettlementStatus.PENDING);
+ insertIncome(holidayWorkLog, businessDayPlatformId, 25_000L, SettlementStatus.PENDING);
incomingTransactionQueryClient.transactions = List.of(
- new NormalizedIncomingTransaction(1L, paymentDate, LocalTime.NOON, "배민커넥트테스트", BigDecimal.valueOf(40_000L))
+ new NormalizedIncomingTransaction(1L, paymentDate, LocalTime.NOON, "배민커넥트테스트", BigDecimal.valueOf(65_000L))
);
service.processSettlement(USER_ID, paymentDate);
Settlement settlement = settlementMapper.findAll().get(0);
assertEquals(expectedWorkDate, settlement.getPeriodStart());
- assertEquals(expectedWorkDate, settlement.getPeriodEnd());
- assertEquals(SettlementStatus.COMPLETED, workLogMapper.findById(expectedLog.getLogId()).getSettlementStatus());
- assertEquals(SettlementStatus.NONE, workLogMapper.findById(fridayLog.getLogId()).getSettlementStatus());
+ assertEquals(expectedPeriodEnd, settlement.getPeriodEnd());
+ assertEquals(65_000L, settlement.getExpectedAmount());
+ assertEquals(SettlementStatus.COMPLETED, workLogMapper.findById(thursdayLog.getLogId()).getSettlementStatus());
+ assertEquals(SettlementStatus.COMPLETED, workLogMapper.findById(holidayWorkLog.getLogId()).getSettlementStatus());
}
@Test