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