/*
* 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.validation.impl;
import java.util.List;
import org.apache.commons.lang.StringUtils;
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.PendingBudgetConstructionAppointmentFunding;
import org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService;
import org.kuali.kfs.module.bc.document.service.SalarySettingRuleHelperService;
import org.kuali.kfs.module.bc.document.validation.SalarySettingRule;
import org.kuali.kfs.module.bc.service.HumanResourcesPayrollService;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.MessageMap;
/**
* the rule implementation for the actions of salary setting component
*/
public class SalarySettingRules implements SalarySettingRule {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SalarySettingRules.class);
protected BudgetConstructionRuleHelperService budgetConstructionRuleHelperService = SpringContext.getBean(BudgetConstructionRuleHelperService.class);
protected SalarySettingRuleHelperService salarySettingRuleHelperService = SpringContext.getBean(SalarySettingRuleHelperService.class);
protected HumanResourcesPayrollService humanResourcesPayrollService = SpringContext.getBean(HumanResourcesPayrollService.class);
protected MessageMap errorMap = GlobalVariables.getMessageMap();
/**
* @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processQuickSaveAppointmentFunding(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
*/
public boolean processQuickSaveAppointmentFunding(PendingBudgetConstructionAppointmentFunding appointmentFunding) {
LOG.debug("processQuickSaveAppointmentFunding() start");
boolean hasValidFormat = budgetConstructionRuleHelperService.isFieldFormatValid(appointmentFunding, errorMap);
if (!hasValidFormat) {
return hasValidFormat;
}
// get a temp message map to allow marking salarySettingExpansion then merge this to errorMap
MessageMap tempErrorMap = new MessageMap();
tempErrorMap.addToErrorPath(BCPropertyConstants.SALARY_SETTING_EXPANSION);
// check object, subobject, incumbent, position
boolean hasValidReference = true;
hasValidReference &= budgetConstructionRuleHelperService.hasValidObjectCode(appointmentFunding, tempErrorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidSubObjectCode(appointmentFunding, tempErrorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidIncumbentQuickSalarySetting(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidPosition(appointmentFunding, errorMap);
if (!hasValidReference) {
errorMap.merge(tempErrorMap);
return hasValidReference;
}
// check position default object code
String defaultObjectCode = appointmentFunding.getBudgetConstructionPosition().getIuDefaultObjectCode();
String objectCode = appointmentFunding.getFinancialObjectCode();
if (!StringUtils.equals(objectCode, defaultObjectCode)) {
errorMap.putError(KFSPropertyConstants.POSITION_NUMBER, BCKeyConstants.ERROR_NOT_DEFAULT_OBJECT_CODE, defaultObjectCode);
return false;
}
// check for active job
if (!appointmentFunding.getEmplid().equalsIgnoreCase("VACANT")){
Integer fiscalYear = appointmentFunding.getUniversityFiscalYear();
String emplid = appointmentFunding.getEmplid();
String positionNumber = appointmentFunding.getPositionNumber();
boolean hasActiveJob = humanResourcesPayrollService.isActiveJob(emplid, positionNumber, fiscalYear, SynchronizationCheckType.NONE);
if (!hasActiveJob) {
errorMap.putError(KFSPropertyConstants.POSITION_NUMBER, BCKeyConstants.ERROR_NO_ACTIVE_JOB_FOUND, appointmentFunding.getEmplid(), appointmentFunding.getPositionNumber());
return hasActiveJob;
}
}
// using request amount as property to light up on error
boolean isAssociatedWithBudgetableDocument = budgetConstructionRuleHelperService.isAssociatedWithValidDocument(appointmentFunding, errorMap, BCPropertyConstants.APPOINTMENT_REQUESTED_AMOUNT);
if (!isAssociatedWithBudgetableDocument) {
return isAssociatedWithBudgetableDocument;
}
boolean hasValidAmounts = this.hasValidAmountsQuickSalarySetting(appointmentFunding, errorMap);
if (!hasValidAmounts) {
return hasValidAmounts;
}
return true;
}
/**
* @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processSaveAppointmentFunding(java.util.List,
* org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
*/
public boolean processSaveAppointmentFunding(PendingBudgetConstructionAppointmentFunding appointmentFunding, SynchronizationCheckType synchronizationCheckType) {
LOG.debug("processSaveAppointmentFunding() start");
boolean hasValidFormat = budgetConstructionRuleHelperService.isFieldFormatValid(appointmentFunding, errorMap);
if (!hasValidFormat) {
return hasValidFormat;
}
boolean hasValidReferences = this.hasValidRefences(appointmentFunding, errorMap);
if (!hasValidReferences) {
return hasValidReferences;
}
boolean isObjectCodeMatching = salarySettingRuleHelperService.hasObjectCodeMatchingDefaultOfPosition(appointmentFunding, errorMap);
if (!isObjectCodeMatching) {
return isObjectCodeMatching;
}
boolean hasActiveJob = salarySettingRuleHelperService.hasActiveJob(appointmentFunding, errorMap, synchronizationCheckType);
if (!hasActiveJob) {
return hasActiveJob;
}
// using request amount as property to light up on error
boolean isAssociatedWithBudgetableDocument = budgetConstructionRuleHelperService.isAssociatedWithValidDocument(appointmentFunding, errorMap, BCPropertyConstants.APPOINTMENT_REQUESTED_AMOUNT);
if (!isAssociatedWithBudgetableDocument) {
return isAssociatedWithBudgetableDocument;
}
boolean hasValidAmounts = this.hasValidAmounts(appointmentFunding, errorMap);
if (!hasValidAmounts) {
return hasValidAmounts;
}
return true;
}
/**
* @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processAddAppointmentFunding(java.util.List,
* org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
*/
public boolean processAddAppointmentFunding(List<PendingBudgetConstructionAppointmentFunding> existingAppointmentFundings, PendingBudgetConstructionAppointmentFunding appointmentFunding, SynchronizationCheckType synchronizationCheckType) {
LOG.debug("processAddAppointmentFunding() start");
boolean hasNoExistingLine = salarySettingRuleHelperService.hasNoExistingLine(existingAppointmentFundings, appointmentFunding, errorMap);
if (!hasNoExistingLine) {
return hasNoExistingLine;
}
boolean hasValidFormat = budgetConstructionRuleHelperService.isFieldFormatValid(appointmentFunding, errorMap);
if (!hasValidFormat) {
return hasValidFormat;
}
boolean hasValidReferences = this.hasValidRefences(appointmentFunding, errorMap);
if (!hasValidReferences) {
return hasValidReferences;
}
boolean isObjectCodeMatching = salarySettingRuleHelperService.hasObjectCodeMatchingDefaultOfPosition(appointmentFunding, errorMap);
if (!isObjectCodeMatching) {
return isObjectCodeMatching;
}
boolean hasActiveJob = salarySettingRuleHelperService.hasActiveJob(appointmentFunding, errorMap, synchronizationCheckType);
if (!hasActiveJob) {
return hasActiveJob;
}
boolean isAssociatedWithBudgetableDocument = budgetConstructionRuleHelperService.isAssociatedWithValidDocument(appointmentFunding, errorMap, KFSPropertyConstants.ACCOUNT_NUMBER);
if (!isAssociatedWithBudgetableDocument) {
return isAssociatedWithBudgetableDocument;
} else {
appointmentFunding.setBudgetable(Boolean.TRUE);
}
boolean hasValidAmounts = this.hasValidAmounts(appointmentFunding, errorMap);
if (!hasValidAmounts) {
return hasValidAmounts;
}
return true;
}
/**
* @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processAdjustSalaraySettingLinePercent(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
*/
public boolean processAdjustSalaraySettingLinePercent(PendingBudgetConstructionAppointmentFunding appointmentFunding) {
boolean canBeAdjusted = salarySettingRuleHelperService.canBeAdjusted(appointmentFunding, errorMap);
if (!canBeAdjusted) {
return false;
}
boolean hasValidAdjustmentAmount = salarySettingRuleHelperService.hasValidAdjustmentAmount(appointmentFunding, errorMap);
if (!hasValidAdjustmentAmount) {
return false;
}
return true;
}
/**
* @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processNormalizePayrateAndAmount(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
*/
public boolean processNormalizePayrateAndAmount(PendingBudgetConstructionAppointmentFunding appointmentFunding) {
return salarySettingRuleHelperService.hasValidPayRateOrAnnualAmount(appointmentFunding, errorMap);
}
// test if all references of the given appointment funding are valid
private boolean hasValidRefences(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) {
boolean hasValidReference = budgetConstructionRuleHelperService.hasValidChart(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidAccount(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidObjectCode(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidSubAccount(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidSubObjectCode(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasDetailPositionRequiredObjectCode(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidPosition(appointmentFunding, errorMap);
hasValidReference &= budgetConstructionRuleHelperService.hasValidIncumbent(appointmentFunding, errorMap);
return hasValidReference;
}
// test if all amounts are legal
private boolean hasValidAmounts(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) {
boolean hasValidAmounts = salarySettingRuleHelperService.hasValidRequestedAmount(appointmentFunding, errorMap);
hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedFteQuantity(appointmentFunding, errorMap);
hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedFundingMonth(appointmentFunding, errorMap);
hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedTimePercent(appointmentFunding, errorMap);
hasValidAmounts &= salarySettingRuleHelperService.hasRequestedAmountZeroWhenFullYearLeave(appointmentFunding, errorMap);
hasValidAmounts &= salarySettingRuleHelperService.hasRequestedFteQuantityZeroWhenFullYearLeave(appointmentFunding, errorMap);
hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedCsfAmount(appointmentFunding, errorMap);
hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedCsfTimePercent(appointmentFunding, errorMap);
return hasValidAmounts;
}
// test if request amount and FTE interaction is legal
private boolean hasValidAmountsQuickSalarySetting(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) {
boolean hasValidAmounts = salarySettingRuleHelperService.hasValidRequestedAmountQuickSalarySetting(appointmentFunding, errorMap);
return hasValidAmounts;
}
}