001 /** 002 * Copyright 2004-2012 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.calendar.service; 017 018 import java.util.Calendar; 019 import java.util.Date; 020 import java.util.List; 021 022 import org.apache.commons.lang.time.DateUtils; 023 import org.kuali.hr.time.calendar.CalendarEntries; 024 import org.kuali.hr.time.calendar.CalendarEntryPeriodType; 025 import org.kuali.hr.time.calendar.dao.CalendarEntriesDao; 026 027 public class CalendarEntriesServiceImpl implements CalendarEntriesService { 028 029 private CalendarEntriesDao calendarEntriesDao; 030 031 public void setCalendarEntriesDao(CalendarEntriesDao calendarEntriesDao) { 032 this.calendarEntriesDao = calendarEntriesDao; 033 } 034 035 public CalendarEntries getCalendarEntries(String hrCalendarEntriesId) { 036 037 return calendarEntriesDao.getCalendarEntries(hrCalendarEntriesId); 038 } 039 040 @Override 041 public CalendarEntries getCalendarEntriesByIdAndPeriodEndDate(String hrCalendarId, Date endPeriodDate) { 042 return calendarEntriesDao.getCalendarEntriesByIdAndPeriodEndDate(hrCalendarId, endPeriodDate); 043 } 044 045 @Override 046 public CalendarEntries getCurrentCalendarEntriesByCalendarId( 047 String hrCalendarId, Date currentDate) { 048 return calendarEntriesDao.getCurrentCalendarEntriesByCalendarId(hrCalendarId, currentDate); 049 } 050 051 @Override 052 public CalendarEntries getPreviousCalendarEntriesByCalendarId(String hrCalendarId, CalendarEntries pce) { 053 return calendarEntriesDao.getPreviousCalendarEntriesByCalendarId(hrCalendarId, pce); 054 } 055 056 @Override 057 public CalendarEntries getNextCalendarEntriesByCalendarId(String hrCalendarId, CalendarEntries pce) { 058 return calendarEntriesDao.getNextCalendarEntriesByCalendarId(hrCalendarId, pce); 059 } 060 061 public List<CalendarEntries> getCurrentCalendarEntryNeedsScheduled(int thresholdDays, Date asOfDate) { 062 return calendarEntriesDao.getCurrentCalendarEntryNeedsScheduled(thresholdDays, asOfDate); 063 } 064 065 @Override 066 public CalendarEntries createNextCalendarEntry(CalendarEntries calendarEntries, CalendarEntryPeriodType type) { 067 CalendarEntries newEntry = new CalendarEntries(); 068 newEntry.setCalendarName(calendarEntries.getCalendarName()); 069 newEntry.setHrCalendarId(calendarEntries.getHrCalendarId()); 070 newEntry.setCalendarObj(calendarEntries.getCalendarObj()); 071 newEntry.setBatchInitiateTime(calendarEntries.getBatchInitiateTime()); 072 newEntry.setBatchEndPayPeriodTime(calendarEntries.getBatchEndPayPeriodTime()); 073 newEntry.setBatchEmployeeApprovalTime(calendarEntries.getBatchEmployeeApprovalTime()); 074 newEntry.setBatchSupervisorApprovalTime(calendarEntries.getBatchSupervisorApprovalTime()); 075 076 if (type == null) { 077 type = CalendarEntryPeriodType.BI_WEEKLY; 078 } 079 if (CalendarEntryPeriodType.WEEKLY.equals(type) 080 || CalendarEntryPeriodType.BI_WEEKLY.equals(type)) { 081 int weekly_multiplier = 2; 082 if (CalendarEntryPeriodType.WEEKLY.equals(type)) { 083 weekly_multiplier = 1; 084 } 085 newEntry.setBeginPeriodDateTime(DateUtils.addWeeks(calendarEntries.getBeginPeriodDateTime(), weekly_multiplier)); 086 newEntry.setEndPeriodDateTime(DateUtils.addWeeks(calendarEntries.getEndPeriodDateTime(), weekly_multiplier)); 087 newEntry.setBatchInitiateDate(new java.sql.Date(DateUtils.addWeeks(calendarEntries.getBatchInitiateDate(), weekly_multiplier).getTime())); 088 newEntry.setBatchEndPayPeriodDate(new java.sql.Date(DateUtils.addWeeks(calendarEntries.getBatchEndPayPeriodDate(), weekly_multiplier).getTime())); 089 newEntry.setBatchEmployeeApprovalDate(new java.sql.Date(DateUtils.addWeeks(calendarEntries.getBatchEmployeeApprovalDate(), weekly_multiplier).getTime())); 090 newEntry.setBatchSupervisorApprovalDate(new java.sql.Date(DateUtils.addWeeks(calendarEntries.getBatchSupervisorApprovalDate(), weekly_multiplier).getTime())); 091 } else if (CalendarEntryPeriodType.MONTHLY.equals(type)) { 092 newEntry.setBeginPeriodDateTime(addMonthToDate(calendarEntries.getBeginPeriodDateTime())); 093 newEntry.setEndPeriodDateTime(addMonthToDate(calendarEntries.getEndPeriodDateTime())); 094 newEntry.setBatchInitiateDate(new java.sql.Date(addMonthToDate(calendarEntries.getBatchInitiateDate()).getTime())); 095 newEntry.setBatchEndPayPeriodDate(new java.sql.Date(addMonthToDate(calendarEntries.getBatchEndPayPeriodDate()).getTime())); 096 newEntry.setBatchEmployeeApprovalDate(new java.sql.Date(addMonthToDate(calendarEntries.getBatchEmployeeApprovalDate()).getTime())); 097 newEntry.setBatchSupervisorApprovalDate(new java.sql.Date(addMonthToDate(calendarEntries.getBatchSupervisorApprovalDate()).getTime())); 098 } else if (CalendarEntryPeriodType.SEMI_MONTHLY.equals(type)) { 099 newEntry.setBeginPeriodDateTime(addSemiMonthToDate(calendarEntries.getBeginPeriodDateTime())); 100 newEntry.setEndPeriodDateTime(addSemiMonthToDate(calendarEntries.getEndPeriodDateTime())); 101 newEntry.setBatchInitiateDate(new java.sql.Date(addSemiMonthToDate(calendarEntries.getBatchInitiateDate()).getTime())); 102 newEntry.setBatchEndPayPeriodDate(new java.sql.Date(addSemiMonthToDate(calendarEntries.getBatchEndPayPeriodDate()).getTime())); 103 newEntry.setBatchEmployeeApprovalDate(new java.sql.Date(addSemiMonthToDate(calendarEntries.getBatchEmployeeApprovalDate()).getTime())); 104 newEntry.setBatchSupervisorApprovalDate(new java.sql.Date(addSemiMonthToDate(calendarEntries.getBatchSupervisorApprovalDate()).getTime())); 105 } 106 calendarEntriesDao.saveOrUpdate(newEntry); 107 return getNextCalendarEntriesByCalendarId(calendarEntries.getHrCalendarId(), calendarEntries); 108 } 109 110 private Date addMonthToDate(Date date) { 111 Calendar temp = Calendar.getInstance(); 112 temp.setTime(date); 113 boolean lastDayOfMonth = temp.getActualMaximum(Calendar.DATE) == temp.get(Calendar.DATE); 114 115 date = DateUtils.addMonths(date, 1); 116 if (lastDayOfMonth) { 117 temp.setTime(date); 118 temp.set(Calendar.DATE, temp.getActualMaximum(Calendar.DATE)); 119 date = temp.getTime(); 120 } 121 return date; 122 } 123 124 private Date addSemiMonthToDate(Date date) { 125 //so assuming the common pairs of this are the 1st & 16th, and then 15th and the last day, 126 // and 14th with the last day minus 1 127 //so we'll peek at the current date and try to figure out the best guesses for addition. 128 Calendar temp = Calendar.getInstance(); 129 temp.setTime(date); 130 if (temp.getActualMaximum(Calendar.DATE) == temp.get(Calendar.DATE)) { 131 //date is on the last day of the month. Set next date to the 15th 132 date = DateUtils.addMonths(date, 1); 133 temp.setTime(date); 134 temp.set(Calendar.DATE, 15); 135 } else if (temp.get(Calendar.DATE) == 15) { 136 //we are on the 15th of the month, so now lets go to the end of the month 137 temp.setTime(date); 138 temp.set(Calendar.DATE, temp.getActualMaximum(Calendar.DATE)); 139 } else if (temp.get(Calendar.DATE) == 1) { 140 //first of the month, next would be 16 141 temp.setTime(date); 142 temp.set(Calendar.DATE, 16); 143 } else if (temp.get(Calendar.DATE) == 16) { 144 //16th, so add a month and set day to '1' 145 date = DateUtils.addMonths(date, 1); 146 temp.setTime(date); 147 temp.set(Calendar.DATE, 1); 148 } else if (temp.get(Calendar.DATE) == 14) { 149 //14th day, set next one to last day minus 1 150 temp.setTime(date); 151 temp.set(Calendar.DATE, temp.getActualMaximum(Calendar.DATE) - 1); 152 } else if (temp.getActualMaximum(Calendar.DATE) == temp.get(Calendar.DATE) - 1) { 153 //date is on the second to last day of the month. Set next date to the 14th 154 date = DateUtils.addMonths(date, 1); 155 temp.setTime(date); 156 temp.set(Calendar.DATE, 14); 157 } else { 158 // so it isn't one of the common dates... i guess we'll just add 15 days... 159 date = DateUtils.addDays(date, 15); 160 temp.setTime(date); 161 } 162 163 return temp.getTime() ; 164 } 165 166 public List<CalendarEntries> getFutureCalendarEntries(String hrCalendarId, Date currentDate, int numberOfEntries) { 167 List<CalendarEntries> calendarEntries = null; 168 calendarEntries = calendarEntriesDao.getFutureCalendarEntries(hrCalendarId, currentDate, numberOfEntries); 169 return calendarEntries; 170 } 171 172 public CalendarEntries getCalendarEntriesByBeginAndEndDate(Date beginPeriodDate, Date endPeriodDate) { 173 return calendarEntriesDao.getCalendarEntriesByBeginAndEndDate(beginPeriodDate, endPeriodDate); 174 } 175 176 public List<CalendarEntries> getAllCalendarEntriesForCalendarId(String hrCalendarId) { 177 return calendarEntriesDao.getAllCalendarEntriesForCalendarId(hrCalendarId); 178 } 179 180 public List<CalendarEntries> getAllCalendarEntriesForCalendarIdAndYear(String hrCalendarId, String year) { 181 return calendarEntriesDao.getAllCalendarEntriesForCalendarIdAndYear(hrCalendarId, year); 182 } 183 }