/**
   * Looks up what should be the method on the AccountingDocument class that returns the group title
   *
   * @return
   */
  protected Method discoverGroupTitleMethod(AccountingDocument document) {
    Method groupTitleMethod = null;
    try {
      String methodName =
          new StringBuilder()
              .append("get")
              .append(accountingLineGroupPropertyName.substring(0, 1).toUpperCase())
              .append(accountingLineGroupPropertyName.substring(1))
              .append("SectionTitle")
              .toString();
      groupTitleMethod = document.getClass().getMethod(methodName, new Class[0]);
    } catch (SecurityException se) {
      throw new RuntimeException(se);
    } catch (NoSuchMethodException nsme) {
      throw new RuntimeException(nsme);
    }

    return groupTitleMethod;
  }
  /**
   * This method checks to see if this doctype needs sales tax If it does then it checks to see if
   * the account and object code require sales tax If it does then it returns true. Note - this is
   * hackish as we shouldn't have to call rules directly from the action class But we need to in
   * this instance because we are copying the lines before calling rules and need a way to modify
   * them before they go on
   *
   * @param accountingLine
   * @return true if sales tax check is needed, false otherwise
   */
  protected boolean isSalesTaxRequired(
      AccountingDocument financialDocument, AccountingLine accountingLine) {
    boolean required = false;
    String docType =
        SpringContext.getBean(DataDictionaryService.class)
            .getDocumentTypeNameByClass(financialDocument.getClass());
    // first we need to check just the doctype to see if it needs the sales tax check
    ParameterService parameterService = SpringContext.getBean(ParameterService.class);
    // apply the rule, see if it fails
    ParameterEvaluator docTypeSalesTaxCheckEvaluator = /*REFACTORME*/
        SpringContext.getBean(ParameterEvaluatorService.class)
            .getParameterEvaluator(
                KfsParameterConstants.FINANCIAL_PROCESSING_DOCUMENT.class,
                APPLICATION_PARAMETER.DOCTYPE_SALES_TAX_CHECK,
                docType);
    if (docTypeSalesTaxCheckEvaluator.evaluationSucceeds()) {
      required = true;
    }

    // second we need to check the account and object code combination to see if it needs sales tax
    if (required) {
      // get the object code and account
      String objCd = accountingLine.getFinancialObjectCode();
      String account = accountingLine.getAccountNumber();
      if (!StringUtils.isEmpty(objCd) && !StringUtils.isEmpty(account)) {
        String compare = account + ":" + objCd;
        ParameterEvaluator salesTaxApplicableAcctAndObjectEvaluator = /*REFACTORME*/
            SpringContext.getBean(ParameterEvaluatorService.class)
                .getParameterEvaluator(
                    KfsParameterConstants.FINANCIAL_PROCESSING_DOCUMENT.class,
                    APPLICATION_PARAMETER.SALES_TAX_APPLICABLE_ACCOUNTS_AND_OBJECT_CODES,
                    compare);
        if (!salesTaxApplicableAcctAndObjectEvaluator.evaluationSucceeds()) {
          required = false;
        }
      } else {
        // the two fields are currently empty and we don't need to check yet
        required = false;
      }
    }
    return required;
  }