/* * 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.gl.service.impl; import java.util.Date; import java.util.Iterator; import org.kuali.kfs.coa.service.AccountingPeriodService; import org.kuali.kfs.gl.businessobject.LedgerEntryForReporting; import org.kuali.kfs.gl.businessobject.LedgerEntryHolder; import org.kuali.kfs.gl.businessobject.Reversal; import org.kuali.kfs.gl.businessobject.Transaction; import org.kuali.kfs.gl.dataaccess.ReversalDao; import org.kuali.kfs.gl.service.ReversalService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.service.UniversityDateService; import org.kuali.rice.krad.service.BusinessObjectService; import org.springframework.transaction.annotation.Transactional; /** * This transactional class provides the default implementation of the services required in ReversalService * * @see org.kuali.kfs.gl.service.ReversalService */ @Transactional public class ReversalServiceImpl implements ReversalService { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ReversalServiceImpl.class); private ReversalDao reversalDao; private AccountingPeriodService accountingPeriodService; private UniversityDateService universityDateService; /** * Deletes a reversal record * * @param re the reversal to delete, remove, or otherwise expiate from the database * @see org.kuali.kfs.gl.service.ReversalService#delete(org.kuali.kfs.gl.businessobject.Reversal) */ public void delete(Reversal re) { LOG.debug("delete() started"); reversalDao.delete(re); } /** * Returns all the reversal records set to reverse on or before the given date * * @param before the date to find reversals on or before * @see org.kuali.kfs.gl.service.ReversalService#getByDate(java.util.Date) */ public Iterator getByDate(Date before) { LOG.debug("getByDate() started"); return reversalDao.getByDate(before); } public Reversal getByTransaction(Transaction t) { LOG.debug("getByTransaction() started"); return reversalDao.getByTransaction(t); } /** * Summarizes all of the reversal records set to reverse before or on the given date * @param before the date reversals summarized should be on or before * @return a LedgerEntryHolder with a summary of * @see org.kuali.kfs.gl.service.ReversalService#getSummaryByDate(java.util.Date) */ public LedgerEntryHolder getSummaryByDate(Date before) { LOG.debug("getSummaryByDate() started"); LedgerEntryHolder ledgerEntryHolder = new LedgerEntryHolder(); Iterator reversalsIterator = reversalDao.getByDate(before); while (reversalsIterator.hasNext()) { Reversal reversal = (Reversal) reversalsIterator.next(); LedgerEntryForReporting ledgerEntry = buildLedgerEntryFromReversal(reversal); ledgerEntryHolder.insertLedgerEntry(ledgerEntry, true); } return ledgerEntryHolder; } /** * Creates a LedgerEntry from a reversal, which is proper for summarization (ie, its fiscal year and period code are based off * the reversal date, not off the transaction date or the reversal's current fiscal year and accounting period) * * @param reversal reversal to build LedgerEntry with * @return a new LedgerEntry, populated by the reversal */ protected LedgerEntryForReporting buildLedgerEntryFromReversal(Reversal reversal) { LedgerEntryForReporting entry = new LedgerEntryForReporting(universityDateService.getFiscalYear(reversal.getFinancialDocumentReversalDate()), accountingPeriodService.getByDate(reversal.getFinancialDocumentReversalDate()).getUniversityFiscalPeriodCode(), reversal.getFinancialBalanceTypeCode(), reversal.getFinancialSystemOriginationCode()); if (KFSConstants.GL_CREDIT_CODE.equals(reversal.getTransactionDebitCreditCode())) { entry.setCreditAmount(reversal.getTransactionLedgerEntryAmount()); entry.setCreditCount(1); } else if (KFSConstants.GL_DEBIT_CODE.equals(reversal.getTransactionDebitCreditCode())) { entry.setDebitAmount(reversal.getTransactionLedgerEntryAmount()); entry.setDebitCount(1); } else { entry.setNoDCAmount(reversal.getTransactionLedgerEntryAmount()); entry.setNoDCCount(1); } entry.setRecordCount(1); return entry; } /** * Saves a reversal record * * @param re the reversal to save * @see org.kuali.kfs.gl.service.ReversalService#save(org.kuali.kfs.gl.businessobject.Reversal) */ public void save(Reversal re) { LOG.debug("save() started"); SpringContext.getBean(BusinessObjectService.class).save(re); } /** * Sets the reversalDao attribute, allowing injection of an implementation of that data access object * * @param reversalDao the reversalDao implementation to set * @see org.kuali.kfs.gl.dataaccess.ReversalDao */ public void setReversalDao(ReversalDao reversalDao) { this.reversalDao = reversalDao; } /** * Sets the accountingPeriodService attribute, allowing injection of an implementation of that service * * @param accountingPeriodService the accountingPeriodService implementation to set * @see org.kuali.kfs.coa.service.AccountingPeriodService */ public void setAccountingPeriodService(AccountingPeriodService accountingPeriodService) { this.accountingPeriodService = accountingPeriodService; } /** * Sets the unversityDateService attribute, allowing injection of an implementation of that service * * @param universityDateService the universityDateService implementation to set * @see org.kuali.kfs.sys.service.UniversityDateService */ public void setUniversityDateService(UniversityDateService universityDateService) { this.universityDateService = universityDateService; } }