/*
* 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.ld.document.service.impl;
import static org.kuali.kfs.module.ld.document.validation.impl.SalaryExpenseTransferDocumentRuleConstants.ERROR_CERTIFICATION_DEFAULT_OVERRIDE_BY_SUB_FUND;
import java.util.List;
import org.kuali.kfs.coa.businessobject.SubFundGroup;
import org.kuali.kfs.integration.ld.LaborLedgerExpenseTransferAccountingLine;
import org.kuali.kfs.module.ld.LaborConstants;
import org.kuali.kfs.module.ld.businessobject.ExpenseTransferTargetAccountingLine;
import org.kuali.kfs.module.ld.document.service.SalaryExpenseTransferTransactionAgeService;
import org.kuali.kfs.sys.businessobject.UniversityDate;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* @see org.kuali.kfs.module.ld.document.service.SalaryExpenseTransferTransactionAgeService
*/
public class SalaryExpenseTransferTransactionAgeServiceImpl implements SalaryExpenseTransferTransactionAgeService {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SalaryExpenseTransferTransactionAgeServiceImpl.class);
protected static UniversityDateService universityDateService;
protected static ParameterService parameterService;
/**
*
* @see org.kuali.kfs.module.ld.document.service.SalaryExpenseTransferTransactionAgeService#defaultNumberOfFiscalPeriodsCheck(java.util.List, java.lang.Integer)
*
* Determines if the age of the transactions are older than the value in a parameter. By default, use the fiscal periods in
* periodsFromParameter. If a target accounting line, check account's sub fund and maybe use
* ERROR_CERTIFICATION_DEFAULT_OVERRIDE_BY_SUB_FUND parameter.
* <ol>
* <li>Loop through {@link ExpenseTransferTargetAccountingLine} instances in the {@link SalaryExpenseTransferDocument}.</li>
* <li>Get fiscal year and fiscal period of each line.</li>
* <li>Check sub fund of each line to possibly reassign periodsFromParameter.</li>
* </ol>
*
* @param accountingLines
* @param periodsFromParameter
* @return true if all of the transaction dates are younger by fiscal periods than specified in the appropriate parameter; false
* otherwise
*/
@Override
public boolean defaultNumberOfFiscalPeriodsCheck(List<LaborLedgerExpenseTransferAccountingLine> accountingLines, Integer periodsFromParameter) {
if (LOG.isDebugEnabled()) {
LOG.debug("in defaultNumberOfFiscalPeriodsCheck");
}
Integer currPayrollEndDateFiscalYear;
String currPayrollEndDateFiscalPeriodCode;
UniversityDate currUnivDate = universityDateService.getCurrentUniversityDate();
Integer currFiscalYear = currUnivDate.getUniversityFiscalYear();
String currFiscalPeriod = currUnivDate.getUniversityFiscalAccountingPeriod();
if (LOG.isDebugEnabled()) {
LOG.debug("currFiscalPeriod: " + currFiscalPeriod);
}
for (LaborLedgerExpenseTransferAccountingLine currentLine : accountingLines) {
currPayrollEndDateFiscalYear = currentLine.getPayrollEndDateFiscalYear();
if (LOG.isDebugEnabled()) {
LOG.debug("current line fiscal year: " + currPayrollEndDateFiscalYear);
}
currPayrollEndDateFiscalPeriodCode = currentLine.getPayrollEndDateFiscalPeriodCode();
if (LOG.isDebugEnabled()) {
LOG.debug("current line fiscal period: " + currPayrollEndDateFiscalPeriodCode);
}
// check sub fund associated with the target accounting line
if (currentLine.isTargetAccountingLine()) {
periodsFromParameter = checkCurrentSubFund(periodsFromParameter, (ExpenseTransferTargetAccountingLine) currentLine);
if (LOG.isDebugEnabled()) {
LOG.debug("periodsFromParameter: " + periodsFromParameter);
}
}
if (ObjectUtils.isNotNull(periodsFromParameter)) {
Integer fiscalPeriodsDifference = Integer.valueOf(currFiscalPeriod) - (Integer.valueOf(currPayrollEndDateFiscalPeriodCode) - (currFiscalYear - currPayrollEndDateFiscalYear) * LaborConstants.ErrorCertification.FISCAL_PERIODS_PER_YEAR);
if (fiscalPeriodsDifference >= periodsFromParameter) {
return false;
}
}
}
return true;
}
/**
*
* @see org.kuali.kfs.module.ld.document.service.SalaryExpenseTransferTransactionAgeService#checkCurrentSubFund(java.lang.Integer, org.kuali.kfs.module.ld.businessobject.ExpenseTransferTargetAccountingLine)
*
* This method checks the sub fund associated with the account in a target accounting line. If sub fund is in
* ERROR_CERTIFICATION_DEFAULT_OVERRIDE_BY_SUB_FUND parameter, use different # of fiscal periods
*
* @param periodsFromParameter initial periods from a parameter
* @param currentTargetLine
* @return the periodsFromParameter, which may have value in ERROR_CERTIFICATION_DEFAULT_OVERRIDE_BY_SUB_FUND
*/
@Override
public Integer checkCurrentSubFund(Integer periodsFromParameter, ExpenseTransferTargetAccountingLine currentTargetLine) {
if (LOG.isDebugEnabled()) {
LOG.debug("in checkCurrentSubFund");
}
SubFundGroup subFundGroup = currentTargetLine.getAccount().getSubFundGroup();
String subFundGroupCode = subFundGroup.getSubFundGroupCode();
String newComparePeriods = parameterService.getSubParameterValueAsString(KfsParameterConstants.LABOR_DOCUMENT.class, ERROR_CERTIFICATION_DEFAULT_OVERRIDE_BY_SUB_FUND, subFundGroupCode);
if (ObjectUtils.isNotNull(newComparePeriods)) {
periodsFromParameter = new Integer(newComparePeriods);
}
return periodsFromParameter;
}
/**
* Gets the injected universityDateService.
*
* @return Returns the universityDateService.
*/
public UniversityDateService getUniversityDateService() {
return universityDateService;
}
/**
* Sets the universityDateService attribute value.
*
* @param universityDateService The universityDateService to set.
*/
public void setUniversityDateService(UniversityDateService universityDateService) {
this.universityDateService = universityDateService;
}
/**
* Gets the injected ParameterService.
*
* @return Returns the parameterService.
*/
public ParameterService getParameterService() {
return parameterService;
}
/**
* Sets the parameterService attribute.
*
* @param parameterService
*/
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
}