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 }