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.util.HashMap;
019    import java.util.Map;
020    
021    import javax.servlet.http.HttpServletRequest;
022    import javax.servlet.http.HttpServletResponse;
023    
024    import org.apache.commons.lang.StringUtils;
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.BudgetConstructionAuthorizationStatus;
032    import org.kuali.kfs.module.bc.businessobject.BudgetConstructionMonthly;
033    import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionGeneralLedger;
034    import org.kuali.kfs.module.bc.document.BudgetConstructionDocument;
035    import org.kuali.kfs.module.bc.document.service.BudgetDocumentService;
036    import org.kuali.kfs.module.bc.document.validation.event.SaveMonthlyBudgetEvent;
037    import org.kuali.kfs.sys.KFSConstants;
038    import org.kuali.kfs.sys.KFSKeyConstants;
039    import org.kuali.kfs.sys.context.SpringContext;
040    import org.kuali.rice.kns.question.ConfirmationQuestion;
041    import org.kuali.rice.kns.service.BusinessObjectService;
042    import org.kuali.rice.kns.service.KualiConfigurationService;
043    import org.kuali.rice.kns.service.KualiRuleService;
044    import org.kuali.rice.kns.util.GlobalVariables;
045    import org.kuali.rice.kns.util.KualiInteger;
046    
047    
048    public class MonthlyBudgetAction extends BudgetExpansionAction {
049        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MonthlyBudgetAction.class);
050    
051        /**
052         * added for testing - remove if not needed
053         * 
054         * @see org.kuali.kfs.module.bc.document.web.struts.BudgetConstructionAction#execute(org.apache.struts.action.ActionMapping,
055         *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
056         */
057        @Override
058        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
059            ActionForward forward = super.execute(mapping, form, request, response);
060    
061            MonthlyBudgetForm monthlyBudgetForm = (MonthlyBudgetForm) form;
062            if (!monthlyBudgetForm.isLostSession()) {
063                populateAuthorizationFields(monthlyBudgetForm);
064    
065                // set the readOnly status on initial load of the form
066                if (monthlyBudgetForm.getMethodToCall().equals(BCConstants.MONTHLY_BUDGET_METHOD)) {
067                    BudgetConstructionMonthly bcMonthly = monthlyBudgetForm.getBudgetConstructionMonthly();
068                    PendingBudgetConstructionGeneralLedger pbgl = bcMonthly.getPendingBudgetConstructionGeneralLedger();
069    
070                    boolean tmpReadOnly = monthlyBudgetForm.isSystemViewOnly() || !monthlyBudgetForm.isEditAllowed();
071                    tmpReadOnly |= bcMonthly.getFinancialObjectCode().equalsIgnoreCase(KFSConstants.BudgetConstructionConstants.OBJECT_CODE_2PLG);
072                    tmpReadOnly |= (!monthlyBudgetForm.isBenefitsCalculationDisabled() && ((pbgl.getLaborObject() != null) && pbgl.getLaborObject().getFinancialObjectFringeOrSalaryCode().equalsIgnoreCase(BCConstants.LABOR_OBJECT_FRINGE_CODE)));
073    
074                    monthlyBudgetForm.setBudgetableDocument(SpringContext.getBean(BudgetDocumentService.class).isBudgetableDocumentNoWagesCheck(pbgl.getBudgetConstructionHeader()));
075                    monthlyBudgetForm.setMonthlyReadOnly(tmpReadOnly);
076    
077                }
078            }
079    
080            return forward;
081        }
082    
083        protected void populateAuthorizationFields(MonthlyBudgetForm monthlyBudgetForm) {
084            BudgetConstructionAuthorizationStatus authorizationStatus = (BudgetConstructionAuthorizationStatus) GlobalVariables.getUserSession().retrieveObject(BCConstants.BC_DOC_AUTHORIZATION_STATUS_SESSIONKEY);
085    
086            if (authorizationStatus == null) {
087                // just return, BudgetExpansionAction.execute() will see the session time out
088                // and redirect back to BudgetConstructionSelection
089                return;
090            }
091    
092            monthlyBudgetForm.setDocumentActions(authorizationStatus.getDocumentActions());
093            monthlyBudgetForm.setEditingMode(authorizationStatus.getEditingMode());
094        }
095    
096        public ActionForward loadExpansionScreen(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
097    
098            MonthlyBudgetForm monthlyBudgetForm = (MonthlyBudgetForm) form;
099    
100            // use the passed url parms to get the record from DB
101            Map fieldValues = new HashMap();
102            fieldValues.put("documentNumber", monthlyBudgetForm.getDocumentNumber());
103            fieldValues.put("universityFiscalYear", monthlyBudgetForm.getUniversityFiscalYear());
104            fieldValues.put("chartOfAccountsCode", monthlyBudgetForm.getChartOfAccountsCode());
105            fieldValues.put("accountNumber", monthlyBudgetForm.getAccountNumber());
106            fieldValues.put("subAccountNumber", monthlyBudgetForm.getSubAccountNumber());
107            fieldValues.put("financialObjectCode", monthlyBudgetForm.getFinancialObjectCode());
108            fieldValues.put("financialSubObjectCode", monthlyBudgetForm.getFinancialSubObjectCode());
109            fieldValues.put("financialBalanceTypeCode", monthlyBudgetForm.getFinancialBalanceTypeCode());
110            fieldValues.put("financialObjectTypeCode", monthlyBudgetForm.getFinancialObjectTypeCode());
111            BudgetConstructionMonthly budgetConstructionMonthly = (BudgetConstructionMonthly) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(BudgetConstructionMonthly.class, fieldValues);
112            if (budgetConstructionMonthly == null) {
113                budgetConstructionMonthly = new BudgetConstructionMonthly();
114                budgetConstructionMonthly.setDocumentNumber(monthlyBudgetForm.getDocumentNumber());
115                budgetConstructionMonthly.setUniversityFiscalYear(monthlyBudgetForm.getUniversityFiscalYear());
116                budgetConstructionMonthly.setChartOfAccountsCode(monthlyBudgetForm.getChartOfAccountsCode());
117                budgetConstructionMonthly.setAccountNumber(monthlyBudgetForm.getAccountNumber());
118                budgetConstructionMonthly.setSubAccountNumber(monthlyBudgetForm.getSubAccountNumber());
119                budgetConstructionMonthly.setFinancialObjectCode(monthlyBudgetForm.getFinancialObjectCode());
120                budgetConstructionMonthly.setFinancialSubObjectCode(monthlyBudgetForm.getFinancialSubObjectCode());
121                budgetConstructionMonthly.setFinancialBalanceTypeCode(monthlyBudgetForm.getFinancialBalanceTypeCode());
122                budgetConstructionMonthly.setFinancialObjectTypeCode(monthlyBudgetForm.getFinancialObjectTypeCode());
123                budgetConstructionMonthly.refreshReferenceObject("pendingBudgetConstructionGeneralLedger");
124                monthlyBudgetForm.setMonthlyPersisted(false);
125            }
126            else {
127                monthlyBudgetForm.setMonthlyPersisted(true);
128            }
129            monthlyBudgetForm.setBudgetConstructionMonthly(budgetConstructionMonthly);
130    
131    
132            return mapping.findForward(KFSConstants.MAPPING_BASIC);
133        }
134    
135        /**
136         * This saves the data and redisplays
137         * 
138         * @param mapping
139         * @param form
140         * @param request
141         * @param response
142         * @return
143         * @throws Exception
144         */
145        public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
146    
147            MonthlyBudgetForm monthlyBudgetForm = (MonthlyBudgetForm) form;
148            BudgetConstructionMonthly budgetConstructionMonthly = monthlyBudgetForm.getBudgetConstructionMonthly();
149    
150            this.replaceMonthlyNullWithZero(budgetConstructionMonthly);
151    
152            BudgetConstructionForm budgetConstructionForm = (BudgetConstructionForm) GlobalVariables.getUserSession().retrieveObject(monthlyBudgetForm.getReturnFormKey());
153            BudgetConstructionDocument bcDoc = budgetConstructionForm.getBudgetConstructionDocument();
154            boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new SaveMonthlyBudgetEvent(BCPropertyConstants.BUDGET_CONSTRUCTION_MONTHLY, bcDoc, budgetConstructionMonthly));
155    
156            if (rulePassed) {
157    
158                // getting here means salary detail line monthly totals equal annual
159                // or this is a non-salary detail line and overriding any difference needs to be confirmed 
160                KualiInteger monthTotalAmount = budgetConstructionMonthly.getFinancialDocumentMonthTotalLineAmount();
161                KualiInteger pbglRequestAmount = budgetConstructionMonthly.getPendingBudgetConstructionGeneralLedger().getAccountLineAnnualBalanceAmount();
162                if (!monthTotalAmount.equals(pbglRequestAmount)){
163    
164                    // total is different than annual
165                    Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME);
166                    KualiConfigurationService kualiConfiguration = SpringContext.getBean(KualiConfigurationService.class);
167                    if (question == null || !(KFSConstants.CONFIRMATION_QUESTION.equals(question))){
168                        // ask question if not already asked
169                        String questionText = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(BCKeyConstants.QUESTION_CONFIRM_MONTHLY_OVERRIDE);
170                        questionText = StringUtils.replace(questionText, "{0}", pbglRequestAmount.toString());
171                        questionText = StringUtils.replace(questionText, "{1}", monthTotalAmount.toString());
172    
173                        return this.performQuestionWithoutInput(mapping, form, request, response, KFSConstants.CONFIRMATION_QUESTION, questionText, KFSConstants.CONFIRMATION_QUESTION, BCConstants.MAPPING_SAVE, "");
174                    }
175                    else {
176                        Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON);
177                        if ((KFSConstants.CONFIRMATION_QUESTION.equals(question)) && ConfirmationQuestion.YES.equals(buttonClicked)) {
178    
179                            // yes do the override for non-salary line and save
180                            SpringContext.getBean(BudgetDocumentService.class).saveMonthlyBudget(monthlyBudgetForm, budgetConstructionMonthly);
181                            GlobalVariables.getMessageList().add(BCKeyConstants.MESSAGE_MONTHLY_ANNUAL_OVERRIDE_SAVED);
182                            monthlyBudgetForm.setMonthlyPersisted(true);
183                        }
184                    }
185                }
186                else {
187                    // total is same as annual do the save with no confirmation
188                    SpringContext.getBean(BudgetDocumentService.class).saveMonthlyBudget(monthlyBudgetForm, budgetConstructionMonthly);
189                    GlobalVariables.getMessageList().add(KFSKeyConstants.MESSAGE_SAVED);
190                    monthlyBudgetForm.setMonthlyPersisted(true);
191                }
192            }
193    
194            return mapping.findForward(KFSConstants.MAPPING_BASIC);
195        }
196    
197        public ActionForward close(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
198    
199            MonthlyBudgetForm monthlyBudgetForm = (MonthlyBudgetForm) form;
200            BudgetConstructionMonthly budgetConstructionMonthly = monthlyBudgetForm.getBudgetConstructionMonthly();
201    
202            if (!monthlyBudgetForm.isMonthlyReadOnly()) {
203                Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME);
204                KualiConfigurationService kualiConfiguration = SpringContext.getBean(KualiConfigurationService.class);
205    
206                // logic for close question
207                if (question == null) {
208                    // ask question if not already asked
209                    return this.performQuestionWithoutInput(mapping, form, request, response, KFSConstants.DOCUMENT_SAVE_BEFORE_CLOSE_QUESTION, kualiConfiguration.getPropertyString(KFSKeyConstants.QUESTION_SAVE_BEFORE_CLOSE), KFSConstants.CONFIRMATION_QUESTION, KFSConstants.MAPPING_CLOSE, "");
210                }
211                else {
212                    Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON);
213                    if ((KFSConstants.CONFIRMATION_QUESTION.equals(question)) || ((KFSConstants.DOCUMENT_SAVE_BEFORE_CLOSE_QUESTION.equals(question)) && ConfirmationQuestion.YES.equals(buttonClicked))) {
214    
215                        // yes button clicked - validate and save the row
216                        return this.save(mapping, form, request, response);
217                    }
218                    // else go to close logic below
219                }
220            }
221    
222            return returnToCaller(mapping, form, request, response);
223        }
224    
225        public ActionForward performMonthlySpread(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
226    
227            MonthlyBudgetForm tForm = (MonthlyBudgetForm) form;
228            BudgetConstructionMonthly bcMth = tForm.getBudgetConstructionMonthly();
229            KualiInteger requestAmt = bcMth.getPendingBudgetConstructionGeneralLedger().getAccountLineAnnualBalanceAmount();
230            if (requestAmt != null) {
231                bcMth.setFinancialDocumentMonth2LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
232                bcMth.setFinancialDocumentMonth3LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
233                bcMth.setFinancialDocumentMonth4LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
234                bcMth.setFinancialDocumentMonth5LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
235                bcMth.setFinancialDocumentMonth6LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
236                bcMth.setFinancialDocumentMonth7LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
237                bcMth.setFinancialDocumentMonth8LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
238                bcMth.setFinancialDocumentMonth9LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
239                bcMth.setFinancialDocumentMonth10LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
240                bcMth.setFinancialDocumentMonth11LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
241                bcMth.setFinancialDocumentMonth12LineAmount(new KualiInteger(requestAmt.divide(new KualiInteger(12))));
242    
243                KualiInteger totSoFar = bcMth.getFinancialDocumentMonth2LineAmount();
244                totSoFar = totSoFar.add(bcMth.getFinancialDocumentMonth3LineAmount().add(bcMth.getFinancialDocumentMonth4LineAmount()));
245                totSoFar = totSoFar.add(bcMth.getFinancialDocumentMonth5LineAmount().add(bcMth.getFinancialDocumentMonth6LineAmount()));
246                totSoFar = totSoFar.add(bcMth.getFinancialDocumentMonth7LineAmount().add(bcMth.getFinancialDocumentMonth8LineAmount()));
247                totSoFar = totSoFar.add(bcMth.getFinancialDocumentMonth9LineAmount().add(bcMth.getFinancialDocumentMonth10LineAmount()));
248                totSoFar = totSoFar.add(bcMth.getFinancialDocumentMonth11LineAmount().add(bcMth.getFinancialDocumentMonth12LineAmount()));
249    
250                bcMth.setFinancialDocumentMonth1LineAmount(requestAmt.subtract(totSoFar));
251            }
252    
253            return mapping.findForward(KFSConstants.MAPPING_BASIC);
254        }
255    
256        public ActionForward performMonthlyZero(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
257    
258            MonthlyBudgetForm tForm = (MonthlyBudgetForm) form;
259            BudgetConstructionMonthly bcMth = tForm.getBudgetConstructionMonthly();
260    
261            bcMth.setFinancialDocumentMonth1LineAmount(new KualiInteger(0));
262            bcMth.setFinancialDocumentMonth2LineAmount(new KualiInteger(0));
263            bcMth.setFinancialDocumentMonth3LineAmount(new KualiInteger(0));
264            bcMth.setFinancialDocumentMonth4LineAmount(new KualiInteger(0));
265            bcMth.setFinancialDocumentMonth5LineAmount(new KualiInteger(0));
266            bcMth.setFinancialDocumentMonth6LineAmount(new KualiInteger(0));
267            bcMth.setFinancialDocumentMonth7LineAmount(new KualiInteger(0));
268            bcMth.setFinancialDocumentMonth8LineAmount(new KualiInteger(0));
269            bcMth.setFinancialDocumentMonth9LineAmount(new KualiInteger(0));
270            bcMth.setFinancialDocumentMonth10LineAmount(new KualiInteger(0));
271            bcMth.setFinancialDocumentMonth11LineAmount(new KualiInteger(0));
272            bcMth.setFinancialDocumentMonth12LineAmount(new KualiInteger(0));
273    
274            return mapping.findForward(KFSConstants.MAPPING_BASIC);
275        }
276    
277        public ActionForward performMonthlyDelete(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
278    
279            MonthlyBudgetForm monthlyBudgetForm = (MonthlyBudgetForm) form;
280            BudgetConstructionMonthly budgetConstructionMonthly = monthlyBudgetForm.getBudgetConstructionMonthly();
281    
282            // don't really need this test since the delete button isn't displayed in readOnly mode
283            if (!monthlyBudgetForm.isSystemViewOnly() && monthlyBudgetForm.isEditAllowed()) {
284                Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME);
285                KualiConfigurationService kualiConfiguration = SpringContext.getBean(KualiConfigurationService.class);
286    
287                // logic for delete question
288                if (question == null) {
289                    // ask question if not already asked
290                    return this.performQuestionWithoutInput(mapping, form, request, response, KFSConstants.DOCUMENT_DELETE_QUESTION, kualiConfiguration.getPropertyString(BCKeyConstants.QUESTION_DELETE), KFSConstants.CONFIRMATION_QUESTION, KFSConstants.MAPPING_CLOSE, "");
291                }
292                else {
293                    Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON);
294                    if ((KFSConstants.DOCUMENT_DELETE_QUESTION.equals(question)) && ConfirmationQuestion.YES.equals(buttonClicked)) {
295    
296                        // if yes button clicked - delete and close
297                        SpringContext.getBean(BusinessObjectService.class).delete(budgetConstructionMonthly);
298    
299                        // if benefits calculation is turned on, check if the line is benefits related and call for calculation after
300                        // save
301                        BudgetConstructionForm budgetConstructionForm = (BudgetConstructionForm) GlobalVariables.getUserSession().retrieveObject(monthlyBudgetForm.getReturnFormKey());
302                        BudgetConstructionDocument bcDoc = budgetConstructionForm.getBudgetConstructionDocument();
303                        SpringContext.getBean(BudgetDocumentService.class).callForBenefitsCalcIfNeeded(bcDoc, budgetConstructionMonthly, KualiInteger.ZERO);
304    
305                        return returnToCaller(mapping, form, request, response);
306                    }
307                    // else go to close logic below
308                }
309            }
310    
311            return mapping.findForward(KFSConstants.MAPPING_BASIC);
312        }
313    
314        /**
315         * checks monthly object for nulls in the amounts and replaces with zeros
316         * 
317         * @param bcMth
318         */
319        public void replaceMonthlyNullWithZero(BudgetConstructionMonthly bcMth) {
320    
321            if (bcMth.getFinancialDocumentMonth1LineAmount() == null) {
322                bcMth.setFinancialDocumentMonth1LineAmount(new KualiInteger(0));
323            }
324            if (bcMth.getFinancialDocumentMonth2LineAmount() == null) {
325                bcMth.setFinancialDocumentMonth2LineAmount(new KualiInteger(0));
326            }
327            if (bcMth.getFinancialDocumentMonth3LineAmount() == null) {
328                bcMth.setFinancialDocumentMonth3LineAmount(new KualiInteger(0));
329            }
330            if (bcMth.getFinancialDocumentMonth4LineAmount() == null) {
331                bcMth.setFinancialDocumentMonth4LineAmount(new KualiInteger(0));
332            }
333            if (bcMth.getFinancialDocumentMonth5LineAmount() == null) {
334                bcMth.setFinancialDocumentMonth5LineAmount(new KualiInteger(0));
335            }
336            if (bcMth.getFinancialDocumentMonth6LineAmount() == null) {
337                bcMth.setFinancialDocumentMonth6LineAmount(new KualiInteger(0));
338            }
339            if (bcMth.getFinancialDocumentMonth7LineAmount() == null) {
340                bcMth.setFinancialDocumentMonth7LineAmount(new KualiInteger(0));
341            }
342            if (bcMth.getFinancialDocumentMonth8LineAmount() == null) {
343                bcMth.setFinancialDocumentMonth8LineAmount(new KualiInteger(0));
344            }
345            if (bcMth.getFinancialDocumentMonth9LineAmount() == null) {
346                bcMth.setFinancialDocumentMonth9LineAmount(new KualiInteger(0));
347            }
348            if (bcMth.getFinancialDocumentMonth10LineAmount() == null) {
349                bcMth.setFinancialDocumentMonth10LineAmount(new KualiInteger(0));
350            }
351            if (bcMth.getFinancialDocumentMonth11LineAmount() == null) {
352                bcMth.setFinancialDocumentMonth11LineAmount(new KualiInteger(0));
353            }
354            if (bcMth.getFinancialDocumentMonth12LineAmount() == null) {
355                bcMth.setFinancialDocumentMonth12LineAmount(new KualiInteger(0));
356            }
357        }
358    
359        /**
360         * This action changes the value of the hide field in the user interface so that when the page is rendered, the UI knows to show
361         * all of the descriptions and labels for each of the pbgl line values.
362         * 
363         * @param mapping
364         * @param form
365         * @param request
366         * @param response
367         * @return ActionForward
368         * @throws Exception
369         */
370        public ActionForward showDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
371            MonthlyBudgetForm tForm = (MonthlyBudgetForm) form;
372            tForm.setHideDetails(false);
373            return mapping.findForward(KFSConstants.MAPPING_BASIC);
374        }
375    
376        /**
377         * This action toggles the value of the hide field in the user interface to "hide" so that when the page is rendered, the UI
378         * displays values without all of the descriptions and labels for each of the pbgl lines.
379         * 
380         * @param mapping
381         * @param form
382         * @param request
383         * @param response
384         * @return ActionForward
385         * @throws Exception
386         */
387        public ActionForward hideDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
388            MonthlyBudgetForm tForm = (MonthlyBudgetForm) form;
389            tForm.setHideDetails(true);
390            return mapping.findForward(KFSConstants.MAPPING_BASIC);
391        }
392    }