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.fp.document.dataaccess.impl;
017    
018    import java.util.ArrayList;
019    import java.util.Calendar;
020    import java.util.GregorianCalendar;
021    import java.util.Iterator;
022    import java.util.List;
023    
024    import org.apache.ojb.broker.query.Criteria;
025    import org.apache.ojb.broker.query.QueryByCriteria;
026    import org.apache.ojb.broker.query.QueryFactory;
027    import org.kuali.kfs.fp.businessobject.CashieringItemInProcess;
028    import org.kuali.kfs.fp.businessobject.CashieringTransaction;
029    import org.kuali.kfs.fp.businessobject.Check;
030    import org.kuali.kfs.fp.businessobject.CheckBase;
031    import org.kuali.kfs.fp.businessobject.CoinDetail;
032    import org.kuali.kfs.fp.businessobject.CurrencyDetail;
033    import org.kuali.kfs.fp.document.dataaccess.CashManagementDao;
034    import org.kuali.kfs.sys.KFSConstants;
035    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
036    import org.kuali.rice.kns.util.TransactionalServiceUtils;
037    import org.springframework.dao.DataAccessException;
038    
039    public class CashManagementDaoOjb extends PlatformAwareDaoBaseOjb implements CashManagementDao {
040        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CashManagementDaoOjb.class);
041    
042        public CashManagementDaoOjb() {
043            super();
044        }
045    
046        /**
047         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findOpenItemsInProcessByCampusCode(java.lang.String)
048         */
049        public List<CashieringItemInProcess> findOpenItemsInProcessByCampusCode(String campusCode) throws DataAccessException {
050            List<CashieringItemInProcess> openItems = new ArrayList<CashieringItemInProcess>();
051            Criteria criteria = new Criteria();
052            criteria.addEqualTo("campusCode", campusCode);
053            criteria.addColumnIsNull("ITM_CLOSED_DT");
054    
055            QueryByCriteria openItemsQuery = QueryFactory.newQuery(CashieringItemInProcess.class, criteria);
056            Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(openItemsQuery);
057            while (iter.hasNext()) {
058                openItems.add((CashieringItemInProcess) iter.next());
059            }
060            return openItems;
061        }
062    
063        /**
064         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findRecentlyClosedItemsInProcess(java.lang.String)
065         */
066        public List<CashieringItemInProcess> findRecentlyClosedItemsInProcess(String campusCode) {
067            List<CashieringItemInProcess> closedItems = new ArrayList<CashieringItemInProcess>();
068    
069            Criteria criteria = new Criteria();
070            criteria.addEqualTo("campusCode", campusCode);
071            criteria.addColumnNotNull("ITM_CLOSED_DT");
072            Calendar thirtyDaysAgo = new GregorianCalendar();
073            thirtyDaysAgo.add(Calendar.DAY_OF_YEAR, -30);
074            criteria.addGreaterThan("itemClosedDate", new java.sql.Date(thirtyDaysAgo.getTimeInMillis()));
075    
076            QueryByCriteria closedItemsQuery = QueryFactory.newQuery(CashieringItemInProcess.class, criteria);
077            Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(closedItemsQuery);
078            while (iter.hasNext()) {
079                closedItems.add((CashieringItemInProcess) iter.next());
080            }
081            return closedItems;
082        }
083    
084        /**
085         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findCoinDetailByCashieringRecordSource(java.lang.String,
086         *      java.lang.String, java.lang.String)
087         */
088        public CoinDetail findCoinDetailByCashieringRecordSource(String documentNumber, String documentTypeCode, String cashieringRecordSource) {
089            return (CoinDetail) retrieveCashDetail(documentNumber, documentTypeCode, cashieringRecordSource, CoinDetail.class);
090        }
091    
092        /**
093         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findCurrencyDetailByCashieringRecordSource(java.lang.String,
094         *      java.lang.String, java.lang.String)
095         */
096        public CurrencyDetail findCurrencyDetailByCashieringRecordSource(String documentNumber, String documentTypeCode, String cashieringRecordSource) {
097            return (CurrencyDetail) retrieveCashDetail(documentNumber, documentTypeCode, cashieringRecordSource, CurrencyDetail.class);
098        }
099    
100        /**
101         * This takes the primary keys for a cash or currency detail record and returns an OJB criteria for it
102         * 
103         * @param documentNumber document number to retrieve
104         * @param documentTypeCode type code of the document
105         * @param cashieringRecordSource the cashiering record source
106         * @return a criteria, based on all of the given information
107         */
108        protected Criteria getCashDetailCriteria(String documentNumber, String documentTypeCode, String cashieringRecordSource) {
109            Criteria criteria = new Criteria();
110            criteria.addEqualTo("documentNumber", documentNumber);
111            criteria.addEqualTo("financialDocumentTypeCode", documentTypeCode);
112            criteria.addEqualTo("cashieringRecordSource", cashieringRecordSource);
113            return criteria;
114        }
115    
116        /**
117         * This method retrieves a cash detail from the database
118         * 
119         * @param documentNumber the document number to retrieve from
120         * @param documentTypeCode the document type of the document the cash detail to look up is associated with
121         * @param cashieringRecordSource the cashiering record source to look up from
122         * @param detailType the class of the cash detail type we want
123         * @return the cash detail type record
124         */
125        protected Object retrieveCashDetail(String documentNumber, String documentTypeCode, String cashieringRecordSource, Class detailType) {
126            QueryByCriteria cashDetailQuery = QueryFactory.newQuery(detailType, getCashDetailCriteria(documentNumber, documentTypeCode, cashieringRecordSource));
127            Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(cashDetailQuery);
128            return (iter.hasNext() ? iter.next() : null);
129        }
130    
131        /**
132         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectCashieringChecksForDeposit(java.lang.String, java.lang.Integer)
133         */
134        public List<Check> selectCashieringChecksForDeposit(String documentNumber, Integer depositLineNumber) {
135            QueryByCriteria depositedChecksQuery = QueryFactory.newQuery(CheckBase.class, createDepositedCashieringCheckCriteria(documentNumber, depositLineNumber));
136            return putResultsIntoCheckList(getPersistenceBrokerTemplate().getIteratorByQuery(depositedChecksQuery));
137        }
138    
139        /**
140         * This method creates a criteria to find the cashiering checks associated with a given deposit
141         * 
142         * @param documentNumber the document number the deposit is associated with
143         * @param depositLineNumber the line number of the deposit
144         * @return a criteria to find those checks
145         */
146        protected Criteria createDepositedCashieringCheckCriteria(String documentNumber, Integer depositLineNumber) {
147            Criteria criteria = getCashDetailCriteria(documentNumber, CashieringTransaction.DETAIL_DOCUMENT_TYPE, KFSConstants.CheckSources.CASH_MANAGEMENT);
148            criteria.addEqualTo("financialDocumentDepositLineNumber", depositLineNumber);
149            return criteria;
150        }
151    
152        /**
153         * This method puts the check elements of an iterator into a list
154         * 
155         * @param iter an iterator with checks results in it
156         * @return a list of checks
157         */
158        protected List<Check> putResultsIntoCheckList(Iterator iter) {
159            List<Check> result = new ArrayList<Check>();
160            while (iter.hasNext()) {
161                result.add((Check) iter.next());
162            }
163            return result;
164        }
165    
166        /**
167         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectUndepositedCashieringChecks(java.lang.String)
168         */
169        public List<Check> selectUndepositedCashieringChecks(String documentNumber) {
170            QueryByCriteria undepositedChecksQuery = QueryFactory.newQuery(CheckBase.class, createUndepositedCashieringCheckCriteria(documentNumber));
171            return putResultsIntoCheckList(getPersistenceBrokerTemplate().getIteratorByQuery(undepositedChecksQuery));
172        }
173    
174        /**
175         * This method creates the criteria to find undeposited cashiering checks
176         * 
177         * @param documentNumber the document number undeposited checks are associated with
178         * @return a criteria to find them
179         */
180        protected Criteria createUndepositedCashieringCheckCriteria(String documentNumber) {
181            Criteria criteria = getCashDetailCriteria(documentNumber, CashieringTransaction.DETAIL_DOCUMENT_TYPE, KFSConstants.CheckSources.CASH_MANAGEMENT);
182            criteria.addColumnIsNull("FDOC_DPST_LN_NBR");
183            return criteria;
184        }
185    
186        /**
187         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectDepositedCashieringChecks(java.lang.String)
188         */
189        public List<Check> selectDepositedCashieringChecks(String documentNumber) {
190            QueryByCriteria depositedChecksQuery = QueryFactory.newQuery(CheckBase.class, createDepositedCashieringCheckCriteria(documentNumber));
191            return putResultsIntoCheckList(getPersistenceBrokerTemplate().getIteratorByQuery(depositedChecksQuery));
192        }
193    
194        /**
195         * This method creates the criteria to find deposited checks
196         * 
197         * @param documentNumber the CM document the checks are associated with
198         * @return a criteria to find deposited checks
199         */
200        protected Criteria createDepositedCashieringCheckCriteria(String documentNumber) {
201            Criteria criteria = getCashDetailCriteria(documentNumber, CashieringTransaction.DETAIL_DOCUMENT_TYPE, KFSConstants.CheckSources.CASH_MANAGEMENT);
202            criteria.addColumnNotNull("FDOC_DPST_LN_NBR");
203            return criteria;
204        }
205    
206        /**
207         * This method retrieves all currency details associated with a cash management document
208         * 
209         * @param documentNumber the document number of the cash management document to get currency details for
210         * @return a list of currency details
211         */
212        public List<CurrencyDetail> getAllCurrencyDetails(String documentNumber) {
213            QueryByCriteria allCurrencyDetailsQuery = QueryFactory.newQuery(CurrencyDetail.class, getAllCashDetailCriteria(documentNumber));
214            List<CurrencyDetail> result = new ArrayList<CurrencyDetail>();
215            for (Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(allCurrencyDetailsQuery); iter.hasNext();) {
216                result.add((CurrencyDetail) iter.next());
217            }
218            return result;
219        }
220    
221        /**
222         * This method gets all coin details for a particular document number, irregardless of cashiering record source
223         * 
224         * @param documentNumber the document number to find cash details for
225         * @return hopefully, a bunch of coin details
226         */
227        public List<CoinDetail> getAllCoinDetails(String documentNumber) {
228            QueryByCriteria allCoinDetailsQuery = QueryFactory.newQuery(CoinDetail.class, getAllCashDetailCriteria(documentNumber));
229            List<CoinDetail> result = new ArrayList<CoinDetail>();
230            for (Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(allCoinDetailsQuery); iter.hasNext();) {
231                result.add((CoinDetail) iter.next());
232            }
233            return result;
234        }
235    
236        /**
237         * This method creates details for getting all of a certain cash detail, irregardless of cashiering record source
238         * 
239         * @param documentNumber the document number to get cash details for
240         * @return the criteria that will allow the retrieval of the right cash details
241         */
242        protected Criteria getAllCashDetailCriteria(String documentNumber) {
243            Criteria criteria = new Criteria();
244            criteria.addEqualTo("documentNumber", documentNumber);
245            criteria.addEqualTo("financialDocumentTypeCode", CashieringTransaction.DETAIL_DOCUMENT_TYPE);
246            return criteria;
247        }
248    
249        /**
250         * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectNextAvailableCheckLineNumber(java.lang.String)
251         */
252        public Integer selectNextAvailableCheckLineNumber(String documentNumber) {
253            if (documentNumber != null) {
254                // select all cashiering checks associated with document
255                Criteria criteria = new Criteria();
256                criteria.addEqualTo("documentNumber", documentNumber);
257                criteria.addEqualTo("cashieringRecordSource", KFSConstants.CheckSources.CASH_MANAGEMENT);
258                criteria.addEqualTo("financialDocumentTypeCode", CashieringTransaction.DETAIL_DOCUMENT_TYPE);
259    
260                QueryByCriteria cmChecksQuery = QueryFactory.newQuery(CheckBase.class, criteria);
261                cmChecksQuery.addOrderByDescending("sequenceId");
262                Iterator allChecksIter = getPersistenceBrokerTemplate().getIteratorByQuery(cmChecksQuery);
263                if (allChecksIter.hasNext()) {
264                    return new Integer((((Check) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(allChecksIter)).getSequenceId()).intValue() + 1);
265                }
266                else {
267                    return new Integer(1);
268                }
269            }
270            else {
271                return null;
272            }
273        }
274    
275    }