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 }