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.joda.time.DateTime;
022 import org.kuali.hr.job.Job;
023 import org.kuali.hr.lm.leavecalendar.LeaveCalendarDocument;
024 import org.kuali.hr.time.assignment.Assignment;
025 import org.kuali.hr.time.assignment.AssignmentDescriptionKey;
026 import org.kuali.hr.time.assignment.dao.AssignmentDao;
027 import org.kuali.hr.time.calendar.CalendarEntries;
028 import org.kuali.hr.time.service.base.TkServiceLocator;
029 import org.kuali.hr.time.timesheet.TimesheetDocument;
030 import org.kuali.hr.time.util.TKContext;
031 import org.kuali.hr.time.util.TKUtils;
032 import org.kuali.hr.time.util.TkConstants;
033
034 import java.sql.Date;
035 import java.util.*;
036
037 public class AssignmentServiceImpl implements AssignmentService {
038
039 private static final Logger LOG = Logger.getLogger(AssignmentServiceImpl.class);
040 private AssignmentDao assignmentDao;
041
042 public AssignmentDao getAssignmentDao() {
043 return assignmentDao;
044 }
045
046 public void setAssignmentDao(AssignmentDao assignmentDao) {
047 this.assignmentDao = assignmentDao;
048 }
049
050
051 @Override
052 public List<Assignment> getAssignments(String principalId, Date asOfDate) {
053 List<Assignment> assignments;
054
055 if (asOfDate == null) {
056 asOfDate = TKUtils.getCurrentDate();
057 }
058
059 assignments = assignmentDao.findAssignments(principalId, asOfDate);
060
061 for (Assignment assignment : assignments) {
062 populateAssignment(assignment, asOfDate);
063 }
064
065 return assignments;
066 }
067
068 public List<Assignment> getAssignments(String principalId, Date beginDate, Date endDate) {
069 List<Assignment> assignments;
070
071 assignments = assignmentDao.findAssignmentsWithinPeriod(principalId, beginDate, endDate);
072
073 for (Assignment assignment : assignments) {
074 populateAssignment(assignment, assignment.getEffectiveDate());
075 }
076
077 return assignments;
078 }
079
080
081 @Override
082 public List<Assignment> searchAssignments(Date fromEffdt, Date toEffdt, String principalId, String jobNumber,
083 String dept, String workArea, String active, String showHistory) {
084 return assignmentDao.searchAssignments(fromEffdt, toEffdt, principalId, jobNumber, dept, workArea, active, showHistory);
085 }
086
087 public List<Assignment> getAssignmentsByPayEntry(String principalId, CalendarEntries payCalendarEntry) {
088 DateTime entryEndDate = payCalendarEntry.getEndLocalDateTime().toDateTime();
089 if (entryEndDate.getHourOfDay() == 0) {
090 entryEndDate = entryEndDate.minusDays(1);
091 }
092 Date endDate = new java.sql.Date(entryEndDate.getMillis());
093 List<Assignment> beginPeriodAssign = getAssignments(principalId, payCalendarEntry.getBeginPeriodDate());
094 List<Assignment> endPeriodAssign = getAssignments(principalId, endDate);
095 List<Assignment> assignsWithPeriod = getAssignments(principalId, payCalendarEntry.getBeginPeriodDate(), endDate);
096
097 List<Assignment> finalAssignments = new ArrayList<Assignment>();
098 Map<String, Assignment> assignKeyToAssignmentMap = new HashMap<String, Assignment>();
099 for (Assignment assign : endPeriodAssign) {
100 assignKeyToAssignmentMap.put(TKUtils.formatAssignmentKey(assign.getJobNumber(), assign.getWorkArea(), assign.getTask()), assign);
101 finalAssignments.add(assign);
102 }
103
104 //Compare the begin and end and add any assignments to the end thats are not there
105 for (Assignment assign : beginPeriodAssign) {
106 String assignKey = TKUtils.formatAssignmentKey(assign.getJobNumber(), assign.getWorkArea(), assign.getTask());
107 if (!assignKeyToAssignmentMap.containsKey(assignKey)) {
108 finalAssignments.add(assign);
109 }
110 }
111
112 // Add the assignments within the pay period
113 for (Assignment assign : assignsWithPeriod) {
114 String assignKey = TKUtils.formatAssignmentKey(assign.getJobNumber(), assign.getWorkArea(), assign.getTask());
115 if (!assignKeyToAssignmentMap.containsKey(assignKey)) {
116 finalAssignments.add(assign);
117 }
118 }
119
120 return finalAssignments;
121
122 }
123
124 public List<Assignment> getAssignmentsByCalEntryForTimeCalendar(String principalId, CalendarEntries payCalendarEntry){
125 if (StringUtils.isEmpty(principalId)
126 || payCalendarEntry == null) {
127 return Collections.emptyList();
128 }
129 List<Assignment> assignments = TkServiceLocator.getAssignmentService().getAssignmentsByPayEntry(principalId, payCalendarEntry);
130 List<Assignment> results = TkServiceLocator.getAssignmentService().filterAssignments(assignments, TkConstants.FLSA_STATUS_NON_EXEMPT, false);
131 return results;
132 }
133
134 public List<Assignment> getAssignmentsByCalEntryForLeaveCalendar(String principalId, CalendarEntries payCalendarEntry){
135 if (StringUtils.isEmpty(principalId)
136 || payCalendarEntry == null) {
137 return Collections.emptyList();
138 }
139 List<Assignment> assignments = TkServiceLocator.getAssignmentService().getAssignmentsByPayEntry(principalId, payCalendarEntry);
140 List<Assignment> results = TkServiceLocator.getAssignmentService().filterAssignments(assignments, null, true);
141 return results;
142 }
143
144 public List<Assignment> filterAssignments(List<Assignment> assignments, String flsaStatus, boolean chkForLeaveEligible) {
145 List<Assignment> results = new ArrayList<Assignment>();
146 for(Assignment assignment : assignments) {
147 boolean flag = false;
148 if(StringUtils.isNotEmpty(flsaStatus)) {
149 if(assignment != null
150 && assignment.getJob() != null
151 && assignment.getJob().getFlsaStatus() != null
152 && assignment.getJob().getFlsaStatus().equalsIgnoreCase(flsaStatus)) {
153 if(chkForLeaveEligible) {
154 if(assignment.getJob().isEligibleForLeave()) {
155 flag = true;
156 }
157 }else {
158 flag = true;
159 }
160 }
161 }else {
162 if(chkForLeaveEligible) {
163 if(assignment != null && assignment.getJob() != null && assignment.getJob().isEligibleForLeave()) {
164 flag = true;
165 }
166 } else {
167 flag = true;
168 }
169 }
170
171 if(flag) {
172 results.add(assignment);
173 }
174 }
175
176 return results;
177
178 }
179
180 @Override
181 public AssignmentDescriptionKey getAssignmentDescriptionKey(String assignmentKey) {
182 return new AssignmentDescriptionKey(assignmentKey);
183 }
184
185 @Override
186 public Map<String, String> getAssignmentDescriptions(TimesheetDocument td, boolean clockOnlyAssignments) {
187 if (td == null) {
188 //throw new RuntimeException("timesheet document is null.");
189 return Collections.emptyMap();
190 }
191 List<Assignment> assignments = td.getAssignments();
192 // if(assignments.size() < 1) {
193 // throw new RuntimeException("No assignment on the timesheet document.");
194 // }
195
196 Map<String, String> assignmentDescriptions = new LinkedHashMap<String, String>();
197 for (Assignment assignment : assignments) {
198 //if the user is not the same as the timesheet and does not have approver access for the assignment
199 //do not add to the display
200 if (!StringUtils.equals(TKContext.getTargetPrincipalId(), TKContext.getPrincipalId())) {
201 if (!TKContext.getUser().isSystemAdmin() && !TKContext.getUser().getReportingWorkAreas().contains(assignment.getWorkArea())) {
202 continue;
203 }
204 }
205
206 //only add to the assignment list if they are synchronous assignments
207 //or clock only assignments is false
208 if (!clockOnlyAssignments || assignment.isSynchronous()) {
209 assignmentDescriptions.putAll(TKUtils.formatAssignmentDescription(assignment));
210 }
211 }
212
213 return assignmentDescriptions;
214 }
215
216 @Override
217 public Map<String, String> getAssignmentDescriptions(Assignment assignment) {
218 if (assignment == null) {
219 throw new RuntimeException("Assignment is null");
220 }
221
222 Map<String, String> assignmentDescriptions = new LinkedHashMap<String, String>();
223 assignmentDescriptions.putAll(TKUtils.formatAssignmentDescription(assignment));
224
225 return assignmentDescriptions;
226
227 }
228
229 @Override
230 public Assignment getAssignment(TimesheetDocument timesheetDocument, String assignmentKey) {
231 List<Assignment> assignments = timesheetDocument.getAssignments();
232 AssignmentDescriptionKey desc = getAssignmentDescriptionKey(assignmentKey);
233
234 for (Assignment assignment : assignments) {
235 if (assignment.getJobNumber().compareTo(desc.getJobNumber()) == 0 &&
236 assignment.getWorkArea().compareTo(desc.getWorkArea()) == 0 &&
237 assignment.getTask().compareTo(desc.getTask()) == 0) {
238 return assignment;
239 }
240 }
241
242 //No assignment found so fetch the inactive ones for this payBeginDate
243 Assignment assign = TkServiceLocator.getAssignmentService().getAssignment(desc, timesheetDocument.getCalendarEntry().getBeginPeriodDate());
244 if (assign != null) {
245 return assign;
246 }
247
248
249 LOG.warn("no matched assignment found");
250 return new Assignment();
251 }
252
253 @Override
254 public Assignment getAssignment(String tkAssignmentId) {
255 return getAssignmentDao().getAssignment(tkAssignmentId);
256 }
257
258
259 @Override
260 public List<Assignment> getActiveAssignmentsForWorkArea(Long workArea, Date asOfDate) {
261 List<Assignment> assignments = assignmentDao.getActiveAssignmentsInWorkArea(workArea, asOfDate);
262 for (Assignment assignment : assignments) {
263 populateAssignment(assignment, asOfDate);
264 }
265 return assignments;
266 }
267
268 @Override
269 public List<Assignment> getActiveAssignments(Date asOfDate) {
270 return assignmentDao.getActiveAssignments(asOfDate);
271 }
272
273 private void populateAssignment(Assignment assignment, Date asOfDate) {
274 assignment.setJob(TkServiceLocator.getJobService().getJob(assignment.getPrincipalId(), assignment.getJobNumber(), asOfDate));
275 assignment.setTimeCollectionRule(TkServiceLocator.getTimeCollectionRuleService().getTimeCollectionRule(assignment.getJob().getDept(), assignment.getWorkArea(), assignment.getJob().getHrPayType(),asOfDate));
276 assignment.setWorkAreaObj(TkServiceLocator.getWorkAreaService().getWorkArea(assignment.getWorkArea(), asOfDate));
277 assignment.setDeptLunchRule(TkServiceLocator.getDepartmentLunchRuleService().getDepartmentLunchRule(assignment.getJob().getDept(),
278 assignment.getWorkArea(), assignment.getPrincipalId(), assignment.getJobNumber(), asOfDate));
279 }
280
281 public Assignment getAssignment(String principalId, AssignmentDescriptionKey key, Date asOfDate) {
282 Assignment a = null;
283
284 if (key != null) {
285 a = assignmentDao.getAssignment(principalId, key.getJobNumber(), key.getWorkArea(), key.getTask(), asOfDate);
286 }
287
288 return a;
289 }
290
291 @Override
292 public Assignment getAssignment(AssignmentDescriptionKey key, Date asOfDate) {
293 Assignment a = null;
294
295 if (key != null) {
296 a = assignmentDao.getAssignment(key.getJobNumber(), key.getWorkArea(), key.getTask(), asOfDate);
297 }
298
299 return a;
300 }
301
302 /**
303 * KPME-1129 Kagata
304 * Get a list of active assignments based on principalId and jobNumber as of a particular date
305 */
306 @Override
307 public List<Assignment> getActiveAssignmentsForJob(String principalId, Long jobNumber, Date asOfDate) {
308 List<Assignment> assignments = assignmentDao.getActiveAssignmentsForJob(principalId, jobNumber, asOfDate);
309
310 return assignments;
311 }
312
313 @Override
314 public Map<String, String> getAssignmentDescriptions(LeaveCalendarDocument lcd) {
315 if (lcd == null) {
316 throw new RuntimeException("leave document is null.");
317 }
318 List<Assignment> assignments = lcd.getAssignments();
319 return TkServiceLocator.getAssignmentService().getAssignmentDescriptionsForAssignments(assignments);
320 }
321
322 public Map<String, String> getAssignmentDescriptionsForAssignments(List<Assignment> assignments) {
323 Map<String, String> assignmentDescriptions = new LinkedHashMap<String, String>();
324 for (Assignment assignment : assignments) {
325 assignmentDescriptions.putAll(TKUtils.formatAssignmentDescription(assignment));
326 }
327 return assignmentDescriptions;
328 }
329
330 @Override
331 public Assignment getAssignment(LeaveCalendarDocument leaveCalendarDocument, String assignmentKey) {
332 List<Assignment> assignments = leaveCalendarDocument.getAssignments();
333 return TkServiceLocator.getAssignmentService().getAssignment(assignments, assignmentKey, leaveCalendarDocument.getCalendarEntry().getBeginPeriodDate());
334 }
335
336 public Assignment getAssignment(List<Assignment> assignments, String assignmentKey, Date beginDate) {
337 AssignmentDescriptionKey desc = getAssignmentDescriptionKey(assignmentKey);
338 if (CollectionUtils.isNotEmpty(assignments)) {
339 for (Assignment assignment : assignments) {
340 if (assignment.getJobNumber().compareTo(desc.getJobNumber()) == 0 &&
341 assignment.getWorkArea().compareTo(desc.getWorkArea()) == 0 &&
342 assignment.getTask().compareTo(desc.getTask()) == 0) {
343 return assignment;
344 }
345 }
346 }
347
348 //No assignment found so fetch the inactive ones for this payBeginDate
349 Assignment assign = TkServiceLocator.getAssignmentService().getAssignment(desc, beginDate);
350 if (assign != null) {
351 return assign;
352 }
353
354 LOG.warn("no matched assignment found");
355 return new Assignment();
356 }
357
358 @Override
359 public Assignment getMaxTimestampAssignment(String principalId) {
360 return assignmentDao.getMaxTimestampAssignment(principalId);
361 }
362
363 public Assignment getAssignmentToApplyScheduledTimeOff(TimesheetDocument timesheetDocument, java.sql.Date payEndDate) {
364 Job primaryJob = TkServiceLocator.getJobService().getPrimaryJob(timesheetDocument.getPrincipalId(), payEndDate);
365 for(Assignment assign : timesheetDocument.getAssignments()){
366 if(assign.getJobNumber().equals(primaryJob.getJobNumber())){
367 return assign;
368 }
369 }
370 return null;
371 }
372
373 public List<String> getPrincipalIds(List<String> workAreaList, Date effdt, Date startDate, Date endDate) {
374 if (CollectionUtils.isEmpty(workAreaList)) {
375 return new ArrayList<String>();
376 }
377 return assignmentDao.getPrincipalIds(workAreaList, effdt, startDate, endDate);
378 }
379
380 public List<Assignment> getAssignments(List<String> workAreaList, Date effdt, Date startDate, Date endDate) {
381 if (CollectionUtils.isEmpty(workAreaList)) {
382 return new ArrayList<Assignment>();
383 }
384 return assignmentDao.getAssignments(workAreaList, effdt, startDate, endDate);
385 }
386 }