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 /* 017 * Created on Aug 11, 2004 018 * 019 */ 020 package org.kuali.kfs.pdp.dataaccess.impl; 021 022 import java.util.ArrayList; 023 import java.util.HashMap; 024 import java.util.Iterator; 025 import java.util.List; 026 import java.util.Map; 027 028 import org.apache.ojb.broker.query.Criteria; 029 import org.apache.ojb.broker.query.QueryFactory; 030 import org.apache.ojb.broker.query.ReportQueryByCriteria; 031 import org.kuali.kfs.pdp.PdpPropertyConstants; 032 import org.kuali.kfs.pdp.PdpConstants.PaymentStatusCodes; 033 import org.kuali.kfs.pdp.businessobject.PaymentGroup; 034 import org.kuali.kfs.pdp.businessobject.PaymentStatus; 035 import org.kuali.kfs.pdp.dataaccess.BatchMaintenanceDao; 036 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb; 037 import org.kuali.rice.kns.service.BusinessObjectService; 038 import org.kuali.rice.kns.util.ObjectUtils; 039 import org.kuali.rice.kns.util.TransactionalServiceUtils; 040 041 042 /** 043 * 044 */ 045 public class BatchMaintenanceDaoOjb extends PlatformAwareDaoBaseOjb implements BatchMaintenanceDao { 046 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BatchMaintenanceDaoOjb.class); 047 private BusinessObjectService businessObjectService; 048 049 public BatchMaintenanceDaoOjb() { 050 super(); 051 } 052 053 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 054 this.businessObjectService = businessObjectService; 055 } 056 057 /** 058 * doBatchPaymentsHaveOpenStatus() Return true if all payments in batch have an 'OPEN' status. Return false if all payments in 059 * batch do not have an 'OPEN' status. The query in this method searches the payment detail table for payments of the given 060 * batchId where the status equals any status other than 'OPEN'. If any rows exist with a status other than 'OPEN', return 061 * false. 062 * 063 * @param batchId Integer value of batch id of payments to search. 064 * @return boolean true = all payments are 'OPEN'; false = all payments are not 'OPEN' 065 */ 066 public boolean doBatchPaymentsHaveOpenStatus(Integer batchId) { 067 LOG.debug("doBatchPaymentsHaveOpenStatus() enter method."); 068 069 // check if batch has any payments 070 Map<String, String> fieldValues = new HashMap<String, String>(); 071 fieldValues.put(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BATCH_ID, String.valueOf(batchId)); 072 List batchPayments = (List)businessObjectService.findMatching(PaymentGroup.class, fieldValues); 073 074 if(ObjectUtils.isNull(batchPayments) || batchPayments.isEmpty()) 075 { 076 return false; 077 } 078 079 List codeList = new ArrayList(); 080 List statusList = (List) this.businessObjectService.findAll(PaymentStatus.class); 081 for (Iterator i = statusList.iterator(); i.hasNext();) { 082 PaymentStatus element = (PaymentStatus) i.next(); 083 if (!(element.getCode().equals(PaymentStatusCodes.OPEN))) { 084 codeList.add(element.getCode()); 085 } 086 } 087 088 Criteria crit = new Criteria(); 089 crit.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BATCH_ID, batchId); 090 crit.addIn(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE, codeList); 091 092 ReportQueryByCriteria q = QueryFactory.newReportQuery(PaymentGroup.class, crit); 093 q.setAttributes(new String[] { PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE }); 094 q.addGroupBy(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE); 095 096 Iterator i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 097 if (i.hasNext()) { 098 LOG.debug("doBatchPaymentsHaveOpenStatus() Not all payment groups have status 'OPEN'."); 099 TransactionalServiceUtils.exhaustIterator(i); 100 return false; 101 } 102 else { 103 LOG.debug("doBatchPaymentsHaveOpenStatus() All payment groups have status 'OPEN'."); 104 return true; 105 } 106 } 107 108 /** 109 * doBatchPaymentsHaveHeldStatus() Return true if all payments in batch have an 'HELD' status. Return false if all payments in 110 * batch do not have an 'HELD' status. The query in this method searches the payment detail table for payments of the given 111 * batchId where the status equals any status other than 'HELD'. If any rows exist with a status other than 'HELD', return 112 * false. 113 * 114 * @param batchId Integer value of batch id of payments to search. 115 * @return boolean true = all payments are 'HELD'; false = all payments are not 'HELD' 116 */ 117 public boolean doBatchPaymentsHaveHeldStatus(Integer batchId) { 118 LOG.debug("doBatchPaymentsHaveHeldStatus() enter method."); 119 120 // check if batch has any payments 121 Map<String, String> fieldValues = new HashMap<String, String>(); 122 fieldValues.put(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BATCH_ID, String.valueOf(batchId)); 123 List batchPayments = (List)businessObjectService.findMatching(PaymentGroup.class, fieldValues); 124 125 if(ObjectUtils.isNull(batchPayments) || batchPayments.isEmpty()) 126 { 127 return false; 128 } 129 130 List codeList = new ArrayList(); 131 List statusList = (List) this.businessObjectService.findAll(PaymentStatus.class); 132 for (Iterator i = statusList.iterator(); i.hasNext();) { 133 PaymentStatus element = (PaymentStatus) i.next(); 134 if (!(element.getCode().equals(PaymentStatusCodes.HELD_CD))) { 135 codeList.add(element.getCode()); 136 } 137 } 138 139 Criteria crit = new Criteria(); 140 crit.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BATCH_ID, batchId); 141 crit.addIn(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE, codeList); 142 143 ReportQueryByCriteria q = QueryFactory.newReportQuery(PaymentGroup.class, crit); 144 q.setAttributes(new String[] { PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE }); 145 q.addGroupBy(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE); 146 147 Iterator i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(q); 148 if (i.hasNext()) { 149 LOG.debug("doBatchPaymentsHaveHeldStatus() Not all payment groups have status 'HELD'."); 150 TransactionalServiceUtils.exhaustIterator(i); 151 return false; 152 } 153 else { 154 LOG.debug("doBatchPaymentsHaveHeldStatus() All payment groups have status 'HELD'."); 155 return true; 156 } 157 } 158 }