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.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    import org.kuali.hr.time.detail.web.ActionFormUtils;
027    import org.kuali.hr.time.service.base.TkServiceLocator;
028    import org.kuali.hr.time.util.TKUtils;
029    import org.kuali.rice.krad.service.KRADServiceLocator;
030    
031    public class CalendarEntriesServiceImpl implements CalendarEntriesService {
032    
033        private CalendarEntriesDao calendarEntriesDao;
034    
035        public void setCalendarEntriesDao(CalendarEntriesDao calendarEntriesDao) {
036            this.calendarEntriesDao = calendarEntriesDao;
037        }
038    
039        public CalendarEntries getCalendarEntries(String hrCalendarEntriesId) {
040    
041            return calendarEntriesDao.getCalendarEntries(hrCalendarEntriesId);
042        }
043    
044        @Override
045        public CalendarEntries getCalendarEntriesByIdAndPeriodEndDate(String hrCalendarId, Date endPeriodDate) {
046            return calendarEntriesDao.getCalendarEntriesByIdAndPeriodEndDate(hrCalendarId, endPeriodDate);
047        }
048    
049        @Override
050        public CalendarEntries getCalendarEntriesByCalendarIdAndDateRange(
051                String hrCalendarId, Date beginDate, Date endDate) {
052            return calendarEntriesDao.getCalendarEntriesByCalendarIdAndDateRange(hrCalendarId, beginDate, endDate);
053        }
054    
055        @Override
056        public CalendarEntries getCurrentCalendarEntriesByCalendarId(
057                String hrCalendarId, Date currentDate) {
058            return calendarEntriesDao.getCurrentCalendarEntriesByCalendarId(hrCalendarId, currentDate);
059        }
060    
061        @Override
062        public CalendarEntries getPreviousCalendarEntriesByCalendarId(String hrCalendarId, CalendarEntries pce) {
063            return calendarEntriesDao.getPreviousCalendarEntriesByCalendarId(hrCalendarId, pce);
064        }
065    
066        @Override
067        public CalendarEntries getNextCalendarEntriesByCalendarId(String hrCalendarId, CalendarEntries pce) {
068            return calendarEntriesDao.getNextCalendarEntriesByCalendarId(hrCalendarId, pce);
069        }
070    
071        public List<CalendarEntries> getCurrentCalendarEntryNeedsScheduled(int thresholdDays, Date asOfDate) {
072            return calendarEntriesDao.getCurrentCalendarEntryNeedsScheduled(thresholdDays, asOfDate);
073        }
074    
075        @Override
076        public CalendarEntries createNextCalendarEntry(CalendarEntries calendarEntries, CalendarEntryPeriodType type) {
077            CalendarEntries newEntry = new CalendarEntries();
078            newEntry.setCalendarName(calendarEntries.getCalendarName());
079            newEntry.setHrCalendarId(calendarEntries.getHrCalendarId());
080            newEntry.setCalendarObj(calendarEntries.getCalendarObj());
081            
082            if (type == null) {
083                type = CalendarEntryPeriodType.BI_WEEKLY;
084            }
085            if (CalendarEntryPeriodType.WEEKLY.equals(type)
086                    || CalendarEntryPeriodType.BI_WEEKLY.equals(type)) {
087                int weekly_multiplier = 2;
088                if (CalendarEntryPeriodType.WEEKLY.equals(type)) {
089                    weekly_multiplier = 1;
090                }
091                newEntry.setBeginPeriodDateTime(DateUtils.addWeeks(calendarEntries.getBeginPeriodDateTime(), weekly_multiplier));
092                newEntry.setEndPeriodDateTime(DateUtils.addWeeks(calendarEntries.getEndPeriodDateTime(), weekly_multiplier));
093                newEntry.setBatchInitiateDateTime(DateUtils.addWeeks(calendarEntries.getBatchInitiateDateTime(), weekly_multiplier));
094                newEntry.setBatchEndPayPeriodDateTime(DateUtils.addWeeks(calendarEntries.getBatchEndPayPeriodDateTime(), weekly_multiplier));
095                newEntry.setBatchEmployeeApprovalDateTime(DateUtils.addWeeks(calendarEntries.getBatchEmployeeApprovalDateTime(), weekly_multiplier));
096                newEntry.setBatchSupervisorApprovalDateTime(DateUtils.addWeeks(calendarEntries.getBatchSupervisorApprovalDateTime(), weekly_multiplier));
097            } else if (CalendarEntryPeriodType.MONTHLY.equals(type)) {
098                newEntry.setBeginPeriodDateTime(addMonthToDate(calendarEntries.getBeginPeriodDateTime()));
099                newEntry.setEndPeriodDateTime(addMonthToDate(calendarEntries.getEndPeriodDateTime()));
100                newEntry.setBatchInitiateDateTime(addMonthToDate(calendarEntries.getBatchInitiateDateTime()));
101                newEntry.setBatchEndPayPeriodDateTime(addMonthToDate(calendarEntries.getBatchEndPayPeriodDateTime()));
102                newEntry.setBatchEmployeeApprovalDateTime(addMonthToDate(calendarEntries.getBatchEmployeeApprovalDateTime()));
103                newEntry.setBatchSupervisorApprovalDateTime(addMonthToDate(calendarEntries.getBatchSupervisorApprovalDateTime()));
104            } else if (CalendarEntryPeriodType.SEMI_MONTHLY.equals(type)) {
105                newEntry.setBeginPeriodDateTime(addSemiMonthToDate(calendarEntries.getBeginPeriodDateTime()));
106                newEntry.setEndPeriodDateTime(addSemiMonthToDate(calendarEntries.getEndPeriodDateTime()));
107                newEntry.setBatchInitiateDateTime(addSemiMonthToDate(calendarEntries.getBatchInitiateDateTime()));
108                newEntry.setBatchEndPayPeriodDateTime(addSemiMonthToDate(calendarEntries.getBatchEndPayPeriodDateTime()));
109                newEntry.setBatchEmployeeApprovalDateTime(addSemiMonthToDate(calendarEntries.getBatchEmployeeApprovalDateTime()));
110                newEntry.setBatchSupervisorApprovalDateTime(addSemiMonthToDate(calendarEntries.getBatchSupervisorApprovalDateTime()));
111            }
112            KRADServiceLocator.getBusinessObjectService().save(newEntry);
113            return getNextCalendarEntriesByCalendarId(calendarEntries.getHrCalendarId(), calendarEntries);
114        }
115    
116        private Date addMonthToDate(Date date) {
117            Calendar temp = Calendar.getInstance();
118            temp.setTime(date);
119            boolean lastDayOfMonth = temp.getActualMaximum(Calendar.DATE) == temp.get(Calendar.DATE);
120    
121            date = DateUtils.addMonths(date, 1);
122            if (lastDayOfMonth) {
123                temp.setTime(date);
124                temp.set(Calendar.DATE, temp.getActualMaximum(Calendar.DATE));
125                date = temp.getTime();
126            }
127            return date;
128        }
129    
130        private Date addSemiMonthToDate(Date date) {
131            //so assuming the common pairs of this are the 1st & 16th, and then 15th and the last day,
132            // and 14th with the last day minus 1
133            //so we'll peek at the current date and try to figure out the best guesses for addition.
134            Calendar temp = Calendar.getInstance();
135            temp.setTime(date);
136            if (temp.getActualMaximum(Calendar.DATE) == temp.get(Calendar.DATE)) {
137                //date is on the last day of the month.  Set next date to the 15th
138                date = DateUtils.addMonths(date, 1);
139                temp.setTime(date);
140                temp.set(Calendar.DATE, 15);
141            } else if (temp.get(Calendar.DATE) == 15) {
142                //we are on the 15th of the month, so now lets go to the end of the month
143                temp.setTime(date);
144                temp.set(Calendar.DATE,  temp.getActualMaximum(Calendar.DATE));
145            } else if (temp.get(Calendar.DATE) == 1) {
146                //first of the month, next would be 16
147                temp.setTime(date);
148                temp.set(Calendar.DATE,  16);
149            } else if (temp.get(Calendar.DATE) == 16) {
150                //16th, so add a month and set day to '1'
151                date = DateUtils.addMonths(date, 1);
152                temp.setTime(date);
153                temp.set(Calendar.DATE, 1);
154            } else if (temp.get(Calendar.DATE) == 14) {
155                //14th day, set next one to last day minus 1
156                temp.setTime(date);
157                temp.set(Calendar.DATE,  temp.getActualMaximum(Calendar.DATE) - 1);
158            } else if (temp.getActualMaximum(Calendar.DATE) == temp.get(Calendar.DATE) - 1) {
159                //date is on the second to last day of the month.  Set next date to the 14th
160                date = DateUtils.addMonths(date, 1);
161                temp.setTime(date);
162                temp.set(Calendar.DATE, 14);
163            } else {
164                // so it isn't one of the common dates... i guess we'll just add 15 days...
165                date = DateUtils.addDays(date, 15);
166                temp.setTime(date);
167            }
168    
169            return temp.getTime() ;
170        }
171    
172        public List<CalendarEntries> getFutureCalendarEntries(String hrCalendarId, Date currentDate, int numberOfEntries) {
173            List<CalendarEntries> calendarEntries = null;
174            calendarEntries = calendarEntriesDao.getFutureCalendarEntries(hrCalendarId, currentDate, numberOfEntries);
175            return calendarEntries;
176        }
177    
178        public List<CalendarEntries> getCalendarEntriesEndingBetweenBeginAndEndDate(String hrCalendarId, Date beginDate, Date endDate) {
179            return calendarEntriesDao.getCalendarEntriesEndingBetweenBeginAndEndDate(hrCalendarId, beginDate, endDate);
180        }
181        
182        public List<CalendarEntries> getAllCalendarEntriesForCalendarId(String hrCalendarId) {
183            return calendarEntriesDao.getAllCalendarEntriesForCalendarId(hrCalendarId);
184        }
185        
186        public List<CalendarEntries> getAllCalendarEntriesForCalendarIdAndYear(String hrCalendarId, String year) {
187            return calendarEntriesDao.getAllCalendarEntriesForCalendarIdAndYear(hrCalendarId, year);
188        }
189        
190        public List<CalendarEntries> getAllCalendarEntriesForCalendarIdUpToPlanningMonths(String hrCalendarId, String principalId) {
191            int planningMonths = ActionFormUtils.getPlanningMonthsForEmployee(principalId);
192            List<CalendarEntries> futureCalEntries = TkServiceLocator.getCalendarEntriesService().getFutureCalendarEntries(
193                            hrCalendarId,TKUtils.getTimelessDate(null),planningMonths);
194            CalendarEntries futureCalEntry = null;
195            if (futureCalEntries != null && !futureCalEntries.isEmpty()) {
196                    futureCalEntry = futureCalEntries.get(futureCalEntries.size() - 1);
197            }
198            Date cutOffTime;
199            if(futureCalEntry != null) {
200                    cutOffTime = futureCalEntry.getEndPeriodDateTime();
201            } else {
202                    CalendarEntries currentCE = TkServiceLocator.getCalendarEntriesService().getCurrentCalendarEntriesByCalendarId(hrCalendarId, TKUtils.getCurrentDate());
203                    cutOffTime = currentCE.getEndPeriodDateTime();          
204            }
205            return TkServiceLocator.getCalendarEntriesService().getAllCalendarEntriesForCalendarIdUpToCutOffTime(hrCalendarId, cutOffTime);
206        }
207        
208        public List<CalendarEntries> getAllCalendarEntriesForCalendarIdUpToCutOffTime(String hrCalendarId, Date cutOffTime) {
209            return calendarEntriesDao.getAllCalendarEntriesForCalendarIdUpToCutOffTime(hrCalendarId, cutOffTime);
210        }
211    }