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.fp.document.service.impl; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.kfs.coa.businessobject.ObjectCode; 020 import org.kuali.kfs.coa.businessobject.OffsetDefinition; 021 import org.kuali.kfs.coa.service.OffsetDefinitionService; 022 import org.kuali.kfs.fp.document.YearEndDocument; 023 import org.kuali.kfs.fp.document.service.YearEndPendingEntryService; 024 import org.kuali.kfs.gl.service.SufficientFundsService; 025 import org.kuali.kfs.sys.KFSPropertyConstants; 026 import org.kuali.kfs.sys.businessobject.AccountingLine; 027 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry; 028 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail; 029 import org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants; 030 import org.kuali.kfs.sys.service.UniversityDateService; 031 import org.kuali.rice.kns.document.TransactionalDocument; 032 import org.kuali.rice.kns.exception.ReferentialIntegrityException; 033 import org.kuali.rice.kns.util.ObjectUtils; 034 035 /** 036 * The default implementation of the YearEndPendingEntryService 037 */ 038 public class YearEndPendingEntryServiceImpl implements YearEndPendingEntryService { 039 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(YearEndPendingEntryServiceImpl.class); 040 041 private static final String FINAL_ACCOUNTING_PERIOD = "13"; 042 043 protected UniversityDateService universityDateService; 044 protected SufficientFundsService sufficientFundsService; 045 protected OffsetDefinitionService offsetDefinitionService; 046 047 /** 048 * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#customizeExplicitGeneralLedgerPendingEntry(org.kuali.rice.kns.document.TransactionalDocument, org.kuali.kfs.sys.businessobject.AccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry) 049 */ 050 public void customizeExplicitGeneralLedgerPendingEntry(TransactionalDocument transactionalDocument, AccountingLine accountingLine, GeneralLedgerPendingEntry explicitEntry) { 051 if (!YearEndDocument.class.isAssignableFrom(transactionalDocument.getClass())) { 052 throw new IllegalArgumentException("invalid (not a year end document) for class:" + transactionalDocument.getClass()); 053 } 054 YearEndDocument yearEndDocument = (YearEndDocument) transactionalDocument; 055 explicitEntry.setUniversityFiscalPeriodCode(getAccountingPeriodForYearEndEntry()); 056 explicitEntry.setUniversityFiscalYear(getPreviousFiscalYear()); 057 } 058 059 /** 060 * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#customizeOffsetGeneralLedgerPendingEntry(org.kuali.rice.kns.document.TransactionalDocument, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry) 061 */ 062 public boolean customizeOffsetGeneralLedgerPendingEntry(TransactionalDocument transactionalDocument, GeneralLedgerPendingEntrySourceDetail accountingLine, GeneralLedgerPendingEntry explicitEntry, GeneralLedgerPendingEntry offsetEntry) { 063 if (!(transactionalDocument instanceof YearEndDocument)) { 064 throw new IllegalArgumentException("invalid (not a year end document) for class:" + transactionalDocument.getClass()); 065 } 066 OffsetDefinition offsetDefinition = getOffsetDefinitionService().getByPrimaryId(getPreviousFiscalYear(), explicitEntry.getChartOfAccountsCode(), explicitEntry.getFinancialDocumentTypeCode(), explicitEntry.getFinancialBalanceTypeCode()); 067 if (!ObjectUtils.isNull(offsetDefinition)) { 068 String offsetObjectCode = getOffsetFinancialObjectCode(offsetDefinition); 069 offsetEntry.setFinancialObjectCode(offsetObjectCode); 070 if (offsetObjectCode.equals(AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode())) { 071 // no BO, so punt 072 offsetEntry.setAcctSufficientFundsFinObjCd(AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode()); 073 } 074 else { 075 offsetDefinition.refreshReferenceObject(KFSPropertyConstants.FINANCIAL_OBJECT); 076 ObjectCode financialObject = offsetDefinition.getFinancialObject(); 077 // The ObjectCode reference may be invalid because a flexible offset account changed its chart code. 078 if (ObjectUtils.isNull(financialObject)) { 079 throw new ReferentialIntegrityException("offset object code " + offsetEntry.getUniversityFiscalYear() + "-" + offsetEntry.getChartOfAccountsCode() + "-" + offsetEntry.getFinancialObjectCode()); 080 } 081 offsetEntry.refreshReferenceObject(KFSPropertyConstants.ACCOUNT); 082 offsetEntry.setAcctSufficientFundsFinObjCd(getSufficientFundsService().getSufficientFundsObjectCode(financialObject, offsetEntry.getAccount().getAccountSufficientFundsCode())); 083 } 084 085 offsetEntry.setFinancialObjectTypeCode(getOffsetFinancialObjectTypeCode(offsetDefinition)); 086 087 return true; 088 } 089 return false; 090 } 091 092 /** 093 * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#getFinalAccountingPeriod() 094 */ 095 public String getFinalAccountingPeriod() { 096 return FINAL_ACCOUNTING_PERIOD; 097 } 098 099 /** 100 * @return the accounting period the year end entry should be populated with 101 */ 102 protected String getAccountingPeriodForYearEndEntry() { 103 return getFinalAccountingPeriod(); 104 } 105 106 /** 107 * @see org.kuali.kfs.fp.document.service.YearEndPendingEntryService#getPreviousFiscalYear() 108 */ 109 public Integer getPreviousFiscalYear() { 110 int i = getUniversityDateService().getCurrentFiscalYear().intValue() - 1; 111 return new Integer(i); 112 } 113 114 /** 115 * Helper method that determines the offset entry's financial object code. 116 * 117 * @param offsetDefinition 118 * @return String 119 */ 120 protected String getOffsetFinancialObjectCode(OffsetDefinition offsetDefinition) { 121 LOG.debug("getOffsetFinancialObjectCode(OffsetDefinition) - start"); 122 123 if (null != offsetDefinition) { 124 String returnString = (!StringUtils.isBlank(offsetDefinition.getFinancialObjectCode())) ? offsetDefinition.getFinancialObjectCode() : AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode(); 125 LOG.debug("getOffsetFinancialObjectCode(OffsetDefinition) - end"); 126 return returnString; 127 } 128 else { 129 LOG.debug("getOffsetFinancialObjectCode(OffsetDefinition) - end"); 130 return AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectCode(); 131 } 132 133 } 134 135 /** 136 * Helper method that determines the offset entry's financial object type code. 137 * 138 * @param offsetDefinition 139 * @return String 140 */ 141 protected String getOffsetFinancialObjectTypeCode(OffsetDefinition offsetDefinition) { 142 LOG.debug("getOffsetFinancialObjectTypeCode(OffsetDefinition) - start"); 143 144 if (null != offsetDefinition && null != offsetDefinition.getFinancialObject()) { 145 String returnString = (!StringUtils.isBlank(offsetDefinition.getFinancialObject().getFinancialObjectTypeCode())) ? offsetDefinition.getFinancialObject().getFinancialObjectTypeCode() : AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectType(); 146 LOG.debug("getOffsetFinancialObjectTypeCode(OffsetDefinition) - end"); 147 return returnString; 148 } 149 else { 150 LOG.debug("getOffsetFinancialObjectTypeCode(OffsetDefinition) - end"); 151 return AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE.getBlankFinancialObjectType(); 152 } 153 154 } 155 156 public UniversityDateService getUniversityDateService() { 157 return universityDateService; 158 } 159 160 public void setUniversityDateService(UniversityDateService universityDateService) { 161 this.universityDateService = universityDateService; 162 } 163 164 public SufficientFundsService getSufficientFundsService() { 165 return sufficientFundsService; 166 } 167 168 public void setSufficientFundsService(SufficientFundsService sufficientFundsService) { 169 this.sufficientFundsService = sufficientFundsService; 170 } 171 172 public OffsetDefinitionService getOffsetDefinitionService() { 173 return offsetDefinitionService; 174 } 175 176 public void setOffsetDefinitionService(OffsetDefinitionService offsetDefinitionService) { 177 this.offsetDefinitionService = offsetDefinitionService; 178 } 179 180 }