001    /*
002     * Copyright 2011 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.kfs.module.bc.document.web.struts;
017    
018    import java.math.BigDecimal;
019    import java.util.List;
020    import java.util.Map;
021    
022    import javax.servlet.http.HttpServletRequest;
023    import javax.servlet.http.HttpServletResponse;
024    
025    import org.apache.struts.action.ActionForm;
026    import org.apache.struts.action.ActionForward;
027    import org.apache.struts.action.ActionMapping;
028    import org.kuali.kfs.module.bc.BCConstants;
029    import org.kuali.kfs.module.bc.BCKeyConstants;
030    import org.kuali.kfs.module.bc.BCPropertyConstants;
031    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionIntendedIncumbent;
032    import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding;
033    import org.kuali.kfs.module.bc.service.BudgetConstructionIntendedIncumbentService;
034    import org.kuali.kfs.sys.KFSConstants;
035    import org.kuali.kfs.sys.KFSPropertyConstants;
036    import org.kuali.kfs.sys.context.SpringContext;
037    import org.kuali.rice.kns.service.BusinessObjectService;
038    import org.kuali.rice.kns.util.GlobalVariables;
039    import org.kuali.rice.kns.util.MessageList;
040    import org.kuali.rice.kns.util.MessageMap;
041    
042    /**
043     * the struts action for the salary setting for incumbent
044     */
045    public class IncumbentSalarySettingAction extends DetailSalarySettingAction {
046        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(IncumbentSalarySettingAction.class);
047    
048        private BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
049        private BudgetConstructionIntendedIncumbentService budgetConstructionIntendedIncumbentService = SpringContext.getBean(BudgetConstructionIntendedIncumbentService.class);
050    
051        /**
052         * @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#loadExpansionScreen(org.apache.struts.action.ActionMapping,
053         *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
054         */
055        @Override
056        public ActionForward loadExpansionScreen(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
057            IncumbentSalarySettingForm incumbentSalarySettingForm = (IncumbentSalarySettingForm) form;
058            MessageMap errorMap;
059            if (incumbentSalarySettingForm.isBudgetByAccountMode()){
060                errorMap = incumbentSalarySettingForm.getCallBackErrors();
061            }
062            else {
063                errorMap = GlobalVariables.getMessageMap();
064            }
065    
066            // update incumbent record if required
067            if (incumbentSalarySettingForm.isRefreshIncumbentBeforeSalarySetting()) {
068                budgetConstructionIntendedIncumbentService.refreshIncumbentFromExternal(incumbentSalarySettingForm.getEmplid());
069            }
070    
071            // use the passed url parms to get the record from DB
072            Map<String, Object> fieldValues = incumbentSalarySettingForm.getKeyMapOfSalarySettingItem();
073            BudgetConstructionIntendedIncumbent budgetConstructionIntendedIncumbent = (BudgetConstructionIntendedIncumbent) businessObjectService.findByPrimaryKey(BudgetConstructionIntendedIncumbent.class, fieldValues);
074    
075            if (budgetConstructionIntendedIncumbent == null) {
076                String emplid = (String) fieldValues.get(KFSPropertyConstants.EMPLID);
077                
078                errorMap.putError(KFSConstants.GLOBAL_MESSAGES, BCKeyConstants.ERROR_INCUMBENT_NOT_FOUND, emplid);
079                if (incumbentSalarySettingForm.isBudgetByAccountMode()){
080                    return this.returnToCaller(mapping, form, request, response);
081                }
082                else {
083                    this.cleanupAnySessionForm(mapping, request);
084                    return mapping.findForward(BCConstants.MAPPING_ORGANIZATION_SALARY_SETTING_RETURNING);
085                }
086            }
087    
088            incumbentSalarySettingForm.setBudgetConstructionIntendedIncumbent(budgetConstructionIntendedIncumbent);
089            if (incumbentSalarySettingForm.isSingleAccountMode()) {
090                incumbentSalarySettingForm.pickAppointmentFundingsForSingleAccount();
091            }
092    
093            // acquire position and funding locks for the associated funding lines
094            if (!incumbentSalarySettingForm.isViewOnlyEntry()) {
095                incumbentSalarySettingForm.postProcessBCAFLines();
096                incumbentSalarySettingForm.setNewBCAFLine(incumbentSalarySettingForm.createNewAppointmentFundingLine());
097                
098                boolean accessModeUpdated = incumbentSalarySettingForm.updateAccessMode(errorMap);
099                if (!accessModeUpdated) {
100                    if (incumbentSalarySettingForm.isBudgetByAccountMode()){
101                        return this.returnToCaller(mapping, form, request, response);
102                    }
103                    else {
104                        this.cleanupAnySessionForm(mapping, request);
105                        return mapping.findForward(BCConstants.MAPPING_ORGANIZATION_SALARY_SETTING_RETURNING);
106                    }
107                }
108    
109                boolean gotLocks = incumbentSalarySettingForm.acquirePositionAndFundingLocks(errorMap);
110                if (!gotLocks) {
111                    if (incumbentSalarySettingForm.isBudgetByAccountMode()){
112                        return this.returnToCaller(mapping, form, request, response);
113                    }
114                    else {
115                        this.cleanupAnySessionForm(mapping, request);
116                        return mapping.findForward(BCConstants.MAPPING_ORGANIZATION_SALARY_SETTING_RETURNING);
117                    }
118                }
119            }
120    
121            return mapping.findForward(KFSConstants.MAPPING_BASIC);
122        }
123    
124        /**
125         * @see org.kuali.kfs.module.bc.document.web.struts.DetailSalarySettingAction#save(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
126         */
127        @Override
128        public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
129    
130            ActionForward saveAction =  super.save(mapping, form, request, response);
131    
132            IncumbentSalarySettingForm incumbentSalarySettingForm = (IncumbentSalarySettingForm) form;
133            this.sendWarnings(incumbentSalarySettingForm, GlobalVariables.getMessageList());
134            
135            return saveAction;
136        }
137    
138        /**
139         * send warning messsages back to the caller
140         * 
141         * @param incumbentSalarySettingForm
142         * @param warnings
143         */
144        public void sendWarnings(IncumbentSalarySettingForm incumbentSalarySettingForm, MessageList warnings){
145            List<PendingBudgetConstructionAppointmentFunding> activeAppointmentFundings = incumbentSalarySettingForm.getActiveFundingLines();
146            if (activeAppointmentFundings == null || activeAppointmentFundings.isEmpty()) {
147                return;
148            }
149            BigDecimal requestedFteQuantityTotal = incumbentSalarySettingForm.getAppointmentRequestedFteQuantityTotal();
150            
151            // check for an active line that is LWPA or LWPF
152            boolean hasFundingLineInvolvedLeaveWithoutPay = this.hasFundingLineInvolvedLeaveWithoutPay(activeAppointmentFundings);
153    
154            if (!hasFundingLineInvolvedLeaveWithoutPay && requestedFteQuantityTotal.compareTo(BigDecimal.ONE) != 0) {
155                warnings.add(BCKeyConstants.WARNING_FTE_NOT_ONE);
156            }
157    
158        }
159    
160        /**
161         * @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#getFundingAwareObjectName()
162         */
163        @Override
164        protected String getFundingAwareObjectName() {
165            return BCPropertyConstants.BUDGET_CONSTRUCTION_INTENDED_INCUMBENT;
166        }
167    }