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 newStudent
;
45 private Student selectedStudent
;
46 private Instructor selectedInstructor
;
47 private Lesson lesson
;
49 private boolean freeLesson
;
50 private int startHour
;
51 private int startMinute
;
53 private int endMinute
;
54 private int groupSize
;
56 public TimetableBean() {
58 lesson
= new Lesson();
59 selectedInstructor
= null;
60 selectedStudent
= null;
64 public boolean getFreeLesson() {
68 public void setFreeLesson(boolean isFreeLesson
) {
69 this.freeLesson
= isFreeLesson
;
72 public int getGroupSize() {
76 public void setGroupSize(int groupSize
) {
77 this.groupSize
= groupSize
;
80 public int getEndHour() {
84 public void setEndHour(int endHour
) {
85 this.endHour
= endHour
;
88 public int getEndMinute() {
92 public void setEndMinute(int endMinute
) {
93 this.endMinute
= endMinute
;
96 public int getStartHour() {
100 public void setStartHour(int startHour
) {
101 this.startHour
= startHour
;
104 public int getStartMinute() {
108 public void setStartMinute(int startMinute
) {
109 this.startMinute
= startMinute
;
112 public Date
getDate() {
116 public void setDate(Date date
) {
120 public Lesson
getLesson() {
124 public void setLesson(Lesson lesson
) {
125 this.lesson
= lesson
;
128 public Student
getSelectedStudent() {
129 return selectedStudent
;
132 public void setSelectedStudent(Student selectedStudent
) {
133 this.selectedStudent
= selectedStudent
;
136 public Instructor
getSelectedInstructor() {
137 return selectedInstructor
;
140 public void setSelectedInstructor(Instructor selectedInstructor
) {
141 this.selectedInstructor
= selectedInstructor
;
144 public void goYesterday(ActionEvent event
) {
145 date
= DateTools
.subtractDay(date
);
148 public void goTomorrow(ActionEvent event
) {
149 date
= DateTools
.addDay(date
);
152 public void goToday(ActionEvent event
) {
156 public DataModel
<Instructor
> getAvailableInstructors() {
157 instructors
= new ListDataModel
<Instructor
>(availabilityManagement
.getAvailableInstructorsByDate(date
));
161 public List
<TimeBar
> createTimeBars(Instructor instructor
) {
162 List
<TimeBar
> bars
= new ArrayList
<TimeBar
>();
163 List
<Availability
> availabilities
= availabilityManagement
.getAvailabilityByDate(instructor
, date
);
164 List
<Lesson
> lessons
= lessonManagement
.getLessonsByDate(instructor
, date
);
165 double previousEnd
= NumberConstants
.DAY_START_HOUR
;
167 for (Availability a
: availabilities
) {
168 bars
.addAll(processAvailability(a
, lessons
, previousEnd
));
169 previousEnd
= DateTools
.timeToHours(a
.getEndTime());
175 private List
<TimeBar
> processAvailability(Availability a
, List
<Lesson
> lessons
, double previousEnd
) {
176 List
<TimeBar
> bars
= new ArrayList
<TimeBar
>();
177 int margin
= NumberConstants
.BAR_MARGIN
;
178 boolean noLesson
= true;
180 for (Lesson l
: lessons
) {
181 Date lessonStart
= DateTools
.addMinute(l
.getStartTime());
182 if (lessonStart
.after(a
.getStartTime()) && lessonStart
.before(a
.getEndTime())) {
183 // time bar for avaiability before lesson
184 int left
= (int) Math
.round((DateTools
.timeToHours(a
.getStartTime()) - previousEnd
) * NumberConstants
.HOUR_WIDTH
) + margin
;
185 int width
= (int) Math
.round((DateTools
.timeToHours(l
.getStartTime()) - DateTools
.timeToHours(a
.getStartTime())) * NumberConstants
.HOUR_WIDTH
) - 2 * margin
;
187 Availability aBefore
= new Availability(a
.getStartTime(), l
.getStartTime());
188 aBefore
.setNote(a
.getNote());
189 bars
.add(new TimeBar(left
, width
, aBefore
));
190 previousEnd
= DateTools
.timeToHours(aBefore
.getEndTime());
193 // time bar for reserved lesson
194 left
= (int) Math
.round((DateTools
.timeToHours(l
.getStartTime()) - previousEnd
) * NumberConstants
.HOUR_WIDTH
) + margin
;
195 width
= (int) Math
.round((DateTools
.timeToHours(l
.getEndTime()) - DateTools
.timeToHours(l
.getStartTime())) * NumberConstants
.HOUR_WIDTH
) - 2 * margin
;
196 bars
.add(new TimeBar(left
, width
, l
));
198 // time bar for the rest of availability
199 if (!DateTools
.equalsTime(l
.getEndTime(), a
.getEndTime())) {
200 double end
= DateTools
.timeToHours(l
.getEndTime());
201 Availability aRest
= new Availability(l
.getEndTime(), a
.getEndTime());
202 aRest
.setNote(a
.getNote());
203 bars
.addAll(processAvailability(aRest
, lessons
, end
));
211 int left
= (int) Math
.round((DateTools
.timeToHours(a
.getStartTime()) - previousEnd
) * NumberConstants
.HOUR_WIDTH
) + margin
;
212 int width
= (int) Math
.round((DateTools
.timeToHours(a
.getEndTime()) - DateTools
.timeToHours(a
.getStartTime())) * NumberConstants
.HOUR_WIDTH
) - 2 * margin
;
213 bars
.add(new TimeBar(left
, width
, a
));
219 public boolean displayedTime(int width
) {
220 return (width
>= (NumberConstants
.HOUR_WIDTH
- 2 * NumberConstants
.BAR_MARGIN
));
223 public int getAvailabilityStartHour() {
224 if (lesson
.getStartTime() == null) {
225 return NumberConstants
.DAY_START_HOUR
;
227 return DateTools
.getHours(lesson
.getStartTime());
230 public int getAvailabilityEndHour() {
231 if (lesson
.getEndTime() == null) {
232 return NumberConstants
.DAY_END_HOUR
;
234 return DateTools
.getHours(lesson
.getEndTime());
237 public List
<Student
> completeStudent(String query
) {
238 List
<Student
> results
= userManagement
.getStudentsByName(query
);
239 if (results
.isEmpty()) {
240 newStudent
= new Student();
241 String
[] names
= query
.split(" +");
243 if (names
.length
> 1) {
244 newStudent
.setFirstName(names
[0]);
245 newStudent
.setLastName(names
[1]);
247 newStudent
.setFirstName(null);
248 newStudent
.setLastName(names
[0]);
254 public List
<Instructor
> completeInstructor(String query
) {
255 return userManagement
.getInstructorsByName(query
);
258 public void newLesson(Availability availability
) {
259 lesson
= new Lesson();
260 selectedStudent
= null;
261 selectedInstructor
= instructors
.getRowData();
264 Date lessonStart
= availability
.getStartTime();
265 Date lessonEnd
= availability
.getEndTime();
267 startHour
= DateTools
.getHours(lessonStart
);
268 startMinute
= DateTools
.getMinutes(lessonStart
);
269 endHour
= DateTools
.getHours(lessonEnd
);
270 endMinute
= DateTools
.getMinutes(lessonEnd
);
272 lesson
.setStartTime(lessonStart
);
273 lesson
.setEndTime(lessonEnd
);
276 public void newFreeLesson(int hour
) {
277 lesson
= new Lesson();
278 selectedStudent
= null;
279 selectedInstructor
= null;
282 Date lessonStart
= DateTools
.makeDateTime(date
, hour
, 0);
283 Date lessonEnd
= DateTools
.makeDateTime(date
, hour
+ 1, 0);
285 startHour
= DateTools
.getHours(lessonStart
);
286 startMinute
= DateTools
.getMinutes(lessonStart
);
287 endHour
= DateTools
.getHours(lessonEnd
);
288 endMinute
= DateTools
.getMinutes(lessonEnd
);
291 public void createNewStudent(ActionEvent event
) {
292 if (newStudent
== null) {
293 // showErrorMessage("Please enter name of the student");
294 showErrorMessage("Prosím zadajte meno žiaka");
297 // if (newStudent.getFirstName() == null) {
298 //// showErrorMessage("Please enter first name and last name");
299 // showErrorMessage("Prosím zadajte meno a prezvisko žiaka");
303 newStudent
.setGroupSize(1);
304 newStudent
.setDisabled(false);
306 userManagement
.createStudent(newStudent
);
307 selectedStudent
= newStudent
;
308 // showInfoMessage("New student created successfully");
309 showInfoMessage("Nový žiak bol úspešne vytvorený");
312 public void createLesson(ActionEvent event
) {
313 List
<Instructor
> instructorsTmp
= new ArrayList
<Instructor
>();
314 instructorsTmp
.add(selectedInstructor
);
315 Date startTime
= DateTools
.makeDateTime(date
, startHour
, startMinute
, 0);
316 Date endTime
= DateTools
.makeDateTime(date
, endHour
, endMinute
, 0);
318 // check whether time is mismatched
319 if (endTime
.before(startTime
)) {
320 // showErrorMessage("End time is before start time");
321 showErrorMessage("Koniec je pred začiatkom");
324 // check whether time equals
325 if (startTime
.equals(endTime
)) {
326 // showErrorMessage("Start time equals end time");
327 showErrorMessage("Začiatok a koniec sú rovnaké");
330 // check whether is selected instructor
331 if (selectedInstructor
== null) {
332 // showErrorMessage("You must add instructor");
333 showErrorMessage("Pridajte inštruktora");
336 // check whether is selected student
337 if (selectedStudent
== null) {
338 // showErrorMessage("You must add student");
339 showErrorMessage("Pridajte žiaka");
342 // check whether other lessons are not reserved
343 List
<Lesson
> conflictLessons
= lessonManagement
.checkLessonReservations(startTime
, endTime
, instructorsTmp
);
344 if (conflictLessons
.size() > 0) {
345 Lesson l
= conflictLessons
.get(0);
346 DateFormat df
= new SimpleDateFormat("HH:mm");
347 String start
= df
.format(l
.getStartTime());
348 String end
= df
.format(l
.getEndTime());
349 String student
= l
.getStudents().get(0).getFirstName() + " " + l
.getStudents().get(0).getLastName();
351 // showErrorMessage("Reserved lesson (" + student + ", " + start + " - " + end + ")");
352 showErrorMessage("Iná hodina v tomto čase (" + student
+ ", " + start
+ " - " + end
+ ")");
355 // create availability for free lesson
357 Availability a
= new Availability();
358 a
.setStartTime(startTime
);
359 a
.setEndTime(endTime
);
360 a
.setInstructor(selectedInstructor
);
361 availabilityManagement
.createAvailability(a
);
363 // check whether instructor is available
364 List
<Instructor
> conflictInstructors
= lessonManagement
.checkLessonAvailability(startTime
, endTime
, instructorsTmp
);
365 if (conflictInstructors
.size() > 0) {
366 DateFormat df
= new SimpleDateFormat("HH:mm");
367 String start
= df
.format(startTime
);
368 String end
= df
.format(endTime
);
369 String instructor
= conflictInstructors
.get(0).getFirstName() + " " + conflictInstructors
.get(0).getLastName();
371 // showErrorMessage(instructor + " is not available during " + start + " - " + end);
372 showErrorMessage(instructor
+ " nie je dostupný " + start
+ " - " + end
);
376 lesson
.setInstructors(instructorsTmp
);
377 lesson
.setStudents(new ArrayList
<Student
>());
378 lesson
.getStudents().add(selectedStudent
);
379 selectedStudent
.setGroupSize(groupSize
);
380 lesson
.setStartTime(startTime
);
381 lesson
.setEndTime(endTime
);
382 lesson
.setExecuted(false);
383 lesson
.setPaid(false);
385 if (groupSize
< NumberConstants
.GROUP_SIZE
) {
386 lesson
.setLessonType(NamingConstants
.LESSON_INDIVIDUAL
);
388 lesson
.setLessonType(NamingConstants
.LESSON_GROUP
);
391 lessonManagement
.createLesson(lesson
);
392 // showInfoMessage("Lesson created successfully");
393 showInfoMessage("Hodina úspešne vytvorená");
396 public void updateLesson(ActionEvent event
) {
397 lessonManagement
.updateLesson(lesson
);
398 // showInfoMessage("Lesson updated successfully");
399 showInfoMessage("Hodina úspešne upravená");
402 public void deleteLesson(ActionEvent event
) {
403 if (lesson
.isExecuted()) {
404 // showErrorMessage("Lesson is already executed");
405 showErrorMessage("Hodina už prebehla");
409 lessonManagement
.deleteLesson(lesson
);
410 // showInfoMessage("Lesson removed successfully");
411 showInfoMessage("Hodina úspešne zmazaná");
414 private void showErrorMessage(String message
) {
415 FacesMessage msg
= new FacesMessage(FacesMessage
.SEVERITY_ERROR
, message
, "");
416 FacesContext
.getCurrentInstance().addMessage(null, msg
);
419 private void showInfoMessage(String message
) {
420 FacesMessage msg
= new FacesMessage(FacesMessage
.SEVERITY_INFO
, message
, "");
421 FacesContext
.getCurrentInstance().addMessage(null, msg
);