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