/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.dataaccess.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.ojb.broker.query.Criteria; import org.apache.ojb.broker.query.QueryByCriteria; import org.apache.ojb.broker.query.QueryFactory; import org.apache.ojb.broker.query.ReportQueryByCriteria; import org.kuali.kfs.coa.businessobject.Account; import org.kuali.kfs.coa.businessobject.BalanceType; import org.kuali.kfs.coa.dataaccess.BalanceTypeDao; import org.kuali.kfs.gl.OJBUtility; import org.kuali.kfs.gl.businessobject.Balance; import org.kuali.kfs.gl.businessobject.Encumbrance; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry; import org.kuali.kfs.sys.businessobject.SystemOptions; import org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao; import org.kuali.kfs.sys.util.TransactionalServiceUtils; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; import org.kuali.rice.kns.lookup.LookupUtils; /** * * */ public class GeneralLedgerPendingEntryDaoOjb extends PlatformAwareDaoBaseOjb implements GeneralLedgerPendingEntryDao { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(GeneralLedgerPendingEntryDaoOjb.class); protected final static String TRANSACTION_LEDGER_ENTRY_SEQUENCE_NUMBER = "transactionLedgerEntrySequenceNumber"; protected final static String FINANCIAL_DOCUMENT_APPROVED_CODE = "financialDocumentApprovedCode"; protected final static String ACCOUNT_NUMBER = "accountNumber"; protected final static String DOC_NUMBER = "documentNumber"; protected final static String CHART_OF_ACCOUNTS_CODE = "chartOfAccountsCode"; protected final static String CHART_FINANCIAL_CASH_OBJECT_CODE = "chart.financialCashObjectCode"; protected final static String OBJECT_TYPE_FIN_OBJECT_TYPE_DEBITCREDIT_CD = "objectType.finObjectTypeDebitcreditCd"; protected BalanceTypeDao balanceTypeDao; /** * @see org.kuali.module.gl.dao.GeneralLedgerPendingEntryDao#getTransactionSummary(java.lang.Integer, java.lang.String, * java.lang.String, java.util.Collection, java.util.Collection, java.lang.String, boolean) */ @Override public KualiDecimal getTransactionSummary(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, Collection objectTypeCodes, Collection balanceTypeCodes, String acctSufficientFundsFinObjCd, boolean isYearEnd) { LOG.debug("getTransactionSummary() started"); Criteria criteria = new Criteria(); criteria.addEqualTo(KFSConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, universityFiscalYear); criteria.addEqualTo(KFSConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, chartOfAccountsCode); criteria.addEqualTo(KFSConstants.ACCOUNT_NUMBER_PROPERTY_NAME, accountNumber); criteria.addEqualTo("acctSufficientFundsFinObjCd", acctSufficientFundsFinObjCd); criteria.addIn(KFSConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, balanceTypeCodes); criteria.addIn("financialObjectTypeCode", objectTypeCodes); if (isYearEnd) { criteria.addLike("financialDocumentTypeCode", "YE%"); } else { criteria.addNotLike("financialDocumentTypeCode", "YE%"); } Collection status = new ArrayList(); status.add(KFSConstants.DocumentStatusCodes.CANCELLED); status.add(KFSConstants.DocumentStatusCodes.DISAPPROVED); criteria.addNotIn(KFSConstants.DOCUMENT_HEADER_PROPERTY_NAME + "." + KFSConstants.DOCUMENT_HEADER_DOCUMENT_STATUS_CODE_PROPERTY_NAME, status); ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(this.getEntryClass(), criteria); reportQuery.setAttributes(new String[] { "sum(" + KFSConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" }); KualiDecimal rv = null; Iterator iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery); if (iterator.hasNext()) { rv = (KualiDecimal) ((Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iterator))[0]; } return (rv == null) ? KualiDecimal.ZERO : rv; } /** * @see org.kuali.module.gl.dao.GeneralLedgerPendingEntryDao#getTransactionSummary(java.lang.Integer, java.lang.String, * java.lang.String, java.util.Collection, java.util.Collection, boolean, boolean) */ @Override public KualiDecimal getTransactionSummary(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, Collection objectTypeCodes, Collection balanceTypeCodes, String acctSufficientFundsFinObjCd, boolean isDebit, boolean isYearEnd) { LOG.debug("getTransactionSummary() started"); Criteria criteria = new Criteria(); criteria.addEqualTo(KFSConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, universityFiscalYear); criteria.addEqualTo(KFSConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, chartOfAccountsCode); criteria.addEqualTo(KFSConstants.ACCOUNT_NUMBER_PROPERTY_NAME, accountNumber); criteria.addEqualTo("acctSufficientFundsFinObjCd", acctSufficientFundsFinObjCd); criteria.addIn(KFSConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, balanceTypeCodes); criteria.addIn("financialObjectTypeCode", objectTypeCodes); if (isYearEnd) { criteria.addLike("financialDocumentTypeCode", "YE%"); } else { criteria.addNotLike("financialDocumentTypeCode", "YE%"); } if (isDebit) { criteria.addEqualTo(KFSConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_DEBIT_CODE); } else { criteria.addNotEqualTo(KFSConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_DEBIT_CODE); } Collection status = new ArrayList(); status.add(KFSConstants.DocumentStatusCodes.CANCELLED); status.add(KFSConstants.DocumentStatusCodes.DISAPPROVED); criteria.addNotIn(KFSConstants.DOCUMENT_HEADER_PROPERTY_NAME + "." + KFSConstants.DOCUMENT_HEADER_DOCUMENT_STATUS_CODE_PROPERTY_NAME, status); ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(this.getEntryClass(), criteria); reportQuery.setAttributes(new String[] { "sum(" + KFSConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" }); KualiDecimal rv = null; Iterator iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery); if (iterator.hasNext()) { rv = (KualiDecimal) ((Object[]) iterator.next())[0]; } return (rv == null) ? KualiDecimal.ZERO : rv; } /** * @see org.kuali.module.gl.dao.GeneralLedgerPendingEntryDao#getTransactionSummary(java.util.Collection, java.lang.String, * java.lang.String, java.util.Collection, java.util.Collection, boolean) */ @Override public KualiDecimal getTransactionSummary(Collection universityFiscalYears, String chartOfAccountsCode, String accountNumber, Collection objectCodes, Collection balanceTypeCodes, boolean isDebit) { LOG.debug("getTransactionSummary() started"); Criteria criteria = new Criteria(); criteria.addIn(KFSConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, universityFiscalYears); criteria.addEqualTo(KFSConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, chartOfAccountsCode); criteria.addEqualTo(KFSConstants.ACCOUNT_NUMBER_PROPERTY_NAME, accountNumber); criteria.addIn(KFSConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME, objectCodes); criteria.addIn(KFSConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, balanceTypeCodes); if (isDebit) { criteria.addEqualTo(KFSConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_DEBIT_CODE); } else { criteria.addNotEqualTo(KFSConstants.TRANSACTION_DEBIT_CREDIT_CODE, KFSConstants.GL_DEBIT_CODE); } Collection status = new ArrayList(); status.add(KFSConstants.DocumentStatusCodes.CANCELLED); status.add(KFSConstants.DocumentStatusCodes.DISAPPROVED); criteria.addNotIn(KFSConstants.DOCUMENT_HEADER_PROPERTY_NAME + "." + KFSConstants.DOCUMENT_HEADER_DOCUMENT_STATUS_CODE_PROPERTY_NAME, status); ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(this.getEntryClass(), criteria); reportQuery.setAttributes(new String[] { "sum(" + KFSConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")" }); KualiDecimal rv = null; Iterator iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery); if (iterator.hasNext()) { rv = (KualiDecimal) ((Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iterator))[0]; } return (rv == null) ? KualiDecimal.ZERO : rv; } /* * (non-Javadoc) * @see org.kuali.dao.GeneralLedgerPendingEntryDao#delete(Long) */ @Override public void delete(String documentHeaderId) { LOG.debug("delete() started"); if (documentHeaderId != null) { Criteria criteria = new Criteria(); criteria.addEqualTo(KFSPropertyConstants.DOCUMENT_NUMBER, documentHeaderId); getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(this.getEntryClass(), criteria)); getPersistenceBrokerTemplate().clearCache(); } } @Override public void deleteByFinancialDocumentApprovedCode(String financialDocumentApprovedCode) { LOG.debug("deleteByFinancialDocumentApprovedCode() started"); Criteria criteria = new Criteria(); criteria.addEqualTo(FINANCIAL_DOCUMENT_APPROVED_CODE, financialDocumentApprovedCode); QueryByCriteria qbc = QueryFactory.newQuery(this.getEntryClass(), criteria); getPersistenceBrokerTemplate().deleteByQuery(qbc); getPersistenceBrokerTemplate().clearCache(); } /** * @see org.kuali.module.gl.dao.GeneralLedgerPendingEntryDao#findApprovedPendingLedgerEntries() */ @Override public Iterator findApprovedPendingLedgerEntries() { LOG.debug("findApprovedPendingLedgerEntries() started"); // only process the document for which document status code is A (approved) Criteria criteria = new Criteria(); criteria.addEqualTo("financialDocumentApprovedCode", KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.APPROVED); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @see org.kuali.module.gl.dao.GeneralLedgerPendingEntryDao#countPendingLedgerEntries(org.kuali.kfs.coa.businessobject.Account) */ @Override public int countPendingLedgerEntries(Account account) { LOG.debug("findPendingLedgerEntries(Account) started"); Criteria criteria = new Criteria(); criteria.addEqualTo(ACCOUNT_NUMBER, account.getAccountNumber()); criteria.addEqualTo(CHART_OF_ACCOUNTS_CODE, account.getChartOfAccountsCode()); ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria); query.setAttributes(new String[] { "count(*)" }); Iterator i = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); if (i.hasNext()) { Object[] values = (Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(i); if (values[0] instanceof BigDecimal) { return ((BigDecimal) values[0]).intValue(); } else { return ((Long) values[0]).intValue(); } } else { return 0; } } /** * @see org.kuali.module.gl.dao.GeneralLedgerPendingEntryDao#findPendingLedgerEntries(org.kuali.kfs.gl.businessobject.Encumbrance, * boolean) */ @Override public Iterator findPendingLedgerEntries(Encumbrance encumbrance, boolean isApproved) { LOG.debug("findPendingLedgerEntries(Encumbrance, boolean) started"); // find pending ledger entry by the primary key fields of encumbrance Criteria criteria = new Criteria(); criteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, encumbrance.getUniversityFiscalYear()); criteria.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, encumbrance.getChartOfAccountsCode()); criteria.addEqualTo(KFSPropertyConstants.ACCOUNT_NUMBER, encumbrance.getAccountNumber()); criteria.addEqualTo(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, encumbrance.getSubAccountNumber()); criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, encumbrance.getObjectCode()); criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, encumbrance.getSubObjectCode()); criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, encumbrance.getBalanceTypeCode()); criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, encumbrance.getDocumentTypeCode()); criteria.addEqualTo(KFSPropertyConstants.ORGANIZATION_DOCUMENT_NUMBER, encumbrance.getDocumentNumber()); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); // Criteria: (originCode=originationCode OR originCode=originationReferenceCode) Criteria criteria1 = new Criteria(); Criteria criteria2 = new Criteria(); criteria1.addEqualTo(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE, encumbrance.getOriginCode()); criteria2.addEqualTo(KFSPropertyConstants.REFERENCE_FINANCIAL_SYSTEM_ORIGINATION_CODE, encumbrance.getOriginCode()); criteria1.addOrCriteria(criteria2); // combine all criteria together criteria.addAndCriteria(criteria1); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @see org.kuali.module.gl.dao.GeneralLedgerPendingEntryDao#findPendingLedgerEntries(org.kuali.kfs.gl.businessobject.Balance, * boolean, boolean) */ @Override public Iterator findPendingLedgerEntries(Balance balance, boolean isApproved, boolean isConsolidated) { LOG.debug("findPendingLedgerEntries(Balance, boolean, boolean) started"); // find pending ledger entry by the primary key fields of balance Criteria criteria = new Criteria(); criteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, balance.getUniversityFiscalYear()); criteria.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, balance.getChartOfAccountsCode()); criteria.addEqualTo(KFSPropertyConstants.ACCOUNT_NUMBER, balance.getAccountNumber()); criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, balance.getObjectCode()); criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, balance.getBalanceTypeCode()); if (!isConsolidated) { criteria.addEqualTo(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, balance.getSubAccountNumber()); } // add the status codes into the criteria this.addStatusCode(criteria, isApproved); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @see org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao#findPendingLedgerEntriesForEntry(java.util.Map, boolean, * java.lang.String, int) */ @Override public Iterator findPendingLedgerEntriesForEntry(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFY, List<String> encumbranceBalanceTypes) { LOG.debug("findPendingLedgerEntriesForEntry started"); Criteria criteria = buildCriteriaFromMap(fieldValues, new GeneralLedgerPendingEntry(), currentFiscalPeriodCode, currentFY, encumbranceBalanceTypes); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); LookupUtils.applySearchResultsLimit(this.getEntryClass(), criteria, getDbPlatform()); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @see org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao#findPendingLedgerEntriesForBalance(java.util.Map, boolean, * java.lang.String, int) */ @Override public Iterator findPendingLedgerEntriesForBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFY, List<String> encumbranceBalanceTypes) { LOG.debug("findPendingLedgerEntriesForBalance started"); Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFY, encumbranceBalanceTypes); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @see org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao#findPendingLedgerEntriesForCashBalance(java.util.Map, boolean, * java.lang.String, int) */ @Override public Iterator findPendingLedgerEntriesForCashBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceType) { LOG.debug("findPendingLedgerEntriesForCashBalance started"); Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceType); criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, "AC"); criteria.addEqualToField(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, CHART_FINANCIAL_CASH_OBJECT_CODE); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @see org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao#findPendingLedgerEntriesForEncumbrance(java.util.Map, boolean, * java.lang.String, int, org.kuali.kfs.sys.businessobject.SystemOptions, java.util.List) */ @Override public Iterator findPendingLedgerEntriesForEncumbrance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, SystemOptions currentYearOptions, List<String> encumbranceBalanceTypes) { LOG.debug("findPendingLedgerEntriesForEncumbrance started"); String docNumber = (String)fieldValues.get(DOC_NUMBER); Criteria subCriteria1 = new Criteria(); boolean docNbrCriteriaNeeded = false; if (StringUtils.isNotBlank(docNumber)) { fieldValues.remove(DOC_NUMBER); subCriteria1 = new Criteria(); subCriteria1.addEqualTo(KFSPropertyConstants.TRANSACTION_ENCUMBRANCE_UPDT_CD, KFSConstants.ENCUMB_UPDT_REFERENCE_DOCUMENT_CD); Criteria subCriteria1b = new Criteria(); subCriteria1b.addEqualTo(KFSPropertyConstants.REFERENCE_FINANCIAL_DOCUMENT_NUMBER, docNumber); subCriteria1.addAndCriteria(subCriteria1b); Criteria subCriteria2 = new Criteria(); subCriteria2.addEqualTo(KFSPropertyConstants.TRANSACTION_ENCUMBRANCE_UPDT_CD, KFSConstants.ENCUMB_UPDT_DOCUMENT_CD); Criteria subCriteria2b = new Criteria(); subCriteria2b.addEqualTo(DOC_NUMBER, docNumber); subCriteria2.addAndCriteria(subCriteria2b); subCriteria1.addOrCriteria(subCriteria2); docNbrCriteriaNeeded = true; } Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes); criteria.addIn(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, harvestCodesFromEncumbranceBalanceTypes()); List encumbranceUpdateCodeList = new ArrayList(); encumbranceUpdateCodeList.add(KFSConstants.ENCUMB_UPDT_REFERENCE_DOCUMENT_CD); encumbranceUpdateCodeList.add(KFSConstants.ENCUMB_UPDT_DOCUMENT_CD); criteria.addIn(KFSPropertyConstants.TRANSACTION_ENCUMBRANCE_UPDT_CD, encumbranceUpdateCodeList); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); // add criteria to exclude fund balance object type code criteria.addAndCriteria(buildCriteriaToExcludeFundBalance(currentYearOptions)); if (docNbrCriteriaNeeded) { criteria.addAndCriteria(subCriteria1); } QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @return returns only the codes from encumbrance balance types */ protected List<String> harvestCodesFromEncumbranceBalanceTypes() { List<String> balanceTypeCodes = new ArrayList<String>(); Collection<BalanceType> encumbranceBalanceTypes = getBalanceTypeDao().getEncumbranceBalanceTypes(); for (BalanceType encumbranceBalanceType : encumbranceBalanceTypes) { balanceTypeCodes.add(encumbranceBalanceType.getCode()); } return balanceTypeCodes; } /** * This method creates Criteria that exclude the fund balance object type from the result. * * @return Criteria */ protected Criteria buildCriteriaToExcludeFundBalance(SystemOptions currentYearOptions) { String fundBalanceObjectTypeCode = currentYearOptions.getFinObjectTypeFundBalanceCd(); Criteria criteria = new Criteria(); criteria.addNotEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE, fundBalanceObjectTypeCode); return criteria; } /** * @see org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao#findPendingLedgerEntriesForAccountBalance(Map, boolean, * String, int, List) */ @Override public Iterator findPendingLedgerEntriesForAccountBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceTypes) { LOG.debug("findPendingLedgerEntriesForAccountBalance started"); Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getIteratorByQuery(query); } /** * @see org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao#findPendingLedgerEntrySummaryForAccountBalance(java.util.Map, * boolean, java.lang.String, int, java.util.List) */ @Override public Iterator findPendingLedgerEntrySummaryForAccountBalance(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceTypes) { LOG.debug("findPendingLedgerEntrySummaryForAccountBalance started"); Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria); List attributeList = buildAttributeList(); List groupByList = buildGroupList(); // set the selection attributes String[] attributes = (String[]) attributeList.toArray(new String[attributeList.size()]); query.setAttributes(attributes); // add the group criteria into the selection statement String[] groupBy = (String[]) groupByList.toArray(new String[groupByList.size()]); query.addGroupBy(groupBy); return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); } /** * This method builds the atrribute list used by balance searching * * @return List an attribute list */ protected List buildAttributeList() { List attributeList = buildGroupList(); attributeList.add("sum(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")"); return attributeList; } /** * This method builds group by attribute list used by balance searching * * @return List an group by attribute list */ protected List buildGroupList() { List groupList = new ArrayList(); groupList.add(KFSPropertyConstants.FINANCIAL_OBJECT_CODE); groupList.add(KFSPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE); groupList.add(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE); groupList.add(OBJECT_TYPE_FIN_OBJECT_TYPE_DEBITCREDIT_CD); return groupList; } /** * add the status code into the given criteria. The status code can be categorized into approved and all. * * @param criteria the given criteria * @param isApproved the flag that indictates if only approved status code can be added into the given searach criteria */ protected void addStatusCode(Criteria criteria, boolean isOnlyApproved) { // add criteria for the approved pending entries if (isOnlyApproved) { criteria.addIn("documentHeader.financialDocumentStatusCode", this.buildApprovalCodeList()); criteria.addNotEqualTo(KFSPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE, KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED); } else { Criteria subCriteria1 = new Criteria(); subCriteria1.addNotEqualTo(KFSPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE, KFSConstants.PENDING_ENTRY_APPROVED_STATUS_CODE.PROCESSED); Criteria subCriteria2 = new Criteria(); subCriteria2.addIsNull(KFSPropertyConstants.FINANCIAL_DOCUMENT_APPROVED_CODE); subCriteria1.addOrCriteria(subCriteria2); criteria.addAndCriteria(subCriteria1); } } /** * build a status code list including the legal approval codes * * @return an approval code list */ protected List buildApprovalCodeList() { List approvalCodeList = new ArrayList(); approvalCodeList.add(KFSConstants.DocumentStatusCodes.APPROVED); return approvalCodeList; } /** * This method builds an OJB query criteria based on the input field map * * @param fieldValues the input field map * @param businessObject the given business object * @return an OJB query criteria */ public Criteria buildCriteriaFromMap(Map fieldValues, Object businessObject, String currentFiscalPeriodCode, Integer currentFiscalYear, List<String> encumbranceBalanceTypes) { Criteria criteria = new Criteria(); // deal with null fiscal year and fiscal period code as current fiscal year and period code respectively String fiscalPeriodFromForm = null; if (fieldValues.containsKey(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE)) { fiscalPeriodFromForm = (String) fieldValues.get(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); } String fiscalYearFromForm = null; if (fieldValues.containsKey(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR)) { fiscalYearFromForm = (String) fieldValues.get(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); } boolean includeNullFiscalPeriodCodeInLookup = null != currentFiscalPeriodCode && currentFiscalPeriodCode.equals(fiscalPeriodFromForm); boolean includeNullFiscalYearInLookup = null != currentFiscalYear && currentFiscalYear.toString().equals(fiscalYearFromForm); if (includeNullFiscalPeriodCodeInLookup) { Criteria apValueCriteria = new Criteria(); apValueCriteria.addLike(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, fiscalPeriodFromForm); Criteria apNullCriteria = new Criteria(); apNullCriteria.addIsNull(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); apValueCriteria.addOrCriteria(apNullCriteria); criteria.addAndCriteria(apValueCriteria); } if (includeNullFiscalYearInLookup) { Criteria fyValueCriteria = new Criteria(); fyValueCriteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYearFromForm); Criteria fyNullCriteria = new Criteria(); fyNullCriteria.addIsNull(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); fyValueCriteria.addOrCriteria(fyNullCriteria); criteria.addAndCriteria(fyValueCriteria); } // handle encumbrance balance type Map<String, Object> localFieldValues = new HashMap(); localFieldValues.putAll(fieldValues); // we've already taken care of these fields... if (includeNullFiscalPeriodCodeInLookup) { localFieldValues.remove(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); } if (includeNullFiscalYearInLookup) { localFieldValues.remove(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); } String propertyName = KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE; if (localFieldValues.containsKey(propertyName)) { String propertyValue = (String) fieldValues.get(propertyName); if (KFSConstants.AGGREGATE_ENCUMBRANCE_BALANCE_TYPE_CODE.equals(propertyValue)) { localFieldValues.remove(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE); criteria.addIn(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, encumbranceBalanceTypes); } } // remove dummyBusinessObject references - no longer needed List<String> keysToRemove = new ArrayList<String>(); for (String key : localFieldValues.keySet()) { if (key.startsWith("dummyBusinessObject.")) { keysToRemove.add(key); } } for (String key : keysToRemove) { localFieldValues.remove(key); } criteria.addAndCriteria(OJBUtility.buildCriteriaFromMap(localFieldValues, businessObject)); return criteria; } /** * @see org.kuali.kfs.sys.dataaccess.GeneralLedgerPendingEntryDao#findPendingEntries(java.util.Map, boolean, java.lang.String, * int, java.util.List) */ @Override public Collection findPendingEntries(Map fieldValues, boolean isApproved, String currentFiscalPeriodCode, int currentFiscalYear, List<String> encumbranceBalanceTypes) { LOG.debug("findPendingEntries(Map, boolean) started"); Criteria criteria = buildCriteriaFromMap(fieldValues, this.getEntryClassInstance(), currentFiscalPeriodCode, currentFiscalYear, encumbranceBalanceTypes); // add the status codes into the criteria this.addStatusCode(criteria, isApproved); LookupUtils.applySearchResultsLimit(this.getEntryClass(), criteria, getDbPlatform()); QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); return getPersistenceBrokerTemplate().getCollectionByQuery(query); } /** * Gets the entryClass attribute. * * @return Returns the entryClass. */ public Class getEntryClass() { return GeneralLedgerPendingEntry.class; } protected Object getEntryClassInstance() { Object entryObject = null; try { entryObject = getEntryClass().newInstance(); } catch (Exception e) { if (LOG.isDebugEnabled()) { LOG.debug("Wrong object type" + e); } } return entryObject; } /** * @return the injected implementation of balance type dao */ public BalanceTypeDao getBalanceTypeDao() { return balanceTypeDao; } /** * Injects an implementation of BalanceTypeDao * @param balanceTypeDao the implementation of BalanceTypeDao to inject */ public void setBalanceTypeDao(BalanceTypeDao balanceTypeDao) { this.balanceTypeDao = balanceTypeDao; } }