/*
* 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.coa.service.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.coa.businessobject.Chart;
import org.kuali.kfs.coa.businessobject.Organization;
import org.kuali.kfs.coa.service.ChartService;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.identity.KfsKimAttributes;
import org.kuali.kfs.sys.service.NonTransactional;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kim.api.identity.Person;
import org.kuali.rice.kim.api.identity.PersonService;
import org.kuali.rice.kim.api.role.RoleService;
import org.kuali.rice.kim.api.services.KimApiServiceLocator;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.springframework.cache.annotation.Cacheable;
/**
* This class is the service implementation for the Chart structure. This is the default, Kuali delivered implementation.
*/
@NonTransactional
public class ChartServiceImpl implements ChartService {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ChartServiceImpl.class);
protected BusinessObjectService businessObjectService;
protected RoleService roleService;
protected PersonService personService;
protected ParameterService parameterService;
/**
* @see org.kuali.kfs.coa.service.ChartService#getByPrimaryId(java.lang.String)
*/
@Override
@Cacheable(value=Chart.CACHE_NAME,key="'chartOfAccountsCode='+#p0")
public Chart getByPrimaryId(String chartOfAccountsCode) {
return businessObjectService.findBySinglePrimaryKey(Chart.class, chartOfAccountsCode);
}
/**
* @see org.kuali.kfs.coa.service.ChartService#getUniversityChart()
*/
@Override
@Cacheable(value=Chart.CACHE_NAME,key="'UniversityChart'")
public Chart getUniversityChart() {
// 1. find the organization with the type which reports to itself
String organizationReportsToSelfParameterValue = parameterService.getParameterValueAsString(Organization.class, KFSConstants.ChartApcParms.ORG_MUST_REPORT_TO_SELF_ORG_TYPES);
Map<String,String> orgCriteria = new HashMap<String, String>(2);
orgCriteria.put(KFSPropertyConstants.ORGANIZATION_TYPE_CODE, organizationReportsToSelfParameterValue);
orgCriteria.put(KFSPropertyConstants.ACTIVE, KFSConstants.ACTIVE_INDICATOR);
Collection<Organization> orgs = businessObjectService.findMatching(Organization.class, orgCriteria);
if ( orgs != null && !orgs.isEmpty() ) {
return getByPrimaryId(orgs.iterator().next().getChartOfAccountsCode());
}
return null;
}
/**
* @see org.kuali.kfs.coa.service.ChartService#getAllChartCodes()
*/
@Override
@Cacheable(value=Chart.CACHE_NAME,key="'AllChartCodes'")
public List<String> getAllChartCodes() {
Collection<Chart> charts = businessObjectService.findAllOrderBy(Chart.class, KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, true);
return getChartCodes(charts);
}
/**
* @see org.kuali.kfs.coa.service.ChartService#getAllActiveChartCodes()
*/
@Override
@Cacheable(value=Chart.CACHE_NAME,key="'AllActiveChartCodes'")
public List<String> getAllActiveChartCodes() {
return getChartCodes(getAllActiveCharts());
}
@Override
@Cacheable(value=Chart.CACHE_NAME,key="'AllActiveCharts'")
public Collection<Chart> getAllActiveCharts() {
return businessObjectService.findMatchingOrderBy(Chart.class,
Collections.singletonMap(KFSPropertyConstants.ACTIVE, true),
KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, true);
}
/**
* @see org.kuali.module.chart.service.getReportsToHierarchy()
*/
@Override
@Cacheable(value=Chart.CACHE_NAME,key="'ReportsToHierarchy'")
public Map<String, String> getReportsToHierarchy() {
Map<String, String> reportsToHierarchy = new HashMap<String, String>();
for ( String chartCode : getAllChartCodes() ) {
Chart chart = businessObjectService.findBySinglePrimaryKey(Chart.class, chartCode);
if (LOG.isDebugEnabled()) {
LOG.debug("adding " + chart.getChartOfAccountsCode() + "-->" + chart.getReportsToChartOfAccountsCode());
}
reportsToHierarchy.put(chart.getChartOfAccountsCode(), chart.getReportsToChartOfAccountsCode());
}
return reportsToHierarchy;
}
@Override
@Cacheable(value=Chart.CACHE_NAME,key="'{isParentChart?}'+#p0+'-->'+#p1")
public boolean isParentChart(String potentialChildChartCode, String potentialParentChartCode) {
if ((potentialChildChartCode == null) || (potentialParentChartCode == null)) {
throw new IllegalArgumentException("The isParentChartCode method requires a non-null potentialChildChartCode and potentialParentChartCode");
}
Chart thisChart = getByPrimaryId(potentialChildChartCode);
if ((thisChart == null) || StringUtils.isBlank(thisChart.getChartOfAccountsCode())) {
throw new IllegalArgumentException("The isParentChartCode method requires a valid potentialChildChartCode");
}
if (thisChart.getCode().equals(thisChart.getReportsToChartOfAccountsCode())) {
return false;
}
else if (potentialParentChartCode.equals(thisChart.getReportsToChartOfAccountsCode())) {
return true;
}
else {
return isParentChart(thisChart.getReportsToChartOfAccountsCode(), potentialParentChartCode);
}
}
@Override
public Person getChartManager(String chartOfAccountsCode) {
String chartManagerId = null;
Person chartManager = null;
Map<String,String> qualification = new HashMap<String,String>();
qualification.put(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode);
Collection<String> chartManagerList = getRoleService().getRoleMemberPrincipalIds(KFSConstants.CoreModuleNamespaces.KFS, KFSConstants.SysKimApiConstants.CHART_MANAGER_KIM_ROLE_NAME, qualification);
if (!chartManagerList.isEmpty()) {
chartManagerId = chartManagerList.iterator().next();
}
if (chartManagerId != null) {
chartManager = getPersonService().getPerson(chartManagerId);
}
return chartManager;
}
protected List<String> getChartCodes(Collection<Chart> charts) {
List<String> chartCodes = new ArrayList<String>(charts.size());
for (Chart chart : charts) {
chartCodes.add(chart.getChartOfAccountsCode());
}
return chartCodes;
}
protected RoleService getRoleService() {
if ( roleService == null ) {
roleService = KimApiServiceLocator.getRoleService();
}
return roleService;
}
protected PersonService getPersonService() {
if (personService == null) {
personService = SpringContext.getBean(PersonService.class);
}
return personService;
}
public void setParameterService(ParameterService parameterService) {
this.parameterService = parameterService;
}
public void setBusinessObjectService(BusinessObjectService businessObjectService) {
this.businessObjectService = businessObjectService;
}
}