001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.bc.document.service.impl; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.apache.commons.lang.StringUtils; 022 import org.apache.log4j.Logger; 023 import org.kuali.kfs.coa.businessobject.Organization; 024 import org.kuali.kfs.coa.service.OrganizationService; 025 import org.kuali.kfs.module.bc.BCConstants; 026 import org.kuali.kfs.module.bc.document.service.BudgetConstructionProcessorService; 027 import org.kuali.kfs.sys.identity.KfsKimAttributes; 028 import org.kuali.rice.kim.bo.Person; 029 import org.kuali.rice.kim.bo.types.dto.AttributeSet; 030 import org.kuali.rice.kim.service.RoleManagementService; 031 import org.springframework.transaction.annotation.Transactional; 032 033 /** 034 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionProcessorService 035 */ 036 @Transactional 037 public class BudgetConstructionProcessorServiceImpl implements BudgetConstructionProcessorService { 038 private static Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionProcessorServiceImpl.class); 039 040 private RoleManagementService roleManagementService; 041 private OrganizationService organizationService; 042 043 /** 044 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionProcessorService#getProcessorOrgs(org.kuali.rice.kim.bo.Person) 045 */ 046 public List<Organization> getProcessorOrgs(Person person) { 047 List<Organization> processorOrgs = new ArrayList<Organization>(); 048 049 List<AttributeSet> allQualifications = roleManagementService.getRoleQualifiersForPrincipalIncludingNested(person.getPrincipalId(), BCConstants.BUDGET_CONSTRUCTION_NAMESPACE, BCConstants.KimConstants.BC_PROCESSOR_ROLE_NAME, null); 050 for (AttributeSet attributeSet : allQualifications) { 051 String chartOfAccountsCode = attributeSet.get(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE); 052 String organizationCode = attributeSet.get(KfsKimAttributes.ORGANIZATION_CODE); 053 054 if (StringUtils.isNotBlank(chartOfAccountsCode) && StringUtils.isNotBlank(organizationCode)) { 055 Organization org = organizationService.getByPrimaryId(chartOfAccountsCode, organizationCode); 056 if (org != null && !processorOrgs.contains(org)) { 057 processorOrgs.add(org); 058 } 059 } 060 } 061 062 return processorOrgs; 063 } 064 065 /** 066 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionProcessorService#isOrgProcessor(java.lang.String, 067 * java.lang.String, org.kuali.rice.kim.bo.Person) 068 */ 069 public boolean isOrgProcessor(String chartOfAccountsCode, String organizationCode, Person person) { 070 AttributeSet qualification = new AttributeSet(); 071 qualification.put(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); 072 qualification.put(KfsKimAttributes.ORGANIZATION_CODE, organizationCode); 073 074 return roleManagementService.principalHasRole(person.getPrincipalId(), getBudgetProcessorRoleIds(), qualification); 075 } 076 077 /** 078 * @see org.kuali.kfs.module.bc.document.service.BudgetConstructionProcessorService#isOrgProcessor(org.kuali.kfs.coa.businessobject.Organization, 079 * org.kuali.rice.kim.bo.Person) 080 */ 081 public boolean isOrgProcessor(Organization organization, Person person) { 082 try { 083 return isOrgProcessor(organization.getChartOfAccountsCode(), organization.getOrganizationCode(), person); 084 } 085 catch (Exception e) { 086 String errorMessage = String.format("Fail to determine if %s is an approver for %s. ", person, organization); 087 LOG.info(errorMessage + e); 088 } 089 090 return false; 091 } 092 093 /** 094 * @return role id for the budget processor role 095 */ 096 protected List<String> getBudgetProcessorRoleIds() { 097 List<String> roleId = new ArrayList<String>(); 098 roleId.add(roleManagementService.getRoleIdByName(BCConstants.BUDGET_CONSTRUCTION_NAMESPACE, BCConstants.KimConstants.BC_PROCESSOR_ROLE_NAME)); 099 100 return roleId; 101 } 102 103 /** 104 * Gets the roleManagementService attribute. 105 * @return Returns the roleManagementService. 106 */ 107 public RoleManagementService getRoleManagementService() { 108 return roleManagementService; 109 } 110 111 /** 112 * Sets the roleManagementService attribute value. 113 * @param roleManagementService The roleManagementService to set. 114 */ 115 public void setRoleManagementService(RoleManagementService roleManagementService) { 116 this.roleManagementService = roleManagementService; 117 } 118 119 /** 120 * Gets the organizationService attribute. 121 * 122 * @return Returns the organizationService. 123 */ 124 protected OrganizationService getOrganizationService() { 125 return organizationService; 126 } 127 128 /** 129 * Sets the organizationService attribute value. 130 * 131 * @param organizationService The organizationService to set. 132 */ 133 public void setOrganizationService(OrganizationService organizationService) { 134 this.organizationService = organizationService; 135 } 136 137 }