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.batch;
017    
018    import java.sql.Timestamp;
019    import java.util.Date;
020    
021    import org.apache.log4j.Logger;
022    import org.kuali.hr.time.assignment.Assignment;
023    import org.kuali.hr.time.assignment.AssignmentDescriptionKey;
024    import org.kuali.hr.time.calendar.Calendar;
025    import org.kuali.hr.time.calendar.CalendarEntries;
026    import org.kuali.hr.time.clocklog.ClockLog;
027    import org.kuali.hr.time.service.base.TkServiceLocator;
028    import org.kuali.hr.time.timesheet.TimesheetDocument;
029    import org.kuali.hr.time.util.TkConstants;
030    import org.kuali.hr.time.workflow.TimesheetDocumentHeader;
031    import org.kuali.rice.core.api.config.property.ConfigContext;
032    import org.kuali.rice.kim.api.identity.principal.Principal;
033    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
034    import org.quartz.Job;
035    import org.quartz.JobDataMap;
036    import org.quartz.JobExecutionContext;
037    import org.quartz.JobExecutionException;
038    
039    
040    public class EndPayPeriodJob implements Job {
041    
042        private static final Logger LOG = Logger.getLogger(EndPayPeriodJob.class);
043    
044        public void execute(JobExecutionContext context) throws JobExecutionException {
045            LOG.info("Starting of EndPayPeriod Job!!!");
046            String batchUserPrincipalId = getBatchUserPrincipalId();
047    
048            if (batchUserPrincipalId != null) {
049                JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
050    
051                String hrCalendarEntryId = jobDataMap.getString("hrCalendarEntryId");
052                String tkClockLogId = jobDataMap.getString("tkClockLogId");
053                CalendarEntries calendarEntry = TkServiceLocator.getCalendarEntriesService().getCalendarEntries(hrCalendarEntryId);
054                Calendar calendar = TkServiceLocator.getCalendarService().getCalendar(calendarEntry.getHrCalendarId());
055                calendarEntry.setCalendarObj(calendar);
056    
057                Date endPeriodDateTime = calendarEntry.getEndPeriodDateTime();
058                CalendarEntries nextCalendarEntry = TkServiceLocator.getCalendarEntriesService().getNextCalendarEntriesByCalendarId(calendarEntry.getHrCalendarId(), calendarEntry);
059                Date beginNextPeriodDateTime = nextCalendarEntry.getBeginPeriodDateTime();
060    
061                ClockLog openClockLog = TkServiceLocator.getClockLogService().getClockLog(tkClockLogId);
062                String ipAddress = openClockLog.getIpAddress();
063                String principalId = openClockLog.getPrincipalId();
064    
065                TimesheetDocumentHeader timesheetDocumentHeader = TkServiceLocator.getTimesheetDocumentHeaderService().getDocumentHeader(principalId, calendarEntry.getBeginPeriodDateTime(), endPeriodDateTime);
066                if (timesheetDocumentHeader != null) {
067                    LOG.info("Current timesheet document id is " + timesheetDocumentHeader.getDocumentId());
068                    TimesheetDocument timesheetDocument = TkServiceLocator.getTimesheetService().getTimesheetDocument(timesheetDocumentHeader.getDocumentId());
069                    String assignmentKey = new AssignmentDescriptionKey(openClockLog.getJobNumber(), openClockLog.getWorkArea(), openClockLog.getTask()).toAssignmentKeyString();
070                    Assignment assignment = TkServiceLocator.getAssignmentService().getAssignment(timesheetDocument, assignmentKey);
071    
072                    LOG.info("Before creating clock OUT log!");
073                    ClockLog clockOutLog = TkServiceLocator.getClockLogService().processClockLog(new java.sql.Timestamp(endPeriodDateTime.getTime()), assignment, calendarEntry, ipAddress,
074                            new java.sql.Date(endPeriodDateTime.getTime()), timesheetDocument, TkConstants.CLOCK_OUT, false, principalId, batchUserPrincipalId);
075                    LOG.info("Clock OUT log created, the id is " + clockOutLog.getTkClockLogId() + ", timestamp is " + clockOutLog.getTimestamp().toString());
076    
077                    TimesheetDocumentHeader nextTdh = TkServiceLocator.getTimesheetDocumentHeaderService()
078                            .getDocumentHeader(principalId, nextCalendarEntry.getBeginPeriodDateTime(), nextCalendarEntry.getEndPeriodDateTime());
079                    TimesheetDocument nextTimeDoc = null;
080                    if(nextTdh != null) {
081                        nextTimeDoc = TkServiceLocator.getTimesheetService().getTimesheetDocument(nextTdh.getDocumentId());
082                        LOG.info("Next Time document is not null, the document id is " + nextTdh.getDocumentId());
083                    }
084                    LOG.info("Before creating clock IN log!");
085                    ClockLog clockInLog = TkServiceLocator.getClockLogService().processClockLog(new java.sql.Timestamp(beginNextPeriodDateTime.getTime()), assignment, nextCalendarEntry, ipAddress,
086                            new java.sql.Date(beginNextPeriodDateTime.getTime()), nextTimeDoc, TkConstants.CLOCK_IN, false, principalId, batchUserPrincipalId);
087                    LOG.info("Clock IN log created, the id is " + clockInLog.getTkClockLogId() + ", timestamp is " + clockInLog.getTimestamp().toString());
088    
089                    // add 5 seconds to clock in log's timestamp so it will be found as the latest clock action
090                    Timestamp ts= clockInLog.getTimestamp();
091                    java.util.Calendar cal = java.util.Calendar.getInstance();
092                    cal.setTimeInMillis(ts.getTime());
093                    cal.add(java.util.Calendar.SECOND, 5);
094                    Timestamp later = new Timestamp(cal.getTime().getTime());
095                    clockInLog.setTimestamp(later);
096                    TkServiceLocator.getClockLogService().saveClockLog(clockInLog);
097                    LOG.info("After adding 5 seconds to ClockInLog, the timestamp is " + clockInLog.getTimestamp().toString());
098                }
099            } else {
100                String principalName = ConfigContext.getCurrentContextConfig().getProperty(TkConstants.BATCH_USER_PRINCIPAL_NAME);
101                LOG.error("Could not run batch jobs due to missing batch user " + principalName);
102            }
103        }
104    
105        private String getBatchUserPrincipalId() {
106            String principalName = ConfigContext.getCurrentContextConfig().getProperty(TkConstants.BATCH_USER_PRINCIPAL_NAME);
107            Principal principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(principalName);
108            return principal == null ? null : principal.getPrincipalId();
109        }
110    
111    }