1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.ole.sys.dataaccess.impl;
17  
18  import java.math.BigDecimal;
19  import java.util.ArrayList;
20  import java.util.Arrays;
21  import java.util.Collection;
22  import java.util.HashMap;
23  import java.util.Iterator;
24  import java.util.List;
25  import java.util.Map;
26  
27  import org.apache.commons.lang.StringUtils;
28  import org.apache.ojb.broker.query.Criteria;
29  import org.apache.ojb.broker.query.QueryByCriteria;
30  import org.apache.ojb.broker.query.QueryFactory;
31  import org.apache.ojb.broker.query.ReportQueryByCriteria;
32  import org.kuali.ole.coa.businessobject.Account;
33  import org.kuali.ole.gl.OJBUtility;
34  import org.kuali.ole.gl.businessobject.Balance;
35  import org.kuali.ole.gl.businessobject.Encumbrance;
36  import org.kuali.ole.sys.OLEConstants;
37  import org.kuali.ole.sys.OLEPropertyConstants;
38  import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntry;
39  import org.kuali.ole.sys.businessobject.SystemOptions;
40  import org.kuali.ole.sys.dataaccess.GeneralLedgerPendingEntryDao;
41  import org.kuali.ole.sys.util.TransactionalServiceUtils;
42  import org.kuali.rice.core.api.util.type.KualiDecimal;
43  import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
44  import org.kuali.rice.kns.lookup.LookupUtils;
45  
46  
47  
48  
49  
50  public class GeneralLedgerPendingEntryDaoOjb extends PlatformAwareDaoBaseOjb implements GeneralLedgerPendingEntryDao {
51      private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(GeneralLedgerPendingEntryDaoOjb.class);
52  
53      protected final static String TRANSACTION_LEDGER_ENTRY_SEQUENCE_NUMBER = "transactionLedgerEntrySequenceNumber";
54      protected final static String FINANCIAL_DOCUMENT_APPROVED_CODE = "financialDocumentApprovedCode";
55      protected final static String ACCOUNT_NUMBER = "accountNumber";
56      protected final static String DOC_NUMBER = "documentNumber";
57      protected final static String CHART_OF_ACCOUNTS_CODE = "chartOfAccountsCode";
58      protected final static String CHART_FINANCIAL_CASH_OBJECT_CODE = "chart.financialCashObjectCode";
59      protected final static String OBJECT_TYPE_FIN_OBJECT_TYPE_DEBITCREDIT_CD = "objectType.finObjectTypeDebitcreditCd";
60  
61      
62  
63  
64  
65      @Override
66      public KualiDecimal getTransactionSummary(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, Collection objectTypeCodes, Collection balanceTypeCodes, String acctSufficientFundsFinObjCd, boolean isYearEnd) {
67          LOG.debug("getTransactionSummary() started");
68  
69          Criteria criteria = new Criteria();
70          criteria.addEqualTo(OLEConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, universityFiscalYear);
71          criteria.addEqualTo(OLEConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, chartOfAccountsCode);
72          criteria.addEqualTo(OLEConstants.ACCOUNT_NUMBER_PROPERTY_NAME, accountNumber);
73          criteria.addEqualTo("acctSufficientFundsFinObjCd", acctSufficientFundsFinObjCd);
74          criteria.addIn(OLEConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, balanceTypeCodes);
75          criteria.addIn("financialObjectTypeCode", objectTypeCodes);
76  
77          if (isYearEnd) {
78              criteria.addLike("financialDocumentTypeCode", "YE%");
79          }
80          else {
81              criteria.addNotLike("financialDocumentTypeCode", "YE%");
82          }
83  
84          Collection status = new ArrayList();
85          status.add(OLEConstants.DocumentStatusCodes.CANCELLED);
86          status.add(OLEConstants.DocumentStatusCodes.DISAPPROVED);
87  
88          criteria.addNotIn(OLEConstants.DOCUMENT_HEADER_PROPERTY_NAME + "." + OLEConstants.DOCUMENT_HEADER_DOCUMENT_STATUS_CODE_PROPERTY_NAME, status);
89  
90          ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(this.getEntryClass(), criteria);
91          reportQuery.setAttributes(new String[] { "sum(" + OLEConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" });
92  
93          KualiDecimal rv = null;
94          Iterator iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery);
95          if (iterator.hasNext()) {
96              rv = (KualiDecimal) ((Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iterator))[0];
97          }
98          return (rv == null) ? KualiDecimal.ZERO : rv;
99      }
100 
101     
102 
103 
104 
105     @Override
106     public KualiDecimal getTransactionSummary(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, Collection objectTypeCodes, Collection balanceTypeCodes, String acctSufficientFundsFinObjCd, boolean isDebit, boolean isYearEnd) {
107         if ( LOG.isDebugEnabled() ) {
108             LOG.debug("getTransactionSummary(): " + universityFiscalYear + " / " + chartOfAccountsCode + " / " + accountNumber + " / " + objectTypeCodes + " / " + balanceTypeCodes + " / " + acctSufficientFundsFinObjCd + " / " + isDebit + " / " + isYearEnd );
109         }
110 
111         Criteria criteria = new Criteria();
112         criteria.addEqualTo(OLEConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, universityFiscalYear);
113         criteria.addEqualTo(OLEConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, chartOfAccountsCode);
114         criteria.addEqualTo(OLEConstants.ACCOUNT_NUMBER_PROPERTY_NAME, accountNumber);
115         criteria.addEqualTo("acctSufficientFundsFinObjCd", acctSufficientFundsFinObjCd);
116         criteria.addIn(OLEConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, balanceTypeCodes);
117         criteria.addIn("financialObjectTypeCode", objectTypeCodes);
118 
119         if (isYearEnd) {
120             criteria.addLike("financialDocumentTypeCode", "YE%");
121         }
122         else {
123             criteria.addNotLike("financialDocumentTypeCode", "YE%");
124         }
125 
126         if (isDebit) {
127             criteria.addEqualTo(OLEConstants.TRANSACTION_DEBIT_CREDIT_CODE, OLEConstants.GL_DEBIT_CODE);
128         }
129         else {
130             criteria.addNotEqualTo(OLEConstants.TRANSACTION_DEBIT_CREDIT_CODE, OLEConstants.GL_DEBIT_CODE);
131         }
132 
133         Collection status = new ArrayList();
134         status.add(OLEConstants.DocumentStatusCodes.CANCELLED);
135         status.add(OLEConstants.DocumentStatusCodes.DISAPPROVED);
136 
137         criteria.addNotIn(OLEConstants.DOCUMENT_HEADER_PROPERTY_NAME + "." + OLEConstants.DOCUMENT_HEADER_DOCUMENT_STATUS_CODE_PROPERTY_NAME, status);
138 
139         ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(this.getEntryClass(), criteria);
140         reportQuery.setAttributes(new String[] { "sum(" + OLEConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" });
141 
142         KualiDecimal rv = null;
143         Iterator iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery);
144         if (iterator.hasNext()) {
145             rv = (KualiDecimal) ((Object[]) iterator.next())[0];
146         }
147         return (rv == null) ? KualiDecimal.ZERO : rv;
148     }
149 
150     
151 
152 
153 
154     @Override
155     public KualiDecimal getTransactionSummary(Collection universityFiscalYears, String chartOfAccountsCode, String accountNumber, Collection objectCodes, Collection balanceTypeCodes, boolean isDebit) {
156         LOG.debug("getTransactionSummary() started");
157 
158         Criteria criteria = new Criteria();
159         criteria.addIn(OLEConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, universityFiscalYears);
160         criteria.addEqualTo(OLEConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, chartOfAccountsCode);
161         criteria.addEqualTo(OLEConstants.ACCOUNT_NUMBER_PROPERTY_NAME, accountNumber);
162         criteria.addIn(OLEConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME, objectCodes);
163         criteria.addIn(OLEConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, balanceTypeCodes);
164 
165         if (isDebit) {
166             criteria.addEqualTo(OLEConstants.TRANSACTION_DEBIT_CREDIT_CODE, OLEConstants.GL_DEBIT_CODE);
167         }
168         else {
169             criteria.addNotEqualTo(OLEConstants.TRANSACTION_DEBIT_CREDIT_CODE, OLEConstants.GL_DEBIT_CODE);
170         }
171 
172         Collection status = new ArrayList();
173         status.add(OLEConstants.DocumentStatusCodes.CANCELLED);
174         status.add(OLEConstants.DocumentStatusCodes.DISAPPROVED);
175 
176         criteria.addNotIn(OLEConstants.DOCUMENT_HEADER_PROPERTY_NAME + "." + OLEConstants.DOCUMENT_HEADER_DOCUMENT_STATUS_CODE_PROPERTY_NAME, status);
177 
178         ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(this.getEntryClass(), criteria);
179         reportQuery.setAttributes(new String[] { "sum(" + OLEConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" });
180 
181         KualiDecimal rv = null;
182         Iterator iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery);
183         if (iterator.hasNext()) {
184             rv = (KualiDecimal) ((Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iterator))[0];
185         }
186         return (rv == null) ? KualiDecimal.ZERO : rv;
187     }
188 
189     
190 
191 
192 
193     @Override
194     public void delete(String documentHeaderId) {
195         LOG.debug("delete() started");
196 
197         if (documentHeaderId != null) {
198             Criteria criteria = new Criteria();
199             criteria.addEqualTo(OLEPropertyConstants.DOCUMENT_NUMBER, documentHeaderId);
200 
201             getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(this.getEntryClass(), criteria));
202             getPersistenceBrokerTemplate().clearCache();
203         }
204     }
205 
206     @Override
207     public void deleteByFinancialDocumentApprovedCode(String financialDocumentApprovedCode) {
208         LOG.debug("deleteByFinancialDocumentApprovedCode() started");
209 
210         Criteria criteria = new Criteria();
211         criteria.addEqualTo(FINANCIAL_DOCUMENT_APPROVED_CODE, financialDocumentApprovedCode);
212 
213         QueryByCriteria qbc = QueryFactory.newQuery(this.getEntryClass(), criteria);
214         getPersistenceBrokerTemplate().deleteByQuery(qbc);
215         getPersistenceBrokerTemplate().clearCache();
216     }
217 
218     
219 
220 
221     @Override
222     public Iterator findApprovedPendingLedgerEntries() {
223         LOG.debug("findApprovedPendingLedgerEntries() started");
224 
225         
226         Criteria criteria = new Criteria();
227         criteria.addEqualTo("financialDocumentApprovedCode", OLEConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.APPROVED);
228 
229         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
230         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
231     }
232 
233     
234 
235 
236     @Override
237     public int countPendingLedgerEntries(Account account) {
238         LOG.debug("findPendingLedgerEntries(Account) started");
239 
240         Criteria criteria = new Criteria();
241         criteria.addEqualTo(ACCOUNT_NUMBER, account.getAccountNumber());
242         criteria.addEqualTo(CHART_OF_ACCOUNTS_CODE, account.getChartOfAccountsCode());
243 
244         ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria);
245         query.setAttributes(new String[] { "count(*)" });
246         Iterator i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query);
247         if (i.hasNext()) {
248             Object[] values = (Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(i);
249             if (values[0] instanceof BigDecimal) {
250                 return ((BigDecimal) values[0]).intValue();
251             }
252             else {
253                 return ((Long) values[0]).intValue();
254             }
255         }
256         else {
257             return 0;
258         }
259     }
260 
261     
262 
263 
264 
265     @Override
266     public Iterator findPendingLedgerEntries(Encumbrance encumbrance, boolean isApproved) {
267         LOG.debug("findPendingLedgerEntries(Encumbrance, boolean) started");
268 
269         
270         Criteria criteria = new Criteria();
271         criteria.addEqualTo(OLEPropertyConstants.UNIVERSITY_FISCAL_YEAR, encumbrance.getUniversityFiscalYear());
272         criteria.addEqualTo(OLEPropertyConstants.CHART_OF_ACCOUNTS_CODE, encumbrance.getChartOfAccountsCode());
273         criteria.addEqualTo(OLEPropertyConstants.ACCOUNT_NUMBER, encumbrance.getAccountNumber());
274         criteria.addEqualTo(OLEPropertyConstants.SUB_ACCOUNT_NUMBER, encumbrance.getSubAccountNumber());
275         criteria.addEqualTo(OLEPropertyConstants.FINANCIAL_OBJECT_CODE, encumbrance.getObjectCode());
276         criteria.addEqualTo(OLEPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, encumbrance.getSubObjectCode());
277         criteria.addEqualTo(OLEPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, encumbrance.getBalanceTypeCode());
278         criteria.addEqualTo(OLEPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, encumbrance.getDocumentTypeCode());
279         criteria.addEqualTo(OLEPropertyConstants.ORGANIZATION_DOCUMENT_NUMBER, encumbrance.getDocumentNumber());
280 
281         
282         this.addStatusCode(criteria, isApproved);
283 
284         
285         Criteria criteria1 = new Criteria();
286         Criteria criteria2 = new Criteria();
287         criteria1.addEqualTo(OLEPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE, encumbrance.getOriginCode());
288         criteria2.addEqualTo(OLEPropertyConstants.REFERENCE_FINANCIAL_SYSTEM_ORIGINATION_CODE, encumbrance.getOriginCode());
289         criteria1.addOrCriteria(criteria2);
290 
291         
292         criteria.addAndCriteria(criteria1);
293 
294         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
295         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
296     }
297 
298     
299 
300 
301 
302     @Override
303     public Iterator findPendingLedgerEntries(Balance balance, boolean isApproved, boolean isConsolidated) {
304         LOG.debug("findPendingLedgerEntries(Balance, boolean, boolean) started");
305 
306         
307         Criteria criteria = new Criteria();
308         criteria.addEqualTo(OLEPropertyConstants.UNIVERSITY_FISCAL_YEAR, balance.getUniversityFiscalYear());
309         criteria.addEqualTo(OLEPropertyConstants.CHART_OF_ACCOUNTS_CODE, balance.getChartOfAccountsCode());
310         criteria.addEqualTo(OLEPropertyConstants.ACCOUNT_NUMBER, balance.getAccountNumber());
311         criteria.addEqualTo(OLEPropertyConstants.FINANCIAL_OBJECT_CODE, balance.getObjectCode());
312         criteria.addEqualTo(OLEPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, balance.getBalanceTypeCode());
313 
314         if (!isConsolidated) {
315             criteria.addEqualTo(OLEPropertyConstants.SUB_ACCOUNT_NUMBER, balance.getSubAccountNumber());
316         }
317 
318         
319         this.addStatusCode(criteria, isApproved);
320 
321         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
322         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
323     }
324 
325     
326 
327 
328 
329     @Override
330     public Iterator findPendingLedgerEntriesForEntry(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFY, List<String> encumbranceBalanceTypes) {
331         LOG.debug("findPendingLedgerEntriesForEntry started");
332 
333         Criteria criteria = buildCriteriaFromMap(fieldValues, new GeneralLedgerPendingEntry(), currentFiscalPeriodCode, currentFY, encumbranceBalanceTypes);
334 
335         
336         this.addStatusCode(criteria, isApproved);
337 
338         LookupUtils.applySearchResultsLimit(this.getEntryClass(), criteria, getDbPlatform());
339 
340         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
341         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
342     }
343 
344     
345 
346 
347 
348     @Override
349     public Iterator findPendingLedgerEntriesForBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFY, List<String> encumbranceBalanceTypes) {
350         LOG.debug("findPendingLedgerEntriesForBalance started");
351 
352         Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFY, encumbranceBalanceTypes);
353 
354         
355         this.addStatusCode(criteria, isApproved);
356 
357         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
358         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
359     }
360 
361     
362 
363 
364 
365     @Override
366     public Iterator findPendingLedgerEntriesForCashBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceType) {
367         LOG.debug("findPendingLedgerEntriesForCashBalance started");
368 
369         Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceType);
370         criteria.addEqualTo(OLEPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, "AC");
371         criteria.addEqualToField(OLEPropertyConstants.FINANCIAL_OBJECT_CODE, CHART_FINANCIAL_CASH_OBJECT_CODE);
372 
373         
374         this.addStatusCode(criteria, isApproved);
375 
376         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
377         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
378     }
379 
380 
381     
382 
383 
384 
385     @Override
386     public Iterator findPendingLedgerEntriesForEncumbrance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, SystemOptions currentYearOptions, List<String> encumbranceBalanceTypes) {
387         LOG.debug("findPendingLedgerEntriesForEncumbrance started");
388 
389         String docNumber = (String)fieldValues.get(DOC_NUMBER);
390         Criteria subCriteria1 = new Criteria();
391         boolean docNbrCriteriaNeeded = false;
392         if (StringUtils.isNotBlank(docNumber)) {
393             fieldValues.remove(DOC_NUMBER);
394             subCriteria1 = new Criteria();
395             subCriteria1.addEqualTo(OLEPropertyConstants.TRANSACTION_ENCUMBRANCE_UPDT_CD, OLEConstants.ENCUMB_UPDT_REFERENCE_DOCUMENT_CD);
396             Criteria subCriteria1b = new Criteria();
397             subCriteria1b.addEqualTo(OLEPropertyConstants.REFERENCE_FINANCIAL_DOCUMENT_NUMBER, docNumber);
398             subCriteria1.addAndCriteria(subCriteria1b);           
399             Criteria subCriteria2 = new Criteria();
400             subCriteria2.addEqualTo(OLEPropertyConstants.TRANSACTION_ENCUMBRANCE_UPDT_CD, OLEConstants.ENCUMB_UPDT_DOCUMENT_CD);
401             Criteria subCriteria2b = new Criteria();
402             subCriteria2b.addEqualTo(DOC_NUMBER, docNumber);
403             subCriteria2.addAndCriteria(subCriteria2b);           
404             subCriteria1.addOrCriteria(subCriteria2);
405             docNbrCriteriaNeeded = true;
406         }
407 
408         Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes);
409         criteria.addIn(OLEPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, Arrays.asList(OLEConstants.ENCUMBRANCE_BALANCE_TYPE));
410 
411         List encumbranceUpdateCodeList = new ArrayList();
412         encumbranceUpdateCodeList.add(OLEConstants.ENCUMB_UPDT_REFERENCE_DOCUMENT_CD);
413         encumbranceUpdateCodeList.add(OLEConstants.ENCUMB_UPDT_DOCUMENT_CD);
414         criteria.addIn(OLEPropertyConstants.TRANSACTION_ENCUMBRANCE_UPDT_CD, encumbranceUpdateCodeList);
415 
416         
417         this.addStatusCode(criteria, isApproved);
418 
419         
420         criteria.addAndCriteria(buildCriteriaToExcludeFundBalance(currentYearOptions));
421 
422         if (docNbrCriteriaNeeded) {
423             criteria.addAndCriteria(subCriteria1);
424         }
425 
426         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
427         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
428     }
429 
430     
431 
432 
433 
434 
435     protected Criteria buildCriteriaToExcludeFundBalance(SystemOptions currentYearOptions) {
436 
437         String fundBalanceObjectTypeCode = currentYearOptions.getFinObjectTypeFundBalanceCd();
438 
439         Criteria criteria = new Criteria();
440         criteria.addNotEqualTo(OLEPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE, fundBalanceObjectTypeCode);
441         return criteria;
442     }
443 
444 
445     
446 
447 
448 
449     @Override
450     public Iterator findPendingLedgerEntriesForAccountBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceTypes) {
451         LOG.debug("findPendingLedgerEntriesForAccountBalance started");
452 
453         Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes);
454 
455         
456         this.addStatusCode(criteria, isApproved);
457 
458         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
459         return getPersistenceBrokerTemplate().getIteratorByQuery(query);
460     }
461 
462 
463     
464 
465 
466 
467     @Override
468     public Iterator findPendingLedgerEntrySummaryForAccountBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceTypes) {
469         LOG.debug("findPendingLedgerEntrySummaryForAccountBalance started");
470 
471         Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes);
472 
473         
474         this.addStatusCode(criteria, isApproved);
475 
476         ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria);
477 
478         List attributeList = buildAttributeList();
479         List groupByList = buildGroupList();
480 
481         
482         String[] attributes = (String[]) attributeList.toArray(new String[attributeList.size()]);
483         query.setAttributes(attributes);
484 
485         
486         String[] groupBy = (String[]) groupByList.toArray(new String[groupByList.size()]);
487         query.addGroupBy(groupBy);
488 
489         return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query);
490     }
491 
492     
493 
494 
495 
496 
497     protected List buildAttributeList() {
498         List attributeList = buildGroupList();
499         attributeList.add("sum(" + OLEPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")");
500         return attributeList;
501     }
502 
503     
504 
505 
506 
507 
508     protected List buildGroupList() {
509         List groupList = new ArrayList();
510 
511         groupList.add(OLEPropertyConstants.FINANCIAL_OBJECT_CODE);
512         groupList.add(OLEPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE);
513         groupList.add(OLEPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE);
514         groupList.add(OBJECT_TYPE_FIN_OBJECT_TYPE_DEBITCREDIT_CD);
515         return groupList;
516     }
517 
518     
519 
520 
521 
522 
523 
524     protected void addStatusCode(Criteria criteria, boolean isOnlyApproved) {
525         
526         if (isOnlyApproved) {
527             criteria.addIn("documentHeader.financialDocumentStatusCode", this.buildApprovalCodeList());
528             criteria.addNotEqualTo(OLEPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE, OLEConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED);
529         }
530         else {
531             Criteria subCriteria1 = new Criteria();
532             subCriteria1.addNotEqualTo(OLEPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE, OLEConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED);
533 
534             Criteria subCriteria2 = new Criteria();
535             subCriteria2.addIsNull(OLEPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE);
536 
537             subCriteria1.addOrCriteria(subCriteria2);
538             criteria.addAndCriteria(subCriteria1);
539         }
540     }
541 
542     
543 
544 
545 
546 
547     protected List buildApprovalCodeList() {
548         List approvalCodeList = new ArrayList();
549 
550         approvalCodeList.add(OLEConstants.DocumentStatusCodes.APPROVED);
551         return approvalCodeList;
552     }
553 
554     
555 
556 
557 
558 
559 
560 
561     public Criteria buildCriteriaFromMap(Map fieldValues, Object businessObject, String currentFiscalPeriodCode, Integer currentFiscalYear, List<String> encumbranceBalanceTypes) {
562         Criteria criteria = new Criteria();
563 
564         
565         String fiscalPeriodFromForm = null;
566         if (fieldValues.containsKey(OLEPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE)) {
567             fiscalPeriodFromForm = (String) fieldValues.get(OLEPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE);
568         }
569 
570         String fiscalYearFromForm = null;
571         if (fieldValues.containsKey(OLEPropertyConstants.UNIVERSITY_FISCAL_YEAR)) {
572             fiscalYearFromForm = (String) fieldValues.get(OLEPropertyConstants.UNIVERSITY_FISCAL_YEAR);
573         }
574 
575         boolean includeNullFiscalPeriodCodeInLookup = null != currentFiscalPeriodCode && currentFiscalPeriodCode.equals(fiscalPeriodFromForm);
576         boolean includeNullFiscalYearInLookup = null != currentFiscalYear && currentFiscalYear.toString().equals(fiscalYearFromForm);
577 
578         if (includeNullFiscalPeriodCodeInLookup) {
579             Criteria apValueCriteria = new Criteria();
580             apValueCriteria.addLike(OLEPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, fiscalPeriodFromForm);
581 
582             Criteria apNullCriteria = new Criteria();
583             apNullCriteria.addIsNull(OLEPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE);
584 
585             apValueCriteria.addOrCriteria(apNullCriteria);
586             criteria.addAndCriteria(apValueCriteria);
587 
588         }
589 
590         if (includeNullFiscalYearInLookup) {
591             Criteria fyValueCriteria = new Criteria();
592             fyValueCriteria.addEqualTo(OLEPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYearFromForm);
593 
594             Criteria fyNullCriteria = new Criteria();
595             fyNullCriteria.addIsNull(OLEPropertyConstants.UNIVERSITY_FISCAL_YEAR);
596 
597             fyValueCriteria.addOrCriteria(fyNullCriteria);
598             criteria.addAndCriteria(fyValueCriteria);
599         }
600 
601         
602         Map<String, Object> localFieldValues = new HashMap();
603         localFieldValues.putAll(fieldValues);
604 
605         
606         if (includeNullFiscalPeriodCodeInLookup) {
607             localFieldValues.remove(OLEPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE);
608         }
609         if (includeNullFiscalYearInLookup) {
610             localFieldValues.remove(OLEPropertyConstants.UNIVERSITY_FISCAL_YEAR);
611         }
612 
613         String propertyName = OLEPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE;
614         if (localFieldValues.containsKey(propertyName)) {
615             String propertyValue = (String) fieldValues.get(propertyName);
616             if (OLEConstants.AGGREGATE_ENCUMBRANCE_BALANCE_TYPE_CODE.equals(propertyValue)) {
617                 localFieldValues.remove(OLEPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE);
618                 criteria.addIn(OLEPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, encumbranceBalanceTypes);
619             }
620         }
621 
622         
623         List<String> keysToRemove = new ArrayList<String>();
624         for (String key : localFieldValues.keySet()) {
625             if (key.startsWith("dummyBusinessObject.")) {
626                 keysToRemove.add(key);
627             }
628         }
629         for (String key : keysToRemove) {
630             localFieldValues.remove(key);
631         }
632 
633         criteria.addAndCriteria(OJBUtility.buildCriteriaFromMap(localFieldValues, businessObject));
634         return criteria;
635     }
636 
637     
638 
639 
640 
641     @Override
642     public Collection findPendingEntries(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceTypes) {
643         LOG.debug("findPendingEntries(Map, boolean) started");
644 
645         Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes);
646 
647         
648         this.addStatusCode(criteria, isApproved);
649 
650         LookupUtils.applySearchResultsLimit(this.getEntryClass(), criteria, getDbPlatform());
651 
652         QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
653         return getPersistenceBrokerTemplate().getCollectionByQuery(query);
654     }
655 
656     
657 
658 
659 
660 
661     public Class getEntryClass() {
662         return GeneralLedgerPendingEntry.class;
663     }
664 
665     protected Object getEntryClassInstance() {
666         Object entryObject = null;
667         try {
668             entryObject = getEntryClass().newInstance();
669         }
670         catch (Exception e) {
671             if (LOG.isDebugEnabled()) {
672                 LOG.debug("Wrong object type" + e);
673             }
674         }
675         return entryObject;
676     }
677 }