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.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.job.Job;
033 import org.kuali.hr.lm.leaveblock.LeaveBlockHistory;
034 import org.kuali.hr.time.department.Department;
035 import org.kuali.hr.time.roles.TkRole;
036 import org.kuali.hr.time.service.base.TkServiceLocator;
037 import org.kuali.hr.time.timeblock.TimeBlockHistory;
038 import org.kuali.hr.time.timeblock.TimeBlockHistoryDetail;
039 import org.kuali.hr.time.util.TKContext;
040 import org.kuali.hr.time.util.TKUtils;
041 import org.kuali.hr.time.util.TkConstants;
042 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
043 import org.kuali.rice.krad.bo.BusinessObject;
044
045 public class TimeBlockHistoryDetailLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl {
046
047 /**
048 *
049 */
050 private static final long serialVersionUID = 1L;
051
052 static final String DOC_ID = "documentId";
053 static final String DOC_STATUS_ID = "timeBlockHistory.timesheetDocumentHeader.documentStatus";
054 static final String BEGIN_DATE_ID = "beginDate";
055
056 @SuppressWarnings("unchecked")
057 @Override
058 public List<? extends BusinessObject> getSearchResults(java.util.Map<String, String> fieldValues) {
059
060 String docStatus = "", beginDateString = "";
061
062 if (fieldValues.containsKey(DOC_STATUS_ID)) {
063 docStatus = fieldValues.get(DOC_STATUS_ID);
064 fieldValues.remove(DOC_STATUS_ID);
065 }
066 if (fieldValues.containsKey(BEGIN_DATE_ID)) {
067 beginDateString = fieldValues.get(BEGIN_DATE_ID);
068 fieldValues.remove(BEGIN_DATE_ID);
069 }
070 List<TimeBlockHistoryDetail> objectList = (List<TimeBlockHistoryDetail>) super.getSearchResults(fieldValues);
071 Map<String,List<TimeBlockHistoryDetail>> timeBlockHistoryToDetailMap = new HashMap<String,List<TimeBlockHistoryDetail>>();
072 Map<String,List<TimeBlockHistoryDetail>> filteredTimeBlockHistoryToDetailMap = new HashMap<String,List<TimeBlockHistoryDetail>>();
073
074 if (!objectList.isEmpty()) {
075 this.filterWithSecurity(objectList);
076
077 for(TimeBlockHistoryDetail tbhd : objectList){
078 if(!timeBlockHistoryToDetailMap.containsKey(tbhd.getTkTimeBlockHistoryId())){
079 List<TimeBlockHistoryDetail> thdList = new ArrayList<TimeBlockHistoryDetail>();
080 timeBlockHistoryToDetailMap.put(tbhd.getTkTimeBlockHistoryId(), thdList);
081 }
082
083 List<TimeBlockHistoryDetail> thdList = timeBlockHistoryToDetailMap.get(tbhd.getTkTimeBlockHistoryId());
084 thdList.add(tbhd);
085 }
086 filteredTimeBlockHistoryToDetailMap.putAll(timeBlockHistoryToDetailMap);
087
088 for (Map.Entry<String, List<TimeBlockHistoryDetail>> entry : timeBlockHistoryToDetailMap.entrySet()) {
089 String timeHourDetailId = entry.getKey();
090 List<TimeBlockHistoryDetail> tbhdList = entry.getValue();
091 TimeBlockHistoryDetail tbhd = tbhdList.get(0);
092 TimeBlockHistory tbh = tbhd.getTimeBlockHistory();
093
094 if(StringUtils.isNotEmpty(docStatus)){
095 if(tbh.getTimesheetDocumentHeader() == null){
096 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId);
097 continue;
098 } else {
099 if (tbh.getTimesheetDocumentHeader().getDocumentStatus() != null) {
100 if (!tbh.getTimesheetDocumentHeader().getDocumentStatus().equals(docStatus)) {
101 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId);
102 continue;
103 }
104 } else {
105 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId);
106 continue;
107 }
108 }
109 }
110
111 if(StringUtils.isNotEmpty(beginDateString)) {
112 if(tbh.getBeginDate() != null) {
113 if(!this.inDateRange(tbh.getBeginDate(), beginDateString)) {
114 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId);
115 continue;
116 }
117 } else {
118 filteredTimeBlockHistoryToDetailMap.remove(timeHourDetailId);
119 continue;
120 }
121 }
122 }
123 }
124
125 List<TimeBlockHistoryDetail> lstFinalList = new ArrayList<TimeBlockHistoryDetail>();
126 for(List<TimeBlockHistoryDetail> tbhdList : filteredTimeBlockHistoryToDetailMap.values()){
127 lstFinalList.addAll(tbhdList);
128 }
129
130 sortByTimeBlockId(lstFinalList);
131 return lstFinalList;
132 }
133
134 private void filterWithSecurity(List<TimeBlockHistoryDetail> objectList) {
135 Iterator<? extends BusinessObject> itr = objectList.iterator();
136 List<TkRole> tkRoles = TkServiceLocator.getTkRoleService().getRoles(TKContext.getPrincipalId(), TKUtils.getCurrentDate());
137 while(itr.hasNext()){
138 TimeBlockHistoryDetail tbhd = (TimeBlockHistoryDetail)itr.next();
139 Job job = TkServiceLocator.getJobService().getJob(tbhd.getTimeBlockHistory().getPrincipalId(), tbhd.getTimeBlockHistory().getJobNumber(), tbhd.getTimeBlockHistory().getEndTimestamp(), false);
140 boolean valid = false;
141 for (TkRole tkRole : tkRoles) {
142 if (StringUtils.equals(tkRole.getRoleName(),
143 TkConstants.ROLE_TK_SYS_ADMIN)
144 || (StringUtils.equals(tkRole.getRoleName(), TkConstants.ROLE_TK_GLOBAL_VO))
145 || (StringUtils.equals(tkRole.getRoleName(),
146 TkConstants.ROLE_TK_APPROVER) && tbhd.getTimeBlockHistory().getWorkArea().equals(tkRole.getWorkArea()))
147 || (StringUtils.equals(tkRole.getRoleName(),
148 TkConstants.ROLE_TK_DEPT_ADMIN) && (job != null && (job.getDept().equals(tkRole.getDepartment()))))) {
149 valid = true;
150 break;
151 }
152 if(StringUtils.equals(tkRole.getRoleName(), TkConstants.ROLE_TK_LOCATION_ADMIN) && job != null && tkRole.getLocationObj()!=null){
153 List<Department> departments = TkServiceLocator.getDepartmentService().getDepartmentByLocation(tkRole.getLocationObj().getLocation());
154 for(Department department : departments){
155 if(StringUtils.equals(job.getDept(), department.getDept())){
156 valid = true;
157 break;
158 }
159 }
160 if(valid){
161 break;
162 }
163 }
164 }
165 if (!valid) {
166 itr.remove();
167 continue;
168 }
169 }
170 }
171
172 private void sortByTimeBlockId(List<TimeBlockHistoryDetail> objectList) {
173 Collections.sort(objectList, new Comparator<TimeBlockHistoryDetail>() { // Sort the Time Blocks
174 @Override
175 public int compare(TimeBlockHistoryDetail timeBlockHistory, TimeBlockHistoryDetail timeBlockHistory1) {
176 //test for nulls.
177 if (timeBlockHistory.getTimeBlockHistory().getTkTimeBlockId() == null || timeBlockHistory1.getTimeBlockHistory().getTkTimeBlockId() == null) {
178 if (timeBlockHistory.getTimeBlockHistory().getTkTimeBlockId() == null && timeBlockHistory1.getTimeBlockHistory().getTkTimeBlockId() == null) {
179 return 0;
180 }
181 else {
182 return timeBlockHistory.getTimeBlockHistory().getTkTimeBlockId() == null ? -1 : 1;
183 }
184 }
185
186 return timeBlockHistory.getTimeBlockHistory().getTkTimeBlockId().compareTo(timeBlockHistory1.getTimeBlockHistory().getTkTimeBlockId());
187 }
188 });
189 }
190
191 public boolean inDateRange(Date asOfDate, String dateString) {
192 try {
193 DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
194 java.util.Date dateFrom = df.parse(TKUtils.getFromDateString(dateString));
195 java.util.Date dateTo = df.parse(TKUtils.getToDateString(dateString));;
196
197 if(dateString.indexOf("..") == 10) {
198 if(asOfDate != null) {
199 Interval range = new Interval(dateFrom.getTime(),dateTo.getTime());
200 return range.contains(asOfDate.getTime());
201 } else {
202 return false;
203 }
204 } else{
205 if(asOfDate != null) {
206 if( (dateString.startsWith(">=") && asOfDate.before(dateTo))
207 || (dateString.startsWith("<=") && asOfDate.after(dateTo))) {
208 return false;
209 }
210 } else {
211 return false;
212 }
213 }
214 } catch (ParseException e) {
215 }
216 return true;
217 }
218 }