/* * 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.module.ar.dataaccess.impl; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.ojb.broker.query.Criteria; import org.apache.ojb.broker.query.Query; 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.ObjectCode; import org.kuali.kfs.coa.businessobject.ObjectCodeCurrent; import org.kuali.kfs.coa.businessobject.ObjectLevel; import org.kuali.kfs.gl.businessobject.Balance; import org.kuali.kfs.module.ar.ArPropertyConstants; import org.kuali.kfs.module.ar.businessobject.CostCategory; import org.kuali.kfs.module.ar.businessobject.CostCategoryDetail; import org.kuali.kfs.module.ar.businessobject.CostCategoryObjectCode; import org.kuali.kfs.module.ar.businessobject.CostCategoryObjectConsolidation; import org.kuali.kfs.module.ar.businessobject.CostCategoryObjectLevel; import org.kuali.kfs.module.ar.dataaccess.CostCategoryDao; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.util.TransactionalServiceUtils; import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; /** * Default OJB implementation of the CostCategoryDao */ public class CostCategoryDaoOjb extends PlatformAwareDaoBaseOjb implements CostCategoryDao { /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryObjectConsolidationUnique(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectConsolidation) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryConsolidationAmongConsolidations(CostCategoryObjectConsolidation objectConsolidation) { Criteria crit = new Criteria(); if (!StringUtils.isBlank(objectConsolidation.getCategoryCode())) { crit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, objectConsolidation.getCategoryCode()); } crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectConsolidation.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.FIN_CONSOLIDATION_OBJECT_CODE, objectConsolidation.getFinConsolidationObjectCode()); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); crit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query q = new QueryByCriteria(CostCategoryObjectConsolidation.class, crit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(q)); } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryConsolidationUniqueAmongLevels(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectConsolidation) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryConsolidationAmongLevels(CostCategoryObjectConsolidation consolidation) { Criteria crit = new Criteria(); if (!StringUtils.isBlank(consolidation.getCategoryCode())) { crit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, consolidation.getCategoryCode()); } crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, consolidation.getChartOfAccountsCode()); crit.addEqualTo(ArPropertyConstants.OBJECT_LEVEL+"."+KFSPropertyConstants.FINANCIAL_CONSOLIDATION_OBJECT_CODE, consolidation.getFinConsolidationObjectCode()); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); crit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query q = new QueryByCriteria(CostCategoryObjectLevel.class, crit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(q)); } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryConsolidationUniqueAmongCodes(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectConsolidation) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryConsolidationAmongCodes(CostCategoryObjectConsolidation consolidation) { Criteria crit = new Criteria(); if (!StringUtils.isBlank(consolidation.getCategoryCode())) { crit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, consolidation.getCategoryCode()); } crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, consolidation.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.OBJECT_CODE_CURRENT+"."+KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL+"."+KFSPropertyConstants.FINANCIAL_CONSOLIDATION_OBJECT_CODE, consolidation.getFinConsolidationObjectCode()); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); crit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query q = new QueryByCriteria(CostCategoryObjectCode.class, crit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(q)); } /** * @return a newly generated subquery which guarantees that we will only check active cost categories */ protected ReportQueryByCriteria buildActiveCostCategorySubQuery() { Criteria crit = new Criteria(); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(CostCategory.class, crit); subQuery.setAttributes(new String[] { ArPropertyConstants.CATEGORY_CODE} ); return subQuery; } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryObjectLevelUnique(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectLevel) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryLevelAmongLevels(CostCategoryObjectLevel objectLevel) { Criteria crit = new Criteria(); if (!StringUtils.isBlank(objectLevel.getCategoryCode())) { crit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, objectLevel.getCategoryCode()); } crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectLevel.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE, objectLevel.getFinancialObjectLevelCode()); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); crit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query q = new QueryByCriteria(CostCategoryObjectLevel.class, crit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(q)); } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryLevelUniqueAmongConsolidations(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectLevel) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryLevelAmongConsolidations(CostCategoryObjectLevel level) { Criteria consolidationCrit = new Criteria(); if (!StringUtils.isBlank(level.getCategoryCode())) { consolidationCrit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, level.getCategoryCode()); } consolidationCrit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, level.getChartOfAccountsCode()); consolidationCrit.addEqualTo(KFSPropertyConstants.FIN_CONSOLIDATION_OBJECT_CODE, buildLevelConsolidationCodeSubQuery(level)); consolidationCrit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); consolidationCrit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query consolidationQuery = new QueryByCriteria(CostCategoryObjectConsolidation.class, consolidationCrit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(consolidationQuery)); } /** * Builds a subquery - so we can perform the whole operation as a single query - which finds the consolidation code of an object level * @param level the cost category object level to find the consolidation code for * @return a subQuery to use in a larger query */ protected ReportQueryByCriteria buildLevelConsolidationCodeSubQuery(CostCategoryObjectLevel level) { Criteria crit = new Criteria(); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, level.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE, level.getFinancialObjectLevelCode()); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(ObjectLevel.class, crit); subQuery.setAttributes(new String[] { KFSPropertyConstants.FINANCIAL_CONSOLIDATION_OBJECT_CODE }); return subQuery; } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryLevelUniqueAmongCodes(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectLevel) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryLevelAmongCodes(CostCategoryObjectLevel level) { Criteria crit = new Criteria(); if (!StringUtils.isBlank(level.getCategoryCode())) { crit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, level.getCategoryCode()); } crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, level.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.OBJECT_CODE_CURRENT+"."+KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL+"."+KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE, level.getFinancialObjectLevelCode()); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); crit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query q = new QueryByCriteria(CostCategoryObjectCode.class, crit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(q)); } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryObjectCodeUnique(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectCode) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryObjectCodeAmongCodes(CostCategoryObjectCode objectCode) { Criteria crit = new Criteria(); if (!StringUtils.isBlank(objectCode.getCategoryCode())) { crit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, objectCode.getCategoryCode()); } crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectCode.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objectCode.getFinancialObjectCode()); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); crit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query uniqueQuery = new QueryByCriteria(CostCategoryObjectCode.class, crit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(uniqueQuery)); } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryObjectCodeUniqueAmongLevels(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectCode) */ @Override public CostCategoryDetail retrieveMatchingCostCategoryObjectCodeAmongLevels(CostCategoryObjectCode objectCode) { Criteria objectLevelCrit = new Criteria(); if (!StringUtils.isBlank(objectCode.getCategoryCode())) { objectLevelCrit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, objectCode.getCategoryCode()); } objectLevelCrit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectCode.getChartOfAccountsCode()); objectLevelCrit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE, buildObjectCodeLevelCodeSubQuery(objectCode)); objectLevelCrit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); objectLevelCrit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query objectLevelQuery = new QueryByCriteria(CostCategoryObjectLevel.class, objectLevelCrit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator(getPersistenceBrokerTemplate().getIteratorByQuery(objectLevelQuery)); } /** * Builds a subquery - so we can perform the whole operation as a single query - which finds the object level code for an object code * @param objectCode the cost category object code to find the object level code for * @return subQuery to use in a larger query */ protected ReportQueryByCriteria buildObjectCodeLevelCodeSubQuery(CostCategoryObjectCode objectCode) { Criteria crit = new Criteria(); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectCode.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objectCode.getFinancialObjectCode()); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(ObjectCodeCurrent.class, crit); subQuery.setAttributes(new String[] { KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE } ); return subQuery; } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#isCostCategoryObjectCodeUniqueAmongConsolidations(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectCode) */ @Override public CostCategoryDetail retrieveCostCategoryObjectCodeAmongConsolidations(CostCategoryObjectCode objectCode) { Criteria objectConsolidationCrit = new Criteria(); if (!StringUtils.isBlank(objectCode.getCategoryCode())) { objectConsolidationCrit.addNotEqualTo(ArPropertyConstants.CATEGORY_CODE, objectCode.getCategoryCode()); } objectConsolidationCrit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectCode.getChartOfAccountsCode()); objectConsolidationCrit.addEqualTo(KFSPropertyConstants.FIN_CONSOLIDATION_OBJECT_CODE, buildObjectCodeConsolidationCodeSubQuery(objectCode)); objectConsolidationCrit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); objectConsolidationCrit.addIn(ArPropertyConstants.CATEGORY_CODE, buildActiveCostCategorySubQuery()); Query objectConsolidationQuery = new QueryByCriteria(CostCategoryObjectConsolidation.class, objectConsolidationCrit); return (CostCategoryDetail)TransactionalServiceUtils.retrieveFirstAndExhaustIterator((getPersistenceBrokerTemplate().getIteratorByQuery(objectConsolidationQuery))); } /** * Builds a subquery - so we can perform the whole operation as a single query - which finds the object consolidation code for an object code * @param objectCode the cost category object code to find the object level code for * @return subQuery to use in a larger query */ protected ReportQueryByCriteria buildObjectCodeConsolidationCodeSubQuery(CostCategoryObjectCode objectCode) { Criteria crit = new Criteria(); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, objectCode.getChartOfAccountsCode()); crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, objectCode.getFinancialObjectCode()); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(ObjectCodeCurrent.class, crit); subQuery.setAttributes(new String[] { KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL+"."+KFSPropertyConstants.FINANCIAL_CONSOLIDATION_OBJECT_CODE } ); return subQuery; } /** * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#getBalancesForCostCategory(java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.kuali.kfs.module.ar.businessobject.CostCategory) */ @Override public List<Balance> getBalancesForCostCategory(Integer fiscalYear, String chartOfAccountsCode, String accountNumber, String balanceType, Collection<String> objectTypeCodes, CostCategory costCategory) { if (!costCategory.isActive()) { return new ArrayList<Balance>(); // cost category isn't active? then dont' find any matching balances } Criteria crit = new Criteria(); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); crit.addEqualTo(KFSPropertyConstants.ACCOUNT_NUMBER, accountNumber); crit.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear); crit.addEqualTo(KFSPropertyConstants.BALANCE_TYPE_CODE, balanceType); crit.addIn(KFSPropertyConstants.OBJECT_TYPE_CODE, objectTypeCodes); Criteria objectCodesCollectiveCriteria = new Criteria(); Criteria objectCodeCriteria = new Criteria(); objectCodeCriteria.addIn(KFSPropertyConstants.OBJECT_CODE, buildObjectCodesOfCostCategorySubQuery(costCategory, chartOfAccountsCode)); objectCodesCollectiveCriteria.addOrCriteria(objectCodeCriteria); Criteria objectLevelCriteria = new Criteria(); objectLevelCriteria.addIn(KFSPropertyConstants.FINANCIAL_OBJECT+"."+KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE,buildObjectLevelsOfCostCategorySubQuery(costCategory, chartOfAccountsCode)); objectCodesCollectiveCriteria.addOrCriteria(objectLevelCriteria); Criteria consolidationCriteria = new Criteria(); consolidationCriteria.addIn(KFSPropertyConstants.FINANCIAL_OBJECT+"."+KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL+"."+KFSPropertyConstants.FINANCIAL_CONSOLIDATION_OBJECT_CODE, buildObjectConsolidationsOfCostCategorySubQuery(costCategory, chartOfAccountsCode)); objectCodesCollectiveCriteria.addOrCriteria(consolidationCriteria); crit.addAndCriteria(objectCodesCollectiveCriteria); Query q = new QueryByCriteria(Balance.class, crit); return (List<Balance>)getPersistenceBrokerTemplate().getCollectionByQuery(q); } /** * Builds a subquery to find the object codes which match the given cost category within the given chart of accounts * @param costCategory the costCategory to find object codes for * @param chartOfAccountsCode the chart that object codes should be limited to * @return subQuery the subequery to find matching object codes */ protected ReportQueryByCriteria buildObjectCodesOfCostCategorySubQuery(CostCategory costCategory, String chartOfAccountsCode) { Criteria crit = new Criteria(); crit.addEqualTo(ArPropertyConstants.CATEGORY_CODE, costCategory.getCategoryCode()); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(CostCategoryObjectCode.class, crit); subQuery.setAttributes(new String[] { KFSPropertyConstants.FINANCIAL_OBJECT_CODE } ); return subQuery; } /** * Builds a subquery to find the object levels which match the given cost category within the given chart of accounts * @param costCategory the costCategory to find object lvels for * @param chartOfAccountsCode the chart that object codes should be limited to * @return subQuery the subequery to find matching object levels */ protected ReportQueryByCriteria buildObjectLevelsOfCostCategorySubQuery(CostCategory costCategory, String chartOfAccountsCode) { Criteria crit = new Criteria(); crit.addEqualTo(ArPropertyConstants.CATEGORY_CODE, costCategory.getCategoryCode()); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(CostCategoryObjectLevel.class, crit); subQuery.setAttributes(new String[] { KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE } ); return subQuery; } /** * Builds a subquery to find the object consolidations which match the given cost category within the given chart of accounts * @param costCategory the costCategory to find object consolidations for * @param chartOfAccountsCode the chart that object consolidations should be limited to * @return subQuery the subequery to find matching object consolidations */ protected ReportQueryByCriteria buildObjectConsolidationsOfCostCategorySubQuery(CostCategory costCategory, String chartOfAccountsCode) { Criteria crit = new Criteria(); crit.addEqualTo(ArPropertyConstants.CATEGORY_CODE, costCategory.getCategoryCode()); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); crit.addEqualTo(KFSPropertyConstants.ACTIVE, Boolean.TRUE); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(CostCategoryObjectConsolidation.class, crit); subQuery.setAttributes(new String[] { KFSPropertyConstants.FIN_CONSOLIDATION_OBJECT_CODE } ); return subQuery; } /** * Attempts to look up a cost category which matches the balance * @see org.kuali.kfs.module.ar.dataaccess.CostCategoryDao#getCostCategoryForBalance(org.kuali.kfs.gl.businessobject.Balance) */ @Override public CostCategory getCostCategoryForObjectCode(Integer universityFiscalYear, String chartOfAccountsCode, String financialObjectCode) { Criteria crit = new Criteria(); Criteria objectCodesCriteria = new Criteria(); objectCodesCriteria.addEqualTo(ArPropertyConstants.OBJECT_CODES+"."+KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); objectCodesCriteria.addEqualTo(ArPropertyConstants.OBJECT_CODES+"."+KFSPropertyConstants.FINANCIAL_OBJECT_CODE, financialObjectCode); objectCodesCriteria.addEqualTo(ArPropertyConstants.OBJECT_CODES+"."+KFSPropertyConstants.ACTIVE, Boolean.TRUE); Criteria objectLevelsCriteria = new Criteria(); objectLevelsCriteria.addEqualTo(ArPropertyConstants.OBJECT_LEVELS+"."+KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); objectLevelsCriteria.addIn(ArPropertyConstants.OBJECT_LEVELS+"."+KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE, buildObjectCodeOfBalanceSubQuery(universityFiscalYear, chartOfAccountsCode, financialObjectCode, KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE)); objectLevelsCriteria.addEqualTo(ArPropertyConstants.OBJECT_LEVELS+"."+KFSPropertyConstants.ACTIVE, Boolean.TRUE); Criteria objectConsolidationsCriteria = new Criteria(); objectConsolidationsCriteria.addEqualTo(ArPropertyConstants.OBJECT_CONSOLIDATIONS+"."+KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); objectConsolidationsCriteria.addIn(ArPropertyConstants.OBJECT_CONSOLIDATIONS+"."+KFSPropertyConstants.FIN_CONSOLIDATION_OBJECT_CODE, buildObjectCodeOfBalanceSubQuery(universityFiscalYear, chartOfAccountsCode, financialObjectCode, KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL+"."+KFSPropertyConstants.FINANCIAL_CONSOLIDATION_OBJECT_CODE)); objectConsolidationsCriteria.addEqualTo(ArPropertyConstants.OBJECT_CONSOLIDATIONS+"."+KFSPropertyConstants.ACTIVE, Boolean.TRUE); crit.addOrCriteria(objectCodesCriteria); crit.addOrCriteria(objectLevelsCriteria); crit.addOrCriteria(objectConsolidationsCriteria); Query q = new QueryByCriteria(CostCategory.class, crit); Collection<CostCategory> costCategories = getPersistenceBrokerTemplate().getCollectionByQuery(q); if (CollectionUtils.isEmpty(costCategories)) { return null; } final CostCategory result = TransactionalServiceUtils.retrieveFirstAndExhaustIterator(costCategories.iterator()); return result; } /** * Builds a sub-query to look up a value from the object code table * @param balance the balance with the object code to look up further information from * @param retrievalProperty the property to retrieve from the object code * @return the subquery */ protected ReportQueryByCriteria buildObjectCodeOfBalanceSubQuery(Integer universityFiscalYear, String chartOfAccountsCode, String financialObjectCode, String retrievalProperty) { Criteria crit = new Criteria(); crit.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, universityFiscalYear); crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); crit.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, financialObjectCode); ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(ObjectCode.class, crit); subQuery.setAttributes(new String[] { retrievalProperty }); return subQuery; } }