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.base.web;
017    
018    import java.sql.Date;
019    import java.text.SimpleDateFormat;
020    import java.util.ArrayList;
021    import java.util.Collections;
022    import java.util.List;
023    
024    import javax.servlet.http.HttpServletRequest;
025    import javax.servlet.http.HttpServletResponse;
026    
027    import org.apache.commons.lang.StringUtils;
028    import org.apache.struts.action.ActionForm;
029    import org.apache.struts.action.ActionForward;
030    import org.apache.struts.action.ActionMapping;
031    import org.displaytag.tags.TableTagParameters;
032    import org.displaytag.util.ParamEncoder;
033    import org.kuali.hr.time.calendar.Calendar;
034    import org.kuali.hr.time.calendar.CalendarEntries;
035    import org.kuali.hr.time.person.TKPerson;
036    import org.kuali.hr.time.service.base.TkServiceLocator;
037    import org.kuali.hr.time.util.TKContext;
038    import org.kuali.hr.time.util.TKUtils;
039    import org.kuali.hr.time.util.TkConstants;
040    import org.kuali.hr.time.workarea.WorkArea;
041    import org.kuali.rice.krad.exception.AuthorizationException;
042    import org.kuali.rice.krad.util.GlobalVariables;
043    
044    public class ApprovalAction extends TkAction{
045    
046            protected List<TKPerson> getSubListPrincipalIds(HttpServletRequest request, List<TKPerson> assignmentPrincipalIds) {
047                String page = request.getParameter((new ParamEncoder(TkConstants.APPROVAL_TABLE_ID).encodeParameterName(TableTagParameters.PARAMETER_PAGE)));
048                // The paging index begins from 1, but the sublist index begins from 0.
049                // So the logic below sets the sublist begin index to 0 if the page number is null or equals 1
050                Integer beginIndex = StringUtils.isBlank(page) || StringUtils.equals(page, "1") ? 0 : (Integer.parseInt(page) - 1)*TkConstants.PAGE_SIZE;
051                Integer endIndex = beginIndex + TkConstants.PAGE_SIZE > assignmentPrincipalIds.size() ? assignmentPrincipalIds.size() : beginIndex + TkConstants.PAGE_SIZE;
052            
053                return assignmentPrincipalIds.subList(beginIndex, endIndex);
054            }
055    
056            protected Boolean isAscending(HttpServletRequest request) {
057                // returned value 1 = ascending; 2 = descending
058                String ascending = request.getParameter((new ParamEncoder(TkConstants.APPROVAL_TABLE_ID).encodeParameterName(TableTagParameters.PARAMETER_ORDER)));
059                return StringUtils.equals(ascending, "1") ? true : false;
060            }
061    
062            protected String getSortField(HttpServletRequest request) {
063                return request.getParameter((new ParamEncoder(TkConstants.APPROVAL_TABLE_ID).encodeParameterName(TableTagParameters.PARAMETER_SORT)));
064            }
065            
066            protected void checkTKAuthorization(ActionForm form, String methodToCall)
067                            throws AuthorizationException {
068                                if (!TKContext.getUser().isTimesheetReviewer() && !TKContext.getUser().isAnyApproverActive() && !TKContext.getUser().isSystemAdmin() 
069                                            && !TKContext.getUser().isLocationAdmin() && !TKContext.getUser().isGlobalViewOnly() && !TKContext.getUser().isDeptViewOnly() 
070                                            && !TKContext.getUser().isDepartmentAdmin()) {
071                                    throw new AuthorizationException(GlobalVariables.getUserSession().getPrincipalId(), "ApprovalAction", "");
072                                }
073                            }
074            
075            protected void resetMainFields(ActionForm form) {
076                    ApprovalForm taf = (ApprovalForm) form;
077                    taf.setSearchField(null);
078                    taf.setSearchTerm(null);
079                    taf.setSelectedWorkArea(null);
080                    taf.setSelectedDept(null);
081                    taf.setPayBeginDate(null);
082                    taf.setPayEndDate(null);
083                    taf.setHrPyCalendarEntriesId(null);
084            }
085            
086            protected void setupDocumentOnFormContext(HttpServletRequest request,
087                            ApprovalForm taf, CalendarEntries payCalendarEntries, String page) {
088                    if(payCalendarEntries == null) {
089                            return;
090                    }
091                    taf.setHrPyCalendarId(payCalendarEntries.getHrCalendarId());
092                    taf.setHrPyCalendarEntriesId(payCalendarEntries.getHrCalendarEntriesId());
093                    taf.setPayBeginDate(payCalendarEntries.getBeginPeriodDateTime());
094                    taf.setPayEndDate(payCalendarEntries.getEndPeriodDateTime());
095                    
096                    CalendarEntries prevPayCalendarEntries = TkServiceLocator.getCalendarEntriesService().getPreviousCalendarEntriesByCalendarId(taf.getHrPyCalendarId(), payCalendarEntries);
097                    if (prevPayCalendarEntries != null) {
098                        taf.setPrevPayCalendarId(prevPayCalendarEntries.getHrCalendarEntriesId());
099                    } else {
100                        taf.setPrevPayCalendarId(null);
101                    }
102                    
103                    CalendarEntries nextPayCalendarEntries = TkServiceLocator.getCalendarEntriesService().getNextCalendarEntriesByCalendarId(taf.getHrPyCalendarId(), payCalendarEntries);
104                    if (nextPayCalendarEntries != null) {
105                        taf.setNextPayCalendarId(nextPayCalendarEntries.getHrCalendarEntriesId());
106                    } else {
107                        taf.setNextPayCalendarId(null);
108                    }       
109                    if (StringUtils.isBlank(page)) {
110                        List<String> depts = new ArrayList<String>(TKContext.getUser().getReportingApprovalDepartments().keySet());
111                        if ( depts.isEmpty() ) {
112                            return;
113                        }
114                        Collections.sort(depts);
115                        taf.setDepartments(depts);
116                        
117                        if (taf.getDepartments().size() == 1 || taf.getSelectedDept() != null) {
118                            if (StringUtils.isEmpty(taf.getSelectedDept()))
119                                    taf.setSelectedDept(taf.getDepartments().get(0));
120                            
121                            List<WorkArea> workAreas = TkServiceLocator.getWorkAreaService().getWorkAreas(taf.getSelectedDept(), new java.sql.Date(taf.getPayBeginDate().getTime()));
122                            for(WorkArea wa : workAreas){
123                                    if (TKContext.getUser().getApproverWorkAreas().contains(wa.getWorkArea())
124                                                    || TKContext.getUser().getReviewerWorkAreas().contains(wa.getWorkArea())) {
125                                            taf.getWorkAreaDescr().put(wa.getWorkArea(),wa.getDescription()+"("+wa.getWorkArea()+")");
126                                    }
127                            }
128                        }
129                    }
130    
131            }
132            
133        public ActionForward gotoCurrentPayPeriod(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
134            
135            String page = request.getParameter((new ParamEncoder(TkConstants.APPROVAL_TABLE_ID).encodeParameterName(TableTagParameters.PARAMETER_PAGE)));         
136            ApprovalForm taf = (ApprovalForm) form;
137            Date currentDate = TKUtils.getTimelessDate(null);
138            Calendar currentPayCalendar = TkServiceLocator.getCalendarService().getCalendarByGroup(taf.getSelectedPayCalendarGroup());
139            CalendarEntries payCalendarEntries = TkServiceLocator.getCalendarEntriesService().getCurrentCalendarEntriesByCalendarId(currentPayCalendar.getHrCalendarId(), currentDate);
140            taf.setPayCalendarEntries(payCalendarEntries);
141            taf.setSelectedCalendarYear(new SimpleDateFormat("yyyy").format(payCalendarEntries.getBeginPeriodDate()));
142            taf.setSelectedPayPeriod(payCalendarEntries.getHrCalendarEntriesId());
143            populateCalendarAndPayPeriodLists(request, taf);
144            setupDocumentOnFormContext(request, taf, payCalendarEntries, page);
145            return mapping.findForward("basic");
146        }
147        
148       
149        
150        // Triggered by changes of calendar year drop down list, reloads the pay period list
151        public ActionForward changeCalendarYear(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
152            ApprovalForm taf = (ApprovalForm) form;
153            if(!StringUtils.isEmpty(request.getParameter("selectedCY"))) {
154                    taf.setSelectedCalendarYear(request.getParameter("selectedCY").toString());
155                    populateCalendarAndPayPeriodLists(request, taf);
156            }
157            return mapping.findForward("basic");
158        }
159    
160        // Triggered by changes of pay period drop down list, reloads the whole page based on the selected pay period
161        public ActionForward changePayPeriod(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
162          String page = request.getParameter((new ParamEncoder(TkConstants.APPROVAL_TABLE_ID).encodeParameterName(TableTagParameters.PARAMETER_PAGE)));
163          ApprovalForm taf = (ApprovalForm) form;
164              if(!StringUtils.isEmpty(request.getParameter("selectedPP"))) {
165                      taf.setSelectedPayPeriod(request.getParameter("selectedPP").toString());
166                      CalendarEntries pce = TkServiceLocator.getCalendarEntriesService()
167                            .getCalendarEntries(request.getParameter("selectedPP").toString());
168                      if(pce != null) {
169                              taf.setPayCalendarEntries(pce);
170                              setupDocumentOnFormContext(request, taf, pce, page);
171                      }
172              }
173              return mapping.findForward("basic");
174            }
175        // sets the CalendarYear and Pay Period lists. Should be overridden by subclasses
176        protected void populateCalendarAndPayPeriodLists(HttpServletRequest request, ApprovalForm taf) {
177            
178        }
179    
180    
181    }