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.external.kc.service.impl; 017 018 import java.net.MalformedURLException; 019 import java.util.ArrayList; 020 import java.util.Collections; 021 import java.util.Comparator; 022 import java.util.HashMap; 023 import java.util.List; 024 import java.util.Map; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.kuali.kfs.coa.businessobject.Account; 028 import org.kuali.kfs.integration.cg.ContractsAndGrantsModuleService; 029 import org.kuali.kfs.module.external.kc.KcConstants; 030 import org.kuali.kfs.module.external.kc.businessobject.AwardAccount; 031 import org.kuali.kfs.module.external.kc.webService.InstitutionalUnitService; 032 import org.kuali.kfs.module.external.kc.webService.InstitutionalUnitSoapService; 033 import org.kuali.kfs.sys.context.SpringContext; 034 import org.kuali.kfs.sys.service.NonTransactional; 035 import org.kuali.kfs.sys.service.impl.KfsParameterConstants; 036 import org.kuali.rice.kim.bo.Person; 037 import org.kuali.rice.kns.service.BusinessObjectService; 038 import org.kuali.rice.kns.service.ParameterService; 039 import org.kuali.rice.kns.util.ObjectUtils; 040 041 @NonTransactional 042 public class ContractsAndGrantsModuleServiceImpl implements ContractsAndGrantsModuleService { 043 private org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ContractsAndGrantsModuleServiceImpl.class); 044 private BusinessObjectService businessObjectService; 045 046 protected List <AwardAccount> getAwardAccounts(String chartCode, String accountNumber) { 047 Map objectKeys = new HashMap(); 048 if ((chartCode != null) && (!chartCode.isEmpty())) objectKeys.put(KcConstants.AccountCreationDefaults.CHART_OF_ACCOUNT_CODE, chartCode); 049 objectKeys.put(KcConstants.AccountCreationDefaults.ACCOUNT_NUMBER, accountNumber); 050 051 List <AwardAccount> awardAccountDTOs = (List<AwardAccount>)SpringContext.getBean(AwardAccountServiceImpl.class).findMatching(objectKeys); 052 053 return awardAccountDTOs; 054 } 055 056 protected InstitutionalUnitService getInstitutionalUnitWebService() { 057 InstitutionalUnitSoapService institutionalUnitSoapService = null; 058 try { 059 institutionalUnitSoapService = new InstitutionalUnitSoapService(); 060 } 061 catch (MalformedURLException ex) { 062 LOG.error("Could not intialize InstitutionalUnitSoapService: " + ex.getMessage()); 063 throw new RuntimeException("Could not intialize InstitutionalUnitSoapService: " + ex.getMessage()); 064 } 065 InstitutionalUnitService port = institutionalUnitSoapService.getInstitutionalUnitServicePort(); 066 return port; 067 } 068 069 public List<String> getParentUnits(String unitNumber) { 070 List<String> parentUnits = this.getInstitutionalUnitWebService().getParentUnits(unitNumber); 071 return parentUnits; 072 } 073 074 /** 075 * @see org.kuali.kfs.integration.cg.ContractsAndGrantsModuleService#getProjectDirectorForAccount(java.lang.String, 076 * java.lang.String) 077 */ 078 public Person getProjectDirectorForAccount(String chartOfAccountsCode, String accountNumber) { 079 080 List<AwardAccount> awardAccountDTOs = this.getAwardAccounts(chartOfAccountsCode, accountNumber); 081 AwardAccount awardAccount = determineAwardAccountForProjectDirector(awardAccountDTOs); 082 if (awardAccount == null) 083 return null; 084 085 String projectDirectorId = awardAccount.getPrincipalId(); 086 LOG.debug("getProjectDirectorForAccount Web Service sent " + chartOfAccountsCode + "/" + accountNumber + " got " + projectDirectorId); 087 if (projectDirectorId != null) { 088 Person projectDirector = SpringContext.getBean(org.kuali.rice.kim.service.PersonService.class).getPerson(projectDirectorId); 089 return projectDirector; 090 } 091 return null; 092 } 093 094 /** 095 * Looks for first non-blank project director id within a list of award accounts sorted newest first 096 * and returns the award account object, otherwise returns null. 097 * 098 * @param awardAccountDTOs 099 * @return 100 */ 101 protected AwardAccount determineAwardAccountForProjectDirector(List<AwardAccount> awardAccounts){ 102 AwardAccount awardAccountReturn = null; 103 104 //sorts awards in reverse order, newest first 105 if(ObjectUtils.isNotNull(awardAccounts)){ 106 Collections.sort(awardAccounts, new Comparator<AwardAccount>() { 107 public int compare(AwardAccount o1, AwardAccount o2) { 108 String awardId1 = String.valueOf(o1.getAward().getProposalNumber()); 109 String awardId2 = String.valueOf(o2.getAward().getProposalNumber()); 110 111 return awardId2.compareTo(awardId1); 112 } 113 }); 114 } 115 116 if(ObjectUtils.isNotNull(awardAccounts) && !awardAccounts.isEmpty()){ 117 118 for(AwardAccount awardAccount : (List<AwardAccount>)awardAccounts){ 119 //break on first award account with a non-blank project director 120 if(StringUtils.isNotBlank(awardAccount.getPrincipalId())){ 121 awardAccountReturn = awardAccount; 122 break; 123 } 124 } 125 } 126 127 return awardAccountReturn; 128 } 129 130 /** 131 * @see org.kuali.kfs.integration.service.ContractsAndGrantsModuleService#getProjectDirectorForAccount(org.kuali.kfs.coa.businessobject.Account) 132 */ 133 public Person getProjectDirectorForAccount(Account account) { 134 if (account != null) { 135 String chartOfAccountsCode = account.getChartOfAccountsCode(); 136 String accountNumber = account.getAccountNumber(); 137 return this.getProjectDirectorForAccount(chartOfAccountsCode, accountNumber); 138 } 139 return null; 140 } 141 142 /** 143 * @see org.kuali.kfs.integration.service.ContractsAndGrantsModuleService#isAwardedByFederalAgency(java.lang.String, 144 * java.lang.String, java.util.List) 145 */ 146 public boolean isAwardedByFederalAgency(String chartOfAccountsCode, String accountNumber, List<String> federalAgencyTypeCodes) { 147 boolean _isFederalSponsor_return = false; 148 List<String> federalSponsorTypeCodes = null; 149 List<AwardAccount> awardAccounts = this.getAwardAccounts(chartOfAccountsCode, accountNumber); 150 AwardAccount awardAccount = determineAwardAccountForFederalAgency(awardAccounts); 151 152 if(ObjectUtils.isNotNull(awardAccount)){ 153 _isFederalSponsor_return = awardAccount.isFederalSponsor(); 154 } 155 156 LOG.debug("isAwardedByFederalAgency" + accountNumber + " got " + _isFederalSponsor_return); 157 158 return _isFederalSponsor_return; 159 } 160 161 /** 162 * Looks for the newest award account object, otherwise returns null. 163 * 164 * @param awardAccounts 165 * @return 166 */ 167 protected AwardAccount determineAwardAccountForFederalAgency(List<AwardAccount> awardAccounts){ 168 AwardAccount awardAccountReturn = null; 169 170 //sorts awards in reverse order, newest first 171 if(ObjectUtils.isNotNull(awardAccounts)){ 172 Collections.sort(awardAccounts, new Comparator<AwardAccount>() { 173 public int compare(AwardAccount o1, AwardAccount o2) { 174 String awardId1 = String.valueOf(o1.getProposalNumber()); 175 String awardId2 = String.valueOf(o2.getProposalNumber()); 176 177 return awardId2.compareTo(awardId1); 178 } 179 }); 180 } 181 182 if(ObjectUtils.isNotNull(awardAccounts) && !awardAccounts.isEmpty()){ 183 184 for(AwardAccount awardAccount : awardAccounts){ 185 awardAccountReturn = awardAccount; 186 break; 187 } 188 } 189 190 return awardAccountReturn; 191 } 192 193 /** 194 * @see org.kuali.kfs.integration.cg.ContractsAndGrantsModuleService#getAllAccountReponsiblityIds() 195 */ 196 public List<Integer> getAllAccountReponsiblityIds() { 197 int maxResponsibilityId = this.getMaxiumAccountResponsibilityId(); 198 199 List<Integer> contractsAndGrantsReponsiblityIds = new ArrayList<Integer>(); 200 for (int id = 1; id <= maxResponsibilityId; id++) { 201 contractsAndGrantsReponsiblityIds.add(id); 202 } 203 204 return contractsAndGrantsReponsiblityIds; 205 } 206 207 /** 208 * @see org.kuali.kfs.integration.cg.ContractsAndGrantsModuleService#hasValidAccountReponsiblityIdIfExists(org.kuali.kfs.coa.businessobject.Account) 209 */ 210 public boolean hasValidAccountReponsiblityIdIfNotNull(Account account) { 211 Integer accountResponsiblityId = account.getContractsAndGrantsAccountResponsibilityId(); 212 213 if (accountResponsiblityId == null) { 214 return true; 215 } 216 217 return accountResponsiblityId >= 1 && accountResponsiblityId <= this.getMaxiumAccountResponsibilityId(); 218 } 219 220 public String getProposalNumberForAccountAndProjectDirector(String chartOfAccountsCode, String accountNumber, String projectDirectorId) { 221 String proposalNumber = null; 222 String awardProjectDirectorId = null; 223 224 List<AwardAccount> awardAccountDTOs = this.getAwardAccounts(chartOfAccountsCode, accountNumber); 225 AwardAccount awardAccount = determineAwardAccountForProjectDirector(awardAccountDTOs); 226 227 //if we have an award, then proceed 228 if (ObjectUtils.isNotNull(awardAccount)){ 229 230 awardProjectDirectorId = awardAccount.getPrincipalId(); 231 232 LOG.debug("getProjectDirectorForAccount Web Service sent " + chartOfAccountsCode + "/" + accountNumber + " got " + StringUtils.trimToEmpty(awardProjectDirectorId)); 233 234 //if what we passed in and what we found match, return Proposal Number (in kc this is award number) 235 if (StringUtils.equalsIgnoreCase( 236 StringUtils.trimToEmpty(awardProjectDirectorId), 237 StringUtils.trimToEmpty(projectDirectorId))) { 238 239 if(ObjectUtils.isNotNull(awardAccount.getAward())){ 240 proposalNumber = awardAccount.getAward().getAwardNumber(); 241 } 242 } 243 } 244 245 return proposalNumber; 246 } 247 248 /** 249 * retieve the maxium account responsiblity id from system parameter 250 * 251 * @return the maxium account responsiblity id from system parameter 252 */ 253 protected int getMaxiumAccountResponsibilityId() { 254 String maxResponsibilityId = getParameterService().getParameterValue(KfsParameterConstants.CONTRACTS_AND_GRANTS_ALL.class, KcConstants.MAXIMUM_ACCOUNT_RESPONSIBILITY_ID); 255 return Integer.valueOf(maxResponsibilityId); 256 } 257 258 /** 259 * Returns an implementation of the parameterService 260 * 261 * @return an implementation of the parameterService 262 */ 263 public ParameterService getParameterService() { 264 return SpringContext.getBean(ParameterService.class); 265 } 266 267 public void setBusinessObjectService(BusinessObjectService businessObjectService) { 268 this.businessObjectService = businessObjectService; 269 } 270 271 }