Step back in refactoring, case sensitive ignored in autocomplite, adding lesson type...
[SkiSchool.git] / SkiSchool-war / src / java / org / cvut / skischool / back / TimetableBean.java
blob0b3315ea5ee5fc6c024ff27fa3221ea5addd0256
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;
9 import java.util.Date;
10 import java.util.List;
11 import javax.ejb.EJB;
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;
29 /**
31 * @author matej
33 @ManagedBean(name = "timetableBean")
34 @SessionScoped
35 public class TimetableBean implements Serializable {
37 @EJB
38 private AvailabilityManagementLocal availabilityManagement;
39 @EJB
40 private LessonManagementLocal lessonManagement;
41 @EJB
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;
48 private Date date;
49 private boolean freeLesson;
50 private int startHour;
51 private int startMinute;
52 private int endHour;
53 private int endMinute;
54 private int groupSize;
56 public TimetableBean() {
57 date = new Date();
58 lesson = new Lesson();
59 selectedInstructor = null;
60 selectedStudent = null;
61 newStudent = null;
64 public boolean getFreeLesson() {
65 return freeLesson;
68 public void setFreeLesson(boolean isFreeLesson) {
69 this.freeLesson = isFreeLesson;
72 public int getGroupSize() {
73 return groupSize;
76 public void setGroupSize(int groupSize) {
77 this.groupSize = groupSize;
80 public int getEndHour() {
81 return endHour;
84 public void setEndHour(int endHour) {
85 this.endHour = endHour;
88 public int getEndMinute() {
89 return endMinute;
92 public void setEndMinute(int endMinute) {
93 this.endMinute = endMinute;
96 public int getStartHour() {
97 return startHour;
100 public void setStartHour(int startHour) {
101 this.startHour = startHour;
104 public int getStartMinute() {
105 return startMinute;
108 public void setStartMinute(int startMinute) {
109 this.startMinute = startMinute;
112 public Date getDate() {
113 return date;
116 public void setDate(Date date) {
117 this.date = date;
120 public Lesson getLesson() {
121 return lesson;
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) {
153 date = new Date();
156 public DataModel<Instructor> getAvailableInstructors() {
157 instructors = new ListDataModel<Instructor>(availabilityManagement.getAvailableInstructorsByDate(date));
158 return instructors;
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());
172 return bars;
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;
186 if (width > 0) {
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));
206 noLesson = false;
207 break;
210 if (noLesson) {
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));
216 return bars;
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]);
246 } else {
247 newStudent.setFirstName(null);
248 newStudent.setLastName(names[0]);
251 return results;
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();
262 freeLesson = false;
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;
280 freeLesson = true;
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");
295 return;
297 // if (newStudent.getFirstName() == null) {
298 //// showErrorMessage("Please enter first name and last name");
299 // showErrorMessage("Prosím zadajte meno a prezvisko žiaka");
300 // return;
301 // }
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");
322 return;
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é");
328 return;
330 // check whether is selected instructor
331 if (selectedInstructor == null) {
332 // showErrorMessage("You must add instructor");
333 showErrorMessage("Pridajte inštruktora");
334 return;
336 // check whether is selected student
337 if (selectedStudent == null) {
338 // showErrorMessage("You must add student");
339 showErrorMessage("Pridajte žiaka");
340 return;
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 + ")");
353 return;
355 // create availability for free lesson
356 if (freeLesson) {
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);
373 return;
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);
387 } else {
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");
406 return;
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);