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.sys.document.service.impl; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.apache.log4j.Logger; 020 import org.kuali.kfs.coa.businessobject.Account; 021 import org.kuali.kfs.coa.businessobject.Chart; 022 import org.kuali.kfs.coa.businessobject.FundGroup; 023 import org.kuali.kfs.coa.businessobject.ObjectCode; 024 import org.kuali.kfs.coa.businessobject.ObjectSubType; 025 import org.kuali.kfs.coa.businessobject.ObjectType; 026 import org.kuali.kfs.coa.businessobject.Organization; 027 import org.kuali.kfs.coa.businessobject.ProjectCode; 028 import org.kuali.kfs.coa.businessobject.SubAccount; 029 import org.kuali.kfs.coa.businessobject.SubFundGroup; 030 import org.kuali.kfs.coa.businessobject.SubObjectCode; 031 import org.kuali.kfs.coa.service.AccountService; 032 import org.kuali.kfs.sys.KFSConstants; 033 import org.kuali.kfs.sys.KFSKeyConstants; 034 import org.kuali.kfs.sys.KFSPropertyConstants; 035 import org.kuali.kfs.sys.businessobject.AccountingLine; 036 import org.kuali.kfs.sys.businessobject.AccountingLineOverride; 037 import org.kuali.kfs.sys.businessobject.OriginationCode; 038 import org.kuali.kfs.sys.businessobject.SourceAccountingLine; 039 import org.kuali.kfs.sys.context.SpringContext; 040 import org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService; 041 import org.kuali.kfs.sys.document.service.FinancialSystemDocumentService; 042 import org.kuali.kfs.sys.document.service.FinancialSystemDocumentTypeService; 043 import org.kuali.rice.kew.doctype.bo.DocumentTypeEBO; 044 import org.kuali.rice.kns.datadictionary.BusinessObjectEntry; 045 import org.kuali.rice.kns.datadictionary.DataDictionary; 046 import org.kuali.rice.kns.service.DataDictionaryService; 047 import org.kuali.rice.kns.service.KualiConfigurationService; 048 import org.kuali.rice.kns.util.GlobalVariables; 049 import org.kuali.rice.kns.util.ObjectUtils; 050 051 public class AccountingLineRuleHelperServiceImpl implements AccountingLineRuleHelperService { 052 private static Logger LOG = Logger.getLogger(AccountingLineRuleHelperServiceImpl.class); 053 private DataDictionaryService dataDictionaryService; 054 private FinancialSystemDocumentTypeService financialSystemDocumentTypeService; 055 056 /** 057 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getAccountLabel() 058 */ 059 public String getAccountLabel() { 060 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(Account.class.getName()).getAttributeDefinition(KFSConstants.ACCOUNT_NUMBER_PROPERTY_NAME).getShortLabel(); 061 } 062 063 /** 064 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getChartLabel() 065 */ 066 public String getChartLabel() { 067 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(Chart.class.getName()).getAttributeDefinition(KFSConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME).getShortLabel(); 068 } 069 070 /** 071 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getFundGroupCodeLabel() 072 */ 073 public String getFundGroupCodeLabel() { 074 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(FundGroup.class.getName()).getAttributeDefinition(KFSPropertyConstants.CODE).getShortLabel(); 075 } 076 077 /** 078 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getObjectCodeLabel() 079 */ 080 public String getObjectCodeLabel() { 081 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(ObjectCode.class.getName()).getAttributeDefinition(KFSConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME).getShortLabel(); 082 } 083 084 /** 085 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getObjectSubTypeCodeLabel() 086 */ 087 public String getObjectSubTypeCodeLabel() { 088 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(ObjectSubType.class.getName()).getAttributeDefinition(KFSPropertyConstants.CODE).getShortLabel(); 089 } 090 091 /** 092 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getObjectTypeCodeLabel() 093 */ 094 public String getObjectTypeCodeLabel() { 095 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(ObjectType.class.getName()).getAttributeDefinition(KFSConstants.GENERIC_CODE_PROPERTY_NAME).getShortLabel(); 096 } 097 098 /** 099 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getOrganizationCodeLabel() 100 */ 101 public String getOrganizationCodeLabel() { 102 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(Organization.class.getName()).getAttributeDefinition(KFSPropertyConstants.ORGANIZATION_CODE).getShortLabel(); 103 } 104 105 /** 106 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getProjectCodeLabel() 107 */ 108 public String getProjectCodeLabel() { 109 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(ProjectCode.class.getName()).getAttributeDefinition(KFSPropertyConstants.CODE).getShortLabel(); 110 } 111 112 /** 113 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getSubAccountLabel() 114 */ 115 public String getSubAccountLabel() { 116 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(SubAccount.class.getName()).getAttributeDefinition(KFSConstants.SUB_ACCOUNT_NUMBER_PROPERTY_NAME).getShortLabel(); 117 } 118 119 /** 120 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getSubFundGroupCodeLabel() 121 */ 122 public String getSubFundGroupCodeLabel() { 123 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(SubFundGroup.class.getName()).getAttributeDefinition(KFSPropertyConstants.SUB_FUND_GROUP_CODE).getShortLabel(); 124 } 125 126 /** 127 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#getSubObjectCodeLabel() 128 */ 129 public String getSubObjectCodeLabel() { 130 return dataDictionaryService.getDataDictionary().getBusinessObjectEntry(SubObjectCode.class.getName()).getAttributeDefinition(KFSConstants.FINANCIAL_SUB_OBJECT_CODE_PROPERTY_NAME).getShortLabel(); 131 } 132 133 /** 134 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#hasRequiredOverrides(org.kuali.kfs.sys.businessobject.AccountingLine, java.lang.String) 135 */ 136 public boolean hasRequiredOverrides(AccountingLine line, String overrideCode) { 137 return hasAccountRequiredOverrides(line, overrideCode) && hasObjectBudgetRequiredOverrides(line, overrideCode); 138 139 } 140 141 public boolean hasAccountRequiredOverrides(AccountingLine line, String overrideCode) { 142 boolean retVal = true; 143 AccountingLineOverride override = AccountingLineOverride.valueOf(overrideCode); 144 Account account = line.getAccount(); 145 if (AccountingLineOverride.needsExpiredAccountOverride(account) && !override.hasComponent(AccountingLineOverride.COMPONENT.EXPIRED_ACCOUNT)) { 146 Account continuation = getUnexpiredContinuationAccountOrNull(account); 147 if (continuation == null) { 148 GlobalVariables.getMessageMap().putError(KFSConstants.ACCOUNT_NUMBER_PROPERTY_NAME, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNT_EXPIRED_NO_CONTINUATION, new String[] { account.getAccountNumber() }); 149 } 150 else { 151 GlobalVariables.getMessageMap().putError(KFSConstants.ACCOUNT_NUMBER_PROPERTY_NAME, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNT_EXPIRED, new String[] { account.getAccountNumber(), continuation.getChartOfAccountsCode(), continuation.getAccountNumber() }); 152 // todo: ... args in JDK 1.5 153 } 154 retVal = false; 155 } 156 return retVal; 157 } 158 159 public boolean hasObjectBudgetRequiredOverrides(AccountingLine line, String overrideCode) { 160 boolean retVal = true; 161 ObjectCode objectCode = line.getObjectCode(); 162 AccountingLineOverride override = AccountingLineOverride.valueOf(overrideCode); 163 Account account = line.getAccount(); 164 if (AccountingLineOverride.needsObjectBudgetOverride(account, objectCode) && !override.hasComponent(AccountingLineOverride.COMPONENT.NON_BUDGETED_OBJECT)) { 165 GlobalVariables.getMessageMap().putError(KFSConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNT_PRESENCE_NON_BUDGETED_OBJECT_CODE, new String[] { account.getAccountNumber(), objectCode.getFinancialObjectCode() }); 166 retVal = false; 167 } 168 return retVal; 169 } 170 171 /** 172 * @param account 173 * @return an unexpired continuation account for the given account, or, if one cannot be found, null 174 */ 175 protected Account getUnexpiredContinuationAccountOrNull(Account account) { 176 int count = 0; 177 while (count++ < 10) { // prevents infinite loops 178 String continuationChartCode = account.getContinuationFinChrtOfAcctCd(); 179 String continuationAccountNumber = account.getContinuationAccountNumber(); 180 // todo: does AccountService already handle blank keys this way? 181 if (StringUtils.isBlank(continuationChartCode) || StringUtils.isBlank(continuationAccountNumber)) { 182 return null; 183 } 184 account = SpringContext.getBean(AccountService.class).getByPrimaryId(continuationChartCode, continuationAccountNumber); 185 if (ObjectUtils.isNull(account)) { 186 return null; 187 } 188 if (account.isActive() && !account.isExpired()) { 189 return account; 190 } 191 } 192 return null; 193 } 194 195 /** 196 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidAccount(org.kuali.kfs.coa.businessobject.Account, org.kuali.rice.kns.datadictionary.DataDictionary) 197 */ 198 public boolean isValidAccount(Account account, DataDictionary dataDictionary) { 199 return isValidAccount(account, dataDictionary, KFSConstants.ACCOUNT_NUMBER_PROPERTY_NAME); 200 } 201 202 /** 203 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidAccount(org.kuali.kfs.coa.businessobject.Account, org.kuali.rice.kns.datadictionary.DataDictionary, java.lang.String) 204 */ 205 public boolean isValidAccount(Account account, DataDictionary dataDictionary, String errorPropertyName) { 206 String label = getAccountLabel(); 207 208 // make sure it exists 209 if (ObjectUtils.isNull(account)) { 210 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 211 return false; 212 } 213 214 // make sure it's active for usage 215 if (!account.isActive()) { 216 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNT_CLOSED, label); 217 return false; 218 } 219 220 return true; 221 } 222 223 /** 224 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidChart(org.kuali.kfs.coa.businessobject.Chart, org.kuali.rice.kns.datadictionary.DataDictionary) 225 */ 226 public boolean isValidChart(Chart chart, DataDictionary dataDictionary) { 227 return isValidChart(chart, dataDictionary, KFSConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME); 228 } 229 230 /** 231 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidChart(org.kuali.kfs.coa.businessobject.Chart, org.kuali.rice.kns.datadictionary.DataDictionary, java.lang.String) 232 */ 233 public boolean isValidChart(Chart chart, DataDictionary dataDictionary, String errorPropertyName) { 234 String label = getChartLabel(); 235 236 // make sure it exists 237 if (ObjectUtils.isNull(chart)) { 238 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 239 return false; 240 } 241 242 // make sure it's active for usage 243 if (!chart.isActive()) { 244 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, label); 245 return false; 246 } 247 248 return true; 249 } 250 251 /** 252 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidObjectCode(org.kuali.kfs.coa.businessobject.ObjectCode, org.kuali.rice.kns.datadictionary.DataDictionary) 253 */ 254 public boolean isValidObjectCode(ObjectCode objectCode, DataDictionary dataDictionary) { 255 return isValidObjectCode(objectCode, dataDictionary, KFSConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME); 256 } 257 258 /** 259 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidObjectCode(org.kuali.kfs.coa.businessobject.ObjectCode, org.kuali.rice.kns.datadictionary.DataDictionary, java.lang.String) 260 */ 261 public boolean isValidObjectCode(ObjectCode objectCode, DataDictionary dataDictionary, String errorPropertyName) { 262 String label = getObjectCodeLabel(); 263 264 // make sure it exists 265 if (ObjectUtils.isNull(objectCode)) { 266 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 267 return false; 268 } 269 270 // check active status 271 if (!objectCode.isFinancialObjectActiveCode()) { 272 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, label); 273 return false; 274 } 275 276 return true; 277 } 278 279 /** 280 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidObjectTypeCode(org.kuali.kfs.coa.businessobject.ObjectType, org.kuali.rice.kns.datadictionary.DataDictionary) 281 */ 282 public boolean isValidObjectTypeCode(ObjectType objectTypeCode, DataDictionary dataDictionary) { 283 return isValidObjectTypeCode(objectTypeCode, dataDictionary, KFSConstants.OBJECT_TYPE_CODE_PROPERTY_NAME); 284 } 285 286 /** 287 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidObjectTypeCode(org.kuali.kfs.coa.businessobject.ObjectType, org.kuali.rice.kns.datadictionary.DataDictionary, java.lang.String) 288 */ 289 public boolean isValidObjectTypeCode(ObjectType objectTypeCode, DataDictionary dataDictionary, String errorPropertyName) { 290 // note that the errorPropertyName does not match the actual attribute name 291 String label = getObjectTypeCodeLabel(); 292 293 // make sure it exists 294 if (ObjectUtils.isNull(objectTypeCode)) { 295 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 296 return false; 297 } 298 299 // check activity 300 if (!objectTypeCode.isActive()) { 301 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, label); 302 return false; 303 } 304 305 return true; 306 } 307 308 /** 309 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidProjectCode(org.kuali.kfs.coa.businessobject.ProjectCode, org.kuali.rice.kns.datadictionary.DataDictionary) 310 */ 311 public boolean isValidProjectCode(ProjectCode projectCode, DataDictionary dataDictionary) { 312 return isValidProjectCode(projectCode, dataDictionary, KFSConstants.PROJECT_CODE_PROPERTY_NAME); 313 } 314 315 /** 316 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidProjectCode(org.kuali.kfs.coa.businessobject.ProjectCode, org.kuali.rice.kns.datadictionary.DataDictionary, java.lang.String) 317 */ 318 public boolean isValidProjectCode(ProjectCode projectCode, DataDictionary dataDictionary, String errorPropertyName) { 319 // note that the errorPropertyName does not match the actual attribute name 320 String label = getProjectCodeLabel(); 321 322 // make sure it exists 323 if (ObjectUtils.isNull(projectCode)) { 324 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 325 return false; 326 } 327 328 // check activity 329 if (!projectCode.isActive()) { 330 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, label); 331 return false; 332 } 333 334 return true; 335 } 336 337 /** 338 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidSubAccount(org.kuali.kfs.coa.businessobject.SubAccount, org.kuali.rice.kns.datadictionary.DataDictionary) 339 */ 340 public boolean isValidSubAccount(SubAccount subAccount, DataDictionary dataDictionary) { 341 return isValidSubAccount(subAccount, dataDictionary, KFSConstants.SUB_ACCOUNT_NUMBER_PROPERTY_NAME); 342 } 343 344 /** 345 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidSubAccount(org.kuali.kfs.coa.businessobject.SubAccount, org.kuali.rice.kns.datadictionary.DataDictionary, java.lang.String) 346 */ 347 public boolean isValidSubAccount(SubAccount subAccount, DataDictionary dataDictionary, String errorPropertyName) { 348 String label = getSubAccountLabel(); 349 350 // make sure it exists 351 if (ObjectUtils.isNull(subAccount)) { 352 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 353 return false; 354 } 355 356 // check to make sure it is active 357 if (!subAccount.isActive()) { 358 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_DOCUMENT_SUB_ACCOUNT_INACTIVE, label); 359 return false; 360 } 361 362 return true; 363 } 364 365 /** 366 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidSubObjectCode(org.kuali.kfs.coa.businessobject.SubObjCd, org.kuali.rice.kns.datadictionary.DataDictionary) 367 */ 368 public boolean isValidSubObjectCode(SubObjectCode subObjectCode, DataDictionary dataDictionary) { 369 return isValidSubObjectCode(subObjectCode, dataDictionary, KFSConstants.FINANCIAL_SUB_OBJECT_CODE_PROPERTY_NAME); 370 } 371 372 /** 373 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#isValidSubObjectCode(org.kuali.kfs.coa.businessobject.SubObjCd, org.kuali.rice.kns.datadictionary.DataDictionary, java.lang.String) 374 */ 375 public boolean isValidSubObjectCode(SubObjectCode subObjectCode, DataDictionary dataDictionary, String errorPropertyName) { 376 String label = getSubObjectCodeLabel(); 377 378 // make sure it exists 379 if (ObjectUtils.isNull(subObjectCode)) { 380 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 381 return false; 382 } 383 384 // check active flag 385 if (!subObjectCode.isActive()) { 386 GlobalVariables.getMessageMap().putError(errorPropertyName, KFSKeyConstants.ERROR_INACTIVE, label); 387 return false; 388 } 389 return true; 390 } 391 392 /** 393 * @see org.kuali.kfs.sys.document.service.AccountingLineRuleHelperService#validateAccountingLine(org.kuali.kfs.sys.businessobject.AccountingLine) 394 */ 395 public boolean validateAccountingLine(AccountingLine accountingLine) { 396 if (accountingLine == null) { 397 throw new IllegalStateException(SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSKeyConstants.ERROR_DOCUMENT_NULL_ACCOUNTING_LINE)); 398 } 399 400 // grab the two service instances that will be needed by all the validate methods 401 DataDictionary dd = dataDictionaryService.getDataDictionary(); 402 403 BusinessObjectEntry accountingLineEntry = dd.getBusinessObjectEntry(SourceAccountingLine.class.getName()); 404 405 // retrieve accounting line objects to validate 406 accountingLine.refreshReferenceObject("chart"); 407 Chart chart = accountingLine.getChart(); 408 accountingLine.refreshReferenceObject("account"); 409 Account account = accountingLine.getAccount(); 410 accountingLine.refreshReferenceObject("objectCode"); 411 ObjectCode objectCode = accountingLine.getObjectCode(); 412 413 boolean valid = true; 414 valid &= isValidChart(chart, dd); 415 valid &= isValidAccount(account, dd); 416 // sub account is not required 417 if (StringUtils.isNotBlank(accountingLine.getSubAccountNumber())) { 418 accountingLine.refreshReferenceObject("subAccount"); 419 SubAccount subAccount = accountingLine.getSubAccount(); 420 valid &= isValidSubAccount(subAccount, dd); 421 } 422 valid &= isValidObjectCode(objectCode, dd); 423 // sub object is not required 424 if (StringUtils.isNotBlank(accountingLine.getFinancialSubObjectCode())) { 425 accountingLine.refreshReferenceObject("subObjectCode"); 426 SubObjectCode subObjectCode = accountingLine.getSubObjectCode(); 427 valid &= isValidSubObjectCode(subObjectCode, dd); 428 } 429 // project code is not required 430 if (StringUtils.isNotBlank(accountingLine.getProjectCode())) { 431 accountingLine.refreshReferenceObject("project"); 432 ProjectCode projectCode = accountingLine.getProject(); 433 valid &= isValidProjectCode(projectCode, dd); 434 } 435 if (StringUtils.isNotBlank(accountingLine.getReferenceOriginCode())) { 436 accountingLine.refreshReferenceObject("referenceOrigin"); 437 OriginationCode referenceOrigin = accountingLine.getReferenceOrigin(); 438 valid &= isValidReferenceOriginCode(referenceOrigin, accountingLineEntry); 439 } 440 if (StringUtils.isNotBlank(accountingLine.getReferenceTypeCode())) { 441 DocumentTypeEBO referenceType = accountingLine.getReferenceFinancialSystemDocumentTypeCode(); 442 valid &= isValidReferenceTypeCode(accountingLine.getReferenceTypeCode(), referenceType, accountingLineEntry); 443 } 444 valid &= hasRequiredOverrides(accountingLine, accountingLine.getOverrideCode()); 445 return valid; 446 } 447 448 /** 449 * This method will check the reference origin code for existence in the system and whether it can actively be used. 450 * 451 * @param referenceOriginCode 452 * @param accountingLineEntry 453 * @return boolean True if the object is valid; false otherwise. 454 */ 455 protected boolean isValidReferenceOriginCode(OriginationCode referenceOriginCode, BusinessObjectEntry accountingLineEntry) { 456 return checkExistence(referenceOriginCode, accountingLineEntry, KFSPropertyConstants.REFERENCE_ORIGIN_CODE, KFSPropertyConstants.REFERENCE_ORIGIN_CODE); 457 } 458 459 /** 460 * This method will check the reference type code for existence in the system and whether it can actively be used. 461 * 462 * @param documentTypeCode the document type name of the reference document type 463 * @param referenceType 464 * @param accountingLineEntry 465 * @return boolean True if the object is valid; false otherwise. 466 */ 467 protected boolean isValidReferenceTypeCode(String documentTypeCode, DocumentTypeEBO referenceType, BusinessObjectEntry accountingLineEntry) { 468 if (!StringUtils.isBlank(documentTypeCode) && !getFinancialSystemDocumentTypeService().isCurrentActiveAccountingDocumentType(documentTypeCode)) { 469 GlobalVariables.getMessageMap().putError(KFSPropertyConstants.REFERENCE_TYPE_CODE, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNTING_LINE_NON_ACTIVE_CURRENT_ACCOUNTING_DOCUMENT_TYPE, documentTypeCode); 470 return false; 471 } 472 return checkExistence(referenceType, accountingLineEntry, KFSPropertyConstants.REFERENCE_TYPE_CODE, KFSPropertyConstants.REFERENCE_TYPE_CODE); 473 } 474 475 /** 476 * Checks for the existence of the given Object. This is doing an OJB-proxy-smart check, so assuming the given Object is not in 477 * need of a refresh(), this method adds an ERROR_EXISTENCE to the global error map if the given Object is not in the database. 478 * 479 * @param toCheck the Object to check for existence 480 * @param accountingLineEntry to get the property's label for the error message parameter. 481 * @param attributeName the name of the SourceAccountingLine attribute in the DataDictionary accountingLineEntry 482 * @param propertyName the name of the property within the global error path. 483 * @return whether the given Object exists or not 484 */ 485 protected boolean checkExistence(Object toCheck, BusinessObjectEntry accountingLineEntry, String attributeName, String propertyName) { 486 String label = accountingLineEntry.getAttributeDefinition(attributeName).getShortLabel(); 487 if (ObjectUtils.isNull(toCheck)) { 488 GlobalVariables.getMessageMap().putError(propertyName, KFSKeyConstants.ERROR_EXISTENCE, label); 489 return false; 490 } 491 return true; 492 } 493 494 /** 495 * Sets the dataDictionaryService attribute value. 496 * @param dataDictionaryService The dataDictionaryService to set. 497 */ 498 public void setDataDictionaryService(DataDictionaryService dataDictionaryService) { 499 this.dataDictionaryService = dataDictionaryService; 500 } 501 502 public DataDictionaryService getDataDictionaryService() { 503 return this.dataDictionaryService; 504 } 505 506 /** 507 * Gets the financialSystemDocumentTypeService attribute. 508 * @return Returns the financialSystemDocumentTypeService. 509 */ 510 public FinancialSystemDocumentTypeService getFinancialSystemDocumentTypeService() { 511 return financialSystemDocumentTypeService; 512 } 513 514 /** 515 * Sets the financialSystemDocumentTypeService attribute value. 516 * @param financialSystemDocumentTypeService The financialSystemDocumentTypeService to set. 517 */ 518 public void setFinancialSystemDocumentTypeService(FinancialSystemDocumentTypeService financialSystemDocumentTypeService) { 519 this.financialSystemDocumentTypeService = financialSystemDocumentTypeService; 520 } 521 }