Broadleaf Microservices
  • v1.0.0-latest-prod

TaxService

Overview

TaxService is an internal service responsible for providing and applying tax calculations for a cart. This is not a stand-alone microservice and cannot be accessed directly via a REST API. Rather, this service is internal to Cart Operations Service and is invoked as part of the Pricing functionality.

Note
For overall pricing, see CartPricingService.

Default Implementation Details

The default implementation of this interface is DefaultDelegatingTaxService, which replaces the deprecated DefaultTaxService. The default implementation defers to TaxDelegate, a component in the TaxCommon library, which selects the best TaxProvider and delegates to that.

The default implementation defers the actual calculating to the configured TaxProvider(s).

Tip
The TaxDelegate can select from a list of TaxProvider instances and uses a discovery process to find the best implementation for the provided request and ContextInfo. This allows different tenants and applications to make use of different TaxProviders.

SimpleTaxProvider

The SimpleTaxProvider is a basic implementation of a TaxProvider that is primarily suitable for estimating taxes, but may be effectively used as a fallback provider in case a more appropriate provider is unavailable. It reads in tax details from a file or from a configuration property. For more information, see Tax Common

Configuring VAT Taxes

SimpleTaxProvider supports VAT taxes. Simply set "vat":"true" in the configuration file in the SimpleTaxRecord definition. For an example, see the tax codes "UK" and "VAT5" in the sample above. In a VAT configuration, the retail price that is displayed on the product page includes tax. Tax amounts are calculated as a fraction of the retail price.

Configuring Tax Codes

Tax Codes can be configured on the product or category. The SimpleTaxProvider will use an item’s tax code (if present) to look up tax record configuration. If no configuration matches the tax code, then the SimpleTaxProvider will look up configuration based on the country code of the shipping address.

Reporting Tax and Taxable Amounts

Each FulfillmentItem contains a list of TaxDetails, which in turn contain fields for the amount of tax calculated and the taxable amount of the items. The SimpleTaxProvider and DefaultTaxService will set these fields consistent with the tax type (sales tax or VAT).

The CartPricing object on Cart has additional fields to indicate if the cart’s taxes are included (VAT) or excluded (sales tax) from the subtotal.

  • The field "taxIncludedType" maps to the TaxIncludedType enum with possible values of YES, NO, and PARTIAL.

  • The field "includedTaxAmount" indicates the amount of tax that is included in the cart subtotal.

For CartPricing objects with only VAT taxes, the "taxIncludedType" will be "YES" and the "includedTaxAmount" will equal the "totalTax" field. When displaying taxes and totals to a user, avoid doing any calculations on the front-end and use the appropriate CartPricing fields.

Other Tax Providers

Broadleaf, as well as 1st and 3rd parties, may provide additional TaxProvider implementations. Each one should have a unique bean name. Each registered TaxProvider will be passed to the DefaultTaxDelegate upon startup.

In order to use these additional TaxProvider implementation, one should only need to include them in the classpath. For example:

<dependency>
    <groupId>com.broadleafcommerce.microservices</groupId>
    <artifactId>broadleaf-avalara-tax</artifactId>
    <version>1.0.0-GA</version>
</dependency>

This will register the AvalaraTaxProvider at runtime, which will add it to a list passed to DefaultTaxDelegate. DefaultTaxDelegate will evaluate whether there are more than one TaxProvider with the same ID, provided by TaxProvider#getProviderId(). Otherwise, TaxProviders will be added to a list to be used by the TaxDelegate. The process to resolve the best TaxProvider is defined here: Tax Common.