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.lm.leave.web; 017 018 import edu.emory.mathcs.backport.java.util.Collections; 019 import org.apache.commons.lang3.ObjectUtils; 020 import org.apache.struts.action.ActionForm; 021 import org.apache.struts.action.ActionForward; 022 import org.apache.struts.action.ActionMapping; 023 import org.kuali.hr.lm.LMConstants; 024 import org.kuali.hr.lm.leaveblock.LeaveBlock; 025 import org.kuali.hr.lm.leaveblock.LeaveBlockHistory; 026 import org.kuali.hr.lm.leaverequest.service.LeaveRequestDocumentService; 027 import org.kuali.hr.lm.workflow.LeaveRequestDocument; 028 import org.kuali.hr.time.base.web.TkAction; 029 import org.kuali.hr.time.calendar.CalendarEntries; 030 import org.kuali.hr.time.service.base.TkServiceLocator; 031 import org.kuali.hr.time.util.TKUser; 032 import org.kuali.hr.time.util.TKUtils; 033 import org.kuali.hr.time.util.TkConstants; 034 import org.kuali.rice.kew.api.KewApiServiceLocator; 035 import org.kuali.rice.kew.api.document.DocumentStatus; 036 037 import javax.servlet.http.HttpServletRequest; 038 import javax.servlet.http.HttpServletResponse; 039 import java.sql.Date; 040 import java.util.*; 041 042 public class LeaveRequestAction extends TkAction { 043 LeaveRequestDocumentService leaveRequestDocumentService; 044 045 @Override 046 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 047 ActionForward forward = super.execute(mapping, form, request, response); 048 LeaveRequestForm leaveForm = (LeaveRequestForm) form; 049 String principalId = TKUser.getCurrentTargetPersonId(); 050 Date currentDate = TKUtils.getTimelessDate(null); 051 052 Calendar currentCalendar = Calendar.getInstance(); 053 if (leaveForm.getNavString() == null) { 054 leaveForm.setYear(currentCalendar.get(Calendar.YEAR)); 055 } else if(leaveForm.getNavString().equals("NEXT")) { 056 leaveForm.setYear(leaveForm.getYear() + 1); 057 } else if(leaveForm.getNavString().equals("PREV")) { 058 leaveForm.setYear(leaveForm.getYear() - 1); 059 } 060 currentCalendar.set(leaveForm.getYear(), 0, 1); 061 // java.util.Date serviceDate = (principalHRAttributes != null) ? principalHRAttributes.getServiceDate() : TKUtils.getTimelessDate(currentCalendar.getTime()); 062 java.util.Date beginDate = TKUtils.getTimelessDate(currentCalendar.getTime()); 063 currentCalendar.set(leaveForm.getYear(), 11, 31); 064 java.util.Date endDate = TKUtils.getTimelessDate(currentCalendar.getTime()); 065 066 // CalendarEntries calendarEntry = TkServiceLocator.getCalendarService().getCurrentCalendarDatesForLeaveCalendar(principalId, currentDate); 067 CalendarEntries calendarEntry = TkServiceLocator.getCalendarService().getCurrentCalendarDatesForLeaveCalendar(principalId, beginDate, endDate); 068 069 // If the current pay period ends before the current leave calendar ends, then we need to include any planned leave blocks that occur 070 // in this window between the current pay end and the beginning of the leave planning calendar (the next future leave period). 071 // The most common scenario occurs when a non-monthly pay period ends before the current leave calendar ends. 072 073 CalendarEntries payCalendarEntry = TkServiceLocator.getCalendarService().getCurrentCalendarDates(principalId, beginDate, endDate); 074 Boolean checkLeaveEligible = true; 075 Boolean nonExemptLeaveEligible = TkServiceLocator.getLeaveApprovalService().isActiveAssignmentFoundOnJobFlsaStatus(principalId, TkConstants.FLSA_STATUS_NON_EXEMPT,checkLeaveEligible); 076 if(nonExemptLeaveEligible && calendarEntry != null && payCalendarEntry != null) { 077 if ( payCalendarEntry.getEndPeriodDate().before(calendarEntry.getEndPeriodDate()) ) { 078 calendarEntry = payCalendarEntry; 079 } 080 } 081 082 if(calendarEntry != null) { 083 if(calendarEntry.getEndLocalDateTime().getMillisOfDay() == 0) { 084 // if the time of the end date is the beginning of a day, subtract one day from the end date 085 currentDate = new java.sql.Date(TKUtils.addDates(calendarEntry.getEndPeriodDate(), -1).getTime()); 086 } else { 087 currentDate = calendarEntry.getEndPeriodDate(); // only show leave requests from planning calendars on leave request page 088 } 089 } 090 List<LeaveBlock> plannedLeaves = getLeaveBlocksWithRequestStatus(principalId, beginDate, endDate, LMConstants.REQUEST_STATUS.PLANNED); 091 plannedLeaves.addAll(getLeaveBlocksWithRequestStatus(principalId, beginDate, endDate, LMConstants.REQUEST_STATUS.DEFERRED)); 092 leaveForm.setPlannedLeaves(plannedLeaves); 093 leaveForm.setPendingLeaves(getLeaveBlocksWithRequestStatus(principalId, beginDate, endDate, LMConstants.REQUEST_STATUS.REQUESTED)); 094 leaveForm.setApprovedLeaves(getLeaveBlocksWithRequestStatus(principalId, beginDate, endDate, LMConstants.REQUEST_STATUS.APPROVED)); 095 leaveForm.setDisapprovedLeaves(getDisapprovedLeaveBlockHistory(principalId, currentDate)); 096 097 leaveForm.setDocuments(getLeaveRequestDocuments(leaveForm)); 098 return forward; 099 } 100 101 102 private List<LeaveBlock> getLeaveBlocksWithRequestStatus(String principalId, java.util.Date beginDate, java.util.Date endDate, String requestStatus) { 103 List<LeaveBlock> plannedLeaves = TkServiceLocator.getLeaveBlockService().getLeaveBlocks(principalId, LMConstants.LEAVE_BLOCK_TYPE.LEAVE_CALENDAR, requestStatus, beginDate, endDate); 104 105 Collections.sort(plannedLeaves, new Comparator<LeaveBlock>() { 106 @Override 107 public int compare(LeaveBlock leaveBlock1, LeaveBlock leaveBlock2) { 108 return ObjectUtils.compare(leaveBlock1.getLeaveDate(), leaveBlock2.getLeaveDate()); 109 } 110 }); 111 112 return plannedLeaves; 113 } 114 115 private List<LeaveBlockHistory> getDisapprovedLeaveBlockHistory(String principalId, Date currentDate) { 116 List<LeaveBlockHistory> historyList = TkServiceLocator.getLeaveBlockHistoryService() 117 .getLeaveBlockHistories(principalId, LMConstants.REQUEST_STATUS.DISAPPROVED, LMConstants.ACTION.DELETE, currentDate); 118 119 Collections.sort(historyList, new Comparator<LeaveBlockHistory>() { 120 @Override 121 public int compare(LeaveBlockHistory lbh1, LeaveBlockHistory lbh2) { 122 return ObjectUtils.compare(lbh1.getLeaveDate(), lbh2.getLeaveDate()); 123 } 124 }); 125 126 return historyList; 127 } 128 129 130 public ActionForward submitForApproval(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 131 LeaveRequestForm lf = (LeaveRequestForm) form; 132 for(LeaveBlock leaveBlock : lf.getPlannedLeaves()) { 133 // check if check box is checked 134 if(leaveBlock.getSubmit()) { 135 LeaveRequestDocument lrd = TkServiceLocator.getLeaveRequestDocumentService().createLeaveRequestDocument(leaveBlock.getLmLeaveBlockId()); 136 TkServiceLocator.getLeaveRequestDocumentService().requestLeave(lrd.getDocumentNumber()); 137 } 138 } 139 return mapping.findForward("basic"); 140 } 141 142 private Map<String, LeaveRequestDocument> getLeaveRequestDocuments(LeaveRequestForm form) { 143 Map<String, LeaveRequestDocument> docs = new HashMap<String, LeaveRequestDocument>(); 144 145 if (form == null) { 146 return docs; 147 } 148 149 for (LeaveBlock leaveBlock : form.getPendingLeaves()) { 150 if(leaveBlock.getLeaveRequestDocumentId() != null && !leaveBlock.getLeaveRequestDocumentId().isEmpty()){ 151 docs.put(leaveBlock.getLmLeaveBlockId(), getLeaveRequestDocumentService().getLeaveRequestDocument(leaveBlock.getLeaveRequestDocumentId())); 152 } 153 } 154 for (LeaveBlock leaveBlock : form.getApprovedLeaves()) { 155 if(leaveBlock.getLeaveRequestDocumentId() != null && !leaveBlock.getLeaveRequestDocumentId().isEmpty()){ 156 docs.put(leaveBlock.getLmLeaveBlockId(), getLeaveRequestDocumentService().getLeaveRequestDocument(leaveBlock.getLeaveRequestDocumentId())); 157 } 158 } 159 for (LeaveBlockHistory lbh : form.getDisapprovedLeaves()) { 160 List<LeaveRequestDocument> docList = getLeaveRequestDocumentService().getLeaveRequestDocumentsByLeaveBlockId(lbh.getLmLeaveBlockId()); 161 for(LeaveRequestDocument lrd : docList) { 162 if(lrd.getDocumentNumber() != null && !lrd.getDocumentNumber().isEmpty()){ 163 DocumentStatus status = KewApiServiceLocator.getWorkflowDocumentService().getDocumentStatus(lrd.getDocumentNumber()); 164 if(status != null && DocumentStatus.DISAPPROVED.getCode().equals(status.getCode())) { 165 //KPME-2214 166 //*getLeaveRequestDocumentService().getLeaveRequestDocument(lrd.getDocumentNumber())* is same as lrd within docList fethced . No need to retrieve again 167 //docs.put(lbh.getLmLeaveBlockId(), getLeaveRequestDocumentService().getLeaveRequestDocument(lrd.getDocumentNumber())); 168 docs.put(lbh.getLmLeaveBlockId(), lrd); 169 break; 170 } 171 } 172 } 173 174 } 175 return docs; 176 } 177 178 private LeaveRequestDocumentService getLeaveRequestDocumentService() { 179 if (leaveRequestDocumentService == null) { 180 leaveRequestDocumentService = TkServiceLocator.getLeaveRequestDocumentService(); 181 } 182 return leaveRequestDocumentService; 183 } 184 185 }