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    }