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.pdp.dataaccess.impl; 017 018 import java.sql.Timestamp; 019 import java.util.ArrayList; 020 import java.util.Calendar; 021 import java.util.Date; 022 import java.util.Iterator; 023 import java.util.List; 024 025 import org.apache.ojb.broker.query.Criteria; 026 import org.apache.ojb.broker.query.QueryByCriteria; 027 import org.kuali.kfs.pdp.PdpConstants; 028 import org.kuali.kfs.pdp.PdpPropertyConstants; 029 import org.kuali.kfs.pdp.businessobject.CustomerProfile; 030 import org.kuali.kfs.pdp.businessobject.PaymentGroup; 031 import org.kuali.kfs.pdp.businessobject.PaymentProcess; 032 import org.kuali.kfs.pdp.businessobject.PaymentStatus; 033 import org.kuali.kfs.pdp.dataaccess.FormatPaymentDao; 034 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb; 035 import org.kuali.rice.kns.service.BusinessObjectService; 036 037 public class FormatPaymentDaoOjb extends PlatformAwareDaoBaseOjb implements FormatPaymentDao { 038 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(FormatPaymentDaoOjb.class); 039 040 private BusinessObjectService businessObjectService; 041 042 /** 043 * @see org.kuali.kfs.pdp.dataaccess.FormatPaymentDao#markPaymentsForFormat(org.kuali.kfs.pdp.businessobject.PaymentProcess, 044 * java.util.List, java.util.Date, java.lang.String) 045 */ 046 public void markPaymentsForFormat(PaymentProcess proc, List customers, Date paydate, String paymentTypes) { 047 LOG.debug("markPaymentsForFormat() started"); 048 049 Timestamp now = new Timestamp((new Date()).getTime()); 050 java.sql.Date sqlDate = new java.sql.Date(paydate.getTime()); 051 Calendar c = Calendar.getInstance(); 052 c.setTime(sqlDate); 053 c.set(Calendar.HOUR, 11); 054 c.set(Calendar.MINUTE, 59); 055 c.set(Calendar.SECOND, 59); 056 c.set(Calendar.MILLISECOND, 59); 057 c.set(Calendar.AM_PM, Calendar.PM); 058 Timestamp paydateTs = new Timestamp(c.getTime().getTime()); 059 060 LOG.debug("markPaymentsForFormat() last update = " + now); 061 LOG.debug("markPaymentsForFormat() entered paydate = " + paydate); 062 LOG.debug("markPaymentsForFormat() actual paydate = " + paydateTs); 063 064 PaymentStatus format = (PaymentStatus) this.businessObjectService.findBySinglePrimaryKey(PaymentStatus.class, PdpConstants.PaymentStatusCodes.FORMAT); 065 066 List customerIds = new ArrayList(); 067 for (Iterator iter = customers.iterator(); iter.hasNext();) { 068 CustomerProfile element = (CustomerProfile) iter.next(); 069 customerIds.add(element.getId()); 070 } 071 072 Criteria criteria = new Criteria(); 073 074 if (customerIds.size() > 0) { 075 criteria.addIn(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BATCH + "." + PdpPropertyConstants.BatchConstants.CUSTOMER_ID, customerIds); 076 } 077 else { 078 // no payments to mark as no customer was selected 079 return; 080 } 081 082 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE, PdpConstants.PaymentStatusCodes.OPEN); 083 084 if (PdpConstants.PaymentTypes.DISBURSEMENTS_WITH_SPECIAL_HANDLING.equals(paymentTypes)) { 085 // special handling only 086 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_SPECIAL_HANDLING, Boolean.TRUE); 087 } 088 else if (PdpConstants.PaymentTypes.DISBURSEMENTS_NO_SPECIAL_HANDLING.equals(paymentTypes)) { 089 // no special handling only 090 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_SPECIAL_HANDLING, Boolean.FALSE); 091 } 092 else if (PdpConstants.PaymentTypes.DISBURSEMENTS_WITH_ATTACHMENTS.equals(paymentTypes)) { 093 // attachments only 094 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_ATTACHMENT, Boolean.TRUE); 095 } 096 else if (PdpConstants.PaymentTypes.DISBURSEMENTS_NO_ATTACHMENTS.equals(paymentTypes)) { 097 // no attachments only 098 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_ATTACHMENT, Boolean.FALSE); 099 } 100 101 if (PdpConstants.PaymentTypes.PROCESS_IMMEDIATE.equals(paymentTypes)) { 102 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PROCESS_IMMEDIATE, Boolean.TRUE); 103 } 104 else { 105 // (Payment date <= usePaydate OR immediate = TRUE) 106 Criteria criteria1 = new Criteria(); 107 criteria1.addEqualTo(PdpPropertyConstants.PaymentGroup.PROCESS_IMMEDIATE, Boolean.TRUE); 108 109 Criteria criteria2 = new Criteria(); 110 criteria2.addLessOrEqualThan(PdpPropertyConstants.PaymentGroup.PAYMENT_DATE, paydateTs); 111 criteria1.addOrCriteria(criteria2); 112 113 criteria.addAndCriteria(criteria1); 114 } 115 116 Iterator groupIterator = getPersistenceBrokerTemplate().getIteratorByQuery(new QueryByCriteria(PaymentGroup.class, criteria)); 117 while (groupIterator.hasNext()) { 118 PaymentGroup paymentGroup = (PaymentGroup) groupIterator.next(); 119 paymentGroup.setLastUpdate(paydateTs);// delete this one 120 paymentGroup.setPaymentStatus(format); 121 paymentGroup.setProcess(proc); 122 getPersistenceBrokerTemplate().store(paymentGroup); 123 } 124 } 125 126 /** 127 * @see org.kuali.kfs.pdp.dataaccess.FormatPaymentDao#unmarkPaymentsForFormat(org.kuali.kfs.pdp.businessobject.PaymentProcess) 128 */ 129 public void unmarkPaymentsForFormat(PaymentProcess proc) { 130 LOG.debug("unmarkPaymentsForFormat() started"); 131 132 Timestamp now = new Timestamp((new Date()).getTime()); 133 134 PaymentStatus openStatus = (PaymentStatus) businessObjectService.findBySinglePrimaryKey(PaymentStatus.class, PdpConstants.PaymentStatusCodes.OPEN); 135 136 Criteria criteria = new Criteria(); 137 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PROCESS_ID, proc.getId()); 138 criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PAYMENT_STATUS_CODE, PdpConstants.PaymentStatusCodes.FORMAT); 139 140 Iterator groupIterator = getPersistenceBrokerTemplate().getIteratorByQuery(new QueryByCriteria(PaymentGroup.class, criteria)); 141 while (groupIterator.hasNext()) { 142 PaymentGroup paymentGroup = (PaymentGroup) groupIterator.next(); 143 paymentGroup.setLastUpdate(now); 144 paymentGroup.setPaymentStatus(openStatus); 145 getPersistenceBrokerTemplate().store(paymentGroup); 146 } 147 } 148 149 /** 150 * Gets the businessObjectService attribute. 151 * 152 * @return Returns the businessObjectService. 153 */ 154 public BusinessObjectService getBusinessObjectService() { 155 return businessObjectService; 156 } 157 158 /** 159 * Sets the businessObjectService attribute value. 160 * 161 * @param businessObjectService The businessObjectService to set. 162 */ 163 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 164 this.businessObjectService = businessObjectService; 165 } 166 167 }