Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: 정책 변경에 따른 출석 플로팅 응답값 변경, 출석 관련 로직 리팩토링 #74

Merged
merged 1 commit into from
May 26, 2024
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
56 changes: 24 additions & 32 deletions src/main/kotlin/com/depromeet/makers/domain/model/Attendance.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down