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.math.BigDecimal;
019    import java.util.ArrayList;
020    import java.util.Iterator;
021    import java.util.List;
022    
023    import org.apache.ojb.broker.query.Criteria;
024    import org.apache.ojb.broker.query.QueryByCriteria;
025    import org.apache.ojb.broker.query.QueryFactory;
026    import org.apache.ojb.broker.query.ReportQueryByCriteria;
027    import org.kuali.kfs.pdp.PdpConstants;
028    import org.kuali.kfs.pdp.PdpPropertyConstants;
029    import org.kuali.kfs.pdp.businessobject.PaymentGroup;
030    import org.kuali.kfs.pdp.dataaccess.PaymentGroupDao;
031    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
032    
033    public 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.kfs.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.kfs.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.kfs.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