001 /**
002 * Copyright 2004-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.hr.time.calendar;
017
018 import java.sql.Date;
019 import java.util.*;
020
021 import edu.emory.mathcs.backport.java.util.Arrays;
022 import org.apache.commons.collections.CollectionUtils;
023 import org.apache.commons.lang.time.DateUtils;
024 import org.joda.time.DateTime;
025 import org.joda.time.DateTimeConstants;
026 import org.joda.time.LocalDate;
027 import org.kuali.hr.lm.leaveblock.LeaveBlock;
028 import org.kuali.hr.time.service.base.TkServiceLocator;
029 import org.kuali.hr.time.util.TKContext;
030 import org.kuali.hr.time.util.TKUser;
031 import org.kuali.hr.time.util.TKUtils;
032 import org.kuali.hr.time.util.TkConstants;
033 import org.kuali.hr.time.workflow.TimesheetDocumentHeader;
034
035 import com.google.common.collect.HashMultimap;
036 import com.google.common.collect.Multimap;
037
038 public class LeaveCalendar extends CalendarParent {
039
040 private Map<String, String> earnCodeList;
041
042 public LeaveCalendar(String principalId, CalendarEntries calendarEntry, List<String> assignmentKeys) {
043 super(calendarEntry);
044
045 DateTime currentDisplayDateTime = getBeginDateTime();
046 DateTime endDisplayDateTime = getEndDateTime();
047
048 // Fill in the days if the first day or end day is in the middle of the week
049 if (currentDisplayDateTime.getDayOfWeek() != DateTimeConstants.SUNDAY) {
050 currentDisplayDateTime = currentDisplayDateTime.minusDays(currentDisplayDateTime.getDayOfWeek());
051 }
052 if (endDisplayDateTime.getDayOfWeek() != DateTimeConstants.SATURDAY) {
053 endDisplayDateTime = endDisplayDateTime.plusDays(DateTimeConstants.SATURDAY - endDisplayDateTime.getDayOfWeek());
054 }
055
056 LeaveCalendarWeek leaveCalendarWeek = new LeaveCalendarWeek();
057 Integer dayNumber = 0;
058 List<LeaveBlock> blocks = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principalId, calendarEntry.getBeginPeriodDate(), calendarEntry.getEndPeriodDate());
059 Map<String, List<LeaveBlock>> leaveBlockMap = new HashMap<String, List<LeaveBlock>>();
060 for (LeaveBlock lb : blocks) {
061 String key = new LocalDate(lb.getLeaveDate()).toString();
062 if (leaveBlockMap.containsKey(key)) {
063 leaveBlockMap.get(key).add(lb);
064 } else {
065 leaveBlockMap.put(key, createNewLeaveBlockList(lb));
066 }
067 }
068
069 while (currentDisplayDateTime.isBefore(endDisplayDateTime) || currentDisplayDateTime.isEqual(endDisplayDateTime)) {
070 LeaveCalendarDay leaveCalendarDay = new LeaveCalendarDay();
071
072 // If the day is not within the current pay period, mark them as read only (gray)
073 if (currentDisplayDateTime.isBefore(getBeginDateTime())
074 || currentDisplayDateTime.isEqual(getEndDateTime())
075 || currentDisplayDateTime.isAfter(getEndDateTime())) {
076 leaveCalendarDay.setGray(true);
077 } else {
078 // This is for the div id of the days on the calendar.
079 // It creates a day id like day_11/01/2011 which will make day parsing easier in the javascript.
080 // leaveCalendarDay.setDayNumberDelta(currDateTime.toString(TkConstants.DT_BASIC_DATE_FORMAT));
081 // leaveCalendarDay.setDayNumberDelta(currDateTime.getDayOfMonth());
082 leaveCalendarDay.setDayNumberDelta(dayNumber);
083
084 java.util.Date leaveDate = TKUtils.getTimelessDate(currentDisplayDateTime.toLocalDate().toDateMidnight().toDate());
085 List<LeaveBlock> lbs = leaveBlockMap.get(currentDisplayDateTime.toLocalDate().toString());
086 if (lbs == null) {
087 lbs = Collections.emptyList();
088 }
089 // use given assignmentKeys to control leave blocks displayed on the calendar
090 if(CollectionUtils.isNotEmpty(lbs) && CollectionUtils.isNotEmpty(assignmentKeys)) {
091 List<LeaveBlock> leaveBlocks = TkServiceLocator.getLeaveBlockService().filterLeaveBlocksForLeaveCalendar(lbs, assignmentKeys);
092 leaveCalendarDay.setLeaveBlocks(leaveBlocks);
093 } else {
094 leaveCalendarDay.setLeaveBlocks(lbs);
095 }
096
097 if (TkServiceLocator.getPermissionsService().canViewLeaveTabsWithNEStatus()) {
098 TimesheetDocumentHeader tdh = TkServiceLocator.getTimesheetDocumentHeaderService().getDocumentHeaderForDate(principalId, leaveDate);
099 if (tdh != null) {
100 if (DateUtils.isSameDay(leaveDate, tdh.getEndDate()) || leaveDate.after(tdh.getEndDate())) {
101 leaveCalendarDay.setDayEditable(true);
102 }
103 } else {
104 leaveCalendarDay.setDayEditable(true);
105 }
106 } else {
107 leaveCalendarDay.setDayEditable(true);
108 }
109
110 dayNumber++;
111 }
112 leaveCalendarDay.setDayNumberString(currentDisplayDateTime.dayOfMonth().getAsShortText());
113 leaveCalendarDay.setDateString(currentDisplayDateTime.toString(TkConstants.DT_BASIC_DATE_FORMAT));
114
115 leaveCalendarWeek.getDays().add(leaveCalendarDay);
116
117 if (leaveCalendarWeek.getDays().size() == DateTimeConstants.DAYS_PER_WEEK) {
118 getWeeks().add(leaveCalendarWeek);
119 leaveCalendarWeek = new LeaveCalendarWeek();
120 }
121
122 currentDisplayDateTime = currentDisplayDateTime.plusDays(1);
123 }
124
125 if (!leaveCalendarWeek.getDays().isEmpty()) {
126 getWeeks().add(leaveCalendarWeek);
127 }
128
129 boolean isPlanningCal = TkServiceLocator.getLeaveCalendarService().isLeavePlanningCalendar(principalId, calendarEntry.getBeginPeriodDateTime(), calendarEntry.getEndPeriodDateTime());
130 Map<String, String> earnCodes = TkServiceLocator.getEarnCodeService().getEarnCodesForDisplay(principalId, isPlanningCal);
131 setEarnCodeList(earnCodes);
132 }
133
134 private List<LeaveBlock> createNewLeaveBlockList(LeaveBlock lb){
135 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>();
136 leaveBlocks.add(lb);
137 return leaveBlocks;
138 }
139
140 private Multimap<Date, LeaveBlock> leaveBlockAggregator(String documentId) {
141 List<LeaveBlock> leaveBlocks = TkServiceLocator.getLeaveBlockService().getLeaveBlocksForDocumentId(documentId);
142 Multimap<Date, LeaveBlock> leaveBlockAggregrate = HashMultimap.create();
143 for (LeaveBlock leaveBlock : leaveBlocks) {
144 leaveBlockAggregrate.put(leaveBlock.getLeaveDate(), leaveBlock);
145 }
146
147 return leaveBlockAggregrate;
148 }
149
150 public Map<String, String> getEarnCodeList() {
151 return earnCodeList;
152 }
153
154 public void setEarnCodeList(Map<String, String> earnCodeList) {
155 this.earnCodeList = earnCodeList;
156 }
157 }