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 }