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 }