Skip to content

Commit 05b73f7

Browse files
authored
Merge pull request #641 from DSM-PICK/640-시간에서-교시-변환-시-동작하는-알고리즘-버그-수정
640 시간에서 교시 변환 시 동작하는 알고리즘 버그 수정
2 parents 1aee9c2 + c01f7bc commit 05b73f7

File tree

4 files changed

+82
-27
lines changed

4 files changed

+82
-27
lines changed

src/main/kotlin/dsm/pick2024/domain/application/service/ApplicationService.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import dsm.pick2024.domain.application.port.`in`.ApplicationUseCase
99
import dsm.pick2024.domain.application.port.out.ExistsApplicationPort
1010
import dsm.pick2024.domain.application.port.out.SaveApplicationPort
1111
import dsm.pick2024.domain.application.presentation.dto.request.ApplicationRequest
12+
import dsm.pick2024.domain.attendance.domain.service.AttendanceService
1213
import dsm.pick2024.domain.fcm.dto.request.FcmRequest
1314
import dsm.pick2024.domain.main.port.`in`.MainUseCase
1415
import dsm.pick2024.domain.outbox.domain.Outbox
@@ -27,7 +28,8 @@ class ApplicationService(
2728
private val userFacadeUseCase: UserFacadeUseCase,
2829
private val adminFinderUseCase: AdminFinderUseCase,
2930
private val saveOutboxPort: SaveOutboxPort,
30-
private val mainUseCase: MainUseCase
31+
private val mainUseCase: MainUseCase,
32+
private val attendanceService: AttendanceService
3133
) : ApplicationUseCase {
3234

3335
@Transactional
@@ -37,6 +39,12 @@ class ApplicationService(
3739
throw AlreadyApplyingForPicnicException
3840
}
3941

42+
attendanceService.checkApplicationTime(
43+
applicationType = request.applicationType,
44+
start = request.start,
45+
end = request.end
46+
)
47+
4048
saveApplicationPort.save(
4149
Application(
4250
userName = user.name,

src/main/kotlin/dsm/pick2024/domain/attendance/domain/service/AttendanceService.kt

Lines changed: 67 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package dsm.pick2024.domain.attendance.domain.service
33
import dsm.pick2024.domain.application.enums.ApplicationType
44
import dsm.pick2024.domain.attendance.domain.Attendance
55
import dsm.pick2024.domain.attendance.enums.AttendanceStatus
6+
import dsm.pick2024.domain.attendance.exception.InvalidPeriodException
67
import org.springframework.stereotype.Component
78
import java.time.LocalTime
89

@@ -14,7 +15,7 @@ class AttendanceService {
1415
LocalTime.of(8, 40) to LocalTime.of(9, 40), // 1교시
1516
LocalTime.of(9, 40) to LocalTime.of(10, 40), // 2교시
1617
LocalTime.of(10, 40) to LocalTime.of(11, 40), // 3교시
17-
LocalTime.of(12, 40) to LocalTime.of(13, 30), // 4교시
18+
LocalTime.of(11, 40) to LocalTime.of(13, 30), // 4교시
1819
LocalTime.of(13, 30) to LocalTime.of(14, 40), // 5교시
1920
LocalTime.of(14, 30) to LocalTime.of(15, 30), // 6교시
2021
LocalTime.of(15, 30) to LocalTime.of(16, 30), // 7교시
@@ -29,17 +30,70 @@ class AttendanceService {
2930
}
3031

3132
// 교시 혹은 시간을 기반으로 교시 목록을 반환하는 함수
32-
fun translateApplication(start: String, end: String?, applicationType: ApplicationType): List<String> {
33+
fun translateApplication(start: String, end: String, applicationType: ApplicationType): Pair<String, String> {
3334
return when (applicationType) {
34-
ApplicationType.PERIOD -> listOf(start, end!!)
35+
ApplicationType.PERIOD -> Pair(start, end)
3536
ApplicationType.TIME -> {
3637
val startTime = LocalTime.parse(start)
37-
val endTime = end?.let { LocalTime.parse(it) }
38+
val endTime = LocalTime.parse(end)
3839
getMatchPeriods(startTime, endTime)
3940
}
4041
}
4142
}
4243

44+
fun checkApplicationTime(applicationType: ApplicationType, start: String, end: String) {
45+
when (applicationType) {
46+
ApplicationType.TIME -> {
47+
val startTime = LocalTime.parse(start)
48+
val endTime = LocalTime.parse(end)
49+
if (startTime > endTime ||
50+
endTime > LocalTime.of(20, 30) ||
51+
startTime < LocalTime.of(8, 30)
52+
) {
53+
throw InvalidPeriodException
54+
}
55+
}
56+
ApplicationType.PERIOD -> {
57+
val startPeriod = start.replace("교시", "").toIntOrNull() ?: throw InvalidPeriodException
58+
val endPeriod = end.replace("교시", "").toIntOrNull() ?: throw InvalidPeriodException
59+
if (startPeriod > endPeriod || startPeriod < 1 || endPeriod > 10) {
60+
throw InvalidPeriodException
61+
}
62+
}
63+
}
64+
}
65+
66+
fun checkEarlyReturnTime(applicationType: ApplicationType, start: String) {
67+
when (applicationType) {
68+
ApplicationType.TIME -> {
69+
val startTime = LocalTime.parse(start)
70+
if (startTime < LocalTime.of(8, 30)) {
71+
throw InvalidPeriodException
72+
}
73+
}
74+
ApplicationType.PERIOD -> {
75+
val startPeriod = start.replace("교시", "").toInt()
76+
if (startPeriod < 1 || startPeriod > 10) {
77+
throw InvalidPeriodException
78+
}
79+
}
80+
}
81+
}
82+
83+
fun translateEarlyReturn(start: String, applicationType: ApplicationType): String {
84+
return when (applicationType) {
85+
ApplicationType.PERIOD -> start
86+
ApplicationType.TIME -> {
87+
val startTime = LocalTime.parse(start)
88+
val startIndex = periods.indexOfFirst { (start, endAt) ->
89+
startTime >= start && startTime < endAt
90+
}
91+
if (startIndex == -1) throw InvalidPeriodException
92+
periodNames[startIndex]
93+
}
94+
}
95+
}
96+
4397
// 주어진 교시 혹은 시간에 해당하는 출석 상태를 업데이트하는 함수
4498
fun updateAttendanceToApplication(
4599
start: String,
@@ -113,27 +167,16 @@ class AttendanceService {
113167
return updateAttendance
114168
}
115169

116-
fun translateEarlyReturn(start: String, applicationType: ApplicationType): List<String> {
117-
return when (applicationType) {
118-
ApplicationType.PERIOD -> {
119-
val startIndex = periodNames.indexOf(start).coerceAtLeast(0)
120-
periodNames.subList(startIndex, periodNames.size)
121-
}
122-
ApplicationType.TIME -> {
123-
val startTime = LocalTime.parse(start)
124-
getMatchPeriods(startTime, null)
125-
}
170+
private fun getMatchPeriods(startTime: LocalTime, endTime: LocalTime): Pair<String, String> {
171+
val startIndex = periods.indexOfFirst { (start, endAt) ->
172+
startTime in start..endAt
173+
}
174+
val endIndex = periods.indexOfFirst { (start, endAt) ->
175+
endTime in start..endAt
126176
}
127-
}
128177

129-
private fun getMatchPeriods(startTime: LocalTime, endTime: LocalTime?): List<String> {
130-
return periods
131-
.mapIndexed { index, period ->
132-
if ((startTime < period.second) && (endTime == null || endTime > period.first)) {
133-
periodNames[index]
134-
} else {
135-
null
136-
}
137-
}.filterNotNull()
178+
if (startIndex == -1 || endIndex == -1) throw InvalidPeriodException
179+
180+
return periodNames[startIndex] to periodNames[endIndex]
138181
}
139182
}

src/main/kotlin/dsm/pick2024/domain/earlyreturn/service/CreateEarlyReturnService.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import dsm.pick2024.domain.application.enums.ApplicationKind
66
import dsm.pick2024.domain.application.enums.Status
77
import dsm.pick2024.domain.application.port.out.ExistsApplicationPort
88
import dsm.pick2024.domain.application.port.out.SaveApplicationPort
9+
import dsm.pick2024.domain.attendance.domain.service.AttendanceService
910
import dsm.pick2024.domain.earlyreturn.exception.AlreadyApplyingForEarlyReturnException
1011
import dsm.pick2024.domain.earlyreturn.port.`in`.CreateEarlyReturnUseCase
1112
import dsm.pick2024.domain.earlyreturn.presentation.dto.request.CreateEarlyReturnRequest
@@ -24,7 +25,8 @@ class CreateEarlyReturnService(
2425
private val userFacadeUseCase: UserFacadeUseCase,
2526
private val adminFinderUseCase: AdminFinderUseCase,
2627
private val outboxFacadeUseCase: OutboxFacadeUseCase,
27-
private val mainUseCase: MainUseCase
28+
private val mainUseCase: MainUseCase,
29+
private val attendanceService: AttendanceService
2830
) : CreateEarlyReturnUseCase {
2931
@Transactional
3032
override fun createEarlyReturn(request: CreateEarlyReturnRequest) {
@@ -34,6 +36,8 @@ class CreateEarlyReturnService(
3436
throw AlreadyApplyingForEarlyReturnException
3537
}
3638

39+
attendanceService.checkEarlyReturnTime(request.applicationType, request.start)
40+
3741
saveApplicationPort.save(
3842
Application(
3943
userName = user.name,

src/main/kotlin/dsm/pick2024/domain/earlyreturn/service/processor/EarlyReturnApprovalProcessor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class EarlyReturnApprovalProcessor(
5353
return ApplicationStory(
5454
reason = application.reason,
5555
userName = application.userName,
56-
start = start.first(),
56+
start = start,
5757
date = application.date,
5858
type = Type.EARLY_RETURN,
5959
userId = application.userId

0 commit comments

Comments
 (0)