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    }