/* * 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.service.impl; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.businessobject.ObjectCodeCurrent; import org.kuali.kfs.gl.businessobject.Balance; 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.module.ar.service.CostCategoryService; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.util.TransactionalServiceUtils; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.util.ObjectUtils; import org.springframework.transaction.annotation.Transactional; /** * Default implementation of the CostCategoryService, basically wrapping CostCategoryDao service methods */ @Transactional public class CostCategoryServiceImpl implements CostCategoryService { protected CostCategoryDao costCategoryDao; protected BusinessObjectService businessObjectService; private org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CostCategoryServiceImpl.class); /** * @see org.kuali.kfs.module.ar.service.CostCategoryService#isCostCategoryObjectConsolidationUnique(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectConsolidation) */ @Override public CostCategoryDetail isCostCategoryObjectConsolidationUnique(CostCategoryObjectConsolidation objectConsolidation) { CostCategoryDetail detail = getCostCategoryDao().retrieveMatchingCostCategoryConsolidationAmongConsolidations(objectConsolidation); if (!ObjectUtils.isNull(detail)) { return detail; } detail = getCostCategoryDao().retrieveMatchingCostCategoryConsolidationAmongLevels(objectConsolidation); if (!ObjectUtils.isNull(detail)) { return detail; } return getCostCategoryDao().retrieveMatchingCostCategoryConsolidationAmongCodes(objectConsolidation); } /** * @see org.kuali.kfs.module.ar.service.CostCategoryService#isCostCategoryObjectLevelUnique(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectLevel) */ @Override public CostCategoryDetail isCostCategoryObjectLevelUnique(CostCategoryObjectLevel objectLevel) { CostCategoryDetail detail = getCostCategoryDao().retrieveMatchingCostCategoryLevelAmongLevels(objectLevel); if (!ObjectUtils.isNull(detail)) { return detail; } detail = getCostCategoryDao().retrieveMatchingCostCategoryLevelAmongConsolidations(objectLevel); if (!ObjectUtils.isNull(detail)) { return detail; } return getCostCategoryDao().retrieveMatchingCostCategoryLevelAmongCodes(objectLevel); } /** * @see org.kuali.kfs.module.ar.service.CostCategoryService#isCostCategoryObjectCodeUnique(org.kuali.kfs.module.ar.businessobject.CostCategoryObjectCode) */ @Override public CostCategoryDetail isCostCategoryObjectCodeUnique(CostCategoryObjectCode objectCode) { CostCategoryDetail detail = getCostCategoryDao().retrieveMatchingCostCategoryObjectCodeAmongCodes(objectCode); if (!ObjectUtils.isNull(detail)) { return detail; } detail = getCostCategoryDao().retrieveMatchingCostCategoryObjectCodeAmongLevels(objectCode); if (!ObjectUtils.isNull(detail)) { return detail; } return getCostCategoryDao().retrieveCostCategoryObjectCodeAmongConsolidations(objectCode); } /** * @see org.kuali.kfs.module.ar.service.CostCategoryService#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 (LOG.isDebugEnabled()) { LOG.debug("Retrieving balances for cost category: "+costCategory.getCategoryCode()+"; fiscal year = "+fiscalYear+"; chart: "+chartOfAccountsCode+"; account number: "+accountNumber+"; balance type: "+balanceType+"; object type codes: "+objectTypeCodes.toString()); } return getCostCategoryDao().getBalancesForCostCategory(fiscalYear, chartOfAccountsCode, accountNumber, balanceType, objectTypeCodes, costCategory); } /** * @see org.kuali.kfs.module.ar.service.CostCategoryService#getCostCategoryForObjectCode(java.lang.Integer, java.lang.String, java.lang.String) */ @Override public CostCategory getCostCategoryForObjectCode(Integer universityFiscalYear, String chartOfAccountsCode, String financialObjectCode) { return getCostCategoryDao().getCostCategoryForObjectCode(universityFiscalYear, chartOfAccountsCode, financialObjectCode); } /** * Look up the given category; if found, then look up an object code with the given chart within any object code, level, or consolidation within the category * @see org.kuali.kfs.module.ar.service.CostCategoryService#findObjectCodeForChartAndCategory(java.lang.String, java.lang.String) */ @Override public ObjectCodeCurrent findObjectCodeForChartAndCategory(String chartOfAccountsCode, String categoryCode) { final CostCategory costCategory = getBusinessObjectService().findBySinglePrimaryKey(CostCategory.class, categoryCode); if (ObjectUtils.isNull(costCategory)) { return null; } ObjectCodeCurrent foundObjectCode = null; if (!CollectionUtils.isEmpty(costCategory.getObjectCodes())) { foundObjectCode = findMatchingObjectCodeByObjectCode(chartOfAccountsCode, costCategory.getObjectCodes()); } if (!ObjectUtils.isNull(foundObjectCode) && !CollectionUtils.isEmpty(costCategory.getObjectLevels())) { foundObjectCode = findMatchingObjectCodeByObjectLevel(chartOfAccountsCode, costCategory.getObjectLevels()); } if (!ObjectUtils.isNull(foundObjectCode) && !CollectionUtils.isEmpty(costCategory.getObjectConsolidations())) { foundObjectCode = findMatchingObjectCodeByObjectConsolidation(chartOfAccountsCode, costCategory.getObjectConsolidations()); } return foundObjectCode; } /** * Finds an object code which matches the given chart of accounts within the list of cost category object codes * @param chartOfAccountsCode the chart of accounts code to find an object code for * @param categoryObjectCodes a list of cost category object codes * @return a matching object code, or null if one could not be found */ protected ObjectCodeCurrent findMatchingObjectCodeByObjectCode(String chartOfAccountsCode, List<CostCategoryObjectCode> categoryObjectCodes) { for (CostCategoryObjectCode costCategoryObjectCode : categoryObjectCodes) { if (StringUtils.equals(costCategoryObjectCode.getChartOfAccountsCode(), chartOfAccountsCode)) { return costCategoryObjectCode.getObjectCodeCurrent(); } } return null; } /** * Finds an object code which matches the given chart of accounts within the list of cost category object levels * @param chartOfAccountsCode the chart of accounts code to find an object code for * @param categoryObjectLevels a list of cost category object levels * @return a matching object code, or null if one could not be found */ protected ObjectCodeCurrent findMatchingObjectCodeByObjectLevel(String chartOfAccountsCode, List<CostCategoryObjectLevel> categoryObjectLevels) { for (CostCategoryObjectLevel costCategoryObjectLevel : categoryObjectLevels) { if (StringUtils.equals(costCategoryObjectLevel.getChartOfAccountsCode(), chartOfAccountsCode)) { Map<String, Object> fieldValues = new HashMap<>(); fieldValues.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); fieldValues.put(KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL_CODE, costCategoryObjectLevel.getFinancialObjectLevelCode()); Collection<ObjectCodeCurrent> objectCodes = getBusinessObjectService().findMatching(ObjectCodeCurrent.class, fieldValues); if (!CollectionUtils.isEmpty(objectCodes)) { return TransactionalServiceUtils.retrieveFirstAndExhaustIterator(objectCodes.iterator()); } } } return null; } /** * Finds an object code which matches the given chart of accounts within the list of cost category object consolidations * @param chartOfAccountsCode the chart of accounts code to find an object code for * @param categoryObjectConsolidations a list of cost category object consolidations * @return a matching object code, or null if one could not be found */ protected ObjectCodeCurrent findMatchingObjectCodeByObjectConsolidation(String chartOfAccountsCode, List<CostCategoryObjectConsolidation> categoryObjectConsolidations) { for (CostCategoryObjectConsolidation costCategoryObjectConsolidation : categoryObjectConsolidations) { if (StringUtils.equals(costCategoryObjectConsolidation.getChartOfAccountsCode(), chartOfAccountsCode)) { Map<String, Object> fieldValues = new HashMap<>(); fieldValues.put(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); fieldValues.put(KFSPropertyConstants.FINANCIAL_OBJECT_LEVEL+"."+KFSPropertyConstants.FINANCIAL_CONSOLIDATION_OBJECT_CODE, costCategoryObjectConsolidation.getFinConsolidationObjectCode()); Collection<ObjectCodeCurrent> objectCodes = getBusinessObjectService().findMatching(ObjectCodeCurrent.class, fieldValues); if (!CollectionUtils.isEmpty(objectCodes)) { return TransactionalServiceUtils.retrieveFirstAndExhaustIterator(objectCodes.iterator()); } } } return null; } public CostCategoryDao getCostCategoryDao() { return costCategoryDao; } public void setCostCategoryDao(CostCategoryDao costCategoryDao) { this.costCategoryDao = costCategoryDao; } public BusinessObjectService getBusinessObjectService() { return businessObjectService; } public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } }