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.module.purap.document.dataaccess.impl;
017
018 import java.util.Collection;
019 import java.util.Iterator;
020 import java.util.List;
021
022 import org.apache.ojb.broker.query.Criteria;
023 import org.apache.ojb.broker.query.QueryByCriteria;
024 import org.apache.ojb.broker.query.ReportQueryByCriteria;
025 import org.kuali.kfs.module.purap.PurapConstants;
026 import org.kuali.kfs.module.purap.PurapPropertyConstants;
027 import org.kuali.kfs.module.purap.businessobject.AutoClosePurchaseOrderView;
028 import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
029 import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
030 import org.kuali.kfs.module.purap.document.dataaccess.PurchaseOrderDao;
031 import org.kuali.kfs.sys.KFSPropertyConstants;
032 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
033 import org.kuali.rice.kns.util.KualiDecimal;
034 import org.kuali.rice.kns.util.TransactionalServiceUtils;
035
036 /**
037 * OJB implementation of PurchaseOrderDao.
038 */
039 public class PurchaseOrderDaoOjb extends PlatformAwareDaoBaseOjb implements PurchaseOrderDao {
040 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurchaseOrderDaoOjb.class);
041
042 public Integer getPurchaseOrderIdForCurrentPurchaseOrderByRelatedDocId(Integer accountsPayablePurchasingDocumentLinkIdentifier) {
043 Criteria criteria = new Criteria();
044 criteria.addEqualTo("accountsPayablePurchasingDocumentLinkIdentifier", accountsPayablePurchasingDocumentLinkIdentifier);
045 criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_CURRENT_INDICATOR, "Y");
046
047 Collection<PurchaseOrderDocument> poList = getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(PurchaseOrderDocument.class, criteria));
048 for (PurchaseOrderDocument purchaseOrderDocument : poList) {
049 //should be only one
050 return purchaseOrderDocument.getPurapDocumentIdentifier();
051 }
052 return null;
053 }
054
055 public PurchaseOrderDocument getCurrentPurchaseOrder(Integer id) {
056 Criteria criteria = new Criteria();
057 criteria.addEqualTo(PurapPropertyConstants.PURAP_DOC_ID, id);
058 criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_CURRENT_INDICATOR, "Y");
059
060 return (PurchaseOrderDocument) getPersistenceBrokerTemplate().getObjectByQuery(new QueryByCriteria(PurchaseOrderDocument.class, criteria));
061 }
062
063
064 /**
065 * @see org.kuali.kfs.module.purap.document.dataaccess.PurchaseOrderDao#getDocumentNumberForPurchaseOrderId(java.lang.Integer)
066 */
067 public String getDocumentNumberForPurchaseOrderId(Integer id) {
068 Criteria criteria = new Criteria();
069 criteria.addEqualTo(PurapPropertyConstants.PURAP_DOC_ID, id);
070 return getDocumentNumberUsingPurchaseOrderCriteria(criteria);
071 }
072
073 /**
074 * @see org.kuali.kfs.module.purap.document.dataaccess.PurchaseOrderDao#getDocumentNumberForCurrentPurchaseOrder(java.lang.Integer)
075 */
076 public String getDocumentNumberForCurrentPurchaseOrder(Integer id) {
077 Criteria criteria = new Criteria();
078 criteria.addEqualTo(PurapPropertyConstants.PURAP_DOC_ID, id);
079 criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_CURRENT_INDICATOR, "Y");
080 return getDocumentNumberUsingPurchaseOrderCriteria(criteria);
081 }
082
083 /**
084 * @see org.kuali.kfs.module.purap.document.dataaccess.PurchaseOrderDao#getOldestPurchaseOrderDocumentNumber(java.lang.Integer)
085 */
086 public String getOldestPurchaseOrderDocumentNumber(Integer id) {
087 Criteria criteria = new Criteria();
088 criteria.addEqualTo(PurapPropertyConstants.PURAP_DOC_ID, id);
089 ReportQueryByCriteria rqbc = new ReportQueryByCriteria(PurchaseOrderDocument.class, criteria);
090 rqbc.setAttributes(new String[] { KFSPropertyConstants.DOCUMENT_NUMBER });
091 rqbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
092 Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rqbc);
093 String oldestDocumentNumber = null;
094 if (iter.hasNext()) {
095 oldestDocumentNumber = (String) (iter.next())[0];
096 }
097 return oldestDocumentNumber;
098 }
099
100 /**
101 * Retrieves the document number of the purchase order returned by the passed in criteria.
102 *
103 * @param criteria - list of criteria to use in the retrieve
104 * @return Document number string if a valid purchase order is found, null if no purchase order is found
105 */
106 protected String getDocumentNumberUsingPurchaseOrderCriteria(Criteria criteria) {
107 Iterator<Object[]> iter = getDocumentNumbersUsingPurchaseOrderCriteria(criteria);
108 if (iter.hasNext()) {
109 Object[] cols = iter.next();
110 if (iter.hasNext()) {
111 // the iterator should have held only a single doc id of data but it holds 2 or more
112 String errorMsg = "Expected single document number for given criteria but multiple (at least 2) were returned";
113 LOG.error(errorMsg);
114 TransactionalServiceUtils.exhaustIterator(iter);
115 throw new RuntimeException(errorMsg);
116 }
117 // at this part of the code, we know there's no more elements in iterator
118 return (String) cols[0];
119 }
120 return null;
121 }
122
123 /**
124 * Retrieves a list of document numbers of the purchase order returned by the passed in criteria.
125 *
126 * @param criteria - list of criteria to use in the retrieve
127 * @return Iterator of document numbers
128 */
129 protected Iterator<Object[]> getDocumentNumbersUsingPurchaseOrderCriteria(Criteria criteria) {
130 ReportQueryByCriteria rqbc = new ReportQueryByCriteria(PurchaseOrderDocument.class, criteria);
131 rqbc.setAttributes(new String[] { KFSPropertyConstants.DOCUMENT_NUMBER });
132 rqbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
133 return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rqbc);
134 }
135
136 /**
137 * @see org.kuali.kfs.module.purap.document.dataaccess.PurchaseOrderDao#itemExistsOnPurchaseOrder(java.lang.Integer, java.lang.String)
138 */
139 public boolean itemExistsOnPurchaseOrder(Integer poItemLineNumber, String docNumber){
140 boolean existsInPo = false;
141
142 Criteria criteria = new Criteria();
143 criteria.addEqualTo("documentNumber", docNumber);
144 criteria.addEqualTo("itemLineNumber", poItemLineNumber);
145
146 ReportQueryByCriteria rqbc = new ReportQueryByCriteria(PurchaseOrderItem.class, criteria);
147 rqbc.setAttributes(new String[] { KFSPropertyConstants.DOCUMENT_NUMBER });
148 rqbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
149 Iterator<Object[]> iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rqbc);
150
151 if (iter.hasNext()) {
152 existsInPo = true;
153 }
154
155 return existsInPo;
156 }
157
158 /**
159 * @see org.kuali.kfs.module.purap.document.dataaccess.PurchaseOrderDao#getAllOpenPurchaseOrders(java.util.List)
160 */
161 public List<AutoClosePurchaseOrderView> getAllOpenPurchaseOrders(List<String> excludedVendorChoiceCodes) {
162 LOG.debug("getAllOpenPurchaseOrders() started");
163 Criteria criteria = new Criteria();
164 criteria.addIsNull(PurapPropertyConstants.RECURRING_PAYMENT_TYPE_CODE);
165 criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_STATUS_CODE, PurapConstants.PurchaseOrderStatuses.OPEN);
166 criteria.addEqualTo(PurapPropertyConstants.TOTAL_ENCUMBRANCE, new KualiDecimal(0));
167 criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_CURRENT_INDICATOR, true);
168 for (String excludeCode : excludedVendorChoiceCodes) {
169 criteria.addNotEqualTo(PurapPropertyConstants.VENDOR_CHOICE_CODE, excludeCode);
170 }
171 QueryByCriteria qbc = new QueryByCriteria(AutoClosePurchaseOrderView.class, criteria);
172 LOG.debug("getAllOpenPurchaseOrders() Query criteria is " + criteria.toString());
173 List<AutoClosePurchaseOrderView> l = (List<AutoClosePurchaseOrderView>) getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
174 LOG.debug("getAllOpenPurchaseOrders() ended.");
175 return l;
176 }
177
178 /**
179 * @see org.kuali.kfs.module.purap.document.dataaccess.PurchaseOrderDao#getAutoCloseRecurringPurchaseOrders(java.util.List)
180 */
181 public List<AutoClosePurchaseOrderView> getAutoCloseRecurringPurchaseOrders(List<String> excludedVendorChoiceCodes) {
182 LOG.debug("getAutoCloseRecurringPurchaseOrders() started.");
183 Criteria criteria = new Criteria();
184 criteria.addNotNull(PurapPropertyConstants.RECURRING_PAYMENT_TYPE_CODE);
185 criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_STATUS_CODE, PurapConstants.PurchaseOrderStatuses.OPEN);
186 for (String excludeCode : excludedVendorChoiceCodes) {
187 criteria.addNotEqualTo(PurapPropertyConstants.VENDOR_CHOICE_CODE, excludeCode);
188 }
189 QueryByCriteria qbc = new QueryByCriteria(AutoClosePurchaseOrderView.class, criteria);
190 LOG.debug("getAutoCloseRecurringPurchaseOrders() Query criteria is " + criteria.toString());
191 List<AutoClosePurchaseOrderView> l = (List<AutoClosePurchaseOrderView>) getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
192 LOG.debug("getAutoCloseRecurringPurchaseOrders() ended.");
193 return l;
194 }
195
196 public List<PurchaseOrderDocument> getPendingPurchaseOrdersForFaxing() {
197 LOG.debug("Getting pending purchase orders for faxing");
198 Criteria criteria = new Criteria();
199 criteria.addEqualTo(PurapPropertyConstants.STATUS_CODE, PurapConstants.PurchaseOrderStatuses.PENDING_FAX);
200 QueryByCriteria qbc = new QueryByCriteria(PurchaseOrderDocument.class,criteria);
201 List l = (List)getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
202 return l;
203 }
204 }