Adding more info to updateLesson dialog, adding time check to createLesson dialo
[SkiSchool.git] / SkiSchool-war / src / java / org / cvut / skischool / back / TimetableBean.java
blobb526f3bb23cce028f243cbe3d7834fc044c8d45c
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 selectedStudent;
45 private Instructor selectedInstructor;
46 private Lesson lesson;
47 private Date date;
48 private int startHour;
49 private int startMinute;
50 private int endHour;
51 private int endMinute;
52 private int groupSize;
54 public TimetableBean() {
55 date = new Date();
56 lesson = new Lesson();
57 selectedInstructor = null;
58 selectedStudent = null;
61 public int getGroupSize() {
62 return groupSize;
65 public void setGroupSize(int groupSize) {
66 this.groupSize = groupSize;
69 public int getEndHour() {
70 return endHour;
73 public void setEndHour(int endHour) {
74 this.endHour = endHour;
77 public int getEndMinute() {
78 return endMinute;
81 public void setEndMinute(int endMinute) {
82 this.endMinute = endMinute;
85 public int getStartHour() {
86 return startHour;
89 public void setStartHour(int startHour) {
90 this.startHour = startHour;
93 public int getStartMinute() {
94 return startMinute;
97 public void setStartMinute(int startMinute) {
98 this.startMinute = startMinute;
101 public Date getDate() {
102 return date;
105 public void setDate(Date date) {
106 this.date = date;
109 public Lesson getLesson() {
110 return lesson;
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) {
142 date = new Date();
145 public DataModel<Instructor> getAvailableInstructors() {
146 instructors = new ListDataModel<Instructor>(availabilityManagement.getAvailableInstructorsByDate(date));
147 return instructors;
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());
161 return bars;
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;
175 if (width > 0) {
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));
193 noLesson = false;
194 break;
197 if (noLesson) {
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));
203 return bars;
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");
275 return;
277 // check whether time equals
278 if (startTime.equals(endTime)) {
279 showErrorMessage("Start time equals end time");
280 return;
282 // check whether is selected instructor
283 if (selectedInstructor == null) {
284 showErrorMessage("createLesson:instructor", "You must add at least 1 instructor", "Empty instructor");
285 return;
287 // check whether is selected student
288 if (selectedStudent == null) {
289 showErrorMessage("createLesson:student", "You must add at least 1 student", "Empty student");
290 return;
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);
301 return;
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 + ")");
313 return;
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);
327 } else {
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);