Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/main/kotlin/com/moa/entity/SalaryType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,17 @@ object SalaryCalculator {
/**
* 출근 시간과 퇴근 시간 사이의 총 근무 시간을 분(minute) 단위로 계산합니다.
*
* 퇴근 시간이 출근 시간보다 빠르거나 같은 경우, 익일 퇴근(야간 교대근무 등)으로 간주하여
* 퇴근 시간이 출근 시간보다 빠른 경우에만, 익일 퇴근(야간 교대근무 등)으로 간주하여
* 자동으로 24시간(1440분)을 더하여 계산합니다.
* 출근 시간과 퇴근 시간이 같으면 0분으로 계산합니다.
*
* @param clockIn 출근 시간
* @param clockOut 퇴근 시간
* @return 총 근무 시간 (분 단위)
*/
fun calculateWorkMinutes(clockIn: LocalTime, clockOut: LocalTime): Long {
val minutes = Duration.between(clockIn, clockOut).toMinutes()
return if (minutes <= 0) minutes + 24 * 60 else minutes
return if (minutes < 0) minutes + 24 * 60 else minutes
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/main/kotlin/com/moa/service/WorkdayService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ class WorkdayService(
val clockIn = schedule.clockIn ?: return DailyWorkStatusType.NONE
val clockOut = schedule.clockOut ?: return DailyWorkStatusType.NONE
val now = LocalDateTime.now()
val endAt = if (clockOut.isAfter(clockIn)) {
val endAt = if (!clockOut.isBefore(clockIn)) {
date.atTime(clockOut)
} else {
date.plusDays(1).atTime(clockOut)
Expand Down Expand Up @@ -401,7 +401,7 @@ class WorkdayService(
}

return when {
clockOut.isAfter(clockIn) -> minOf(now, clockOut)
!clockOut.isBefore(clockIn) -> minOf(now, clockOut)
else -> now
}
}
Expand Down
9 changes: 9 additions & 0 deletions src/test/kotlin/com/moa/entity/SalaryCalculatorTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,15 @@ class SalaryCalculatorTest {
assertThat(result).isEqualTo(240L)
}

@Test
fun `calculateWorkMinutes - 시작시간과 종료시간이 같으면 0분을 반환한다`() {
val result = SalaryCalculator.calculateWorkMinutes(
LocalTime.of(9, 0),
LocalTime.of(9, 0),
)
assertThat(result).isEqualTo(0L)
}

// --- 실제 수입 계산 ---

@Test
Expand Down
17 changes: 17 additions & 0 deletions src/test/kotlin/com/moa/service/EarningsCalculatorTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,23 @@ class EarningsCalculatorTest {
assertThat(result!!.toLong()).isLessThan(dailyRate)
}

@Test
fun `출퇴근 시간이 같으면 0원을 반환한다`() {
stubPayroll()
val policy = createPolicy()

val result = sut.calculateDailyEarnings(
memberId = MEMBER_ID,
date = DATE,
policy = policy,
type = DailyWorkScheduleType.WORK,
clockInTime = LocalTime.of(9, 0),
clockOutTime = LocalTime.of(9, 0),
)

assertThat(result).isEqualByComparingTo(BigDecimal.ZERO)
}

// --- getDefaultMonthlySalary ---

@Test
Expand Down
Loading