/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.bc.document.web.struts;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.kuali.kfs.module.bc.BCConstants;
import org.kuali.kfs.module.bc.BCKeyConstants;
import org.kuali.kfs.module.bc.BCPropertyConstants;
import org.kuali.kfs.module.bc.BCConstants.SynchronizationCheckType;
import org.kuali.kfs.module.bc.businessobject.BudgetConstructionIntendedIncumbent;
import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding;
import org.kuali.kfs.module.bc.service.BudgetConstructionIntendedIncumbentService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.kns.util.KNSGlobalVariables;
import org.kuali.rice.kns.util.MessageList;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.MessageMap;
/**
* the struts action for the salary setting for incumbent
*/
public class IncumbentSalarySettingAction extends DetailSalarySettingAction {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(IncumbentSalarySettingAction.class);
private BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
private BudgetConstructionIntendedIncumbentService budgetConstructionIntendedIncumbentService = SpringContext.getBean(BudgetConstructionIntendedIncumbentService.class);
/**
* @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#loadExpansionScreen(org.apache.struts.action.ActionMapping,
* org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward loadExpansionScreen(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
IncumbentSalarySettingForm incumbentSalarySettingForm = (IncumbentSalarySettingForm) form;
MessageMap errorMap;
if (incumbentSalarySettingForm.isBudgetByAccountMode()){
errorMap = incumbentSalarySettingForm.getCallBackErrors();
}
else {
errorMap = GlobalVariables.getMessageMap();
}
// update incumbent record if required
if (incumbentSalarySettingForm.isRefreshIncumbentBeforeSalarySetting()) {
budgetConstructionIntendedIncumbentService.refreshIncumbentFromExternal(incumbentSalarySettingForm.getEmplid());
}
// use the passed url parms to get the record from DB
Map<String, Object> fieldValues = incumbentSalarySettingForm.getKeyMapOfSalarySettingItem();
BudgetConstructionIntendedIncumbent budgetConstructionIntendedIncumbent = (BudgetConstructionIntendedIncumbent) businessObjectService.findByPrimaryKey(BudgetConstructionIntendedIncumbent.class, fieldValues);
if (budgetConstructionIntendedIncumbent == null) {
String emplid = (String) fieldValues.get(KFSPropertyConstants.EMPLID);
errorMap.putError(KFSConstants.GLOBAL_MESSAGES, BCKeyConstants.ERROR_INCUMBENT_NOT_FOUND, emplid);
if (incumbentSalarySettingForm.isBudgetByAccountMode()){
return this.returnToCaller(mapping, form, request, response);
}
else {
this.cleanupAnySessionForm(mapping, request);
return mapping.findForward(BCConstants.MAPPING_ORGANIZATION_SALARY_SETTING_RETURNING);
}
}
incumbentSalarySettingForm.setBudgetConstructionIntendedIncumbent(budgetConstructionIntendedIncumbent);
if (incumbentSalarySettingForm.isSingleAccountMode()) {
incumbentSalarySettingForm.pickAppointmentFundingsForSingleAccount();
}
// acquire position and funding locks for the associated funding lines
if (!incumbentSalarySettingForm.isViewOnlyEntry()) {
incumbentSalarySettingForm.postProcessBCAFLines();
incumbentSalarySettingForm.setNewBCAFLine(incumbentSalarySettingForm.createNewAppointmentFundingLine());
boolean accessModeUpdated = incumbentSalarySettingForm.updateAccessMode(errorMap);
if (!accessModeUpdated) {
if (incumbentSalarySettingForm.isBudgetByAccountMode()){
return this.returnToCaller(mapping, form, request, response);
}
else {
this.cleanupAnySessionForm(mapping, request);
return mapping.findForward(BCConstants.MAPPING_ORGANIZATION_SALARY_SETTING_RETURNING);
}
}
boolean gotLocks = incumbentSalarySettingForm.acquirePositionAndFundingLocks(errorMap);
if (!gotLocks) {
if (incumbentSalarySettingForm.isBudgetByAccountMode()){
return this.returnToCaller(mapping, form, request, response);
}
else {
this.cleanupAnySessionForm(mapping, request);
return mapping.findForward(BCConstants.MAPPING_ORGANIZATION_SALARY_SETTING_RETURNING);
}
}
}
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* @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)
*/
@Override
public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
ActionForward saveAction = super.save(mapping, form, request, response);
IncumbentSalarySettingForm incumbentSalarySettingForm = (IncumbentSalarySettingForm) form;
this.sendWarnings(incumbentSalarySettingForm, KNSGlobalVariables.getMessageList());
return saveAction;
}
/**
* send warning messsages back to the caller
*
* @param incumbentSalarySettingForm
* @param warnings
*/
public void sendWarnings(IncumbentSalarySettingForm incumbentSalarySettingForm, MessageList warnings){
List<PendingBudgetConstructionAppointmentFunding> activeAppointmentFundings = incumbentSalarySettingForm.getActiveFundingLines();
if (activeAppointmentFundings == null || activeAppointmentFundings.isEmpty()) {
return;
}
BigDecimal requestedFteQuantityTotal = incumbentSalarySettingForm.getAppointmentRequestedFteQuantityTotal();
// check for an active line that is LWPA or LWPF
boolean hasFundingLineInvolvedLeaveWithoutPay = this.hasFundingLineInvolvedLeaveWithoutPay(activeAppointmentFundings);
if (!hasFundingLineInvolvedLeaveWithoutPay && requestedFteQuantityTotal.compareTo(BigDecimal.ONE) != 0) {
warnings.add(BCKeyConstants.WARNING_FTE_NOT_ONE);
}
}
/**
* @see org.kuali.kfs.module.bc.document.web.struts.SalarySettingBaseAction#getFundingAwareObjectName()
*/
protected String getFundingAwareObjectName() {
return BCPropertyConstants.BUDGET_CONSTRUCTION_INTENDED_INCUMBENT;
}
/**
* @see org.kuali.kfs.module.bc.document.web.struts.DetailSalarySettingAction#getSynchronizationCheckType()
*/
@Override
public SynchronizationCheckType getSynchronizationCheckType() {
return SynchronizationCheckType.POSN;
}
}