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; 017 018 import java.util.ArrayList; 019 import java.util.Collections; 020 import java.util.Comparator; 021 import java.util.Date; 022 import java.util.HashMap; 023 import java.util.List; 024 import java.util.Map; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.kuali.hr.time.util.TKUtils; 028 import org.kuali.rice.kns.lookup.HtmlData; 029 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl; 030 import org.kuali.rice.kns.lookup.LookupUtils; 031 import org.kuali.rice.krad.bo.BusinessObject; 032 import org.kuali.rice.krad.lookup.CollectionIncomplete; 033 034 public abstract class HrEffectiveDateActiveLookupableHelper extends KualiLookupableHelperServiceImpl{ 035 036 /** 037 * 038 */ 039 private static final long serialVersionUID = 1L; 040 041 @SuppressWarnings("unchecked") 042 @Override 043 /** 044 * Core HR Effective dating lookup logic 045 * alter at your own risk 046 */ 047 public List<? extends BusinessObject> getSearchResults( 048 Map<String, String> fieldValues) { 049 if (fieldValues.containsKey("workArea") 050 && StringUtils.equals(fieldValues.get("workArea"), "%")) { 051 fieldValues.put("workArea", ""); 052 } 053 if (fieldValues.containsKey("jobNumber") 054 && StringUtils.equals(fieldValues.get("jobNumber"), "%")) { 055 fieldValues.put("jobNumber", ""); 056 } 057 if (fieldValues.containsKey("dept") 058 && StringUtils.equals(fieldValues.get("dept"), "%")) { 059 fieldValues.put("dept", ""); 060 } 061 if (fieldValues.containsKey("principalId") 062 && StringUtils.equals(fieldValues.get("principalId"), "%")) { 063 fieldValues.put("principalId", ""); 064 } 065 String showHistory = "Y"; 066 if (fieldValues.containsKey("history")) { 067 showHistory = fieldValues.get("history"); 068 fieldValues.remove("history"); 069 } 070 String active = ""; 071 if(fieldValues.containsKey("active")){ 072 active = fieldValues.get("active"); 073 fieldValues.put("active", ""); 074 } 075 076 List<HrBusinessObject> hrObjList = (List<HrBusinessObject>)super.getSearchResults(fieldValues); 077 //Create a principalId+jobNumber map as this is the unique key for results 078 Map<String,List<HrBusinessObject>> hrBusinessMap = new HashMap<String,List<HrBusinessObject>>(); 079 080 for(HrBusinessObject hrObj : hrObjList){ 081 String key = hrObj.getUniqueKey(); 082 083 //If no key exists for this business object return full collection 084 if(StringUtils.isEmpty(key)){ 085 return hrObjList; 086 } 087 if(hrBusinessMap.get(key)!= null){ 088 List<HrBusinessObject> lstHrBusinessList = hrBusinessMap.get(key); 089 lstHrBusinessList.add(hrObj); 090 } else { 091 List<HrBusinessObject> lstHrBusinessObj = new ArrayList<HrBusinessObject>(); 092 lstHrBusinessObj.add(hrObj); 093 hrBusinessMap.put(key, lstHrBusinessObj); 094 } 095 } 096 097 List<BusinessObject> finalBusinessObjectList = new ArrayList<BusinessObject>(); 098 099 for(List<HrBusinessObject> lstHrBusinessObj: hrBusinessMap.values()){ 100 Collections.sort(lstHrBusinessObj, new EffectiveDateTimestampCompare()); 101 Collections.reverse(lstHrBusinessObj); 102 } 103 104 105 Date currDate = TKUtils.getCurrentDate(); 106 //Active = Both and Show History = Yes 107 //return all results 108 if(StringUtils.isEmpty(active) && StringUtils.equals("Y", showHistory)){ 109 return hrObjList; 110 } 111 //Active = Both and show history = No 112 //return the most effective results from today and any future rows 113 else if(StringUtils.isEmpty(active) && StringUtils.equals("N", showHistory)){ 114 for(List<HrBusinessObject> lstHrBusiness : hrBusinessMap.values()){ 115 for(HrBusinessObject hrBus : lstHrBusiness){ 116 if(hrBus.getEffectiveDate().before(currDate)){ 117 finalBusinessObjectList.add(hrBus); 118 break; 119 } else { 120 finalBusinessObjectList.add(hrBus); 121 } 122 } 123 } 124 } 125 //Active = Yes and Show History = No 126 //return all active records as of today and any active future rows 127 //if there is an inactive record before the active one then do not show the results as this record is inactive 128 else if(StringUtils.equals(active, "Y") && StringUtils.equals("N", showHistory)){ 129 for(List<HrBusinessObject> lstHrBus : hrBusinessMap.values()){ 130 for(HrBusinessObject hrBusinessObject : lstHrBus){ 131 if(!hrBusinessObject.isActive() && hrBusinessObject.getEffectiveDate().before(currDate)){ 132 break; 133 } 134 else { 135 if(hrBusinessObject.getEffectiveDate().before(currDate)){ 136 finalBusinessObjectList.add(hrBusinessObject); 137 break; 138 } else { 139 if(hrBusinessObject.isActive()){ 140 finalBusinessObjectList.add(hrBusinessObject); 141 } 142 } 143 } 144 } 145 } 146 } 147 //Active = Yes and Show History = Yes 148 //return all active records from database 149 //if there is an inactive record before the active one then do not show the results as this record is inactive 150 else if(StringUtils.equals(active, "Y") && StringUtils.equals("Y", showHistory)){ 151 for(List<HrBusinessObject> lstHrBus : hrBusinessMap.values()){ 152 for(HrBusinessObject hrBus : lstHrBus){ 153 if(!hrBus.isActive() && hrBus.getEffectiveDate().before(currDate)){ 154 break; 155 } 156 else if(hrBus.isActive()){ 157 finalBusinessObjectList.add(hrBus); 158 } 159 } 160 } 161 } 162 //Active = No and Show History = Yes 163 //return all inactive records in the database 164 else if(StringUtils.equals(active, "N") && StringUtils.equals(showHistory, "Y")){ 165 for(List<HrBusinessObject> lstHrBus : hrBusinessMap.values()){ 166 for(HrBusinessObject hrBus : lstHrBus){ 167 if(!hrBus.isActive()){ 168 finalBusinessObjectList.add(hrBus); 169 } 170 } 171 } 172 } 173 //Active = No and Show History = No 174 //return the most effective inactive rows if there are no active rows <= the curr date 175 else if(StringUtils.equals(active, "N") && StringUtils.equals(showHistory, "N")){ 176 for(List<HrBusinessObject> lstHrBusiness : hrBusinessMap.values()){ 177 for(HrBusinessObject hrBus : lstHrBusiness){ 178 if(hrBus.getEffectiveDate().before(currDate)){ 179 if(!hrBus.isActive()){ 180 finalBusinessObjectList.add(hrBus); 181 } 182 break; 183 } else { 184 if(!hrBus.isActive()){ 185 finalBusinessObjectList.add(hrBus); 186 } 187 } 188 } 189 } 190 } 191 192 Integer searchResultsLimit = LookupUtils.getSearchResultsLimit(businessObjectClass); 193 194 Long matchingResultsCount = Long.valueOf(finalBusinessObjectList.size()); 195 196 if (matchingResultsCount.intValue() <= searchResultsLimit.intValue()) { 197 198 matchingResultsCount = new Long(0); 199 200 } 201 202 return new CollectionIncomplete(finalBusinessObjectList, matchingResultsCount); 203 204 } 205 @SuppressWarnings("rawtypes") 206 public class EffectiveDateTimestampCompare implements Comparator{ 207 208 @Override 209 public int compare(Object arg0, Object arg1) { 210 HrBusinessObject hrBusinessObject = (HrBusinessObject)arg0; 211 HrBusinessObject hrBusinessObject2 = (HrBusinessObject)arg1; 212 213 java.sql.Date effDate1 = hrBusinessObject.getEffectiveDate(); 214 java.sql.Date effDate2 = hrBusinessObject2.getEffectiveDate(); 215 if (effDate1 == null ^ effDate2 == null) { 216 return (effDate1 == null) ? -1 : 1; 217 } 218 if (effDate1 == null && effDate2 == null) { 219 return 0; 220 } 221 int result = hrBusinessObject.getEffectiveDate().compareTo(hrBusinessObject2.getEffectiveDate()); 222 if(result==0){ 223 return hrBusinessObject.getTimestamp().compareTo(hrBusinessObject2.getTimestamp()); 224 } 225 return result; 226 } 227 228 } 229 @Override 230 public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, 231 @SuppressWarnings("rawtypes") List pkNames) { 232 List<HtmlData> customActionUrls = super.getCustomActionUrls(businessObject, pkNames); 233 List<HtmlData> overrideUrls = new ArrayList<HtmlData>(); 234 for(HtmlData actionUrl : customActionUrls){ 235 if(!StringUtils.equals(actionUrl.getMethodToCall(), "copy")){ 236 overrideUrls.add(actionUrl); 237 } 238 239 } 240 return overrideUrls; 241 } 242 243 244 245 246 }