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 org.apache.commons.lang.StringUtils; 019 import org.kuali.hr.time.service.base.TkServiceLocator; 020 import org.kuali.hr.time.timeblock.TimeBlock; 021 import org.kuali.hr.time.timesheet.TimesheetDocument; 022 import org.kuali.hr.time.timesummary.TimeSummary; 023 import org.kuali.hr.time.util.TKContext; 024 import org.kuali.hr.time.util.TkConstants; 025 import org.kuali.rice.kew.api.KewApiConstants; 026 import org.kuali.rice.kew.api.note.Note; 027 import org.kuali.rice.kew.doctype.SecuritySession; 028 import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue; 029 import org.kuali.rice.kew.service.KEWServiceLocator; 030 import org.kuali.rice.kim.api.identity.principal.Principal; 031 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 032 033 import java.io.Serializable; 034 import java.math.BigDecimal; 035 import java.util.*; 036 037 public class ApprovalTimeSummaryRow implements Comparable<ApprovalTimeSummaryRow>, Serializable { 038 private String name; 039 private List<TimeBlock> lstTimeBlocks = new ArrayList<TimeBlock>(); 040 /** A Map (Assignment key) of Mapped totals (pay label mapping) */ 041 private Map<String, Map<String, BigDecimal>> approverHoursByAssignment; 042 /** A Map (Assignment key) of Mapped totals (pay label mapping) */ 043 private Map<String, Map<String, BigDecimal>> otherHoursByAssignment; 044 /** A String (AssignmentDescriptionKey) to Description mapping for all assignments on this summary row */ 045 private Map<String,String> assignmentDescriptions; // could refactor out to action level call 046 047 private String approvalStatus; 048 private String approvalStatusMessage; 049 private String documentId; 050 private Map<String,BigDecimal> hoursToPayLabelMap = new HashMap<String,BigDecimal>(); 051 private Map<String,BigDecimal> hoursToFlsaPayLabelMap = new HashMap<String,BigDecimal>(); 052 private String clockStatusMessage; 053 private String payCalendarGroup; 054 private List<Note> notes = new ArrayList<Note>(); 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 setHoursToFlsaPayLabelMap(Map<String,BigDecimal> hoursToFlsaPayLabelMap) { 126 this.hoursToFlsaPayLabelMap = hoursToFlsaPayLabelMap; 127 } 128 public Map<String,BigDecimal> getHoursToFlsaPayLabelMap() { 129 return hoursToFlsaPayLabelMap; 130 } 131 public void setClockStatusMessage(String clockStatusMessage) { 132 this.clockStatusMessage = clockStatusMessage; 133 } 134 public String getClockStatusMessage() { 135 return clockStatusMessage; 136 } 137 138 public String getPayCalendarGroup() { 139 return payCalendarGroup; 140 } 141 142 public void setPayCalendarGroup(String payCalendarGroup) { 143 this.payCalendarGroup = payCalendarGroup; 144 } 145 146 /** 147 * Is this record initiated? 148 * @return true if initiated, false otherwise. 149 */ 150 public boolean isRoutable() { 151 return StringUtils.equals(getApprovalStatus(), TkConstants.ROUTE_STATUS.INITIATED); 152 } 153 154 /** 155 * Is this record ready to be approved? 156 * @return true if a valid TK_APPROVER / TK_PROCESSOR can approve, false otherwise. 157 */ 158 public boolean isApprovable() { 159 boolean isEnroute = StringUtils.equals(getApprovalStatus(), "ENROUTE") ; 160 161 if(isEnroute){ 162 163 TimesheetDocument doc = TkServiceLocator.getTimesheetService().getTimesheetDocument(this.documentId); 164 //is there a pending bt doc? 165 if (!TkServiceLocator.getTimesheetService().isReadyToApprove(doc)) { 166 return false; 167 } 168 169 DocumentRouteHeaderValue routeHeader = TkServiceLocator.getTimeApproveService().getRouteHeader(this.getDocumentId()); 170 boolean authorized = KEWServiceLocator.getDocumentSecurityService().routeLogAuthorized(TKContext.getPrincipalId(), routeHeader, new SecuritySession(TKContext.getPrincipalId())); 171 if(authorized){ 172 List<String> principalsToApprove = KEWServiceLocator.getActionRequestService().getPrincipalIdsWithPendingActionRequestByActionRequestedAndDocId(KewApiConstants.ACTION_REQUEST_APPROVE_REQ, this.getDocumentId()); 173 if(!principalsToApprove.isEmpty() && principalsToApprove.contains(TKContext.getPrincipalId())){ 174 return true; 175 } 176 } 177 } 178 return false; 179 } 180 181 /** 182 * Helper method to grab the URL parameters for setting target mode for a 183 * user/documentID timesheet. Returns a portion simlar to: 184 * 185 * @return parameter portion of a URL, usable to initiate target mode. 186 */ 187 public String getTimesheetUserTargetURLParams() { 188 StringBuffer link = new StringBuffer(); 189 190 link.append("methodToCall=changeTargetPerson"); 191 link.append("&documentId=").append(this.getDocumentId()); 192 Principal person = KimApiServiceLocator.getIdentityService().getPrincipal(this.getPrincipalId()); 193 link.append("&principalName=").append(person.getPrincipalName()); 194 195 return link.toString(); 196 } 197 198 public List<Note> getNotes() { 199 return notes; 200 } 201 202 public void setNotes(List<Note> notes) { 203 this.notes = notes; 204 } 205 206 public List<String> getWarnings() { 207 return warnings; 208 } 209 210 public void setWarnings(List<String> warnings) { 211 this.warnings = warnings; 212 } 213 214 public Set<String> getWorkAreas() { 215 return workAreas; 216 } 217 218 public void setWorkAreas(Set<String> workAreas) { 219 this.workAreas = workAreas; 220 } 221 222 public String getPrincipalId() { 223 return principalId; 224 } 225 226 public void setPrincipalId(String principalId) { 227 this.principalId = principalId; 228 } 229 public Boolean getClockedInOverThreshold() { 230 return clockedInOverThreshold; 231 } 232 public void setClockedInOverThreshold(Boolean clockedInOverThreshold) { 233 this.clockedInOverThreshold = clockedInOverThreshold; 234 } 235 public String getSelected() { 236 return selected; 237 } 238 239 public void setSelected(String selected) { 240 this.selected = selected; 241 } 242 243 public TimeSummary getTimeSummary() { 244 return timeSummary; 245 } 246 247 public void setTimeSummary(TimeSummary timeSummary) { 248 this.timeSummary = timeSummary; 249 } 250 251 public BigDecimal getPeriodTotal() { 252 return periodTotal; 253 } 254 255 public void setPeriodTotal(BigDecimal periodTotal) { 256 this.periodTotal = periodTotal; 257 } 258 259 public int compareTo(ApprovalTimeSummaryRow row) { 260 return name.compareToIgnoreCase(row.getName()); 261 } 262 }