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.gl.service.impl;
017
018 import java.util.Date;
019 import java.util.Iterator;
020
021 import org.kuali.kfs.coa.service.AccountingPeriodService;
022 import org.kuali.kfs.gl.businessobject.LedgerEntryForReporting;
023 import org.kuali.kfs.gl.businessobject.LedgerEntryHolder;
024 import org.kuali.kfs.gl.businessobject.Reversal;
025 import org.kuali.kfs.gl.businessobject.Transaction;
026 import org.kuali.kfs.gl.dataaccess.ReversalDao;
027 import org.kuali.kfs.gl.service.ReversalService;
028 import org.kuali.kfs.sys.KFSConstants;
029 import org.kuali.kfs.sys.service.UniversityDateService;
030 import org.springframework.transaction.annotation.Transactional;
031
032 /**
033 * This transactional class provides the default implementation of the services required in ReversalService
034 *
035 * @see org.kuali.kfs.gl.service.ReversalService
036 */
037 @Transactional
038 public class ReversalServiceImpl implements ReversalService {
039 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ReversalServiceImpl.class);
040
041 private ReversalDao reversalDao;
042 private AccountingPeriodService accountingPeriodService;
043 private UniversityDateService universityDateService;
044
045 /**
046 * Deletes a reversal record
047 *
048 * @param re the reversal to delete, remove, or otherwise expiate from the database
049 * @see org.kuali.kfs.gl.service.ReversalService#delete(org.kuali.kfs.gl.businessobject.Reversal)
050 */
051 public void delete(Reversal re) {
052 LOG.debug("delete() started");
053
054 reversalDao.delete(re);
055 }
056
057 /**
058 * Returns all the reversal records set to reverse on or before the given date
059 *
060 * @param before the date to find reversals on or before
061 * @see org.kuali.kfs.gl.service.ReversalService#getByDate(java.util.Date)
062 */
063 public Iterator getByDate(Date before) {
064 LOG.debug("getByDate() started");
065
066 return reversalDao.getByDate(before);
067 }
068
069 public Reversal getByTransaction(Transaction t) {
070 LOG.debug("getByTransaction() started");
071
072 return reversalDao.getByTransaction(t);
073 }
074
075 /**
076 * Summarizes all of the reversal records set to reverse before or on the given date
077 * @param before the date reversals summarized should be on or before
078 * @return a LedgerEntryHolder with a summary of
079 * @see org.kuali.kfs.gl.service.ReversalService#getSummaryByDate(java.util.Date)
080 */
081 public LedgerEntryHolder getSummaryByDate(Date before) {
082 LOG.debug("getSummaryByDate() started");
083
084 LedgerEntryHolder ledgerEntryHolder = new LedgerEntryHolder();
085
086 Iterator reversalsIterator = reversalDao.getByDate(before);
087 while (reversalsIterator.hasNext()) {
088 Reversal reversal = (Reversal) reversalsIterator.next();
089 LedgerEntryForReporting ledgerEntry = buildLedgerEntryFromReversal(reversal);
090 ledgerEntryHolder.insertLedgerEntry(ledgerEntry, true);
091 }
092 return ledgerEntryHolder;
093 }
094
095 /**
096 * Creates a LedgerEntry from a reversal, which is proper for summarization (ie, its fiscal year and period code are based off
097 * the reversal date, not off the transaction date or the reversal's current fiscal year and accounting period)
098 *
099 * @param reversal reversal to build LedgerEntry with
100 * @return a new LedgerEntry, populated by the reversal
101 */
102 protected LedgerEntryForReporting buildLedgerEntryFromReversal(Reversal reversal) {
103 LedgerEntryForReporting entry = new LedgerEntryForReporting(universityDateService.getFiscalYear(reversal.getFinancialDocumentReversalDate()), accountingPeriodService.getByDate(reversal.getFinancialDocumentReversalDate()).getUniversityFiscalPeriodCode(), reversal.getFinancialBalanceTypeCode(), reversal.getFinancialSystemOriginationCode());
104 if (KFSConstants.GL_CREDIT_CODE.equals(reversal.getTransactionDebitCreditCode())) {
105 entry.setCreditAmount(reversal.getTransactionLedgerEntryAmount());
106 entry.setCreditCount(1);
107 }
108 else if (KFSConstants.GL_DEBIT_CODE.equals(reversal.getTransactionDebitCreditCode())) {
109 entry.setDebitAmount(reversal.getTransactionLedgerEntryAmount());
110 entry.setDebitCount(1);
111 }
112 else {
113 entry.setNoDCAmount(reversal.getTransactionLedgerEntryAmount());
114 entry.setNoDCCount(1);
115 }
116 entry.setRecordCount(1);
117 return entry;
118 }
119
120 /**
121 * Saves a reversal record
122 *
123 * @param re the reversal to save
124 * @see org.kuali.kfs.gl.service.ReversalService#save(org.kuali.kfs.gl.businessobject.Reversal)
125 */
126 public void save(Reversal re) {
127 LOG.debug("save() started");
128
129 reversalDao.save(re);
130 }
131
132 /**
133 * Sets the reversalDao attribute, allowing injection of an implementation of that data access object
134 *
135 * @param reversalDao the reversalDao implementation to set
136 * @see org.kuali.kfs.gl.dataaccess.ReversalDao
137 */
138 public void setReversalDao(ReversalDao reversalDao) {
139 this.reversalDao = reversalDao;
140 }
141
142 /**
143 * Sets the accountingPeriodService attribute, allowing injection of an implementation of that service
144 *
145 * @param accountingPeriodService the accountingPeriodService implementation to set
146 * @see org.kuali.kfs.coa.service.AccountingPeriodService
147 */
148 public void setAccountingPeriodService(AccountingPeriodService accountingPeriodService) {
149 this.accountingPeriodService = accountingPeriodService;
150 }
151
152 /**
153 * Sets the unversityDateService attribute, allowing injection of an implementation of that service
154 *
155 * @param universityDateService the universityDateService implementation to set
156 * @see org.kuali.kfs.sys.service.UniversityDateService
157 */
158 public void setUniversityDateService(UniversityDateService universityDateService) {
159 this.universityDateService = universityDateService;
160 }
161 }