package net.rrm.ehour.ui.common.panel.calendar; import net.rrm.ehour.timesheet.service.IOverviewTimesheet; import net.rrm.ehour.ui.common.util.WebUtils; import net.rrm.ehour.util.DateUtil; import org.apache.wicket.spring.injection.annot.SpringBean; import org.joda.time.LocalDate; import java.io.Serializable; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class CalendarWeekFactory implements Serializable { @SpringBean private IOverviewTimesheet overviewTimesheet; public CalendarWeekFactory() { } // junit testing protected CalendarWeekFactory(IOverviewTimesheet overviewTimesheet) { this.overviewTimesheet = overviewTimesheet; } public List<CalendarWeek> createWeeks(Integer firstDayOfWeek, Integer userId, Calendar thisMonth) { List<CalendarWeek> calendarWeeks = new ArrayList<>(); thisMonth.setFirstDayOfWeek(firstDayOfWeek); List<LocalDate> bookedDays = getOverviewTimesheet().getBookedDaysMonthOverview(userId, thisMonth); thisMonth.set(Calendar.DAY_OF_MONTH, 1); // could have passed in calendar as well but than equals does not work anymore LocalDate thisMonthLocal = new LocalDate(thisMonth.getTime()); int currentMonth = thisMonth.get(Calendar.MONTH); CalendarWeek week = new CalendarWeek(ElementLocation.FIRST); int weekOfYear = thisMonth.get(Calendar.WEEK_OF_YEAR); week.setWeek(weekOfYear); if (weekOfYear > 51 && currentMonth == Calendar.JANUARY) { week.setYear(thisMonth.get(Calendar.YEAR) - 1); } else { week.setYear(thisMonth.get(Calendar.YEAR)); } week.setWeekStart((Calendar) thisMonth.clone()); DateUtil.dayOfWeekFix(week.getWeekStart()); week.getWeekStart().set(Calendar.DAY_OF_WEEK, firstDayOfWeek); int previousWeek = -1; do { int dayInMonth = thisMonth.get(Calendar.DAY_OF_MONTH); int dayInWeek = thisMonth.get(Calendar.DAY_OF_WEEK); boolean isBooked = bookedDays.contains(thisMonthLocal.withDayOfMonth(dayInMonth)); CalendarDay day = new CalendarDay(dayInMonth, isBooked); week.addDayInWeek(dayInWeek, day); thisMonth.add(Calendar.DAY_OF_MONTH, 1); // next week? add current week and create a new one if (thisMonth.get(Calendar.DAY_OF_WEEK) == firstDayOfWeek) { calendarWeeks.add(week); week = new CalendarWeek(ElementLocation.MIDDLE); week.setWeek(thisMonth.get(Calendar.WEEK_OF_YEAR)); week.setWeekStart((Calendar) thisMonth.clone()); // fix that the year is still the old year but the week is already in the next year if (previousWeek != -1 && previousWeek > thisMonth.get(Calendar.WEEK_OF_YEAR)) { week.setYear(thisMonth.get(Calendar.YEAR) + 1); } else { week.setYear(thisMonth.get(Calendar.YEAR)); } previousWeek = thisMonth.get(Calendar.WEEK_OF_YEAR); } } while (thisMonth.get(Calendar.MONTH) == currentMonth); // first day of week is already stored if (thisMonth.get(Calendar.DAY_OF_WEEK) != firstDayOfWeek) { calendarWeeks.add(week); } calendarWeeks.get(calendarWeeks.size() - 1).setLocation(ElementLocation.LAST); return calendarWeeks; } private IOverviewTimesheet getOverviewTimesheet() { if (overviewTimesheet == null) { WebUtils.springInjection(this); } return overviewTimesheet; } }