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 }