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.Date; 019 import java.text.ParseException; 020 import java.text.SimpleDateFormat; 021 import java.util.List; 022 023 import org.joda.time.DateTime; 024 import org.kuali.hr.lm.leaveplan.LeavePlan; 025 import org.kuali.hr.time.batch.service.BatchJobService; 026 import org.kuali.hr.time.service.base.TkServiceLocator; 027 import org.kuali.hr.time.util.TKUtils; 028 import org.quartz.JobExecutionContext; 029 import org.quartz.JobExecutionException; 030 import org.quartz.SchedulerException; 031 import org.springframework.scheduling.quartz.QuartzJobBean; 032 033 public class CarryOverSchedulerJob extends QuartzJobBean { 034 035 private static int LEAVE_PLAN_POLLING_WINDOW; 036 037 private static BatchJobService batchJobService; 038 039 @Override 040 protected void executeInternal(JobExecutionContext context) throws JobExecutionException { 041 Date asOfDate = TKUtils.getCurrentDate(); 042 List<LeavePlan> leavePlans = TkServiceLocator.getLeavePlanService().getLeavePlansNeedsCarryOverScheduled(getLeavePlanPollingWindow(), asOfDate); 043 try { 044 if(leavePlans!=null && !leavePlans.isEmpty()) { 045 DateTime current = new DateTime(asOfDate.getTime()); 046 DateTime windowStart = current.minusDays(getLeavePlanPollingWindow()); 047 DateTime windowEnd = current.plusDays(getLeavePlanPollingWindow()); 048 049 // schedule batch job for all LeavePlans who fall in leave polling window. 050 for(LeavePlan leavePlan : leavePlans) { 051 if(leavePlan.getBatchPriorYearCarryOverStartDate() != null && leavePlan.getBatchPriorYearCarryOverStartTime() != null ) { 052 java.util.Date batchDate = getBatchJobStartDateTime(leavePlan); 053 DateTime batchDateTime = new DateTime(batchDate.getTime()); 054 if(batchDateTime.compareTo(windowStart) >= 0 && batchDateTime.compareTo(windowEnd) <= 0) { 055 getBatchJobService().scheduleLeaveCarryOverJobs(leavePlan); 056 } 057 } 058 } 059 } 060 } catch (SchedulerException se) { 061 throw new JobExecutionException("Exception thrown during job scheduling of Carry over for Leave", se); 062 } 063 } 064 065 public int getLeavePlanPollingWindow() { 066 return LEAVE_PLAN_POLLING_WINDOW; 067 } 068 069 public void setLeavePlanPollingWindow(int leavePlanPollingWindow) { 070 LEAVE_PLAN_POLLING_WINDOW = leavePlanPollingWindow; 071 } 072 073 public static BatchJobService getBatchJobService() { 074 return CarryOverSchedulerJob.batchJobService; 075 } 076 077 public void setBatchJobService(BatchJobService batchJobService) { 078 CarryOverSchedulerJob.batchJobService = batchJobService; 079 } 080 081 private java.util.Date getBatchJobStartDateTime(LeavePlan leavePlan) { 082 083 String batchJobDate = leavePlan.getBatchPriorYearCarryOverStartDate(); 084 085 java.util.Calendar batchJobTimeCal = java.util.Calendar.getInstance(); 086 batchJobTimeCal.setTimeInMillis(leavePlan.getBatchPriorYearCarryOverStartTime().getTime()); 087 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd"); 088 sdf.setLenient(false); 089 090 java.util.Date batchJobStart = null; 091 092 try { 093 batchJobStart = sdf.parse(batchJobDate); 094 } catch (ParseException e) { 095 } 096 097 java.util.Calendar batchJobStartDateTime = java.util.Calendar.getInstance(); 098 batchJobStartDateTime.setTime(batchJobStart); 099 batchJobStartDateTime.set(java.util.Calendar.YEAR,java.util.Calendar.getInstance().get(java.util.Calendar.YEAR)); 100 batchJobStartDateTime.set(java.util.Calendar.HOUR_OF_DAY,batchJobTimeCal.get(java.util.Calendar.HOUR_OF_DAY)); 101 batchJobStartDateTime.set(java.util.Calendar.MINUTE,batchJobTimeCal.get(java.util.Calendar.MINUTE)); 102 batchJobStartDateTime.set(java.util.Calendar.SECOND, 0); 103 batchJobStartDateTime.set(java.util.Calendar.MILLISECOND, 0); 104 105 return batchJobStartDateTime.getTime(); 106 } 107 108 }