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.assignment.service; 017 018 import org.apache.commons.collections.CollectionUtils; 019 import org.apache.commons.lang.StringUtils; 020 import org.apache.log4j.Logger; 021 import org.kuali.hr.time.assignment.Assignment; 022 import org.kuali.hr.time.assignment.AssignmentDescriptionKey; 023 import org.kuali.hr.time.assignment.dao.AssignmentDao; 024 import org.kuali.hr.time.calendar.CalendarEntries; 025 import org.kuali.hr.time.service.base.TkServiceLocator; 026 import org.kuali.hr.time.timesheet.TimesheetDocument; 027 import org.kuali.hr.time.util.TKContext; 028 import org.kuali.hr.time.util.TKUtils; 029 030 import java.sql.Date; 031 import java.util.*; 032 033 public class AssignmentServiceImpl implements AssignmentService { 034 035 private static final Logger LOG = Logger.getLogger(AssignmentServiceImpl.class); 036 private AssignmentDao assignmentDao; 037 038 public AssignmentDao getAssignmentDao() { 039 return assignmentDao; 040 } 041 042 public void setAssignmentDao(AssignmentDao assignmentDao) { 043 this.assignmentDao = assignmentDao; 044 } 045 046 047 @Override 048 public List<Assignment> getAssignments(String principalId, Date asOfDate) { 049 List<Assignment> assignments; 050 051 if (asOfDate == null) { 052 asOfDate = TKUtils.getCurrentDate(); 053 } 054 055 assignments = assignmentDao.findAssignments(principalId, asOfDate); 056 057 for (Assignment assignment : assignments) { 058 populateAssignment(assignment, asOfDate); 059 } 060 061 return assignments; 062 } 063 064 public List<Assignment> getAssignments(String principalId, Date beginDate, Date endDate) { 065 List<Assignment> assignments; 066 067 assignments = assignmentDao.findAssignmentsWithinPeriod(principalId, beginDate, endDate); 068 069 for (Assignment assignment : assignments) { 070 populateAssignment(assignment, assignment.getEffectiveDate()); 071 } 072 073 return assignments; 074 } 075 076 077 @Override 078 public List<Assignment> searchAssignments(Date fromEffdt, Date toEffdt, String principalId, String jobNumber, 079 String dept, String workArea, String active, String showHistory) { 080 return assignmentDao.searchAssignments(fromEffdt, toEffdt, principalId, jobNumber, dept, workArea, active, showHistory); 081 } 082 083 084 public List<Assignment> getAssignmentsByPayEntry(String principalId, CalendarEntries payCalendarEntry) { 085 List<Assignment> beginPeriodAssign = getAssignments(principalId, payCalendarEntry.getBeginPeriodDate()); 086 List<Assignment> endPeriodAssign = getAssignments(principalId, payCalendarEntry.getEndPeriodDate()); 087 List<Assignment> assignsWithPeriod = getAssignments(principalId, payCalendarEntry.getBeginPeriodDate(), payCalendarEntry.getEndPeriodDate()); 088 089 List<Assignment> finalAssignments = new ArrayList<Assignment>(); 090 Map<String, Assignment> assignKeyToAssignmentMap = new HashMap<String, Assignment>(); 091 for (Assignment assign : endPeriodAssign) { 092 assignKeyToAssignmentMap.put(TKUtils.formatAssignmentKey(assign.getJobNumber(), assign.getWorkArea(), assign.getTask()), assign); 093 finalAssignments.add(assign); 094 } 095 096 //Compare the begin and end and add any assignments to the end thats are not there 097 for (Assignment assign : beginPeriodAssign) { 098 String assignKey = TKUtils.formatAssignmentKey(assign.getJobNumber(), assign.getWorkArea(), assign.getTask()); 099 if (!assignKeyToAssignmentMap.containsKey(assignKey)) { 100 finalAssignments.add(assign); 101 } 102 } 103 104 // Add the assignments within the pay period 105 for (Assignment assign : assignsWithPeriod) { 106 String assignKey = TKUtils.formatAssignmentKey(assign.getJobNumber(), assign.getWorkArea(), assign.getTask()); 107 if (!assignKeyToAssignmentMap.containsKey(assignKey)) { 108 finalAssignments.add(assign); 109 } 110 } 111 112 return finalAssignments; 113 114 } 115 116 @Override 117 public AssignmentDescriptionKey getAssignmentDescriptionKey(String assignmentKey) { 118 return new AssignmentDescriptionKey(assignmentKey); 119 } 120 121 @Override 122 public Map<String, String> getAssignmentDescriptions(TimesheetDocument td, boolean clockOnlyAssignments) { 123 if (td == null) { 124 throw new RuntimeException("timesheet document is null."); 125 } 126 List<Assignment> assignments = td.getAssignments(); 127 // if(assignments.size() < 1) { 128 // throw new RuntimeException("No assignment on the timesheet document."); 129 // } 130 131 Map<String, String> assignmentDescriptions = new LinkedHashMap<String, String>(); 132 for (Assignment assignment : assignments) { 133 //if the user is not the same as the timesheet and does not have approver access for the assignment 134 //do not add to the display 135 if (!StringUtils.equals(TKContext.getTargetPrincipalId(), TKContext.getPrincipalId())) { 136 if (!TKContext.getUser().isSystemAdmin() && !TKContext.getUser().getReportingWorkAreas().contains(assignment.getWorkArea())) { 137 continue; 138 } 139 } 140 141 //only add to the assignment list if they are synchronous assignments 142 //or clock only assignments is false 143 if (!clockOnlyAssignments || assignment.isSynchronous()) { 144 assignmentDescriptions.putAll(TKUtils.formatAssignmentDescription(assignment)); 145 } 146 } 147 148 return assignmentDescriptions; 149 } 150 151 @Override 152 public Map<String, String> getAssignmentDescriptions(Assignment assignment) { 153 if (assignment == null) { 154 throw new RuntimeException("Assignment is null"); 155 } 156 157 Map<String, String> assignmentDescriptions = new LinkedHashMap<String, String>(); 158 assignmentDescriptions.putAll(TKUtils.formatAssignmentDescription(assignment)); 159 160 return assignmentDescriptions; 161 162 } 163 164 @Override 165 public Assignment getAssignment(TimesheetDocument timesheetDocument, String assignmentKey) { 166 List<Assignment> assignments = timesheetDocument.getAssignments(); 167 AssignmentDescriptionKey desc = getAssignmentDescriptionKey(assignmentKey); 168 169 for (Assignment assignment : assignments) { 170 if (assignment.getJobNumber().compareTo(desc.getJobNumber()) == 0 && 171 assignment.getWorkArea().compareTo(desc.getWorkArea()) == 0 && 172 assignment.getTask().compareTo(desc.getTask()) == 0) { 173 return assignment; 174 } 175 } 176 177 //No assignment found so fetch the inactive ones for this payBeginDate 178 Assignment assign = TkServiceLocator.getAssignmentService().getAssignment(desc, timesheetDocument.getPayCalendarEntry().getBeginPeriodDate()); 179 if (assign != null) { 180 return assign; 181 } 182 183 184 LOG.warn("no matched assignment found"); 185 return new Assignment(); 186 } 187 188 @Override 189 public Assignment getAssignment(String tkAssignmentId) { 190 return getAssignmentDao().getAssignment(tkAssignmentId); 191 } 192 193 194 @Override 195 public List<Assignment> getActiveAssignmentsForWorkArea(Long workArea, Date asOfDate) { 196 List<Assignment> assignments = assignmentDao.getActiveAssignmentsInWorkArea(workArea, asOfDate); 197 for (Assignment assignment : assignments) { 198 populateAssignment(assignment, asOfDate); 199 } 200 return assignments; 201 } 202 203 @Override 204 public List<Assignment> getActiveAssignments(Date asOfDate) { 205 return assignmentDao.getActiveAssignments(asOfDate); 206 } 207 208 private void populateAssignment(Assignment assignment, Date asOfDate) { 209 assignment.setJob(TkServiceLocator.getJobService().getJob(assignment.getPrincipalId(), assignment.getJobNumber(), asOfDate)); 210 assignment.setTimeCollectionRule(TkServiceLocator.getTimeCollectionRuleService().getTimeCollectionRule(assignment.getJob().getDept(), assignment.getWorkArea(), assignment.getJob().getHrPayType(),asOfDate)); 211 assignment.setWorkAreaObj(TkServiceLocator.getWorkAreaService().getWorkArea(assignment.getWorkArea(), asOfDate)); 212 assignment.setDeptLunchRule(TkServiceLocator.getDepartmentLunchRuleService().getDepartmentLunchRule(assignment.getJob().getDept(), 213 assignment.getWorkArea(), assignment.getPrincipalId(), assignment.getJobNumber(), asOfDate)); 214 } 215 216 public Assignment getAssignment(String principalId, AssignmentDescriptionKey key, Date asOfDate) { 217 Assignment a = null; 218 219 if (key != null) { 220 a = assignmentDao.getAssignment(principalId, key.getJobNumber(), key.getWorkArea(), key.getTask(), asOfDate); 221 } 222 223 return a; 224 } 225 226 @Override 227 public Assignment getAssignment(AssignmentDescriptionKey key, Date asOfDate) { 228 Assignment a = null; 229 230 if (key != null) { 231 a = assignmentDao.getAssignment(key.getJobNumber(), key.getWorkArea(), key.getTask(), asOfDate); 232 } 233 234 return a; 235 } 236 237 /** 238 * KPME-1129 Kagata 239 * Get a list of active assignments based on principalId and jobNumber as of a particular date 240 */ 241 @Override 242 public List<Assignment> getActiveAssignmentsForJob(String principalId, Long jobNumber, Date asOfDate) { 243 List<Assignment> assignments = assignmentDao.getActiveAssignmentsForJob(principalId, jobNumber, asOfDate); 244 245 return assignments; 246 } 247 248 @Override 249 public Assignment getMaxTimestampAssignment(String principalId) { 250 return assignmentDao.getMaxTimestampAssignment(principalId); 251 } 252 253 }