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.lm.util;
017
018 import java.util.ArrayList;
019 import java.util.Collections;
020 import java.util.Comparator;
021 import java.util.List;
022
023 import org.joda.time.DateTime;
024 import org.joda.time.Interval;
025 import org.joda.time.LocalDate;
026 import org.joda.time.LocalDateTime;
027 import org.kuali.hr.lm.leaveblock.LeaveBlock;
028 import org.kuali.hr.time.calendar.CalendarEntries;
029 import org.kuali.hr.time.calendar.LeaveCalendar;
030 import org.kuali.hr.time.util.TKUtils;
031
032 public class LeaveBlockAggregate {
033 public List<List<LeaveBlock>> dayLeaveBlockList = new ArrayList<List<LeaveBlock>>();
034 private CalendarEntries leaveCalendarEntry;
035 private LeaveCalendar leaveCalendar;
036
037
038 /**
039 * Provides the option to refer to the time zone adjusted time for the current
040 * user.
041 * @param LeaveBlocks
042 * @param leaveCalendarEntry
043 * @param leaveCalendar
044 */
045 public LeaveBlockAggregate(List<LeaveBlock> leaveBlocks, CalendarEntries leaveCalendarEntry, LeaveCalendar leaveCalendar) {
046 this.leaveCalendarEntry = leaveCalendarEntry;
047 this.leaveCalendar = leaveCalendar;
048 List<Interval> dayIntervals = TKUtils.getDaySpanForCalendarEntry(leaveCalendarEntry);
049 for(Interval dayInt : dayIntervals){
050 List<LeaveBlock> dayLeaveBlocks = new ArrayList<LeaveBlock>();
051 for(LeaveBlock leaveBlock : leaveBlocks){
052 LocalDate localDate = new LocalDate(leaveBlock.getLeaveDate());
053 LocalDate dayIntBegin = new LocalDate(dayInt.getStart());
054 if(localDate.equals(dayIntBegin)){
055 dayLeaveBlocks.add(leaveBlock);
056 }
057 }
058 dayLeaveBlockList.add(dayLeaveBlocks);
059 }
060 }
061
062 public LeaveBlockAggregate(List<LeaveBlock> leaveBlocks, CalendarEntries leaveCalendarEntry) {
063 this.leaveCalendarEntry = leaveCalendarEntry;
064 List<Interval> dayIntervals = TKUtils.getDaySpanForCalendarEntry(leaveCalendarEntry);
065 for(Interval dayInt : dayIntervals){
066 List<LeaveBlock> dayLeaveBlocks = new ArrayList<LeaveBlock>();
067 for(LeaveBlock leaveBlock : leaveBlocks){
068 LocalDate localDate = new LocalDate(leaveBlock.getLeaveDate());
069 LocalDate dayIntBegin = new LocalDate(dayInt.getStart());
070 if(localDate.equals(dayIntBegin)){
071 dayLeaveBlocks.add(leaveBlock);
072 }
073 }
074 dayLeaveBlockList.add(dayLeaveBlocks);
075 }
076 }
077
078 /**
079 * build leaveBlockAggregate with given leaveBlocks, calendarEntry and dayIntervals
080 * dayIntervals with full week span is for Time Calendar
081 * @param LeaveBlocks
082 * @param leaveCalendarEntry
083 * @param dayIntervals
084 */
085 public LeaveBlockAggregate(List<LeaveBlock> leaveBlocks, CalendarEntries leaveCalendarEntry, List<Interval> dayIntervals) {
086 this.leaveCalendarEntry = leaveCalendarEntry;
087 for(Interval dayInt : dayIntervals){
088 List<LeaveBlock> dayLeaveBlocks = new ArrayList<LeaveBlock>();
089 DateTime localTime = (new DateTime(dayInt.getStart())).toLocalDateTime().toDateTime();
090 String intervalStartDateString = TKUtils.getTimelessDate(localTime.toDate()).toString();
091
092 for(LeaveBlock leaveBlock : leaveBlocks){
093 // if the interval end time is 0, ie the beginning of a day, use the date string of the interval start time
094 // to check if the leave block should go into this interval. Leave blocks only have leaveDate, there's no leave time
095 if(dayInt.getEnd().getHourOfDay() == 0) {
096 String lbDateString = TKUtils.getTimelessDate(leaveBlock.getLeaveDate()).toString();
097 if(intervalStartDateString.equals(lbDateString)) {
098 dayLeaveBlocks.add(leaveBlock);
099 }
100 } else {
101 LocalDate localDate = new LocalDate(leaveBlock.getLeaveDate());
102 LocalDate dayIntBegin = new LocalDate(dayInt.getStart());
103 if(localDate.equals(dayIntBegin)){
104 dayLeaveBlocks.add(leaveBlock);
105 }
106 }
107 }
108 dayLeaveBlockList.add(dayLeaveBlocks);
109 }
110 }
111
112 public List<LeaveBlock> getFlattenedLeaveBlockList(){
113 List<LeaveBlock> lstLeaveBlocks = new ArrayList<LeaveBlock>();
114 for(List<LeaveBlock> leaveBlocks : dayLeaveBlockList){
115 lstLeaveBlocks.addAll(leaveBlocks);
116 }
117
118 Collections.sort(lstLeaveBlocks, new Comparator<LeaveBlock>() { // Sort the Leave Blocks
119 public int compare(LeaveBlock tb1, LeaveBlock tb2) {
120 if (tb1 != null && tb2 != null) {
121 if (tb1.getTimestamp() != null && tb2.getTimestamp() != null) {
122 return tb1.getTimestamp().compareTo(tb2.getTimestamp());
123 }
124 }
125 return 0;
126 }
127 });
128
129 return lstLeaveBlocks;
130 }
131
132 /**
133 * Provides a way to access all of the leave blocks for a given week.
134 *
135 * Outer list is 0 indexed list representing days in a week.
136 * Inner List are all of the time blocks for that day.
137 *
138 * Ex.
139 *
140 * List<List<LeaveBlock>> week0 = getWeekLeaveBlocks(0);
141 * List<LeaveBlock> day0 = week0.get(0);
142 *
143 * @param week
144 * @return
145 */
146 public List<List<LeaveBlock>> getWeekLeaveBlocks(int week){
147 int startIndex = week*7;
148 int endIndex = (week*7)+7;
149 endIndex = endIndex > dayLeaveBlockList.size() ? dayLeaveBlockList.size() : endIndex;
150
151 // Need to sort each day by clock time.
152 List<List<LeaveBlock>> wList = dayLeaveBlockList.subList(startIndex, endIndex);
153 for (List<LeaveBlock> dList : wList) {
154 Collections.sort(dList, new Comparator<LeaveBlock>() { // Sort the Leave Blocks
155 public int compare(LeaveBlock tb1, LeaveBlock tb2) {
156 if (tb1 != null && tb2 != null)
157 return tb1.getTimestamp().compareTo(tb2.getTimestamp());
158 return 0;
159 }
160 });
161 }
162
163 return wList;
164 }
165
166 /**
167 * @return the total number of weeks that this object represents.
168 */
169 public int numberOfAggregatedWeeks() {
170 int weeks = 0;
171
172 if (this.dayLeaveBlockList.size() > 0) {
173 weeks = this.dayLeaveBlockList.size() / 7;
174 if (this.dayLeaveBlockList.size() % 7 > 0)
175 weeks++;
176 }
177
178 return weeks;
179 }
180
181 public List<List<LeaveBlock>> getDayLeaveBlockList() {
182 return dayLeaveBlockList;
183 }
184
185 public CalendarEntries getleaveCalendarEntry() {
186 return leaveCalendarEntry;
187 }
188
189 public void setleaveCalendarEntry(CalendarEntries leaveCalendarEntry) {
190 this.leaveCalendarEntry = leaveCalendarEntry;
191 }
192
193 public LeaveCalendar getLeaveCalendar() {
194 return leaveCalendar;
195 }
196
197 public void setLeaveCalendar(LeaveCalendar leaveCalendar) {
198 this.leaveCalendar = leaveCalendar;
199 }
200
201 }