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