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.List; 020 import java.util.Map; 021 import java.util.Properties; 022 023 import javax.servlet.http.HttpServletRequest; 024 import javax.servlet.http.HttpServletResponse; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.apache.struts.action.ActionForm; 028 import org.apache.struts.action.ActionForward; 029 import org.apache.struts.action.ActionMapping; 030 import org.kuali.kfs.module.bc.BCConstants; 031 import org.kuali.kfs.module.bc.BCKeyConstants; 032 import org.kuali.kfs.module.bc.BCPropertyConstants; 033 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionIntendedIncumbent; 034 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition; 035 import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding; 036 import org.kuali.kfs.module.bc.businessobject.SalarySettingExpansion; 037 import org.kuali.kfs.module.bc.document.BudgetConstructionDocument; 038 import org.kuali.kfs.module.bc.document.service.BudgetDocumentService; 039 import org.kuali.kfs.module.bc.document.service.SalarySettingService; 040 import org.kuali.kfs.module.bc.document.validation.event.QuickSaveSalarySettingEvent; 041 import org.kuali.kfs.module.bc.util.BudgetUrlUtil; 042 import org.kuali.kfs.sys.DynamicCollectionComparator; 043 import org.kuali.kfs.sys.KFSConstants; 044 import org.kuali.kfs.sys.KFSPropertyConstants; 045 import org.kuali.kfs.sys.context.SpringContext; 046 import org.kuali.rice.kns.service.BusinessObjectService; 047 import org.kuali.rice.kns.service.KualiConfigurationService; 048 import org.kuali.rice.kns.util.GlobalVariables; 049 import org.kuali.rice.kns.util.KualiDecimal; 050 import org.kuali.rice.kns.util.ObjectUtils; 051 import org.kuali.rice.kns.util.UrlFactory; 052 import org.kuali.rice.kns.web.struts.form.KualiForm; 053 054 /** 055 * the struts action for the quick salary setting 056 */ 057 public class QuickSalarySettingAction extends SalarySettingBaseAction { 058 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(QuickSalarySettingAction.class); 059 060 private BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class); 061 private SalarySettingService salarySettingService = SpringContext.getBean(SalarySettingService.class); 062 private BudgetDocumentService budgetDocumentService = SpringContext.getBean(BudgetDocumentService.class); 063 064 /** 065 * @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping, 066 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 067 */ 068 @Override 069 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 070 LOG.info("refresh() started"); 071 072 super.refresh(mapping, form, request, response); 073 074 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 075 salarySettingForm.setRefreshIncumbentBeforeSalarySetting(false); 076 salarySettingForm.setRefreshPositionBeforeSalarySetting(false); 077 078 return this.loadExpansionScreen(mapping, form, request, response); 079 } 080 081 /** 082 * Forwards to budget incumbent lookup passing parameters for new funding line. 083 */ 084 public ActionForward addIncumbent(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 085 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 086 087 if (!salarySettingForm.isViewOnlyEntry()) { 088 boolean isSaved = this.save(form); 089 if (!isSaved) { 090 return mapping.findForward(KFSConstants.MAPPING_BASIC); 091 } 092 } 093 094 Map<String, String> parameters = new HashMap<String, String>(); 095 parameters.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, salarySettingForm.getChartOfAccountsCode()); 096 parameters.put(KFSPropertyConstants.ACCOUNT_NUMBER, salarySettingForm.getAccountNumber()); 097 parameters.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, salarySettingForm.getSubAccountNumber()); 098 parameters.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, salarySettingForm.getFinancialObjectCode()); 099 parameters.put(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, salarySettingForm.getFinancialSubObjectCode()); 100 101 parameters.put(BCConstants.SHOW_SALARY_BY_INCUMBENT_ACTION, Boolean.TRUE.toString()); 102 parameters.put(BCPropertyConstants.BUDGET_BY_ACCOUNT_MODE, Boolean.TRUE.toString()); 103 parameters.put(BCPropertyConstants.ADD_LINE, Boolean.TRUE.toString()); 104 parameters.put(BCPropertyConstants.MAIN_WINDOW, (salarySettingForm.isMainWindow() ? "true" : "false")); 105 106 // anchor, if it exists 107 if (form instanceof KualiForm && StringUtils.isNotEmpty(salarySettingForm.getAnchor())) { 108 parameters.put(BCConstants.RETURN_ANCHOR, salarySettingForm.getAnchor()); 109 } 110 111 // the form object is retrieved and removed upon return by KualiRequestProcessor.processActionForm() 112 parameters.put(BCConstants.RETURN_FORM_KEY, GlobalVariables.getUserSession().addObject(form, BCConstants.FORMKEY_PREFIX)); 113 114 String lookupUrl = BudgetUrlUtil.buildTempListLookupUrl(mapping, salarySettingForm, BCConstants.TempListLookupMode.INTENDED_INCUMBENT, BudgetConstructionIntendedIncumbent.class.getName(), parameters); 115 116 this.cleanupAnySessionForm(mapping, request); 117 return new ActionForward(lookupUrl, true); 118 } 119 120 /** 121 * Forwards to budget position lookup passing parameters for new funding line. 122 */ 123 public ActionForward addPosition(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 124 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 125 126 if (!salarySettingForm.isViewOnlyEntry()) { 127 boolean isSaved = this.save(form); 128 if (!isSaved) { 129 return mapping.findForward(KFSConstants.MAPPING_BASIC); 130 } 131 } 132 133 Map<String, String> parameters = new HashMap<String, String>(); 134 parameters.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, salarySettingForm.getChartOfAccountsCode()); 135 parameters.put(KFSPropertyConstants.ACCOUNT_NUMBER, salarySettingForm.getAccountNumber()); 136 parameters.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, salarySettingForm.getSubAccountNumber()); 137 parameters.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, salarySettingForm.getFinancialObjectCode()); 138 parameters.put(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, salarySettingForm.getFinancialSubObjectCode()); 139 140 parameters.put(BCConstants.SHOW_SALARY_BY_POSITION_ACTION, Boolean.toString(salarySettingForm.isBudgetByAccountMode())); 141 parameters.put(BCPropertyConstants.BUDGET_BY_ACCOUNT_MODE, Boolean.TRUE.toString()); 142 parameters.put(BCPropertyConstants.ADD_LINE, Boolean.TRUE.toString()); 143 parameters.put(BCPropertyConstants.MAIN_WINDOW, (salarySettingForm.isMainWindow() ? "true" : "false")); 144 145 // anchor, if it exists 146 if (form instanceof KualiForm && StringUtils.isNotEmpty(salarySettingForm.getAnchor())) { 147 parameters.put(BCConstants.RETURN_ANCHOR, salarySettingForm.getAnchor()); 148 } 149 150 // the form object is retrieved and removed upon return by KualiRequestProcessor.processActionForm() 151 parameters.put(BCConstants.RETURN_FORM_KEY, GlobalVariables.getUserSession().addObject(form, BCConstants.FORMKEY_PREFIX)); 152 153 String lookupUrl = BudgetUrlUtil.buildTempListLookupUrl(mapping, salarySettingForm, BCConstants.TempListLookupMode.BUDGET_POSITION_LOOKUP, BudgetConstructionPosition.class.getName(), parameters); 154 155 this.cleanupAnySessionForm(mapping, request); 156 return new ActionForward(lookupUrl, true); 157 } 158 159 /** 160 * @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#loadExpansionScreen(org.apache.struts.action.ActionMapping, 161 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 162 */ 163 @Override 164 public ActionForward loadExpansionScreen(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 165 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 166 167 Map<String, Object> keyMap = salarySettingForm.getKeyMapOfSalarySettingItem(); 168 SalarySettingExpansion salarySettingExpansion = (SalarySettingExpansion) businessObjectService.findByPrimaryKey(SalarySettingExpansion.class, keyMap); 169 170 if (salarySettingExpansion == null) { 171 GlobalVariables.getMessageMap().putError(KFSConstants.GLOBAL_MESSAGES, BCKeyConstants.ERROR_SALARY_SETTING_EXPANSION_NOT_FOUND); 172 return this.returnToCaller(mapping, form, request, response); 173 } 174 175 salarySettingForm.setSalarySettingExpansion(salarySettingExpansion); 176 177 return mapping.findForward(KFSConstants.MAPPING_BASIC); 178 } 179 180 /** 181 * perform salary setting by incumbent with the specified funding line 182 */ 183 public ActionForward performIncumbentSalarySetting(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 184 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 185 186 if (!salarySettingForm.isViewOnlyEntry()) { 187 boolean isSaved = this.save(form); 188 if (!isSaved) { 189 return mapping.findForward(KFSConstants.MAPPING_BASIC); 190 } 191 } 192 193 String salarySettingURL = this.buildDetailSalarySettingURL(mapping, form, request, BCConstants.INCUMBENT_SALARY_SETTING_ACTION); 194 this.cleanupAnySessionForm(mapping, request); 195 return new ActionForward(salarySettingURL, true); 196 } 197 198 /** 199 * perform salary setting by position with the specified funding line 200 */ 201 public ActionForward performPositionSalarySetting(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 202 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 203 204 if (!salarySettingForm.isViewOnlyEntry()) { 205 boolean isSaved = this.save(form); 206 if (!isSaved) { 207 return mapping.findForward(KFSConstants.MAPPING_BASIC); 208 } 209 } 210 211 String salarySettingURL = this.buildDetailSalarySettingURL(mapping, form, request, BCConstants.POSITION_SALARY_SETTING_ACTION); 212 this.cleanupAnySessionForm(mapping, request); 213 return new ActionForward(salarySettingURL, true); 214 } 215 216 /** 217 * adjust the salary amounts of all funding lines 218 */ 219 public ActionForward adjustAllSalarySettingLinesPercent(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 220 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 221 SalarySettingExpansion salarySettingExpansion = salarySettingForm.getSalarySettingExpansion(); 222 223 List<PendingBudgetConstructionAppointmentFunding> appointmentFundings = salarySettingForm.getAppointmentFundings(); 224 225 KualiDecimal adjustmentAmount = salarySettingForm.getAdjustmentAmount(); 226 String adjustmentMeasurement = salarySettingForm.getAdjustmentMeasurement(); 227 228 // the adjustment measurement and amount must be provided 229 if (StringUtils.isBlank(adjustmentMeasurement)) { 230 GlobalVariables.getMessageMap().putError(BCPropertyConstants.ADJUSTMENT_MEASUREMENT, BCKeyConstants.ERROR_ADJUSTMENT_PERCENT_REQUIRED); 231 return mapping.findForward(KFSConstants.MAPPING_BASIC); 232 } 233 if (ObjectUtils.isNull(adjustmentAmount)) { 234 GlobalVariables.getMessageMap().putError(BCPropertyConstants.ADJUSTMENT_AMOUNT, BCKeyConstants.ERROR_ADJUSTMENT_AMOUNT_REQUIRED); 235 return mapping.findForward(KFSConstants.MAPPING_BASIC); 236 } 237 238 // retrieve corresponding document in advance in order to use the rule framework 239 BudgetConstructionDocument document = budgetDocumentService.getBudgetConstructionDocument(salarySettingExpansion); 240 if (document == null) { 241 GlobalVariables.getMessageMap().putError(KFSConstants.GLOBAL_ERRORS, BCKeyConstants.ERROR_BUDGET_DOCUMENT_NOT_FOUND, salarySettingExpansion.getSalarySettingExpansionString()); 242 return mapping.findForward(KFSConstants.MAPPING_BASIC); 243 } 244 245 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : appointmentFundings) { 246 appointmentFunding.setAdjustmentAmount(adjustmentAmount); 247 appointmentFunding.setAdjustmentMeasurement(adjustmentMeasurement); 248 249 String errorKeyPrefix = this.getErrorKeyPrefixOfAppointmentFundingLine(appointmentFundings, appointmentFunding); 250 251 ActionForward adjustAction = this.adjustSalarySettingLinePercent(mapping, salarySettingForm, appointmentFunding, document, errorKeyPrefix); 252 } 253 254 return mapping.findForward(KFSConstants.MAPPING_BASIC); 255 } 256 257 258 /** 259 * perform salary setting by position with the specified funding line 260 */ 261 public ActionForward toggleAdjustmentMeasurement(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 262 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 263 264 boolean currentStatus = salarySettingForm.isHideAdjustmentMeasurement(); 265 salarySettingForm.setHideAdjustmentMeasurement(!currentStatus); 266 267 return mapping.findForward(KFSConstants.MAPPING_BASIC); 268 } 269 270 /** 271 * @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#close(org.apache.struts.action.ActionMapping, 272 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 273 */ 274 @Override 275 public ActionForward close(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 276 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 277 278 ActionForward closeActionForward; 279 if (salarySettingForm.isViewOnlyEntry() || salarySettingForm.isSalarySettingClosed()) { 280 closeActionForward = this.returnAfterClose(salarySettingForm, mapping, request, response); 281 } 282 else { 283 closeActionForward = super.close(mapping, salarySettingForm, request, response); 284 } 285 return closeActionForward; 286 } 287 288 /** 289 * @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#save(org.apache.struts.action.ActionMapping, 290 * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 291 */ 292 @Override 293 public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 294 boolean isSaved = this.save(form); 295 if (isSaved) { 296 GlobalVariables.getMessageList().add(BCKeyConstants.MESSAGE_SALARY_SETTING_SAVED); 297 } 298 299 return mapping.findForward(KFSConstants.MAPPING_BASIC); 300 } 301 302 // save the savable appointment funding lines 303 private boolean save(ActionForm form) { 304 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 305 SalarySettingExpansion salarySettingExpansion = salarySettingForm.getSalarySettingExpansion(); 306 307 BudgetConstructionDocument document = budgetDocumentService.getBudgetConstructionDocument(salarySettingExpansion); 308 if (document == null) { 309 GlobalVariables.getMessageMap().putError(KFSConstants.GLOBAL_ERRORS, BCKeyConstants.ERROR_BUDGET_DOCUMENT_NOT_FOUND, salarySettingExpansion.getSalarySettingExpansionString()); 310 return false; 311 } 312 313 // get budget allowed flag which is used to deny any updates other than delete 314 boolean isBudgetAllowed = budgetDocumentService.isBudgetableDocument(document); 315 316 List<PendingBudgetConstructionAppointmentFunding> savableAppointmentFundings = salarySettingForm.getAppointmentFundings(); 317 List<PendingBudgetConstructionAppointmentFunding> appointmentFundings = salarySettingForm.getAppointmentFundings(); 318 319 for (PendingBudgetConstructionAppointmentFunding savableFunding : savableAppointmentFundings) { 320 String errorKeyPrefix = this.getErrorKeyPrefixOfAppointmentFundingLine(appointmentFundings, savableFunding); 321 322 // added 12/3/2008 - gwp 323 // no rules check for marked delete line 324 if (savableFunding.isAppointmentFundingDeleteIndicator()) { 325 continue; 326 } 327 328 salarySettingService.recalculateDerivedInformation(savableFunding); 329 330 // any other update must be against a budget allowed document 331 if (!isBudgetAllowed) { 332 GlobalVariables.getMessageMap().addToErrorPath(errorKeyPrefix); 333 GlobalVariables.getMessageMap().putError(BCPropertyConstants.APPOINTMENT_REQUESTED_AMOUNT, BCKeyConstants.ERROR_BUDGET_DOCUMENT_NOT_BUDGETABLE, salarySettingExpansion.getSalarySettingExpansionString()); 334 return false; 335 } 336 337 // validate the savable appointment funding lines 338 boolean isValid = this.invokeRules(new QuickSaveSalarySettingEvent(KFSConstants.EMPTY_STRING, errorKeyPrefix, document, savableFunding)); 339 if (!isValid) { 340 return false; 341 } 342 } 343 344 salarySettingService.saveSalarySetting(salarySettingExpansion); 345 salarySettingExpansion.refresh(); 346 347 return true; 348 } 349 350 // build the URL for the specified salary setting method 351 private String buildDetailSalarySettingURL(ActionMapping mapping, ActionForm form, HttpServletRequest request, String salarySettingAction) { 352 QuickSalarySettingForm salarySettingForm = (QuickSalarySettingForm) form; 353 354 int indexOfSelectedLine = this.getSelectedLine(request); 355 List<PendingBudgetConstructionAppointmentFunding> appointmentFundings = salarySettingForm.getAppointmentFundings(); 356 DynamicCollectionComparator.sort(appointmentFundings, KFSPropertyConstants.POSITION_NUMBER, KFSPropertyConstants.EMPLID); 357 358 PendingBudgetConstructionAppointmentFunding appointmentFunding = appointmentFundings.get(indexOfSelectedLine); 359 360 // get the base action 361 Map<String, String> salarySettingMethodAction = this.getSalarySettingMethodActionInfo(); 362 String basePath = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.APPLICATION_URL_KEY); 363 String baseAction = basePath + "/" + salarySettingAction; 364 String methodToCall = salarySettingMethodAction.get(salarySettingAction); 365 366 // build the query strings with the information of the selected line 367 Properties parameters = new Properties(); 368 parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, methodToCall); 369 parameters.put(KFSConstants.BACK_LOCATION, basePath + mapping.getPath() + KFSConstants.ACTION_EXTENSION_DOT_DO); 370 371 parameters.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, appointmentFunding.getUniversityFiscalYear().toString()); 372 parameters.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, appointmentFunding.getChartOfAccountsCode()); 373 parameters.put(KFSPropertyConstants.ACCOUNT_NUMBER, appointmentFunding.getAccountNumber()); 374 parameters.put(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, appointmentFunding.getSubAccountNumber()); 375 parameters.put(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, appointmentFunding.getFinancialObjectCode()); 376 parameters.put(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, appointmentFunding.getFinancialSubObjectCode()); 377 parameters.put(KFSPropertyConstants.POSITION_NUMBER, appointmentFunding.getPositionNumber()); 378 parameters.put(KFSPropertyConstants.EMPLID, appointmentFunding.getEmplid()); 379 380 parameters.put(BCPropertyConstants.REFRESH_INCUMBENT_BEFORE_SALARY_SETTING, Boolean.valueOf(salarySettingForm.isRefreshIncumbentBeforeSalarySetting()).toString()); 381 parameters.put(BCPropertyConstants.REFRESH_POSITION_BEFORE_SALARY_SETTING, Boolean.valueOf(salarySettingForm.isRefreshPositionBeforeSalarySetting()).toString()); 382 383 parameters.put(BCPropertyConstants.BUDGET_BY_ACCOUNT_MODE, Boolean.TRUE.toString()); 384 parameters.put(BCPropertyConstants.ADD_LINE, Boolean.FALSE.toString()); 385 parameters.put(BCPropertyConstants.MAIN_WINDOW, (salarySettingForm.isMainWindow() ? "true" : "false")); 386 387 // anchor, if it exists 388 if (form instanceof KualiForm && StringUtils.isNotEmpty(salarySettingForm.getAnchor())) { 389 parameters.put(BCConstants.RETURN_ANCHOR, salarySettingForm.getAnchor()); 390 } 391 392 // the form object is retrieved and removed upon return by KualiRequestProcessor.processActionForm() 393 parameters.put(BCConstants.RETURN_FORM_KEY, GlobalVariables.getUserSession().addObject(form, BCConstants.FORMKEY_PREFIX)); 394 395 return UrlFactory.parameterizeUrl(baseAction, parameters); 396 } 397 398 // get the pairs of the method and action of salary settings 399 private Map<String, String> getSalarySettingMethodActionInfo() { 400 Map<String, String> salarySettingMethodAction = new HashMap<String, String>(); 401 salarySettingMethodAction.put(BCConstants.INCUMBENT_SALARY_SETTING_ACTION, BCConstants.INCUMBENT_SALARY_SETTING_METHOD); 402 salarySettingMethodAction.put(BCConstants.POSITION_SALARY_SETTING_ACTION, BCConstants.POSITION_SALARY_SETTING_METHOD); 403 404 return salarySettingMethodAction; 405 } 406 407 /** 408 * @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#getFundingAwareObjectName() 409 */ 410 @Override 411 protected String getFundingAwareObjectName() { 412 return BCPropertyConstants.SALARY_SETTING_EXPANSION; 413 } 414 }