forked from woowacourse/java-attendance
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAttendanceHistories.java
83 lines (73 loc) · 3.64 KB
/
AttendanceHistories.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package domain;
import constant.Holiday;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class AttendanceHistories {
private final List<AttendanceHistory> attendanceHistories;
public AttendanceHistories(final List<LocalDateTime> histories, LocalDate standardDate) {
List<AttendanceHistory> allHistories = new ArrayList<>();
for (int i = 1; i < standardDate.getDayOfMonth(); i++) {
LocalDate localDate = LocalDate.of(standardDate.getYear(), standardDate.getMonth(), i);
createAttendance(histories, localDate, allHistories);
}
this.attendanceHistories = allHistories;
}
public AttendanceResult addAttendanceHistory(LocalDateTime attendanceTime) {
Validator.validateAddAttendanceHistory(attendanceHistories, attendanceTime);
AttendanceHistory newAttendanceHistory = new AttendanceHistory(attendanceTime);
attendanceHistories.add(newAttendanceHistory);
return newAttendanceHistory.getAttendanceResult();
}
public AttendanceHistory findAttendanceHistoryByDate(LocalDate standardDate) {
return attendanceHistories.stream().filter(history -> history.isSameDate(standardDate))
.findAny()
.orElseThrow(() -> new IllegalArgumentException("[ERROR] 기록이 존재하지 않습니다."));
}
public AttendanceResult editAttendanceHistory(LocalDateTime editTime) {
AttendanceHistory findBeforeHistory = findAttendanceHistoryByDate(editTime.toLocalDate());
attendanceHistories.remove(findBeforeHistory);
return addAttendanceHistory(editTime);
}
public List<AttendanceHistory> getBeforeAttendanceHistories(LocalDate localDate) {
return attendanceHistories.stream()
.filter(attendanceHistory -> attendanceHistory.isBeforeAttendanceHistory(localDate))
.sorted(new Comparator<AttendanceHistory>() {
@Override
public int compare(AttendanceHistory o1, AttendanceHistory o2) {
return o1.getAttendanceDate().compareTo(o2.getAttendanceDate());
}
})
.toList();
}
public AttendanceAnalyze getAttendanceAnalyze(LocalDate standard) {
return new AttendanceAnalyze(getBeforeAttendanceHistories(standard));
}
private void createAttendance(List<LocalDateTime> histories, LocalDate localDate,
List<AttendanceHistory> allHistories) {
if (Holiday.isHoliday(localDate)) {
return;
}
AttendanceHistory attendanceHistory = histories.stream()
.filter(history -> {
LocalDate historyDate = history.toLocalDate();
return historyDate.isEqual(localDate);
})
.findAny()
.map(AttendanceHistory::new)
.orElseGet(() -> new AttendanceHistory(localDate, null));
allHistories.add(attendanceHistory);
}
public static class Validator {
public static void validateAddAttendanceHistory(List<AttendanceHistory> attendanceHistories,
LocalDateTime localDateTime) {
boolean check = attendanceHistories.stream()
.anyMatch(attendanceHistory -> attendanceHistory.isSameDate(localDateTime.toLocalDate()));
if (check) {
throw new IllegalArgumentException("[ERROR] 오늘 이미 출석을 하셨습니다. 수정 메뉴로 이동해주세요!");
}
}
}
}