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