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.clocklog.service; 017 018 import java.util.ArrayList; 019 import java.util.Date; 020 import java.util.Iterator; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.apache.commons.lang.StringUtils; 025 import org.kuali.hr.job.Job; 026 import org.kuali.hr.time.clocklog.ClockLog; 027 import org.kuali.hr.time.department.Department; 028 import org.kuali.hr.time.missedpunch.MissedPunchDocument; 029 import org.kuali.hr.time.roles.TkRole; 030 import org.kuali.hr.time.service.base.TkServiceLocator; 031 import org.kuali.hr.time.util.TKContext; 032 import org.kuali.hr.time.util.TKUtils; 033 import org.kuali.hr.time.util.TkConstants; 034 import org.kuali.hr.time.workflow.TimesheetDocumentHeader; 035 import org.kuali.hr.time.workflow.service.TimesheetDocumentHeaderService; 036 import org.kuali.rice.kns.lookup.HtmlData; 037 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl; 038 import org.kuali.rice.krad.bo.BusinessObject; 039 040 public class ClockLogLookupableHelper extends KualiLookupableHelperServiceImpl { 041 /** 042 * 043 */ 044 private static final long serialVersionUID = 1L; 045 046 @Override 047 public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, 048 List pkNames) { 049 List<HtmlData> customActionUrls = super.getCustomActionUrls( 050 businessObject, pkNames); 051 List<HtmlData> overrideUrls = new ArrayList<HtmlData>(); 052 053 //Add missed punch to the clock log if it has one 054 ClockLog clockLog = (ClockLog)businessObject; 055 MissedPunchDocument mpDoc = TkServiceLocator.getMissedPunchService().getMissedPunchByClockLogId(clockLog.getTkClockLogId()); 056 if(mpDoc != null){ 057 clockLog.setMissedPunchDocumentId(mpDoc.getDocumentNumber()); 058 } 059 060 for(HtmlData actionUrl : customActionUrls){ 061 if(!StringUtils.equals(actionUrl.getMethodToCall(), "copy")){ 062 overrideUrls.add(actionUrl); 063 } 064 } 065 if (TKContext.getUser().isSystemAdmin() || TKContext.getUser().isGlobalViewOnly()) { 066 clockLog = (ClockLog) businessObject; 067 final String className = this.getBusinessObjectClass().getName(); 068 final String tkClockLogId = clockLog.getTkClockLogId(); 069 HtmlData htmlData = new HtmlData() { 070 071 @Override 072 public String constructCompleteHtmlTag() { 073 return "<a target=\"_blank\" href=\"inquiry.do?businessObjectClassName=" 074 + className 075 + "&methodToCall=start&tkClockLogId=" 076 + tkClockLogId + "\">view</a>"; 077 } 078 }; 079 overrideUrls.add(htmlData); 080 } else if (overrideUrls.size() != 0) { 081 overrideUrls.remove(0); 082 } 083 return overrideUrls; 084 } 085 086 @Override 087 public List<? extends BusinessObject> getSearchResults( 088 Map<String, String> fieldValues) { 089 List<? extends BusinessObject> objectList = new ArrayList<BusinessObject>(); 090 091 092 TimesheetDocumentHeaderService timesheetDocumentHeaderService = TkServiceLocator.getTimesheetDocumentHeaderService(); 093 094 // search if documentid is given for search critria. 095 String documentId =fieldValues.get("documentId"); 096 if(documentId != null && StringUtils.isNotEmpty(documentId)) { 097 fieldValues.remove("documentId"); 098 099 TimesheetDocumentHeader timesheetDocumentHeader = timesheetDocumentHeaderService.getDocumentHeader(documentId); 100 if(timesheetDocumentHeader == null) { 101 objectList = new ArrayList<BusinessObject>(); 102 } else { 103 String timesheetUserId = timesheetDocumentHeader.getPrincipalId(); 104 Date beginDate = timesheetDocumentHeader.getBeginDate(); 105 Date endDate = timesheetDocumentHeader.getEndDate(); 106 objectList = super.getSearchResultsUnbounded(fieldValues); 107 Iterator itr = objectList.iterator(); 108 while (itr.hasNext()) { 109 ClockLog cl = (ClockLog) itr.next(); 110 cl.setDocumentId(timesheetUserId); 111 if(cl.getPrincipalId().equalsIgnoreCase(timesheetUserId)) { 112 if(new Date(cl.getClockTimestamp().getTime()).compareTo(beginDate) >= 0 && new Date(cl.getClockTimestamp().getTime()).compareTo(endDate) <= 0) { 113 continue; 114 } else { 115 itr.remove(); 116 } 117 } else { 118 itr.remove(); 119 } 120 } 121 } 122 } else { 123 objectList = super.getSearchResults(fieldValues); 124 } 125 126 if (!objectList.isEmpty()) { 127 Iterator itr = objectList.iterator(); 128 while (itr.hasNext()) { 129 ClockLog cl = (ClockLog) itr.next(); 130 131 // Set Document Id 132 if(cl.getDocumentId() == null) { 133 TimesheetDocumentHeader tsdh = timesheetDocumentHeaderService.getDocumentHeaderForDate(cl.getPrincipalId(), cl.getClockTimestamp()); 134 if(tsdh != null) { 135 cl.setDocumentId(tsdh.getDocumentId()); 136 } 137 } 138 139 List<TkRole> tkRoles = TkServiceLocator.getTkRoleService() 140 .getRoles(TKContext.getPrincipalId(), 141 TKUtils.getCurrentDate()); 142 Job job = TkServiceLocator.getJobService().getJob( 143 cl.getUserPrincipalId(), cl.getJobNumber(), 144 TKUtils.getCurrentDate(), false); 145 boolean valid = false; 146 for (TkRole tkRole : tkRoles) { 147 if (StringUtils.equals(tkRole.getRoleName(), 148 TkConstants.ROLE_TK_SYS_ADMIN) 149 || (StringUtils.equals(tkRole.getRoleName(), 150 TkConstants.ROLE_TK_APPROVER) && cl 151 .getWorkArea().equals(tkRole.getWorkArea())) 152 || (StringUtils.equals(tkRole.getRoleName(), 153 TkConstants.ROLE_TK_DEPT_ADMIN) && (job != null && (job 154 .getDept().equals(tkRole.getDepartment()))))) { 155 valid = true; 156 break; 157 } 158 if(StringUtils.equals(tkRole.getRoleName(), TkConstants.ROLE_TK_LOCATION_ADMIN) && job != null && tkRole.getLocationObj()!=null){ 159 List<Department> departments = TkServiceLocator.getDepartmentService().getDepartmentByLocation(tkRole.getLocationObj().getLocation()); 160 for(Department department : departments){ 161 if(StringUtils.equals(job.getDept(), department.getDept())){ 162 valid = true; 163 break; 164 } 165 } 166 if(valid){ 167 break; 168 } 169 } 170 } 171 if (!valid) { 172 itr.remove(); 173 continue; 174 } 175 } 176 } 177 return objectList; 178 } 179 180 181 }