001/*
002 * Copyright 2007 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 */
016package org.kuali.ole.pdp.dataaccess.impl;
017
018import java.math.BigDecimal;
019import java.util.ArrayList;
020import java.util.Iterator;
021import java.util.List;
022
023import org.apache.ojb.broker.query.Criteria;
024import org.apache.ojb.broker.query.QueryByCriteria;
025import org.apache.ojb.broker.query.QueryFactory;
026import org.apache.ojb.broker.query.ReportQueryByCriteria;
027import org.kuali.ole.pdp.PdpConstants;
028import org.kuali.ole.pdp.PdpPropertyConstants;
029import org.kuali.ole.pdp.businessobject.PaymentGroup;
030import org.kuali.ole.pdp.dataaccess.PaymentGroupDao;
031import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
032
033public class PaymentGroupDaoOjb extends PlatformAwareDaoBaseOjb implements PaymentGroupDao {
034    private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PaymentGroupDaoOjb.class);
035
036    
037    public PaymentGroupDaoOjb() {
038        super();
039    }
040
041    /**
042     * @see org.kuali.ole.pdp.dataaccess.PaymentGroupDao#getDisbursementNumbersByDisbursementType(java.lang.Integer, java.lang.String)
043     */
044    public List<Integer> getDisbursementNumbersByDisbursementType(Integer pid,String disbursementType) {
045        LOG.debug("getDisbursementNumbersByDisbursementType() started");
046
047        List<Integer> results = new ArrayList<Integer>();
048
049        Criteria criteria = new Criteria();
050        criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PROCESS_ID, pid);
051        criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_DISBURSEMENT_TYPE_CODE, disbursementType);
052
053        String[] fields = new String[] { PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_DISBURSEMENT_NBR };
054
055        ReportQueryByCriteria rq = QueryFactory.newReportQuery(PaymentGroup.class, fields, criteria, true);
056        rq.addOrderBy(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_DISBURSEMENT_NBR, true);
057
058        Iterator i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rq);
059        while ( i.hasNext() ) {
060            Object[] data = (Object[])i.next();
061            BigDecimal d = (BigDecimal)data[0];
062            results.add( new Integer(d.intValue()) );
063        }
064        return results;
065    }
066    
067    /**
068     * @see org.kuali.ole.pdp.dataaccess.PaymentGroupDao#getDisbursementNumbersByDisbursementType(java.lang.Integer, java.lang.String, java.lang.String)
069     */
070    public List<Integer> getDisbursementNumbersByDisbursementTypeAndBankCode(Integer pid, String disbursementType, String bankCode) {
071        if (LOG.isDebugEnabled()) {
072            LOG.debug("getDisbursementNumbersByDisbursementType() started");
073        }
074
075        List<Integer> results = new ArrayList<Integer>();
076
077        Criteria criteria = new Criteria();
078        criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PROCESS_ID, pid);
079        criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_DISBURSEMENT_TYPE_CODE, disbursementType);
080        criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BANK_CODE, bankCode);
081
082        String[] fields = new String[] { PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_DISBURSEMENT_NBR };
083
084        ReportQueryByCriteria rq = QueryFactory.newReportQuery(PaymentGroup.class, fields, criteria, true);
085        rq.addOrderBy(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_DISBURSEMENT_NBR, true);
086
087        Iterator i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rq);
088        while ( i.hasNext() ) {
089            Object[] data = (Object[])i.next();
090            BigDecimal d = (BigDecimal)data[0];
091            results.add( new Integer(d.intValue()) );
092        }
093        return results;
094    }
095
096    /**
097     * Given a process id and a disbursement type, finds a distinct list of bank codes used by payment groups within that payment process
098     * @param pid payment process to query payment groups of
099     * @param disbursementType the type of disbursements to query
100     * @return a sorted List of bank codes
101     */
102    public List<String> getDistinctBankCodesForProcessAndType(Integer pid, String disbursementType) {
103        List<String> results = new ArrayList<String>();
104        
105        Criteria criteria = new Criteria();
106        criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_PROCESS_ID, pid);
107        criteria.addEqualTo(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_DISBURSEMENT_TYPE_CODE, disbursementType);
108
109        String[] fields = new String[] { PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BANK_CODE };
110        
111        ReportQueryByCriteria rq = QueryFactory.newReportQuery(PaymentGroup.class, fields, criteria, true);
112        rq.addOrderBy(PdpPropertyConstants.PaymentGroup.PAYMENT_GROUP_BANK_CODE, true);
113        
114        Iterator iter = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(rq);
115        while (iter.hasNext()) {
116            final Object[] row = (Object[])iter.next();
117            final String bankCode = (String)row[0];
118        
119            results.add(bankCode);
120        }
121        
122        return results;
123    }
124
125    /**
126     * @see org.kuali.ole.pdp.dataaccess.PaymentGroupDao#getAchPaymentsNeedingAdviceNotification()
127     */
128    public List<PaymentGroup> getAchPaymentsNeedingAdviceNotification() {
129        LOG.debug("getAchPaymentsNeedingAdviceNotification() started");
130
131        Criteria criteria = new Criteria();
132        criteria.addEqualTo(PdpPropertyConstants.PAYMENT_STATUS_CODE, PdpConstants.PaymentStatusCodes.EXTRACTED);
133        criteria.addEqualTo(PdpPropertyConstants.DISBURSEMENT_TYPE_CODE, PdpConstants.DisbursementTypeCodes.ACH);
134        criteria.addIsNull(PdpPropertyConstants.ADVICE_EMAIL_SENT_DATE);
135
136        return (List<PaymentGroup>) getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(PaymentGroup.class, criteria));
137    }
138 
139}
140