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