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.sql.Date;
019    import java.util.ArrayList;
020    import java.util.Iterator;
021    import java.util.List;
022    
023    import org.apache.ojb.broker.query.Criteria;
024    import org.apache.ojb.broker.query.Query;
025    import org.apache.ojb.broker.query.QueryByCriteria;
026    import org.apache.ojb.broker.query.ReportQueryByCriteria;
027    import org.kuali.kfs.module.purap.PurapConstants;
028    import org.kuali.kfs.module.purap.PurapPropertyConstants;
029    import org.kuali.kfs.module.purap.document.CorrectionReceivingDocument;
030    import org.kuali.kfs.module.purap.document.LineItemReceivingDocument;
031    import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
032    import org.kuali.kfs.module.purap.document.dataaccess.ReceivingDao;
033    import org.kuali.kfs.sys.KFSPropertyConstants;
034    import org.kuali.kfs.sys.context.SpringContext;
035    import org.kuali.rice.kew.exception.WorkflowException;
036    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
037    import org.kuali.rice.kns.exception.InfrastructureException;
038    import org.kuali.rice.kns.service.DocumentService;
039    
040    /**
041     * OJB implementation of PurchaseOrderDao.
042     */
043    public class ReceivingDaoOjb extends PlatformAwareDaoBaseOjb implements ReceivingDao {
044        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ReceivingDaoOjb.class);
045    
046        public List<String> getDocumentNumbersByPurchaseOrderId(Integer id) {        
047    
048            List<String> returnList = new ArrayList<String>();
049            Criteria criteria = new Criteria();
050            criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, id);        
051            Iterator<Object[]> iter = getDocumentNumbersOfReceivingLineByCriteria(criteria, false);
052            while (iter.hasNext()) {
053                Object[] cols = (Object[]) iter.next();
054                returnList.add((String) cols[0]);
055            }
056            return returnList;
057    
058        }
059    
060        public List<String> getCorrectionReceivingDocumentNumbersByPurchaseOrderId(Integer id) {
061    
062            List<String> returnList = new ArrayList<String>();
063            Criteria criteria = new Criteria();
064            criteria.addEqualTo("lineItemReceivingDocument.purchaseOrderIdentifier", id);        
065            Iterator<Object[]> iter = getDocumentNumbersOfCorrectionReceivingByCriteria(criteria, false);
066            while (iter.hasNext()) {
067                Object[] cols = (Object[]) iter.next();
068                returnList.add((String) cols[0]);
069            }
070            return returnList;
071    
072        }
073    
074        public List<String> getCorrectionReceivingDocumentNumbersByReceivingLineNumber(String receivingDocumentNumber) {
075    
076            List<String> returnList = new ArrayList<String>();
077            Criteria criteria = new Criteria();
078            criteria.addEqualTo(PurapPropertyConstants.LINE_ITEM_RECEIVING_DOCUMENT_NUMBER, receivingDocumentNumber);        
079            Iterator<Object[]> iter = getDocumentNumbersOfCorrectionReceivingByCriteria(criteria, false);
080            while (iter.hasNext()) {
081                Object[] cols = (Object[]) iter.next();
082                returnList.add((String) cols[0]);
083            }
084            return returnList;
085    
086        }
087        
088        /**
089         * Retrieves a document number for a payment request by user defined criteria and sorts the values ascending if orderByAscending
090         * parameter is true, descending otherwise.
091         * 
092         * @param criteria - list of criteria to use in the retrieve
093         * @param orderByAscending - boolean to sort results ascending if true, descending otherwise
094         * @return - Iterator of document numbers
095         */
096        protected Iterator<Object[]> getDocumentNumbersOfReceivingLineByCriteria(Criteria criteria, boolean orderByAscending) {
097            
098            ReportQueryByCriteria rqbc = new ReportQueryByCriteria(LineItemReceivingDocument.class, criteria);
099            rqbc.setAttributes(new String[] { KFSPropertyConstants.DOCUMENT_NUMBER });
100            if (orderByAscending) {
101                rqbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
102            }
103            else {
104                rqbc.addOrderByDescending(KFSPropertyConstants.DOCUMENT_NUMBER);
105            }
106            return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rqbc);
107        }
108    
109        protected Iterator<Object[]> getDocumentNumbersOfCorrectionReceivingByCriteria(Criteria criteria, boolean orderByAscending) {
110            
111            ReportQueryByCriteria rqbc = new ReportQueryByCriteria(CorrectionReceivingDocument.class, criteria);
112            rqbc.setAttributes(new String[] { KFSPropertyConstants.DOCUMENT_NUMBER });
113            if (orderByAscending) {
114                rqbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
115            }
116            else {
117                rqbc.addOrderByDescending(KFSPropertyConstants.DOCUMENT_NUMBER);
118            }
119            return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rqbc);
120        }
121    
122        public List<String> duplicateBillOfLadingNumber(Integer poId, String billOfLadingNumber) {
123            
124            List<String> returnList = new ArrayList<String>();
125            Criteria criteria = new Criteria();
126            criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, poId);
127            criteria.addEqualTo(PurapPropertyConstants.SHIPMENT_BILL_OF_LADING_NUMBER, billOfLadingNumber);        
128            Iterator<Object[]> iter = getDocumentNumbersOfReceivingLineByCriteria(criteria, false);
129    
130            while (iter.hasNext()) {
131                Object[] cols = (Object[]) iter.next();
132                returnList.add((String) cols[0]);
133            }
134            
135            return returnList;
136        }
137    
138        public List<String> duplicatePackingSlipNumber(Integer poId, String packingSlipNumber) {      
139    
140            List<String> returnList = new ArrayList<String>();
141            Criteria criteria = new Criteria();
142            criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, poId);
143            criteria.addEqualTo(PurapPropertyConstants.SHIPMENT_PACKING_SLIP_NUMBER, packingSlipNumber);        
144            Iterator<Object[]> iter = getDocumentNumbersOfReceivingLineByCriteria(criteria, false);
145    
146            while (iter.hasNext()) {
147                Object[] cols = (Object[]) iter.next();
148                returnList.add((String) cols[0]);
149            }
150            
151            return returnList;
152        }
153    
154        public List<String> duplicateVendorDate(Integer poId, Date vendorDate) {
155     
156            List<String> returnList = new ArrayList<String>();
157            Criteria criteria = new Criteria();
158            criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, poId);
159            criteria.addEqualTo(PurapPropertyConstants.SHIPMENT_RECEIVED_DATE, vendorDate);        
160            Iterator<Object[]> iter = getDocumentNumbersOfReceivingLineByCriteria(criteria, false);
161    
162            while (iter.hasNext()) {
163                Object[] cols = (Object[]) iter.next();
164                returnList.add((String) cols[0]);
165            }
166            
167            return returnList;
168        }
169    
170        public List<LineItemReceivingDocument> getReceivingDocumentsForPOAmendment() {
171            
172            Criteria criteria = new Criteria();
173            criteria.addEqualTo("lineItemReceivingStatusCode", PurapConstants.LineItemReceivingStatuses.AWAITING_PO_OPEN_STATUS);
174    
175            Query query = new QueryByCriteria(LineItemReceivingDocument.class, criteria);
176            Iterator<LineItemReceivingDocument> documents = (Iterator<LineItemReceivingDocument>) getPersistenceBrokerTemplate().getIteratorByQuery(query);
177            ArrayList<String> documentHeaderIds = new ArrayList<String>();
178            while (documents.hasNext()) {
179                LineItemReceivingDocument document = (LineItemReceivingDocument) documents.next();
180                documentHeaderIds.add(document.getDocumentNumber());
181            }
182    
183            if (documentHeaderIds.size() > 0) {
184                try {
185                    return SpringContext.getBean(DocumentService.class).getDocumentsByListOfDocumentHeaderIds(LineItemReceivingDocument.class, documentHeaderIds);
186                }
187                catch (WorkflowException e) {
188                    throw new InfrastructureException("unable to retrieve LineItemReceivingDocuments", e);
189                }
190            }
191            else {
192                return null;
193            }
194    
195        }
196        
197    }