/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.fp.document.dataaccess.impl; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.List; import org.apache.ojb.broker.query.Criteria; import org.apache.ojb.broker.query.QueryByCriteria; import org.apache.ojb.broker.query.QueryFactory; import org.kuali.kfs.fp.businessobject.CashieringItemInProcess; import org.kuali.kfs.fp.businessobject.CashieringTransaction; import org.kuali.kfs.fp.businessobject.Check; import org.kuali.kfs.fp.businessobject.CheckBase; import org.kuali.kfs.fp.businessobject.CoinDetail; import org.kuali.kfs.fp.businessobject.CurrencyDetail; import org.kuali.kfs.fp.document.dataaccess.CashManagementDao; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.util.TransactionalServiceUtils; import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; import org.springframework.dao.DataAccessException; public class CashManagementDaoOjb extends PlatformAwareDaoBaseOjb implements CashManagementDao { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CashManagementDaoOjb.class); public CashManagementDaoOjb() { super(); } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findOpenItemsInProcessByCampusCode(java.lang.String) */ public List<CashieringItemInProcess> findOpenItemsInProcessByCampusCode(String campusCode) throws DataAccessException { List<CashieringItemInProcess> openItems = new ArrayList<CashieringItemInProcess>(); Criteria criteria = new Criteria(); criteria.addEqualTo("campusCode", campusCode); criteria.addColumnIsNull("ITM_CLOSED_DT"); QueryByCriteria openItemsQuery = QueryFactory.newQuery(CashieringItemInProcess.class, criteria); return new ArrayList<CashieringItemInProcess>( getPersistenceBrokerTemplate().getCollectionByQuery(openItemsQuery) ); } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findRecentlyClosedItemsInProcess(java.lang.String) */ public List<CashieringItemInProcess> findRecentlyClosedItemsInProcess(String campusCode) { List<CashieringItemInProcess> closedItems = new ArrayList<CashieringItemInProcess>(); Criteria criteria = new Criteria(); criteria.addEqualTo("campusCode", campusCode); criteria.addColumnNotNull("ITM_CLOSED_DT"); Calendar thirtyDaysAgo = new GregorianCalendar(); thirtyDaysAgo.add(Calendar.DAY_OF_YEAR, -30); criteria.addGreaterThan("itemClosedDate", new java.sql.Date(thirtyDaysAgo.getTimeInMillis())); QueryByCriteria closedItemsQuery = QueryFactory.newQuery(CashieringItemInProcess.class, criteria); Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(closedItemsQuery); while (iter.hasNext()) { closedItems.add((CashieringItemInProcess) iter.next()); } return closedItems; } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findCoinDetailByCashieringStatus(java.lang.String, * java.lang.String, java.lang.String) */ public CoinDetail findCoinDetailByCashieringStatus(String documentNumber, String documentTypeCode, String cashieringStatus) { return (CoinDetail) retrieveCashDetail(documentNumber, documentTypeCode, cashieringStatus, CoinDetail.class); } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#findCurrencyDetailByCashieringStatus(java.lang.String, * java.lang.String, java.lang.String) */ public CurrencyDetail findCurrencyDetailByCashieringStatus(String documentNumber, String documentTypeCode, String cashieringStatus) { return (CurrencyDetail) retrieveCashDetail(documentNumber, documentTypeCode, cashieringStatus, CurrencyDetail.class); } /** * This takes the primary keys for a cash or currency detail record and returns an OJB criteria for it * * @param documentNumber document number to retrieve * @param documentTypeCode type code of the document * @param cashieringStatus the cashiering status * @return a criteria, based on all of the given information */ protected Criteria getCashDetailCriteria(String documentNumber, String documentTypeCode, String cashieringStatus) { Criteria criteria = new Criteria(); criteria.addEqualTo("documentNumber", documentNumber); criteria.addEqualTo("financialDocumentTypeCode", documentTypeCode); criteria.addEqualTo("cashieringStatus", cashieringStatus); return criteria; } /** * This method retrieves a cash detail from the database * * @param documentNumber the document number to retrieve from * @param documentTypeCode the document type of the document the cash detail to look up is associated with * @param cashieringStatus the cashiering status to look up from * @param detailType the class of the cash detail type we want * @return the cash detail type record */ protected Object retrieveCashDetail(String documentNumber, String documentTypeCode, String cashieringStatus, Class detailType) { QueryByCriteria cashDetailQuery = QueryFactory.newQuery(detailType, getCashDetailCriteria(documentNumber, documentTypeCode, cashieringStatus)); Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(cashDetailQuery); return (iter.hasNext() ? iter.next() : null); } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectCashieringChecksForDeposit(java.lang.String, java.lang.Integer) */ public List<Check> selectCashieringChecksForDeposit(String documentNumber, Integer depositLineNumber) { QueryByCriteria depositedChecksQuery = QueryFactory.newQuery(CheckBase.class, createDepositedCashieringCheckCriteria(documentNumber, depositLineNumber)); return putResultsIntoCheckList(getPersistenceBrokerTemplate().getIteratorByQuery(depositedChecksQuery)); } /** * This method creates a criteria to find the cashiering checks associated with a given deposit * * @param documentNumber the document number the deposit is associated with * @param depositLineNumber the line number of the deposit * @return a criteria to find those checks */ protected Criteria createDepositedCashieringCheckCriteria(String documentNumber, Integer depositLineNumber) { Criteria criteria = getCashDetailCriteria(documentNumber, CashieringTransaction.DETAIL_DOCUMENT_TYPE, KFSConstants.CheckSources.CASH_MANAGEMENT); criteria.addEqualTo("financialDocumentDepositLineNumber", depositLineNumber); return criteria; } /** * This method puts the check elements of an iterator into a list * * @param iter an iterator with checks results in it * @return a list of checks */ protected List<Check> putResultsIntoCheckList(Iterator iter) { List<Check> result = new ArrayList<Check>(); while (iter.hasNext()) { result.add((Check) iter.next()); } return result; } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectUndepositedCashieringChecks(java.lang.String) */ public List<Check> selectUndepositedCashieringChecks(String documentNumber) { QueryByCriteria undepositedChecksQuery = QueryFactory.newQuery(CheckBase.class, createUndepositedCashieringCheckCriteria(documentNumber)); return putResultsIntoCheckList(getPersistenceBrokerTemplate().getIteratorByQuery(undepositedChecksQuery)); } /** * This method creates the criteria to find undeposited cashiering checks * * @param documentNumber the document number undeposited checks are associated with * @return a criteria to find them */ protected Criteria createUndepositedCashieringCheckCriteria(String documentNumber) { Criteria criteria = getCashDetailCriteria(documentNumber, CashieringTransaction.DETAIL_DOCUMENT_TYPE, KFSConstants.CheckSources.CASH_MANAGEMENT); criteria.addColumnIsNull("FDOC_DPST_LN_NBR"); return criteria; } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectDepositedCashieringChecks(java.lang.String) */ public List<Check> selectDepositedCashieringChecks(String documentNumber) { QueryByCriteria depositedChecksQuery = QueryFactory.newQuery(CheckBase.class, createDepositedCashieringCheckCriteria(documentNumber)); return putResultsIntoCheckList(getPersistenceBrokerTemplate().getIteratorByQuery(depositedChecksQuery)); } /** * This method creates the criteria to find deposited checks * * @param documentNumber the CM document the checks are associated with * @return a criteria to find deposited checks */ protected Criteria createDepositedCashieringCheckCriteria(String documentNumber) { Criteria criteria = getCashDetailCriteria(documentNumber, CashieringTransaction.DETAIL_DOCUMENT_TYPE, KFSConstants.CheckSources.CASH_MANAGEMENT); criteria.addColumnNotNull("FDOC_DPST_LN_NBR"); return criteria; } /** * This method retrieves all currency details associated with a cash management document * * @param documentNumber the document number of the cash management document to get currency details for * @return a list of currency details */ public List<CurrencyDetail> getAllCurrencyDetails(String documentNumber) { QueryByCriteria allCurrencyDetailsQuery = QueryFactory.newQuery(CurrencyDetail.class, getAllCashDetailCriteria(documentNumber)); List<CurrencyDetail> result = new ArrayList<CurrencyDetail>(); for (Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(allCurrencyDetailsQuery); iter.hasNext();) { result.add((CurrencyDetail) iter.next()); } return result; } /** * This method gets all coin details for a particular document number, irregardless of cashiering record source * * @param documentNumber the document number to find cash details for * @return hopefully, a bunch of coin details */ public List<CoinDetail> getAllCoinDetails(String documentNumber) { QueryByCriteria allCoinDetailsQuery = QueryFactory.newQuery(CoinDetail.class, getAllCashDetailCriteria(documentNumber)); List<CoinDetail> result = new ArrayList<CoinDetail>(); for (Iterator iter = getPersistenceBrokerTemplate().getIteratorByQuery(allCoinDetailsQuery); iter.hasNext();) { result.add((CoinDetail) iter.next()); } return result; } /** * This method creates details for getting all of a certain cash detail, irregardless of cashiering record source * * @param documentNumber the document number to get cash details for * @return the criteria that will allow the retrieval of the right cash details */ protected Criteria getAllCashDetailCriteria(String documentNumber) { Criteria criteria = new Criteria(); criteria.addEqualTo("documentNumber", documentNumber); criteria.addEqualTo("financialDocumentTypeCode", CashieringTransaction.DETAIL_DOCUMENT_TYPE); return criteria; } /** * @see org.kuali.kfs.fp.document.dataaccess.CashManagementDao#selectNextAvailableCheckLineNumber(java.lang.String) */ public Integer selectNextAvailableCheckLineNumber(String documentNumber) { if (documentNumber != null) { // select all cashiering checks associated with document Criteria criteria = new Criteria(); criteria.addEqualTo("documentNumber", documentNumber); criteria.addEqualTo("cashieringStatus", KFSConstants.CheckSources.CASH_MANAGEMENT); criteria.addEqualTo("financialDocumentTypeCode", CashieringTransaction.DETAIL_DOCUMENT_TYPE); QueryByCriteria cmChecksQuery = QueryFactory.newQuery(CheckBase.class, criteria); cmChecksQuery.addOrderByDescending("sequenceId"); Iterator allChecksIter = getPersistenceBrokerTemplate().getIteratorByQuery(cmChecksQuery); if (allChecksIter.hasNext()) { return new Integer((((Check) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(allChecksIter)).getSequenceId()).intValue() + 1); } else { return new Integer(1); } } else { return null; } } }