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.ar.dataaccess.impl;
017    
018    import java.util.Arrays;
019    import java.util.HashMap;
020    import java.util.Iterator;
021    
022    import org.apache.ojb.broker.query.Criteria;
023    import org.apache.ojb.broker.query.ReportQueryByCriteria;
024    import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceDetail;
025    import org.kuali.kfs.module.ar.businessobject.InvoicePaidApplied;
026    import org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao;
027    import org.kuali.kfs.sys.KFSConstants;
028    import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
029    import org.kuali.rice.kns.util.KualiDecimal;
030    
031    public class CustomerAgingReportDaoOjb extends PlatformAwareDaoBaseOjb implements CustomerAgingReportDao {
032        
033        /**
034         * 
035         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findInvoiceAmountByProcessingChartAndOrg(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
036         */
037        public HashMap<String, KualiDecimal> findInvoiceAmountByProcessingChartAndOrg(String chart, String org, java.sql.Date begin, java.sql.Date end) {
038            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
039            Criteria criteria = new Criteria();
040            if (begin != null) {
041                criteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
042            }
043            if (end != null) {
044                criteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
045            }
046            criteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
047            criteria.addEqualTo("customerInvoiceDocument.accountsReceivableDocumentHeader.processingChartOfAccountCode", chart);
048            criteria.addEqualTo("customerInvoiceDocument.accountsReceivableDocumentHeader.processingOrganizationCode", org);
049            criteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
050            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(amount)" }, criteria);
051            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
052            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
053            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
054    
055            while (iterator != null && iterator.hasNext()) {
056                Object[] data = (Object[]) iterator.next();
057                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
058            }
059            return map;
060        }
061    
062        /**
063         * 
064         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findAppliedAmountByProcessingChartAndOrg(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
065         */
066        public HashMap<String, KualiDecimal> findAppliedAmountByProcessingChartAndOrg(String chart, String org, java.sql.Date begin, java.sql.Date end) {
067            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
068            Criteria criteria = new Criteria();
069            if (begin != null) {
070                criteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
071            }
072            if (end != null) {
073                criteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
074            }
075            criteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
076            criteria.addEqualTo("customerInvoiceDocument.accountsReceivableDocumentHeader.processingChartOfAccountCode", chart);
077            criteria.addEqualTo("customerInvoiceDocument.accountsReceivableDocumentHeader.processingOrganizationCode", org);
078            criteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
079            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(InvoicePaidApplied.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(invoiceItemAppliedAmount)" }, criteria);
080            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
081            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
082            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
083    
084            while (iterator != null && iterator.hasNext()) {
085                Object[] data = (Object[]) iterator.next();
086                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
087            }
088            return map;
089        }
090    
091        /**
092         * 
093         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findDiscountAmountByProcessingChartAndOrg(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
094         */
095        public HashMap<String, KualiDecimal> findDiscountAmountByProcessingChartAndOrg(String chart, String org, java.sql.Date begin, java.sql.Date end) {
096    
097            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
098            Criteria subCriteria = new Criteria();
099            if (begin != null) {
100                subCriteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
101            }
102            if (end != null) {
103                subCriteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
104            }
105            subCriteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
106            subCriteria.addEqualTo("customerInvoiceDocument.accountsReceivableDocumentHeader.processingChartOfAccountCode", chart);
107            subCriteria.addEqualTo("customerInvoiceDocument.accountsReceivableDocumentHeader.processingOrganizationCode", org);
108            subCriteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
109            subCriteria.addEqualToField("documentNumber", Criteria.PARENT_QUERY_PREFIX + "documentNumber");
110    
111            ReportQueryByCriteria subReportQuery = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "invoiceItemDiscountLineNumber" }, subCriteria);
112    
113            Criteria criteria = new Criteria();
114            criteria.addIn("sequenceNumber", subReportQuery);
115            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(amount)" }, criteria);
116            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
117            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
118            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
119    
120            while (iterator != null && iterator.hasNext()) {
121                Object[] data = (Object[]) iterator.next();
122                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
123            }
124            return map;
125    
126        }
127    
128        /**
129         * 
130         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findInvoiceAmountByBillingChartAndOrg(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
131         */
132        public HashMap<String, KualiDecimal> findInvoiceAmountByBillingChartAndOrg(String chart, String org, java.sql.Date begin, java.sql.Date end) {
133            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
134            Criteria criteria = new Criteria();
135            if (begin != null) {
136                criteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
137            }
138            if (end != null) {
139                criteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
140            }
141            criteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
142            criteria.addEqualTo("customerInvoiceDocument.billByChartOfAccountCode", chart);
143            criteria.addEqualTo("customerInvoiceDocument.billedByOrganizationCode", org);
144            criteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
145            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(amount)" }, criteria);
146            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
147            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
148            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
149    
150            while (iterator != null && iterator.hasNext()) {
151                Object[] data = (Object[]) iterator.next();
152                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
153            }
154            return map;
155        }
156    
157        /**
158         * 
159         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findAppliedAmountByBillingChartAndOrg(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
160         */
161        public HashMap<String, KualiDecimal> findAppliedAmountByBillingChartAndOrg(String chart, String org, java.sql.Date begin, java.sql.Date end) {
162            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
163            Criteria criteria = new Criteria();
164            if (begin != null) {
165                criteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
166            }
167            if (end != null) {
168                criteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
169            }
170            criteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
171            criteria.addEqualTo("customerInvoiceDocument.billByChartOfAccountCode", chart);
172            criteria.addEqualTo("customerInvoiceDocument.billedByOrganizationCode", org);
173            criteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
174            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(InvoicePaidApplied.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(invoiceItemAppliedAmount)" }, criteria);
175            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
176            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
177            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
178    
179            while (iterator != null && iterator.hasNext()) {
180                Object[] data = (Object[]) iterator.next();
181                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
182            }
183            return map;
184        }
185    
186        /**
187         * 
188         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findDiscountAmountByBillingChartAndOrg(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
189         */
190        public HashMap<String, KualiDecimal> findDiscountAmountByBillingChartAndOrg(String chart, String org, java.sql.Date begin, java.sql.Date end) {
191    
192            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
193            Criteria subCriteria = new Criteria();
194            if (begin != null) {
195                subCriteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
196            }
197            if (end != null) {
198                subCriteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
199            }
200            subCriteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
201            subCriteria.addEqualTo("customerInvoiceDocument.billByChartOfAccountCode", chart);
202            subCriteria.addEqualTo("customerInvoiceDocument.billedByOrganizationCode", org);
203            subCriteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
204            subCriteria.addEqualToField("documentNumber", Criteria.PARENT_QUERY_PREFIX + "documentNumber");
205    
206            ReportQueryByCriteria subReportQuery = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "invoiceItemDiscountLineNumber" }, subCriteria);
207    
208            Criteria criteria = new Criteria();
209            criteria.addIn("sequenceNumber", subReportQuery);
210            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(amount)" }, criteria);
211            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
212            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
213            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
214    
215            while (iterator != null && iterator.hasNext()) {
216                Object[] data = (Object[]) iterator.next();
217                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
218            }
219            return map;
220    
221        }
222    
223        /**
224         * 
225         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findInvoiceAmountByAccount(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
226         */
227        public HashMap<String, KualiDecimal> findInvoiceAmountByAccount(String chart, String account, java.sql.Date begin, java.sql.Date end) {
228            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
229            Criteria criteria = new Criteria();
230            if (begin != null) {
231                criteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
232            }
233            if (end != null) {
234                criteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
235            }
236            criteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
237            criteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
238            criteria.addEqualTo("chartOfAccountsCode", chart);
239            criteria.addEqualTo("accountNumber", account);
240            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(amount)" }, criteria);
241            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
242            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
243            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
244    
245            while (iterator != null && iterator.hasNext()) {
246                Object[] data = (Object[]) iterator.next();
247                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
248            }
249            return map;
250        }
251    
252        /**
253         * 
254         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findAppliedAmountByAccount(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
255         */
256        public HashMap<String, KualiDecimal> findAppliedAmountByAccount(String chart, String account, java.sql.Date begin, java.sql.Date end) {
257            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
258            Criteria criteria = new Criteria();
259            if (begin != null) {
260                criteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
261            }
262            if (end != null) {
263                criteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
264            }
265            criteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
266            criteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
267            criteria.addEqualTo("invoiceDetail.chartOfAccountsCode", chart);
268            criteria.addEqualTo("invoiceDetail.accountNumber", account);
269            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(InvoicePaidApplied.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(invoiceItemAppliedAmount)" }, criteria);
270            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
271            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
272            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
273    
274            while (iterator != null && iterator.hasNext()) {
275                Object[] data = (Object[]) iterator.next();
276                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
277            }
278            return map;
279        }
280    
281        /**
282         * 
283         * @see org.kuali.kfs.module.ar.dataaccess.CustomerAgingReportDao#findDiscountAmountByAccount(java.lang.String, java.lang.String, java.sql.Date, java.sql.Date)
284         */
285        public HashMap<String, KualiDecimal> findDiscountAmountByAccount(String chart, String account, java.sql.Date begin, java.sql.Date end) {
286    
287            HashMap<String, KualiDecimal> map = new HashMap<String, KualiDecimal>();
288            Criteria subCriteria = new Criteria();
289            if (begin != null) {
290                subCriteria.addGreaterOrEqualThan("customerInvoiceDocument.billingDate", begin);
291            }
292            if (end != null) {
293                subCriteria.addLessOrEqualThan("customerInvoiceDocument.billingDate", end);
294            }
295            subCriteria.addEqualTo("customerInvoiceDocument.documentHeader.financialDocumentStatusCode", KFSConstants.DocumentStatusCodes.APPROVED);
296            subCriteria.addEqualTo("customerInvoiceDocument.openInvoiceIndicator", true);
297            subCriteria.addEqualTo("chartOfAccountsCode", chart);
298            subCriteria.addEqualTo("accountNumber", account);
299            subCriteria.addEqualToField("documentNumber", Criteria.PARENT_QUERY_PREFIX + "documentNumber");
300    
301            ReportQueryByCriteria subReportQuery = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "invoiceItemDiscountLineNumber" }, subCriteria);
302    
303            Criteria criteria = new Criteria();
304            criteria.addIn("sequenceNumber", subReportQuery);
305            ReportQueryByCriteria reportByCriteria = new ReportQueryByCriteria(CustomerInvoiceDetail.class, new String[] { "customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber", "customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName", "sum(amount)" }, criteria);
306            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customerNumber");
307            reportByCriteria.addGroupBy("customerInvoiceDocument.accountsReceivableDocumentHeader.customer.customerName");
308            Iterator<?> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportByCriteria);
309    
310            while (iterator != null && iterator.hasNext()) {
311                Object[] data = (Object[]) iterator.next();
312                map.put((String) data[0] + "-" + data[1], (KualiDecimal) data[2]);
313            }
314            return map;
315    
316        }
317    }