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 }