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 /*
017 * Created on Jan 11, 2006
018 *
019 */
020 package org.kuali.kfs.gl.dataaccess.impl;
021
022 import java.math.BigDecimal;
023 import java.util.Date;
024 import java.util.Iterator;
025
026 import org.apache.ojb.broker.query.Criteria;
027 import org.apache.ojb.broker.query.QueryByCriteria;
028 import org.apache.ojb.broker.query.QueryFactory;
029 import org.apache.ojb.broker.query.ReportQueryByCriteria;
030 import org.kuali.kfs.gl.businessobject.Entry;
031 import org.kuali.kfs.gl.businessobject.Reversal;
032 import org.kuali.kfs.gl.businessobject.Transaction;
033 import org.kuali.kfs.gl.dataaccess.ReversalDao;
034 import org.kuali.kfs.sys.KFSPropertyConstants;
035 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
036 import org.kuali.rice.kns.util.TransactionalServiceUtils;
037
038 /**
039 * An OJB implementation of the Reversal DAO
040 */
041 public class ReversalDaoOjb extends PlatformAwareDaoBaseOjb implements ReversalDao {
042 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ReversalDaoOjb.class);
043
044 private final static String UNIVERISITY_FISCAL_YEAR = "universityFiscalYear";
045 private final static String CHART_OF_ACCOUNTS_CODE = "chartOfAccountsCode";
046 private final static String ACCOUNT_NUMBER = "accountNumber";
047 private final static String SUB_ACCOUNT_NUMBER = "subAccountNumber";
048 private final static String FINANCIAL_OBJECT_CODE = "financialObjectCode";
049 private final static String FINANCIAL_SUB_OBJECT_CODE = "financialSubObjectCode";
050 private final static String FINANCIAL_BALANCE_TYPE_CODE = "financialBalanceTypeCode";
051 private final static String FINANCIAL_OBJECT_TYPE_CODE = "financialObjectTypeCode";
052 private final static String UNIVERISTY_FISCAL_PERIOD_CODE = "universityFiscalPeriodCode";
053 private final static String FINANCIAL_DOCUMENT_TYPE_CODE = "financialDocumentTypeCode";
054 private final static String FINANCIAL_SYSTEM_ORIGINATION_CODE = "financialSystemOriginationCode";
055 private final static String MAX_CONSTANT = "max(documentNumber)";
056
057 /**
058 * Constructs a ReversalDaoOjb instance
059 */
060 public ReversalDaoOjb() {
061 super();
062 }
063
064 /**
065 * Find the maximum transactionLedgerEntrySequenceNumber in the entry table for a specific transaction. This is used to make
066 * sure that rows added have a unique primary key.
067 *
068 * @param t a transaction to find the maximum sequence number for
069 * @return the max sequence number for the given transaction
070 */
071 public int getMaxSequenceNumber(Transaction t) {
072 LOG.debug("getSequenceNumber() ");
073
074 Criteria crit = new Criteria();
075 crit.addEqualTo(UNIVERISITY_FISCAL_YEAR, t.getUniversityFiscalYear());
076 crit.addEqualTo(CHART_OF_ACCOUNTS_CODE, t.getChartOfAccountsCode());
077 crit.addEqualTo(ACCOUNT_NUMBER, t.getAccountNumber());
078 crit.addEqualTo(SUB_ACCOUNT_NUMBER, t.getSubAccountNumber());
079 crit.addEqualTo(FINANCIAL_OBJECT_CODE, t.getFinancialObjectCode());
080 crit.addEqualTo(FINANCIAL_SUB_OBJECT_CODE, t.getFinancialSubObjectCode());
081 crit.addEqualTo(FINANCIAL_BALANCE_TYPE_CODE, t.getFinancialBalanceTypeCode());
082 crit.addEqualTo(FINANCIAL_OBJECT_TYPE_CODE, t.getFinancialObjectTypeCode());
083 crit.addEqualTo(UNIVERISTY_FISCAL_PERIOD_CODE, t.getUniversityFiscalPeriodCode());
084 crit.addEqualTo(FINANCIAL_DOCUMENT_TYPE_CODE, t.getFinancialDocumentTypeCode());
085 crit.addEqualTo(FINANCIAL_SYSTEM_ORIGINATION_CODE, t.getFinancialSystemOriginationCode());
086 crit.addEqualTo(KFSPropertyConstants.DOCUMENT_NUMBER, t.getDocumentNumber());
087
088 ReportQueryByCriteria q = QueryFactory.newReportQuery(Entry.class, crit);
089 q.setAttributes(new String[] { "max(transactionLedgerEntrySequenceNumber)" });
090
091 Iterator iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q);
092 if (iter.hasNext()) {
093 Object[] data = (Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iter);
094 BigDecimal max = (BigDecimal) data[0]; // Don't know why OJB returns a BigDecimal, but it does
095
096 if (max == null) {
097 return 0;
098 }
099 else {
100 return max.intValue();
101 }
102 }
103 else {
104 return 0;
105 }
106 }
107
108 /**
109 * Fetches the reversal record that would affected by the posting of the given transaction
110 *
111 * @param t the transaction to find the related reversal for
112 * @return the reversal affected by the given transaction
113 * @see org.kuali.kfs.gl.dataaccess.ReversalDao#getByTransaction(org.kuali.kfs.gl.businessobject.Transaction)
114 */
115 public Reversal getByTransaction(Transaction t) {
116 LOG.debug("getByTransaction() started");
117
118 Criteria crit = new Criteria();
119 crit.addEqualTo(KFSPropertyConstants.FINANCIAL_DOCUMENT_REVERSAL_DATE, t.getFinancialDocumentReversalDate());
120 crit.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, t.getUniversityFiscalYear());
121 crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, t.getChartOfAccountsCode());
122 crit.addEqualTo(KFSPropertyConstants.ACCOUNT_NUMBER, t.getAccountNumber());
123 crit.addEqualTo(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, t.getSubAccountNumber());
124 crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, t.getFinancialObjectCode());
125 crit.addEqualTo(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, t.getFinancialSubObjectCode());
126 crit.addEqualTo(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, t.getFinancialBalanceTypeCode());
127 crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE, t.getFinancialObjectTypeCode());
128 crit.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, t.getUniversityFiscalPeriodCode());
129 crit.addEqualTo(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, t.getFinancialDocumentTypeCode());
130 crit.addEqualTo(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE, t.getFinancialSystemOriginationCode());
131 crit.addEqualTo(KFSPropertyConstants.DOCUMENT_NUMBER, t.getDocumentNumber());
132 crit.addEqualTo(KFSPropertyConstants.TRANSACTION_ENTRY_SEQUENCE_NUMBER, t.getTransactionLedgerEntrySequenceNumber());
133
134 QueryByCriteria qbc = QueryFactory.newQuery(Reversal.class, crit);
135 return (Reversal) getPersistenceBrokerTemplate().getObjectByQuery(qbc);
136 }
137
138 /**
139 * Saves a reversal record
140 *
141 * @param re a reversal record to save
142 * @see org.kuali.kfs.gl.dataaccess.ReversalDao#save(org.kuali.kfs.gl.businessobject.Reversal)
143 */
144 public void save(Reversal re) {
145 LOG.debug("save() started");
146
147 getPersistenceBrokerTemplate().store(re);
148 }
149
150 /**
151 * Fetches all reversals that have been set to reverse on or before the given date - that is to say,
152 * returns all the reversal records ready to be reversed!
153 *
154 * @param before the date that reversals must reverse on or before
155 * @return an Iterator of reversal records to reverse
156 * @see org.kuali.kfs.gl.dataaccess.ReversalDao#getByDate(java.util.Date)
157 */
158 public Iterator getByDate(Date before) {
159 LOG.debug("getByDate() started");
160
161 Criteria crit = new Criteria();
162 crit.addLessOrEqualThan(KFSPropertyConstants.FINANCIAL_DOCUMENT_REVERSAL_DATE, new java.sql.Date(before.getTime()));
163
164 QueryByCriteria qbc = QueryFactory.newQuery(Reversal.class, crit);
165 return getPersistenceBrokerTemplate().getIteratorByQuery(qbc);
166 }
167
168 /**
169 * Deletes a reversal record
170 *
171 * @param re reversal to delete
172 * @see org.kuali.kfs.gl.dataaccess.ReversalDao#delete(org.kuali.kfs.gl.businessobject.Reversal)
173 */
174 public void delete(Reversal re) {
175 LOG.debug("delete() started");
176
177 getPersistenceBrokerTemplate().delete(re);
178 }
179 }