0

我们是否有任何开箱即用的管道组件用于在 commerce server 2007 中计算税收?是否建议在 commerce server 交易相关数据库中使用自定义表来存储税收信息?

4

1 回答 1

0

是否在 _transactionconfig 数据库中存储税款取决于您。这取决于您开展业务的税收规则/法律的复杂程度。如果您必须处理计算税收的变量不断变化的全球问题,那么我建议您使用税收计算服务来自商家提供商的 Verisign、FirstDataCorporation 和许多其他提供商都有 Web 服务 API,如果您设置了付费商家帐户,您可以访问这些 API 来为您处理这些计算。对于简单的税收计算,您甚至可以考虑将其存储在您的 app.config 或 web.config 文件中,如果它只是一个很少变化的固定百分比。

对于是否存在用于计算税收的开箱即用的管道组件,答案是否定的。Commerce Server 2007 仅附带两个与税收相关的管道组件。如果您打开可以在您的商务服务器站点的管道文件夹中找到的 total.pcf 文件,您会注意到一个名为 tax 的阶段。您将看到一个 DefaultTaxCy 组件和一个 RequiredTaxCy 组件。

DefaultTaxCy 组件将 _cy_tax_total(表示当前订单上的总税额的十进制值)初始化为零,并将 _cy_tax_included(表示订单上是否包含税的布尔值)设置为 false。

RequiredTaxCy 组件仅读取 _cy_Tax_total 值和 _cy_tax_included 值,如果遇到错误,则将错误写入 _PurchaseErrors 字典。

您要做的是创建一个自定义管道组件来替换 DefaultTaxCy 组件并设置订单上的 _cy_tax_total 属性的值。可以在此处的 MSDN 上找到说明http://msdn.microsoft.com/en-US/library/ms916284(v=cs.70).aspx

这是一个简单的示例,仅自定义管道组件的 Execute 方法迭代订单中的每个 lineitem,然后根据我称为“CalculateTaxForLineItem”的假设方法增加订单上的税收总额,该方法将 LineItem 字典作为参数,然后将允许您使用自己的自定义业务逻辑计算该税。

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....
}
于 2013-02-07T22:31:53.587 回答