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    }