1 package org
.cvut
.skischool
.back
;
3 import org
.cvut
.skischool
.TimeBar
;
4 import org
.cvut
.skischool
.core
.DateTools
;
5 import java
.io
.Serializable
;
6 import java
.text
.DateFormat
;
7 import java
.text
.SimpleDateFormat
;
8 import java
.util
.ArrayList
;
10 import java
.util
.List
;
12 import javax
.faces
.application
.FacesMessage
;
13 import javax
.faces
.bean
.ManagedBean
;
14 import javax
.faces
.bean
.SessionScoped
;
15 import javax
.faces
.context
.FacesContext
;
16 import javax
.faces
.event
.ActionEvent
;
17 import javax
.faces
.model
.DataModel
;
18 import javax
.faces
.model
.ListDataModel
;
19 import org
.cvut
.skischool
.beans
.AvailabilityManagementLocal
;
20 import org
.cvut
.skischool
.beans
.LessonManagementLocal
;
21 import org
.cvut
.skischool
.beans
.UserManagementLocal
;
22 import org
.cvut
.skischool
.core
.NamingConstants
;
23 import org
.cvut
.skischool
.core
.NumberConstants
;
24 import org
.cvut
.skischool
.model
.Availability
;
25 import org
.cvut
.skischool
.model
.Instructor
;
26 import org
.cvut
.skischool
.model
.Lesson
;
27 import org
.cvut
.skischool
.model
.Student
;
33 @ManagedBean(name
= "timetableBean")
35 public class TimetableBean
implements Serializable
{
38 private AvailabilityManagementLocal availabilityManagement
;
40 private LessonManagementLocal lessonManagement
;
42 private UserManagementLocal userManagement
;
43 private DataModel
<Instructor
> instructors
;
44 private Student selectedStudent
;
45 private Instructor selectedInstructor
;
46 private Lesson lesson
;
48 private int startHour
;
49 private int startMinute
;
51 private int endMinute
;
52 private int groupSize
;
54 public TimetableBean() {
56 lesson
= new Lesson();
57 selectedInstructor
= null;
58 selectedStudent
= null;
61 public int getGroupSize() {
65 public void setGroupSize(int groupSize
) {
66 this.groupSize
= groupSize
;
69 public int getEndHour() {
73 public void setEndHour(int endHour
) {
74 this.endHour
= endHour
;
77 public int getEndMinute() {
81 public void setEndMinute(int endMinute
) {
82 this.endMinute
= endMinute
;
85 public int getStartHour() {
89 public void setStartHour(int startHour
) {
90 this.startHour
= startHour
;
93 public int getStartMinute() {
97 public void setStartMinute(int startMinute
) {
98 this.startMinute
= startMinute
;
101 public Date
getDate() {
105 public void setDate(Date date
) {
109 public Lesson
getLesson() {
113 public void setLesson(Lesson lesson
) {
114 this.lesson
= lesson
;
117 public Student
getSelectedStudent() {
118 return selectedStudent
;
121 public void setSelectedStudent(Student selectedStudent
) {
122 this.selectedStudent
= selectedStudent
;
125 public Instructor
getSelectedInstructor() {
126 return selectedInstructor
;
129 public void setSelectedInstructor(Instructor selectedInstructor
) {
130 this.selectedInstructor
= selectedInstructor
;
133 public void goYesterday(ActionEvent event
) {
134 date
= DateTools
.subtractDay(date
);
137 public void goTomorrow(ActionEvent event
) {
138 date
= DateTools
.addDay(date
);
141 public void goToday(ActionEvent event
) {
145 public DataModel
<Instructor
> getAvailableInstructors() {
146 instructors
= new ListDataModel
<Instructor
>(availabilityManagement
.getAvailableInstructorsByDate(date
));
150 public List
<TimeBar
> createTimeBars(Instructor instructor
) {
151 List
<TimeBar
> bars
= new ArrayList
<TimeBar
>();
152 List
<Availability
> availabilities
= availabilityManagement
.getAvailabilityByDate(instructor
, date
);
153 List
<Lesson
> lessons
= lessonManagement
.getLessonsByDate(instructor
, date
);
154 double previousEnd
= NumberConstants
.DAY_START_HOUR
;
156 for (Availability a
: availabilities
) {
157 bars
.addAll(processAvailability(a
, lessons
, previousEnd
));
158 previousEnd
= DateTools
.timeToHours(a
.getEndTime());
164 private List
<TimeBar
> processAvailability(Availability a
, List
<Lesson
> lessons
, double previousEnd
) {
165 List
<TimeBar
> bars
= new ArrayList
<TimeBar
>();
166 int margin
= NumberConstants
.BAR_MARGIN
;
167 boolean noLesson
= true;
169 for (Lesson l
: lessons
) {
170 Date lessonStart
= DateTools
.addMinute(l
.getStartTime());
171 if (lessonStart
.after(a
.getStartTime()) && lessonStart
.before(a
.getEndTime())) {
172 // time bar for avaiability before lesson
173 int left
= (int) Math
.round((DateTools
.timeToHours(a
.getStartTime()) - previousEnd
) * NumberConstants
.HOUR_WIDTH
) + margin
;
174 int width
= (int) Math
.round((DateTools
.timeToHours(l
.getStartTime()) - DateTools
.timeToHours(a
.getStartTime())) * NumberConstants
.HOUR_WIDTH
) - 2 * margin
;
176 Availability aBefore
= new Availability(a
.getStartTime(), l
.getStartTime());
177 bars
.add(new TimeBar(left
, width
, aBefore
));
178 previousEnd
= DateTools
.timeToHours(aBefore
.getEndTime());
181 // time bar for reserved lesson
182 left
= (int) Math
.round((DateTools
.timeToHours(l
.getStartTime()) - previousEnd
) * NumberConstants
.HOUR_WIDTH
) + margin
;
183 width
= (int) Math
.round((DateTools
.timeToHours(l
.getEndTime()) - DateTools
.timeToHours(l
.getStartTime())) * NumberConstants
.HOUR_WIDTH
) - 2 * margin
;
184 bars
.add(new TimeBar(left
, width
, l
));
186 // time bar for the rest of availability
187 if (!DateTools
.equalsTime(l
.getEndTime(), a
.getEndTime())) {
188 double end
= DateTools
.timeToHours(l
.getEndTime());
189 Availability availabilityRest
= new Availability(l
.getEndTime(), a
.getEndTime());
190 bars
.addAll(processAvailability(availabilityRest
, lessons
, end
));
198 int left
= (int) Math
.round((DateTools
.timeToHours(a
.getStartTime()) - previousEnd
) * NumberConstants
.HOUR_WIDTH
) + margin
;
199 int width
= (int) Math
.round((DateTools
.timeToHours(a
.getEndTime()) - DateTools
.timeToHours(a
.getStartTime())) * NumberConstants
.HOUR_WIDTH
) - 2 * margin
;
200 bars
.add(new TimeBar(left
, width
, a
));
206 public boolean displayedTime(int width
) {
207 return (width
>= 46);
210 public int getAvailabilityStartHour() {
211 if (lesson
.getStartTime() == null) {
212 return NumberConstants
.DAY_START_HOUR
;
214 return DateTools
.getHours(lesson
.getStartTime());
217 public int getAvailabilityEndHour() {
218 if (lesson
.getEndTime() == null) {
219 return NumberConstants
.DAY_END_HOUR
;
221 return DateTools
.getHours(lesson
.getEndTime());
224 public List
<Student
> completeStudent(String query
) {
225 return userManagement
.getStudentsByName(query
);
228 public List
<Instructor
> completeInstructor(String query
) {
229 return userManagement
.getInstructorsByName(query
);
232 public void newLesson(Availability availability
) {
233 lesson
= new Lesson();
234 selectedStudent
= null;
235 selectedInstructor
= instructors
.getRowData();
237 Date lessonStart
= availability
.getStartTime();
238 Date lessonEnd
= availability
.getEndTime();
240 startHour
= DateTools
.getHours(lessonStart
);
241 startMinute
= DateTools
.getMinutes(lessonStart
);
242 endHour
= DateTools
.getHours(lessonEnd
);
243 endMinute
= DateTools
.getMinutes(lessonEnd
);
245 lesson
.setStartTime(lessonStart
);
246 lesson
.setEndTime(lessonEnd
);
249 public void newFreeLesson(int hour
) {
250 lesson
= new Lesson();
251 selectedStudent
= null;
252 selectedInstructor
= null;
254 Date lessonStart
= DateTools
.makeDateTime(date
, hour
, 0);
255 Date lessonEnd
= DateTools
.makeDateTime(date
, hour
+ 1, 0);
257 startHour
= DateTools
.getHours(lessonStart
);
258 startMinute
= DateTools
.getMinutes(lessonStart
);
259 endHour
= DateTools
.getHours(lessonEnd
);
260 endMinute
= DateTools
.getMinutes(lessonEnd
);
263 public void createNewStudent(ActionEvent event
) {
266 public void createLesson(ActionEvent event
) {
267 List
<Instructor
> instructorsTmp
= new ArrayList
<Instructor
>();
268 instructorsTmp
.add(selectedInstructor
);
269 Date startTime
= DateTools
.makeDateTime(date
, startHour
, startMinute
, 0);
270 Date endTime
= DateTools
.makeDateTime(date
, endHour
, endMinute
, 0);
272 // check whether time is mismatched
273 if (endTime
.before(startTime
)) {
274 showErrorMessage("End time is before start time");
277 // check whether time equals
278 if (startTime
.equals(endTime
)) {
279 showErrorMessage("Start time equals end time");
282 // check whether is selected instructor
283 if (selectedInstructor
== null) {
284 showErrorMessage("createLesson:instructor", "You must add at least 1 instructor", "Empty instructor");
287 // check whether is selected student
288 if (selectedStudent
== null) {
289 showErrorMessage("createLesson:student", "You must add at least 1 student", "Empty student");
292 // check whether instructor is available
293 List
<Instructor
> conflictInstructors
= lessonManagement
.checkLessonAvailability(startTime
, endTime
, instructorsTmp
);
294 if (conflictInstructors
.size() > 0) {
295 DateFormat df
= new SimpleDateFormat("HH:mm");
296 String start
= df
.format(startTime
);
297 String end
= df
.format(endTime
);
298 String instructor
= conflictInstructors
.get(0).getFirstName() + " " + conflictInstructors
.get(0).getLastName();
300 showErrorMessage(instructor
+ " is not available during " + start
+ " - " + end
);
303 // check whether other lessons are not reserved
304 List
<Lesson
> conflictLessons
= lessonManagement
.checkLessonReservations(startTime
, endTime
, instructorsTmp
);
305 if (conflictLessons
.size() > 0) {
306 Lesson l
= conflictLessons
.get(0);
307 DateFormat df
= new SimpleDateFormat("HH:mm");
308 String start
= df
.format(l
.getStartTime());
309 String end
= df
.format(l
.getEndTime());
310 String student
= l
.getStudents().get(0).getFirstName() + " " + l
.getStudents().get(0).getLastName();
312 showErrorMessage("Reserved lesson (" + student
+ ", " + start
+ " - " + end
+ ")");
316 lesson
.setInstructors(instructorsTmp
);
317 lesson
.setStudents(new ArrayList
<Student
>());
318 lesson
.getStudents().add(selectedStudent
);
319 lesson
.setStartTime(startTime
);
320 lesson
.setEndTime(endTime
);
321 selectedStudent
.setGroupSize(groupSize
);
322 lesson
.setExecuted(false);
323 lesson
.setPaid(false);
325 if (groupSize
< NumberConstants
.GROUP_SIZE
) {
326 lesson
.setLessonType(NamingConstants
.LESSON_INDIVIDUAL
);
328 lesson
.setLessonType(NamingConstants
.LESSON_GROUP
);
331 lessonManagement
.createLesson(lesson
);
332 showInfoMessage("Lesson created");
335 public void updateLesson(ActionEvent event
) {
336 lessonManagement
.updateLesson(lesson
);
337 showInfoMessage("Lesson updated");
340 private void showErrorMessage(String message
) {
341 FacesMessage msg
= new FacesMessage(FacesMessage
.SEVERITY_ERROR
, message
, "");
342 FacesContext
.getCurrentInstance().addMessage(null, msg
);
345 private void showErrorMessage(String clientId
, String message
, String detail
) {
346 FacesMessage msg
= new FacesMessage(FacesMessage
.SEVERITY_ERROR
, message
, detail
);
347 FacesContext
.getCurrentInstance().addMessage(clientId
, msg
);
350 private void showInfoMessage(String message
) {
351 FacesMessage msg
= new FacesMessage(FacesMessage
.SEVERITY_INFO
, message
, "");
352 FacesContext
.getCurrentInstance().addMessage(null, msg
);