Tax Module in Commerce Server 2007

215 views Asked by At

Do we have any out of the box pipeline component for calculating tax in commerce server 2007?Is it recommended to have a custom table in the commerce server transaction related databases to store tax information?

1

There are 1 answers

3
RazorEdge On

Whether or not you store tax in the _transactionconfig database is up to you. It depends on the level of sophistication of your tax rules/laws for the nexuses you do business in. If you have to deal with global concerns where the variables that go into calculating tax are constantly changing, then I would recommend using a tax calculation service from a merchant provider, Verisign, FirstDataCorporation and many other providers have web services API that you can access to handle these calculations for you if you setup a paid merchant account. For simple tax calculations, you might even just consider storing that in your app.config or web.config files if its just a flat percentage that rarely changes.

In response to whether or not there are out of the box pipeline component for calculating tax, the answer is no. Commerce Server 2007 only ships with two pipeline components related to tax. If you open up the total.pcf file that can be found in the pipelines folder of your commerce server site, you will notice a stage called tax. You will see a DefaultTaxCy component and a RequiredTaxCy component.

The DefaultTaxCy component initializes the _cy_tax_total (a decimal value representing the total amount of tax on the current orderform) to zero and sets the _cy_tax_included (a boolean value representing whether or not tax is included on the orderform) to false.

The RequiredTaxCy component simply reads the _cy_Tax_total value an dthe _cy_tax_included value and writes errors to the _PurchaseErrors dictionary if an error is encountered.

What you will want to do is create a custom pipeline component to replace the DefaultTaxCy component and set the value of the _cy_tax_total property on the orderform. Instructions can be found on MSDN here http://msdn.microsoft.com/en-US/library/ms916284(v=cs.70).aspx

Here is a simple example of only the Execute method of a custom pipeline component iterating over each lineitem in the order and then incrementing the tax total on the orderform based on a hypothetical method I called "CalculateTaxForLineItem that takes a LineItem dictionary as an argument and then would allow you to calculate that tax using your own custom business logic.

public int Execute(object pdispOrder, object pdispContext, int lFlags)
{
     string basketErrorMessage = string.Empty;
     int componentErrorLevel = 1;
        IDictionary order = (IDictionary)pdispOrder;
        ISimpleList lineItems = (ISimpleList)order["items"];
        if (lineItems != null && lineItems.Count > 0)
        {
          decimal taxTotal = 0M;
          int lineItemCount = lineItems.Count;
          // Loop over the lineitems
          for (int i = 0; i < lineItemCount; i++)
          {
             IDictionary lineItem = (IDictionary)lineItems[i];
             decimal lineItemTaxTotal = 0M; 
             // TODO: peform some business logic to get calculate the lineItemTaxTotal
             // per line here
             lineItemTaxTotal = CalculateTaxForLineItem(lineItems[i]);
             // add the lineitem tax total that was calculated to the total for the order
             taxTotal += lineItemTaxTotal;

           }
         }
      // Set the _cy_tax_total for the orderform
      order["_cy_tax_total"] = taxTotal;

      return componentErrorLevel;

}

public decimal CalculateTaxForLineItem(IDictionary currentLineItem){

   // TODO: write your code to calculate your lineitem tax totals based on whatever
   // custom business logic you want (could be a web service from a 3rd party tax service, could 
   // be custom sql reaching out to a database, your choice....
}