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 }