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 }