001 /** 002 * Copyright 2004-2012 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.timeblock.service; 017 018 import java.text.DateFormat; 019 import java.text.ParseException; 020 import java.text.SimpleDateFormat; 021 import java.util.ArrayList; 022 import java.util.Collections; 023 import java.util.Comparator; 024 import java.util.Date; 025 import java.util.HashMap; 026 import java.util.Iterator; 027 import java.util.List; 028 import java.util.Map; 029 030 import org.apache.commons.lang.StringUtils; 031 import org.joda.time.Interval; 032 import org.kuali.hr.time.timeblock.TimeBlockHistory; 033 import org.kuali.hr.time.timeblock.TimeBlockHistoryDetail; 034 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl; 035 import org.kuali.rice.krad.bo.BusinessObject; 036 037 public class TimeBlockHistoryDetailLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl { 038 039 /** 040 * 041 */ 042 private static final long serialVersionUID = 1L; 043 044 static final String DOC_ID = "documentId"; 045 static final String DOC_STATUS_ID = "timesheetDocumentHeader.documentStatus"; 046 static final String BEGIN_DATE_ID = "beginDate"; 047 048 @SuppressWarnings("unchecked") 049 @Override 050 public List<? extends BusinessObject> getSearchResults(java.util.Map<String, String> fieldValues) { 051 052 String docStatus = "", beginDateString = ""; 053 054 if (fieldValues.containsKey(DOC_STATUS_ID)) { 055 docStatus = fieldValues.get(DOC_STATUS_ID); 056 fieldValues.remove(DOC_STATUS_ID); 057 } 058 if (fieldValues.containsKey(BEGIN_DATE_ID)) { 059 beginDateString = fieldValues.get(BEGIN_DATE_ID); 060 fieldValues.remove(BEGIN_DATE_ID); 061 } 062 List<TimeBlockHistoryDetail> objectList = (List<TimeBlockHistoryDetail>) super.getSearchResults(fieldValues); 063 Map<String,List<TimeBlockHistoryDetail>> timeBlockHistoryToDetailMap = new HashMap<String,List<TimeBlockHistoryDetail>>(); 064 Map<String,List<TimeBlockHistoryDetail>> filteredTimeBlockHistoryToDetailMap = new HashMap<String,List<TimeBlockHistoryDetail>>(); 065 066 if (!objectList.isEmpty()) { 067 for(TimeBlockHistoryDetail tbhd : objectList){ 068 if(!timeBlockHistoryToDetailMap.containsKey(tbhd.getTkTimeBlockHistoryId())){ 069 List<TimeBlockHistoryDetail> thdList = new ArrayList<TimeBlockHistoryDetail>(); 070 timeBlockHistoryToDetailMap.put(tbhd.getTkTimeBlockHistoryId(), thdList); 071 } 072 073 List<TimeBlockHistoryDetail> thdList = timeBlockHistoryToDetailMap.get(tbhd.getTkTimeBlockHistoryId()); 074 thdList.add(tbhd); 075 } 076 filteredTimeBlockHistoryToDetailMap.putAll(timeBlockHistoryToDetailMap); 077 078 Iterator<String> itr = timeBlockHistoryToDetailMap.keySet().iterator(); 079 while(itr.hasNext()){ 080 String timeHourDetailId = itr.next(); 081 List<TimeBlockHistoryDetail> tbhdList = timeBlockHistoryToDetailMap.get(timeHourDetailId); 082 TimeBlockHistoryDetail tbhd = tbhdList.get(0); 083 TimeBlockHistory tbh = tbhd.getTimeBlockHistory(); 084 085 if(StringUtils.isNotEmpty(docStatus)){ 086 if(tbh.getTimesheetDocumentHeader() == null){ 087 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId); 088 continue; 089 } else { 090 if (tbh.getTimesheetDocumentHeader().getDocumentStatus() != null) { 091 if (!tbh.getTimesheetDocumentHeader().getDocumentStatus().equals(docStatus)) { 092 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId); 093 continue; 094 } 095 } else { 096 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId); 097 continue; 098 } 099 } 100 } 101 102 if(StringUtils.isNotEmpty(beginDateString)) { 103 if(tbh.getBeginDate() != null) { 104 if(!this.inDateRange(tbh.getBeginDate(), beginDateString)) { 105 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId); 106 continue; 107 } 108 } else { 109 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId); 110 continue; 111 } 112 } 113 } 114 } 115 116 List<TimeBlockHistoryDetail> lstFinalList = new ArrayList<TimeBlockHistoryDetail>(); 117 for(List<TimeBlockHistoryDetail> tbhdList : filteredTimeBlockHistoryToDetailMap.values()){ 118 lstFinalList.addAll(tbhdList); 119 } 120 121 sortByTimeBlockId(lstFinalList); 122 return lstFinalList; 123 } 124 125 private void sortByTimeBlockId(List<TimeBlockHistoryDetail> objectList) { 126 Collections.sort(objectList, new Comparator<TimeBlockHistoryDetail>() { // Sort the Time Blocks 127 @Override 128 public int compare(TimeBlockHistoryDetail timeBlockHistory, TimeBlockHistoryDetail timeBlockHistory1) { 129 return timeBlockHistory.getTimeBlockHistory().getTkTimeBlockId().compareTo(timeBlockHistory1.getTimeBlockHistory().getTkTimeBlockId()); 130 } 131 }); 132 } 133 134 public boolean inDateRange(Date asOfDate, String dateString) { 135 try { 136 DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); 137 Date dateFrom; 138 Date dateTo; 139 String subDateString; 140 if(dateString.indexOf("..") == 10) { 141 subDateString= dateString.substring(0, 10); 142 dateFrom = df.parse(subDateString); 143 subDateString= dateString.substring(12, dateString.length()); 144 dateTo = df.parse(subDateString); 145 if(asOfDate != null) { 146 Interval range = new Interval(dateFrom.getTime(),dateTo.getTime()); 147 return range.contains(asOfDate.getTime()); 148 } else { 149 return false; 150 } 151 } else{ 152 subDateString= dateString.substring(2, dateString.length()); 153 dateTo = df.parse(subDateString); 154 if(asOfDate != null) { 155 if( (dateString.startsWith(">=") && asOfDate.before(dateTo)) 156 || (dateString.startsWith("<=") && asOfDate.after(dateTo))) { 157 return false; 158 } 159 } else { 160 return false; 161 } 162 } 163 } catch (ParseException e) { 164 } 165 return true; 166 } 167 }