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.ar.document.validation.impl; 017 018 import java.sql.Date; 019 import java.sql.Timestamp; 020 import java.util.Calendar; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.apache.commons.lang.time.DateUtils; 024 import org.apache.log4j.Logger; 025 import org.kuali.kfs.module.ar.ArKeyConstants; 026 import org.kuali.kfs.module.ar.ArPropertyConstants; 027 import org.kuali.kfs.module.ar.businessobject.Customer; 028 import org.kuali.kfs.module.ar.businessobject.CustomerAddress; 029 import org.kuali.kfs.module.ar.document.service.CustomerService; 030 import org.kuali.kfs.sys.KFSConstants; 031 import org.kuali.kfs.sys.context.SpringContext; 032 import org.kuali.rice.kns.bo.PersistableBusinessObject; 033 import org.kuali.rice.kns.document.MaintenanceDocument; 034 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 035 import org.kuali.rice.kns.service.DateTimeService; 036 import org.kuali.rice.kns.service.ParameterService; 037 import org.kuali.rice.kns.util.GlobalVariables; 038 import org.kuali.rice.kns.util.KNSConstants; 039 import org.kuali.rice.kns.util.MessageMap; 040 import org.kuali.rice.kns.util.ObjectUtils; 041 042 public class CustomerRule extends MaintenanceDocumentRuleBase { 043 protected static Logger LOG = org.apache.log4j.Logger.getLogger(CustomerRule.class); 044 protected Customer oldCustomer; 045 protected Customer newCustomer; 046 protected DateTimeService dateTimeService = SpringContext.getBean(DateTimeService.class); 047 048 /** 049 * This method initializes the old and new customer 050 * 051 * @param document 052 */ 053 protected void initializeAttributes(MaintenanceDocument document) { 054 if (newCustomer == null) { 055 newCustomer = (Customer) document.getNewMaintainableObject().getBusinessObject(); 056 } 057 if (oldCustomer == null) { 058 oldCustomer = (Customer) document.getOldMaintainableObject().getBusinessObject(); 059 } 060 } 061 062 /** 063 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument) 064 */ 065 @Override 066 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { 067 068 boolean isValid = true; 069 isValid &= super.processCustomRouteDocumentBusinessRules(document); 070 MessageMap errorMap = GlobalVariables.getMessageMap(); 071 isValid &= errorMap.isEmpty(); 072 if (isValid) { 073 initializeAttributes(document); 074 isValid &= checkCustomerHasAddress(newCustomer); 075 076 if (isValid) { 077 isValid &= validateAddresses(newCustomer); 078 } 079 080 if (isValid) { 081 isValid &= checkAddresses(newCustomer); 082 } 083 084 if (isValid) { 085 isValid &= checkTaxNumber(newCustomer); 086 } 087 088 if (isValid) { 089 isValid &= checkNameIsValidLength(newCustomer.getCustomerName()); 090 } 091 092 // TODO This should probably be done in a BO 'before insert' hook, rather than in the business rule validation, 093 // unless there's some reason not clear why it needs to happen here. 094 if (isValid && document.isNew() && StringUtils.isBlank(newCustomer.getCustomerNumber())) { 095 isValid &= setCustomerNumber(); 096 } 097 } 098 099 return isValid; 100 } 101 102 /** 103 * This method sets the new customer number 104 * 105 * @return Returns true if the customer number is set successfully, false otherwise. 106 */ 107 protected boolean setCustomerNumber() { 108 // TODO This should probably be done in a BO 'before insert' hook, rather than in the business rule validation, 109 // unless there's some reason not clear why it needs to happen here. 110 boolean success = true; 111 try { 112 String customerNumber = SpringContext.getBean(CustomerService.class).getNextCustomerNumber(newCustomer); 113 newCustomer.setCustomerNumber(customerNumber); 114 if (oldCustomer != null) { 115 oldCustomer.setCustomerNumber(customerNumber); 116 } 117 } 118 catch (StringIndexOutOfBoundsException sibe) { 119 // It is expected that if a StringIndexOutOfBoundsException occurs, it is due to the customer name being less than three 120 // characters 121 GlobalVariables.getMessageMap().putError(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_NAME, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_NAME_LESS_THAN_THREE_CHARACTERS); 122 success = false; 123 } 124 return success; 125 } 126 127 /** 128 * This method checks if the new customer has at least one address 129 * 130 * @param newCustomer the new customer 131 * @return true is the new customer has at least one address, false otherwise 132 */ 133 public boolean checkCustomerHasAddress(Customer newCustomer) { 134 boolean success = true; 135 if (newCustomer.getCustomerAddresses().isEmpty()) { 136 success = false; 137 GlobalVariables.getMessageMap().putError(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES, ArKeyConstants.CustomerConstants.ERROR_AT_LEAST_ONE_ADDRESS); 138 } 139 return success; 140 141 } 142 143 /** 144 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomAddCollectionLineBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument, 145 * java.lang.String, org.kuali.rice.kns.bo.PersistableBusinessObject) 146 */ 147 @Override 148 public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject line) { 149 boolean isValid = true; 150 isValid &= super.processCustomAddCollectionLineBusinessRules(document, collectionName, line); 151 MessageMap errorMap = GlobalVariables.getMessageMap(); 152 isValid &= errorMap.isEmpty(); 153 154 if (collectionName.equals(ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES)) { 155 CustomerAddress customerAddress = (CustomerAddress) line; 156 157 if (isValid) { 158 isValid &= checkAddressIsValid(customerAddress); 159 isValid &= validateEndDateForNewAddressLine(customerAddress.getCustomerAddressEndDate()); 160 } 161 162 if (isValid) { 163 Customer customer = (Customer) document.getNewMaintainableObject().getBusinessObject(); 164 if (customerAddress.getCustomerAddressTypeCode().equalsIgnoreCase(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_PRIMARY)) { 165 166 for (int i = 0; i < customer.getCustomerAddresses().size(); i++) { 167 if (customer.getCustomerAddresses().get(i).getCustomerAddressTypeCode().equalsIgnoreCase(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_PRIMARY)) { 168 customer.getCustomerAddresses().get(i).setCustomerAddressTypeCode(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_ALTERNATE); 169 // OK 170 // break; 171 } 172 } 173 } 174 // if new address is not Primary, check if there is an active primary address for this customer. If not, make a new 175 // address primary 176 else { 177 boolean isActivePrimaryAddress = false; 178 Date endDate; 179 180 for (int i = 0; i < customer.getCustomerAddresses().size(); i++) { 181 if (customer.getCustomerAddresses().get(i).getCustomerAddressTypeCode().equalsIgnoreCase(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_PRIMARY)) { 182 endDate = customer.getCustomerAddresses().get(i).getCustomerAddressEndDate(); 183 // check if endDate qualifies this customer address as inactive (if endDate is a passed date or present 184 // date) 185 if (!checkEndDateIsValid(endDate, false)) 186 customer.getCustomerAddresses().get(i).setCustomerAddressTypeCode(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_ALTERNATE); 187 else 188 isActivePrimaryAddress = true; 189 } 190 } 191 if (!isActivePrimaryAddress) 192 customerAddress.setCustomerAddressTypeCode(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_PRIMARY); 193 } 194 } 195 } 196 197 return isValid; 198 199 } 200 201 /** 202 * This method checks if customer end date is valid: 1. if a new address is being added, customer end date must be a future date 203 * 2. if inactivating an address, customer end date must be current or future date 204 * 205 * @param endDate 206 * @param canBeTodaysDateFlag 207 * @return True if endDate is valid. 208 */ 209 public boolean checkEndDateIsValid(Date endDate, boolean canBeTodaysDateFlag) { 210 boolean isValid = true; 211 212 if (ObjectUtils.isNull(endDate)) 213 return isValid; 214 215 Timestamp today = dateTimeService.getCurrentTimestamp(); 216 today.setTime(DateUtils.truncate(today, Calendar.DAY_OF_MONTH).getTime()); 217 218 // end date must be todays date or future date 219 if (canBeTodaysDateFlag) { 220 if (endDate.before(today)) { 221 isValid = false; 222 } 223 } // end date must be a future date 224 else { 225 if (!endDate.after(today)) { 226 isValid = false; 227 } 228 } 229 230 return isValid; 231 } 232 233 public boolean validateEndDateForNewAddressLine(Date endDate) { 234 boolean isValid = checkEndDateIsValid(endDate, false); 235 if (!isValid) { 236 String propertyName = ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES_ADD_NEW_ADDRESS + "." + ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_END_DATE; 237 putFieldError(propertyName, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_END_DATE_MUST_BE_FUTURE_DATE); 238 } 239 240 return isValid; 241 } 242 243 public boolean validateEndDateForExistingCustomerAddress(Date newEndDate, int ind) { 244 boolean isValid = checkEndDateIsValid(newEndDate, true); 245 246 // valid end date for an existing customer address; 247 // 1. blank <=> no date entered 248 // 2. todays date -> makes address inactive 249 // 3. future date 250 // 4. if end date is a passed date AND it hasn't been updated <=> oldEndDate = newEndDate 251 // 252 // invalid end date for an existing customer address 253 // 1. if end date is a passed date AND it has been updated <=> oldEndDate != newEndDate 254 if (!isValid) { 255 Date oldEndDate = oldCustomer.getCustomerAddresses().get(ind).getCustomerAddressEndDate(); 256 // passed end date has been entered 257 if (ObjectUtils.isNull(oldEndDate) || ObjectUtils.isNotNull(oldEndDate) && !oldEndDate.toString().equals(newEndDate.toString())) { 258 String propertyName = ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES + "[" + ind + "]." + ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_END_DATE; 259 putFieldError(propertyName, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_END_DATE_MUST_BE_CURRENT_OR_FUTURE_DATE); 260 } 261 else { 262 isValid = true; 263 } 264 } 265 return isValid; 266 } 267 268 /** 269 * This method checks if the customer name entered is greater than or equal to three (3) characters long. This rule was 270 * implemented to ensure that there are three characters available from the name to be used as a the customer code. 271 * 272 * @param customerName The name of the customer. 273 * @return True if the name is greater than or equal to 3 characters long. 274 */ 275 public boolean checkNameIsValidLength(String customerName) { 276 boolean success = true; 277 if (customerName.length() < 3) { 278 success = false; 279 GlobalVariables.getMessageMap().putError(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_NAME, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_NAME_LESS_THAN_THREE_CHARACTERS); 280 } 281 282 if (customerName.indexOf(' ') > -1 && customerName.indexOf(' ') < 3) { 283 success = false; 284 GlobalVariables.getMessageMap().putError(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_NAME, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_NAME_NO_SPACES_IN_FIRST_THREE_CHARACTERS); 285 } 286 return success; 287 } 288 289 /** 290 * This method checks if the address is valid 291 * 292 * @param customerAddress 293 * @return true if valid, false otherwise 294 */ 295 public boolean checkAddressIsValid(CustomerAddress customerAddress, int ind) { 296 boolean isValid = true; 297 String propertyName = ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES + "[" + ind + "]."; 298 299 if (ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_US.equalsIgnoreCase(customerAddress.getCustomerCountryCode())) { 300 301 if (customerAddress.getCustomerZipCode() == null || "".equalsIgnoreCase(customerAddress.getCustomerZipCode())) { 302 isValid = false; 303 putFieldError(propertyName + ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_ZIP_CODE, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_ZIP_CODE_REQUIRED_WHEN_COUNTTRY_US); 304 } 305 if (customerAddress.getCustomerStateCode() == null || "".equalsIgnoreCase(customerAddress.getCustomerStateCode())) { 306 isValid = false; 307 putFieldError(propertyName + ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_STATE_CODE, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_STATE_CODE_REQUIRED_WHEN_COUNTTRY_US); 308 } 309 } 310 else { 311 if (customerAddress.getCustomerInternationalMailCode() == null || "".equalsIgnoreCase(customerAddress.getCustomerInternationalMailCode())) { 312 isValid = false; 313 // GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_INTERNATIONAL_MAIL_CODE, 314 // ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_INTERNATIONAL_MAIL_CODE_REQUIRED_WHEN_COUNTTRY_NON_US); 315 putFieldError(propertyName + ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_INTERNATIONAL_MAIL_CODE, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_INTERNATIONAL_MAIL_CODE_REQUIRED_WHEN_COUNTTRY_NON_US); 316 } 317 if (customerAddress.getCustomerAddressInternationalProvinceName() == null || "".equalsIgnoreCase(customerAddress.getCustomerAddressInternationalProvinceName())) { 318 isValid = false; 319 // GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_INTERNATIONAL_PROVINCE_NAME, 320 // ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_INTERNATIONAL_PROVINCE_NAME_REQUIRED_WHEN_COUNTTRY_NON_US); 321 putFieldError(propertyName + ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_INTERNATIONAL_PROVINCE_NAME, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_INTERNATIONAL_PROVINCE_NAME_REQUIRED_WHEN_COUNTTRY_NON_US); 322 } 323 } 324 return isValid; 325 } 326 327 public boolean checkAddressIsValid(CustomerAddress customerAddress) { 328 boolean isValid = true; 329 330 if (ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_US.equalsIgnoreCase(customerAddress.getCustomerCountryCode())) { 331 332 if (customerAddress.getCustomerZipCode() == null || "".equalsIgnoreCase(customerAddress.getCustomerZipCode())) { 333 isValid = false; 334 GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_ZIP_CODE, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_ZIP_CODE_REQUIRED_WHEN_COUNTTRY_US); 335 } 336 if (customerAddress.getCustomerStateCode() == null || "".equalsIgnoreCase(customerAddress.getCustomerStateCode())) { 337 isValid = false; 338 GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_STATE_CODE, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_STATE_CODE_REQUIRED_WHEN_COUNTTRY_US); 339 } 340 } 341 else { 342 if (customerAddress.getCustomerInternationalMailCode() == null || "".equalsIgnoreCase(customerAddress.getCustomerInternationalMailCode())) { 343 isValid = false; 344 GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_INTERNATIONAL_MAIL_CODE, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_INTERNATIONAL_MAIL_CODE_REQUIRED_WHEN_COUNTTRY_NON_US); 345 } 346 if (customerAddress.getCustomerAddressInternationalProvinceName() == null || "".equalsIgnoreCase(customerAddress.getCustomerAddressInternationalProvinceName())) { 347 isValid = false; 348 GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_INTERNATIONAL_PROVINCE_NAME, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_ADDRESS_INTERNATIONAL_PROVINCE_NAME_REQUIRED_WHEN_COUNTTRY_NON_US); 349 } 350 } 351 return isValid; 352 } 353 354 /** 355 * This method checks if the customer addresses are valid: has one and only one primary address 356 * 357 * @param customer 358 * @return true if valid, false otherwise 359 */ 360 public boolean checkAddresses(Customer customer) { 361 boolean isValid = true; 362 boolean hasPrimaryAddress = false; 363 for (CustomerAddress customerAddress : customer.getCustomerAddresses()) { 364 if (customerAddress.getCustomerAddressTypeCode().equalsIgnoreCase(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_PRIMARY)) { 365 if (hasPrimaryAddress) { 366 isValid = false; 367 GlobalVariables.getMessageMap().putError(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES, ArKeyConstants.CustomerConstants.ERROR_ONLY_ONE_PRIMARY_ADDRESS); 368 } 369 else { 370 hasPrimaryAddress = true; 371 } 372 } 373 } 374 375 // customer must have at least one primary address 376 if (!hasPrimaryAddress) { 377 isValid = false; 378 GlobalVariables.getMessageMap().putError(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES, ArKeyConstants.CustomerConstants.ERROR_ONLY_ONE_PRIMARY_ADDRESS); 379 } 380 return isValid; 381 } 382 383 public boolean validateAddresses(Customer customer) { 384 boolean isValid = true; 385 int i = 0; 386 // this block is to validate email addresses 387 for (CustomerAddress customerAddress : customer.getCustomerAddresses()) { 388 if (ObjectUtils.isNotNull(customerAddress.getCustomerEmailAddress())) { 389 String errorPath = KNSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES + "[" + i + "]"; 390 GlobalVariables.getMessageMap().addToErrorPath(errorPath); 391 392 this.getDictionaryValidationService().validateBusinessObject(customerAddress); 393 GlobalVariables.getMessageMap().removeFromErrorPath(errorPath); 394 } 395 i++; 396 } 397 i = 0; 398 for (CustomerAddress customerAddress : customer.getCustomerAddresses()) { 399 isValid &= checkAddressIsValid(customerAddress, i); 400 isValid &= validateEndDateForExistingCustomerAddress(customerAddress.getCustomerAddressEndDate(), i); 401 i++; 402 } 403 if (GlobalVariables.getMessageMap().getErrorCount() > 0) 404 isValid = false; 405 406 if (isValid) { 407 i = 0; 408 for (CustomerAddress customerAddress : customer.getCustomerAddresses()) { 409 if (customerAddress.getCustomerAddressTypeCode().equalsIgnoreCase(ArKeyConstants.CustomerConstants.CUSTOMER_ADDRESS_TYPE_CODE_PRIMARY) && ObjectUtils.isNotNull(customerAddress.getCustomerAddressEndDate())) 410 isValid &= checkIfPrimaryAddressActive(customerAddress.getCustomerAddressEndDate(), i); 411 i++; 412 } 413 } 414 415 return isValid; 416 } 417 418 public boolean checkIfPrimaryAddressActive(Date newEndDate, int ind) { 419 // if here -> this is a Primary Address, customer end date is not null 420 boolean isActiveAddressFlag = checkEndDateIsValid(newEndDate, false); 421 422 if (!isActiveAddressFlag) { 423 String propertyName = ArPropertyConstants.CustomerFields.CUSTOMER_TAB_ADDRESSES + "[" + ind + "]." + ArPropertyConstants.CustomerFields.CUSTOMER_ADDRESS_END_DATE; 424 putFieldError(propertyName, ArKeyConstants.CustomerConstants.ERROR_CUSTOMER_PRIMARY_ADDRESS_MUST_HAVE_FUTURE_END_DATE); 425 } 426 427 return isActiveAddressFlag; 428 } 429 430 /** 431 * This method checks if tax number is entered when tax number is required 432 * 433 * @param customer 434 * @return true if tax number is required and tax number is entered or if tax number is not required, false if tax number 435 * required and tax number not entered 436 */ 437 public boolean checkTaxNumber(Customer customer) { 438 boolean isValid = true; 439 if (isTaxNumberRequired()) { 440 boolean noTaxNumber = (customer.getCustomerTaxNbr() == null || customer.getCustomerTaxNbr().equalsIgnoreCase("")); 441 if (noTaxNumber) { 442 isValid = false; 443 GlobalVariables.getMessageMap().putError(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.CustomerFields.CUSTOMER_SOCIAL_SECURITY_NUMBER, ArKeyConstants.CustomerConstants.ERROR_TAX_NUMBER_IS_REQUIRED); 444 } 445 } 446 return isValid; 447 } 448 449 /** 450 * This method checks if tax number is required 451 * 452 * @return true if tax number is required, false otherwise 453 */ 454 public boolean isTaxNumberRequired() { 455 boolean paramExists = SpringContext.getBean(ParameterService.class).parameterExists(Customer.class, KFSConstants.CustomerParameter.TAX_NUMBER_REQUIRED_IND); 456 if (paramExists) { 457 return SpringContext.getBean(ParameterService.class).getIndicatorParameter(Customer.class, KFSConstants.CustomerParameter.TAX_NUMBER_REQUIRED_IND); 458 } 459 else 460 return false; 461 } 462 463 }