/* * 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.fp.document.service.impl; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.businessobject.ObjectCode; import org.kuali.kfs.coa.businessobject.OffsetDefinition; import org.kuali.kfs.coa.service.OffsetDefinitionService; import org.kuali.kfs.fp.document.YearEndDocument; import org.kuali.kfs.fp.document.service.YearEndPendingEntryService; import org.kuali.kfs.gl.service.SufficientFundsService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry; import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; import org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants; import org.kuali.kfs.sys.service.UniversityDateService; import org.kuali.rice.krad.document.TransactionalDocument; import org.kuali.rice.krad.util.ObjectUtils; /** * The default implementation of the YearEndPendingEntryService */ public class YearEndPendingEntryServiceImpl implements YearEndPendingEntryService { private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(YearEndPendingEntryServiceImpl.class); protected static final String FINAL_ACCOUNTING_PERIOD = KFSConstants.MONTH13; protected UniversityDateService universityDateService; protected SufficientFundsService sufficientFundsService; protected OffsetDefinitionService offsetDefinitionService; /** * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#customizeExplicitGeneralLedgerPendingEntry(org.kuali.rice.krad.document.TransactionalDocument, org.kuali.kfs.sys.businessobject.AccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry) */ @Override public void customizeExplicitGeneralLedgerPendingEntry(TransactionalDocument transactionalDocument, AccountingLine accountingLine, GeneralLedgerPendingEntry explicitEntry) { if (!(transactionalDocument instanceof YearEndDocument)) { throw new IllegalArgumentException("invalid (not a year end document) for class:" + transactionalDocument.getClass()); } YearEndDocument yearEndDocument = (YearEndDocument) transactionalDocument; explicitEntry.setUniversityFiscalPeriodCode(getAccountingPeriodForYearEndEntry()); explicitEntry.setUniversityFiscalYear(getPreviousFiscalYear()); } /** * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#customizeOffsetGeneralLedgerPendingEntry(org.kuali.rice.krad.document.TransactionalDocument, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry) */ @Override public boolean customizeOffsetGeneralLedgerPendingEntry(TransactionalDocument transactionalDocument, GeneralLedgerPendingEntrySourceDetail accountingLine, GeneralLedgerPendingEntry explicitEntry, GeneralLedgerPendingEntry offsetEntry) { if (!(transactionalDocument instanceof YearEndDocument)) { throw new IllegalArgumentException("invalid (not a year end document) for class:" + transactionalDocument.getClass()); } OffsetDefinition offsetDefinition = offsetDefinitionService.getByPrimaryId(getPreviousFiscalYear(), explicitEntry.getChartOfAccountsCode(), explicitEntry.getFinancialDocumentTypeCode(), explicitEntry.getFinancialBalanceTypeCode()); if (!ObjectUtils.isNull(offsetDefinition)) { String offsetObjectCode = getOffsetFinancialObjectCode(offsetDefinition); offsetEntry.setFinancialObjectCode(offsetObjectCode); if (offsetObjectCode.equals(AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode())) { // no BO, so punt offsetEntry.setAcctSufficientFundsFinObjCd(AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode()); } else { offsetDefinition.refreshReferenceObject(KFSPropertyConstants.FINANCIAL_OBJECT); ObjectCode financialObject = offsetDefinition.getFinancialObject(); // The ObjectCode reference may be invalid because a flexible offset account changed its chart code. if (ObjectUtils.isNull(financialObject)) { throw new RuntimeException("offset object code " + offsetEntry.getUniversityFiscalYear() + "-" + offsetEntry.getChartOfAccountsCode() + "-" + offsetEntry.getFinancialObjectCode()); } offsetEntry.refreshReferenceObject(KFSPropertyConstants.ACCOUNT); offsetEntry.setAcctSufficientFundsFinObjCd(sufficientFundsService.getSufficientFundsObjectCode(financialObject, offsetEntry.getAccount().getAccountSufficientFundsCode())); } offsetEntry.setFinancialObjectTypeCode(getOffsetFinancialObjectTypeCode(offsetDefinition)); return true; } return false; } /** * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#getFinalAccountingPeriod() */ @Override public String getFinalAccountingPeriod() { return FINAL_ACCOUNTING_PERIOD; } /** * @return the accounting period the year end entry should be populated with */ protected String getAccountingPeriodForYearEndEntry() { return getFinalAccountingPeriod(); } /** * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#getPreviousFiscalYear() */ @Override public Integer getPreviousFiscalYear() { return universityDateService.getCurrentFiscalYear() - 1; } /** * Helper method that determines the offset entry's financial object code. * * @param offsetDefinition * @return String */ protected String getOffsetFinancialObjectCode(OffsetDefinition offsetDefinition) { if (null != offsetDefinition) { String returnString = (!StringUtils.isBlank(offsetDefinition.getFinancialObjectCode())) ? offsetDefinition.getFinancialObjectCode() : AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode(); return returnString; } else { return AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode(); } } /** * Helper method that determines the offset entry's financial object type code. * * @param offsetDefinition * @return String */ protected String getOffsetFinancialObjectTypeCode(OffsetDefinition offsetDefinition) { if (null != offsetDefinition && null != offsetDefinition.getFinancialObject()) { String returnString = (!StringUtils.isBlank(offsetDefinition.getFinancialObject().getFinancialObjectTypeCode())) ? offsetDefinition.getFinancialObject().getFinancialObjectTypeCode() : AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectType(); return returnString; } else { return AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectType(); } } public void setUniversityDateService(UniversityDateService universityDateService) { this.universityDateService = universityDateService; } public void setSufficientFundsService(SufficientFundsService sufficientFundsService) { this.sufficientFundsService = sufficientFundsService; } public void setOffsetDefinitionService(OffsetDefinitionService offsetDefinitionService) { this.offsetDefinitionService = offsetDefinitionService; } }