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.approval.web; 017 018 import java.io.Serializable; 019 import java.math.BigDecimal; 020 import java.util.ArrayList; 021 import java.util.HashMap; 022 import java.util.List; 023 import java.util.Map; 024 import java.util.Set; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.kuali.hr.time.service.base.TkServiceLocator; 028 import org.kuali.hr.time.timeblock.TimeBlock; 029 import org.kuali.hr.time.timesheet.TimesheetDocument; 030 import org.kuali.hr.time.timesummary.TimeSummary; 031 import org.kuali.hr.time.util.TKContext; 032 import org.kuali.hr.time.util.TkConstants; 033 import org.kuali.rice.kew.api.KewApiConstants; 034 import org.kuali.rice.kew.api.document.DocumentStatus; 035 import org.kuali.rice.kew.api.note.Note; 036 import org.kuali.rice.kew.doctype.SecuritySession; 037 import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue; 038 import org.kuali.rice.kew.service.KEWServiceLocator; 039 import org.kuali.rice.kim.api.identity.principal.Principal; 040 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 041 042 public class ApprovalTimeSummaryRow implements Comparable<ApprovalTimeSummaryRow>, Serializable { 043 private String name; 044 private List<TimeBlock> lstTimeBlocks = new ArrayList<TimeBlock>(); 045 /** A Map (Assignment key) of Mapped totals (pay label mapping) */ 046 private Map<String, Map<String, BigDecimal>> approverHoursByAssignment; 047 /** A Map (Assignment key) of Mapped totals (pay label mapping) */ 048 private Map<String, Map<String, BigDecimal>> otherHoursByAssignment; 049 /** A String (AssignmentDescriptionKey) to Description mapping for all assignments on this summary row */ 050 private Map<String,String> assignmentDescriptions; // could refactor out to action level call 051 052 private String approvalStatus; 053 private String approvalStatusMessage; 054 private String documentId; 055 private Map<String,BigDecimal> hoursToPayLabelMap = new HashMap<String,BigDecimal>(); 056 private Map<String,BigDecimal> hoursToFlsaPayLabelMap = new HashMap<String,BigDecimal>(); 057 private String clockStatusMessage; 058 private String payCalendarGroup; 059 private List<Note> notes = new ArrayList<Note>(); 060 private List<String> warnings = new ArrayList<String>(); 061 private Set<String> workAreas; 062 private String principalId; 063 private Boolean clockedInOverThreshold = Boolean.FALSE; 064 private String selected = "off"; 065 private TimeSummary timeSummary; 066 private BigDecimal periodTotal = BigDecimal.ZERO; 067 068 public String getApprovalStatusMessage() { 069 return approvalStatusMessage; 070 } 071 072 public void setApprovalStatusMessage(String approvalStatusMessage) { 073 this.approvalStatusMessage = approvalStatusMessage; 074 } 075 076 public Map<String, String> getAssignmentDescriptions() { 077 return assignmentDescriptions; 078 } 079 080 public void setAssignmentDescriptions(Map<String, String> assignmentDescriptions) { 081 this.assignmentDescriptions = assignmentDescriptions; 082 } 083 084 public Map<String, Map<String, BigDecimal>> getApproverHoursByAssignment() { 085 return approverHoursByAssignment; 086 } 087 088 public void setApproverHoursByAssignment(Map<String, Map<String, BigDecimal>> approverHoursByAssignment) { 089 this.approverHoursByAssignment = approverHoursByAssignment; 090 } 091 092 public Map<String, Map<String, BigDecimal>> getOtherHoursByAssignment() { 093 return otherHoursByAssignment; 094 } 095 096 public void setOtherHoursByAssignment(Map<String, Map<String, BigDecimal>> otherHoursByAssignment) { 097 this.otherHoursByAssignment = otherHoursByAssignment; 098 } 099 100 public String getName() { 101 return name; 102 } 103 public void setName(String name) { 104 this.name = name; 105 } 106 public List<TimeBlock> getLstTimeBlocks() { 107 return lstTimeBlocks; 108 } 109 public void setLstTimeBlocks(List<TimeBlock> lstTimeBlocks) { 110 this.lstTimeBlocks = lstTimeBlocks; 111 } 112 public String getApprovalStatus() { 113 return approvalStatus; 114 } 115 public void setApprovalStatus(String approvalStatus) { 116 this.approvalStatus = approvalStatus; 117 } 118 public void setDocumentId(String documentId) { 119 this.documentId = documentId; 120 } 121 public String getDocumentId() { 122 return documentId; 123 } 124 public void setHoursToPayLabelMap(Map<String,BigDecimal> hoursToPayLabelMap) { 125 this.hoursToPayLabelMap = hoursToPayLabelMap; 126 } 127 public Map<String,BigDecimal> getHoursToPayLabelMap() { 128 return hoursToPayLabelMap; 129 } 130 public void setHoursToFlsaPayLabelMap(Map<String,BigDecimal> hoursToFlsaPayLabelMap) { 131 this.hoursToFlsaPayLabelMap = hoursToFlsaPayLabelMap; 132 } 133 public Map<String,BigDecimal> getHoursToFlsaPayLabelMap() { 134 return hoursToFlsaPayLabelMap; 135 } 136 public void setClockStatusMessage(String clockStatusMessage) { 137 this.clockStatusMessage = clockStatusMessage; 138 } 139 public String getClockStatusMessage() { 140 return clockStatusMessage; 141 } 142 143 public String getPayCalendarGroup() { 144 return payCalendarGroup; 145 } 146 147 public void setPayCalendarGroup(String payCalendarGroup) { 148 this.payCalendarGroup = payCalendarGroup; 149 } 150 151 /** 152 * Is this record initiated? 153 * @return true if initiated, false otherwise. 154 */ 155 public boolean isRoutable() { 156 return StringUtils.equals(getApprovalStatus(), TkConstants.ROUTE_STATUS.INITIATED); 157 } 158 159 public boolean isApprovable() { 160 boolean isApprovable = false; 161 162 if (DocumentStatus.ENROUTE.getLabel().equals(getApprovalStatus())) { 163 TimesheetDocument timesheetDocument = TkServiceLocator.getTimesheetService().getTimesheetDocument(getDocumentId()); 164 if (timesheetDocument != null) { 165 String timesheetPrincipalId = timesheetDocument.getPrincipalId(); 166 String approverPrincipalId = TKContext.getPrincipalId(); 167 168 if (!StringUtils.equals(timesheetPrincipalId, approverPrincipalId) && TkServiceLocator.getTimesheetService().isReadyToApprove(timesheetDocument)) { 169 DocumentRouteHeaderValue routeHeader = TkServiceLocator.getTimeApproveService().getRouteHeader(getDocumentId()); 170 boolean authorized = KEWServiceLocator.getDocumentSecurityService().routeLogAuthorized(approverPrincipalId, routeHeader, new SecuritySession(approverPrincipalId)); 171 if (authorized) { 172 List<String> approverPrincipalIds = KEWServiceLocator.getActionRequestService().getPrincipalIdsWithPendingActionRequestByActionRequestedAndDocId(KewApiConstants.ACTION_REQUEST_APPROVE_REQ, getDocumentId()); 173 if (approverPrincipalIds.contains(approverPrincipalId)) { 174 isApprovable = true; 175 } 176 } 177 } 178 } 179 } 180 181 return isApprovable; 182 } 183 184 /** 185 * Helper method to grab the URL parameters for setting target mode for a 186 * user/documentID timesheet. Returns a portion simlar to: 187 * 188 * @return parameter portion of a URL, usable to initiate target mode. 189 */ 190 public String getTimesheetUserTargetURLParams() { 191 StringBuffer link = new StringBuffer(); 192 193 link.append("methodToCall=changeTargetPerson"); 194 link.append("&documentId=").append(this.getDocumentId()); 195 Principal person = KimApiServiceLocator.getIdentityService().getPrincipal(this.getPrincipalId()); 196 link.append("&principalName=").append(person.getPrincipalName()); 197 198 return link.toString(); 199 } 200 201 public List<Note> getNotes() { 202 return notes; 203 } 204 205 public void setNotes(List<Note> notes) { 206 this.notes = notes; 207 } 208 209 public List<String> getWarnings() { 210 return warnings; 211 } 212 213 public void setWarnings(List<String> warnings) { 214 this.warnings = warnings; 215 } 216 217 public Set<String> getWorkAreas() { 218 return workAreas; 219 } 220 221 public void setWorkAreas(Set<String> workAreas) { 222 this.workAreas = workAreas; 223 } 224 225 public String getPrincipalId() { 226 return principalId; 227 } 228 229 public void setPrincipalId(String principalId) { 230 this.principalId = principalId; 231 } 232 public Boolean getClockedInOverThreshold() { 233 return clockedInOverThreshold; 234 } 235 public void setClockedInOverThreshold(Boolean clockedInOverThreshold) { 236 this.clockedInOverThreshold = clockedInOverThreshold; 237 } 238 public String getSelected() { 239 return selected; 240 } 241 242 public void setSelected(String selected) { 243 this.selected = selected; 244 } 245 246 public TimeSummary getTimeSummary() { 247 return timeSummary; 248 } 249 250 public void setTimeSummary(TimeSummary timeSummary) { 251 this.timeSummary = timeSummary; 252 } 253 254 public BigDecimal getPeriodTotal() { 255 return periodTotal; 256 } 257 258 public void setPeriodTotal(BigDecimal periodTotal) { 259 this.periodTotal = periodTotal; 260 } 261 262 public int compareTo(ApprovalTimeSummaryRow row) { 263 return name.compareToIgnoreCase(row.getName()); 264 } 265 }