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    
019    import java.sql.Date;
020    import java.util.ArrayList;
021    import java.util.Arrays;
022    import java.util.Collection;
023    import java.util.Iterator;
024    import java.util.List;
025    
026    import org.apache.ojb.broker.query.Criteria;
027    import org.apache.ojb.broker.query.QueryByCriteria;
028    import org.apache.ojb.broker.query.ReportQueryByCriteria;
029    import org.kuali.kfs.module.purap.PurapConstants;
030    import org.kuali.kfs.module.purap.PurapPropertyConstants;
031    import org.kuali.kfs.module.purap.PurapConstants.CreditMemoStatuses;
032    import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
033    import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
034    import org.kuali.kfs.module.purap.document.dataaccess.CreditMemoDao;
035    import org.kuali.kfs.module.purap.util.VendorGroupingHelper;
036    import org.kuali.kfs.sys.KFSPropertyConstants;
037    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
038    import org.kuali.rice.kns.util.KualiDecimal;
039    import org.kuali.rice.kns.util.TransactionalServiceUtils;
040    
041    /**
042     * OJB Implementation of CreditMemoDao. Provides persistence layer methods for the credit memo document.
043     */
044    public class CreditMemoDaoOjb extends PlatformAwareDaoBaseOjb implements CreditMemoDao {
045        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CreditMemoDaoOjb.class);
046    
047        /**
048         * @see org.kuali.kfs.module.purap.document.dataaccess.CreditMemoDao#getCreditMemosToExtract(java.lang.String)
049         */
050        public Iterator<VendorCreditMemoDocument> getCreditMemosToExtract(String chartCode) {
051            LOG.debug("getCreditMemosToExtract() started");
052    
053            Criteria criteria = new Criteria();
054            criteria.addEqualTo("processingCampusCode", chartCode);
055            criteria.addIn("statusCode", Arrays.asList(CreditMemoStatuses.STATUSES_ALLOWED_FOR_EXTRACTION));
056            criteria.addIsNull("extractedTimestamp");
057            criteria.addEqualTo("holdIndicator", Boolean.FALSE);
058    
059            return getPersistenceBrokerTemplate().getIteratorByQuery(new QueryByCriteria(VendorCreditMemoDocument.class, criteria));
060        }
061    
062        
063        /**
064         * @see org.kuali.kfs.module.purap.document.dataaccess.CreditMemoDao#getCreditMemosToExtractByVendor(java.lang.String, java.lang.Integer, java.lang.Integer)
065         */
066        public Collection<VendorCreditMemoDocument> getCreditMemosToExtractByVendor(String chartCode, VendorGroupingHelper vendor ) {
067            LOG.debug("getCreditMemosToExtractByVendor() started");
068    
069            Criteria criteria = new Criteria();
070            criteria.addEqualTo( "processingCampusCode", chartCode );
071            criteria.addIn( "statusCode", Arrays.asList(CreditMemoStatuses.STATUSES_ALLOWED_FOR_EXTRACTION) );
072            criteria.addIsNull( "extractedTimestamp" );
073            criteria.addEqualTo( "holdIndicator", Boolean.FALSE );
074            criteria.addEqualTo( "vendorHeaderGeneratedIdentifier", vendor.getVendorHeaderGeneratedIdentifier() );
075            criteria.addEqualTo( "vendorDetailAssignedIdentifier", vendor.getVendorDetailAssignedIdentifier() );
076            criteria.addEqualTo( "vendorCountryCode", vendor.getVendorCountry() );
077            criteria.addLike( "vendorPostalCode", vendor.getVendorPostalCode() + "%" );
078    
079            return getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(VendorCreditMemoDocument.class, criteria));
080        }
081    
082    
083    
084        /**
085         * @see edu.iu.uis.pur.cm.dao.CreditMemoDao#duplicateExists(java.lang.String, java.lang.String)
086         */
087        public boolean duplicateExists(Integer vendorNumberHeaderId, Integer vendorNumberDetailId, String creditMemoNumber) {
088            LOG.debug("duplicateExists() started");
089    
090            // criteria: vendorNumberHeader AND vendorNumberDetail AND creditMemoNumber
091            Criteria criteria = new Criteria();
092            criteria.addEqualTo("vendorHeaderGeneratedIdentifier", vendorNumberHeaderId);
093            criteria.addEqualTo("vendorDetailAssignedIdentifier", vendorNumberDetailId);
094            criteria.addEqualTo("creditMemoNumber", creditMemoNumber);
095    
096            criteria.addNotIn(PurapPropertyConstants.STATUS_CODE, PurapConstants.CreditMemoStatuses.CANCELLED_STATUSES);
097    
098            // use the criteria to do a Count against the DB, and return the resulting
099            // number. Any positive non-zero result means that a potential duplicate
100            // exists and we return true, otherwise, return false.
101            int cmCount = getPersistenceBrokerTemplate().getCount(new QueryByCriteria(VendorCreditMemoDocument.class, criteria));
102            if (cmCount > 0) {
103                return true;
104            }
105            else {
106                return false;
107            }
108        }
109    
110        /**
111         * @see edu.iu.uis.pur.cm.dao.CreditMemoDao#duplicateExists(java.lang.String, java.lang.String)
112         */
113        public boolean duplicateExists(Integer vendorNumberHeaderId, Integer vendorNumberDetailId, Date date, KualiDecimal amount) {
114            LOG.debug("duplicateExists() started");
115    
116            // criteria: vendorNumberHeader AND vendorNumberDetail AND date AND amount
117            Criteria criteria = new Criteria();
118            criteria.addEqualTo("vendorHeaderGeneratedIdentifier", vendorNumberHeaderId);
119            criteria.addEqualTo("vendorDetailAssignedIdentifier", vendorNumberDetailId);
120            criteria.addEqualTo("creditMemoDate", date);
121            criteria.addEqualTo("creditMemoAmount", amount);
122    
123            criteria.addNotIn(PurapPropertyConstants.STATUS_CODE, PurapConstants.CreditMemoStatuses.CANCELLED_STATUSES);
124    
125            // use the criteria to do a Count against the DB, and return the resulting
126            // number. Any positive non-zero result means that a potential duplicate
127            // exists and we return true, otherwise, return false.
128            int cmCount = getPersistenceBrokerTemplate().getCount(new QueryByCriteria(VendorCreditMemoDocument.class, criteria));
129            if (cmCount > 0) {
130                return true;
131            }
132            else {
133                return false;
134            }
135        }
136    
137        /**
138         * @see org.kuali.kfs.module.purap.document.dataaccess.CreditMemoDao#getDocumentNumberByCreditMemoId(java.lang.Integer)
139         */
140        public String getDocumentNumberByCreditMemoId(Integer id) {
141            Criteria criteria = new Criteria();
142            criteria.addEqualTo(PurapPropertyConstants.PURAP_DOC_ID, id);
143            return getDocumentNumberOfCreditMemoByCriteria(criteria);
144        }
145    
146        /**
147         * Retrieves a document number for a credit memo by user defined criteria.
148         * 
149         * @param criteria - holds field and value pairs defined by the calling method
150         * @return - document number
151         */
152        protected String getDocumentNumberOfCreditMemoByCriteria(Criteria criteria) {
153            LOG.debug("getDocumentNumberOfCreditMemoByCriteria() started");
154            Iterator<Object[]> iter = getDocumentNumbersOfCreditMemoByCriteria(criteria, false);
155            if (iter.hasNext()) {
156                Object[] cols = (Object[]) iter.next();
157                if (iter.hasNext()) {
158                    // the iterator should have held only a single doc id of data but it holds 2 or more
159                    String errorMsg = "Expected single document number for given criteria but multiple (at least 2) were returned";
160                    LOG.error(errorMsg);
161                    TransactionalServiceUtils.exhaustIterator(iter);
162                    throw new RuntimeException();
163                }
164                // at this part of the code, we know there's no more elements in iterator
165                return (String) cols[0];
166            }
167            return null;
168        }
169    
170        /**
171         * Retrieves a document number for a credit memo by user defined criteria and sorts the values ascending if orderByAscending
172         * parameter is true, descending otherwise.
173         * 
174         * @param criteria - list of criteria to use in the retrieve
175         * @param orderByAscending - boolean indicating results should be sorted ascending, descending otherwise
176         * @return - Iterator of document numbers
177         */
178        protected Iterator<Object[]> getDocumentNumbersOfCreditMemoByCriteria(Criteria criteria, boolean orderByAscending) {
179            LOG.debug("getDocumentNumberOfCreditMemoByCriteria() started");
180            ReportQueryByCriteria rqbc = new ReportQueryByCriteria(VendorCreditMemoDocument.class, criteria);
181            rqbc.setAttributes(new String[] { KFSPropertyConstants.DOCUMENT_NUMBER });
182            if (orderByAscending) {
183                rqbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
184            }
185            else {
186                rqbc.addOrderByDescending(KFSPropertyConstants.DOCUMENT_NUMBER);
187            }
188            return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rqbc);
189        }
190    
191        public List<String> getActiveCreditMemoDocumentNumbersForPurchaseOrder(Integer purchaseOrderId){
192            LOG.debug("getActiveCreditmemoDocumentNumbersForPurchaseOrder() started");
193                    
194            List<String> returnList = new ArrayList<String>();
195            Criteria criteria = new Criteria();
196            
197            criteria.addEqualTo(PurapPropertyConstants.PURCHASE_ORDER_IDENTIFIER, purchaseOrderId);
198            criteria.addIn(PurapPropertyConstants.STATUS_CODE, Arrays.asList(CreditMemoStatuses.STATUSES_POTENTIALLY_ACTIVE));
199            QueryByCriteria qbc = new QueryByCriteria(PaymentRequestDocument.class, criteria);
200            
201            Iterator<Object[]> iter = getDocumentNumbersOfCreditMemoByCriteria(criteria, false);
202            while (iter.hasNext()) {
203                Object[] cols = (Object[]) iter.next();
204                returnList.add((String) cols[0]);
205            }
206            return returnList;
207        }
208    }