diff --git a/src/main/kotlin/com/depromeet/makers/domain/model/Attendance.kt b/src/main/kotlin/com/depromeet/makers/domain/model/Attendance.kt index f6503c4..c0aa2e8 100644 --- a/src/main/kotlin/com/depromeet/makers/domain/model/Attendance.kt +++ b/src/main/kotlin/com/depromeet/makers/domain/model/Attendance.kt @@ -15,18 +15,34 @@ data class Attendance( val attendanceStatus: AttendanceStatus, val attendanceTime: LocalDateTime? ) { - fun checkIn(attendanceTime: LocalDateTime, sessionStartTime: LocalDateTime): Attendance { - if (!isAttendanceOnHold()) { - throw AttendanceAlreadyExistsException() - } - sessionStartTime.isAvailableCheckInTime(attendanceTime) - + fun checkIn(now: LocalDateTime, attendanceStatus: AttendanceStatus): Attendance { return this.copy( - attendanceStatus = attendanceTime.checkIn(sessionStartTime), - attendanceTime = LocalDateTime.now() + attendanceStatus = attendanceStatus, + attendanceTime = now ) } + fun expectAttendanceStatus(sessionStartTime: LocalDateTime, now: LocalDateTime): AttendanceStatus { + return when { + // [출석] 출석 대기 상태이며, 세션 시작 시간의 15분 전부터 15분 전까지 입니다. (정책에 따라 수정 필요) + isAttendanceOnHold() && now.isAfter(sessionStartTime.minusMinutes(15)) && now.isBefore(sessionStartTime.plusMinutes(15)) -> AttendanceStatus.ATTENDANCE + // [지각] 출석 대기 상태이며, 세션 시작 시간의 15분 후부터 30분 전까지 입니다. (정책에 따라 수정 필요) + isAttendanceOnHold() && now.isAfter(sessionStartTime.plusMinutes(15)) && now.isBefore(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.TARDY + // [결석] 출석 대기 상태이며, 세션 시작 시간의 30분 후 입니다. (정책에 따라 수정 필요) + isAttendanceOnHold() && now.isAfter(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.ABSENCE + else -> AttendanceStatus.ATTENDANCE_ON_HOLD + } + } + + fun isAvailableCheckInRequest(sessionStartTime: LocalDateTime, now: LocalDateTime): Boolean { + when { + attendanceStatus.isAttendanceOnHold().not() -> throw AttendanceAlreadyExistsException() + now.isBefore(sessionStartTime.minusMinutes(15)) -> throw AttendanceBeforeTimeException() + now.isAfter(sessionStartTime.plusMinutes(30)) -> throw AttendanceAfterTimeException() + else -> return true + } + } + fun isAttendanceOnHold() = attendanceStatus.isAttendanceOnHold() fun isAttendance() = attendanceStatus.isAttendance() @@ -35,30 +51,6 @@ data class Attendance( fun isTardy() = attendanceStatus.isTardy() - private fun LocalDateTime.isAvailableCheckInTime(attendanceTime: LocalDateTime): Boolean { - // 출석 요청 가능 시간은 세션 시작 시간의 30분 전부터 120분 후까지 입니다. (정책에 따라 수정 필요) - if (attendanceTime.isBefore(this.minusMinutes(15))) { - throw AttendanceBeforeTimeException() - } - if (attendanceTime.isAfter(this.plusMinutes(120))) { - throw AttendanceAfterTimeException() - } - return true - } - - private fun LocalDateTime.checkIn(sessionStartTime: LocalDateTime): AttendanceStatus { - return when { - // 출석 가능 시간은 세션 시작 시간의 15분 전부터 15분 후까지 입니다. (정책에 따라 수정 필요) - this.isAfter(sessionStartTime.minusMinutes(15)) && this.isBefore(sessionStartTime.plusMinutes(15)) -> AttendanceStatus.ATTENDANCE - // 지각은 세션 시작 시간의 15분 후부터 30분 후까지 입니다. (정책에 따라 수정 필요) - this.isAfter(sessionStartTime.plusMinutes(15)) && this.isBefore(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.TARDY - // 결석은 세션 시작 시간의 30분 후 입니다. (정책에 따라 수정 필요) - this.isAfter(sessionStartTime.plusMinutes(30)) -> AttendanceStatus.ABSENCE - else -> throw AttendanceAfterTimeException() - } - - } - fun update( attendanceId: String = this.attendanceId, generation: Int = this.generation, diff --git a/src/main/kotlin/com/depromeet/makers/domain/usecase/CheckInSession.kt b/src/main/kotlin/com/depromeet/makers/domain/usecase/CheckInSession.kt index 8e52a39..360f821 100644 --- a/src/main/kotlin/com/depromeet/makers/domain/usecase/CheckInSession.kt +++ b/src/main/kotlin/com/depromeet/makers/domain/usecase/CheckInSession.kt @@ -50,8 +50,7 @@ class CheckInSession( ) ) - logger().info(thisWeekSession.toString()) - logger().info(input.longitude.toString() + " " + input.latitude.toString()) + attendance.isAvailableCheckInRequest(thisWeekSession.startTime, input.now) // 오프라인 세션의 경우 거리 확인 로직 if (thisWeekSession.isOffline()) { @@ -68,12 +67,13 @@ class CheckInSession( logger().info(distance.toString()) - if (!inRange(distance, 500.0)) { // 100m 기준 (임시 설정) + if (inRange(distance, 1000.0).not()) { // 1000m 기준 (임시 설정) throw InvalidCheckInDistanceException() } } - return attendanceGateway.save(attendance.checkIn(input.now, thisWeekSession.startTime)) + val expectAttendanceStatus = attendance.expectAttendanceStatus(thisWeekSession.startTime, input.now) + return attendanceGateway.save(attendance.checkIn(input.now, expectAttendanceStatus)) } private fun LocalDateTime.getMonday() = this.toLocalDate().with(DayOfWeek.MONDAY).atStartOfDay() diff --git a/src/main/kotlin/com/depromeet/makers/domain/usecase/GetCheckInStatus.kt b/src/main/kotlin/com/depromeet/makers/domain/usecase/GetCheckInStatus.kt index 3c904b3..9bac089 100644 --- a/src/main/kotlin/com/depromeet/makers/domain/usecase/GetCheckInStatus.kt +++ b/src/main/kotlin/com/depromeet/makers/domain/usecase/GetCheckInStatus.kt @@ -54,25 +54,10 @@ class GetCheckInStatus( val isBeforeSession15minutes = input.now.isAfter(thisWeekSession.startTime.minusMinutes(15)) && input.now.isBefore(thisWeekSession.startTime) - // 현재 시간이 출석 요청 가능 시간 사이 && 출석 상태가 ON_HOLD인 경우 -> 플로팅 버튼 띄우기 여부 - val needFloatingButton = attendance.isAttendanceOnHold() && - input.now.isAfter(thisWeekSession.startTime.minusMinutes(15)) && input.now.isBefore(thisWeekSession.startTime.plusMinutes(120)) + // 현재 시간이 출석 요청 가능 시간 사이 && 출석 상태가 ON_HOLD(출석 대기) 인 경우 -> 플로팅 버튼 띄우기 여부 + val needFloatingButton = attendance.isAvailableCheckInRequest(thisWeekSession.startTime, input.now) - val expectAttendanceStatus = when { - // 세션 시작전 15분 ~ 15분 사이 -> 출석으로 인정될 상태 - input.now.isAfter(thisWeekSession.startTime.minusMinutes(15)) && - input.now.isBefore(thisWeekSession.startTime.plusMinutes(15)) -> AttendanceStatus.ATTENDANCE - - // 세션 시작 15분 ~ 30분 사이 -> 지각으로 인정될 상태 - input.now.isAfter(thisWeekSession.startTime.plusMinutes(15)) && - input.now.isBefore(thisWeekSession.startTime.plusMinutes(30)) -> AttendanceStatus.TARDY - - // 세션 시작 30분 이후 ~ 240분 -> 결석으로 인정될 상태 - input.now.isAfter(thisWeekSession.startTime.plusMinutes(30)) && - input.now.isBefore(thisWeekSession.startTime.plusMinutes(240)) -> AttendanceStatus.ABSENCE - - else -> AttendanceStatus.ATTENDANCE_ON_HOLD - } + val expectAttendanceStatus = attendance.expectAttendanceStatus(thisWeekSession.startTime, input.now) return GetCheckInStatusOutput( generation = attendance.generation,