private void checkForTaxExemption(
      final Invoice invoice,
      final Collection<PluginProperty> properties,
      final TenantContext context) {
    // Overridden by plugin properties?
    if (PluginProperties.findPluginPropertyValue(
            AvaTaxTaxCalculator.CUSTOMER_USAGE_TYPE, properties)
        != null) {
      return;
    }

    final List<CustomField> customFields =
        killbillAPI
            .getCustomFieldUserApi()
            .getCustomFieldsForObject(invoice.getAccountId(), ObjectType.ACCOUNT, context);
    final CustomField customField =
        Iterables.<CustomField>tryFind(
                customFields,
                new Predicate<CustomField>() {
                  @Override
                  public boolean apply(final CustomField customField) {
                    return AvaTaxTaxCalculator.CUSTOMER_USAGE_TYPE.equals(
                        customField.getFieldName());
                  }
                })
            .orNull();

    if (customField != null) {
      properties.add(
          new PluginProperty(
              AvaTaxTaxCalculator.CUSTOMER_USAGE_TYPE, customField.getFieldValue(), false));
    }
  }
  private void checkForTaxCodesInCustomFields(
      final Invoice invoice,
      final Collection<PluginProperty> properties,
      final TenantContext context) {
    final List<CustomField> customFields =
        killbillAPI
            .getCustomFieldUserApi()
            .getCustomFieldsForAccountType(
                invoice.getAccountId(), ObjectType.INVOICE_ITEM, context);
    if (customFields.isEmpty()) {
      return;
    }

    final Collection<UUID> invoiceItemIds = new HashSet<UUID>();
    for (final InvoiceItem invoiceItem : invoice.getInvoiceItems()) {
      invoiceItemIds.add(invoiceItem.getId());
    }

    final Iterable<CustomField> taxCodeCustomFieldsForInvoiceItems =
        Iterables.<CustomField>filter(
            customFields,
            new Predicate<CustomField>() {
              @Override
              public boolean apply(final CustomField customField) {
                return AvaTaxTaxCalculator.TAX_CODE.equals(customField.getFieldName())
                    && invoiceItemIds.contains(customField.getObjectId());
              }
            });
    for (final CustomField customField : taxCodeCustomFieldsForInvoiceItems) {
      final UUID invoiceItemId = customField.getObjectId();
      final String taxCode = customField.getFieldValue();
      addTaxCodeToInvoiceItem(invoiceItemId, taxCode, properties);
    }
  }