我们是否有任何开箱即用的管道组件用于在 commerce server 2007 中计算税收?是否建议在 commerce server 交易相关数据库中使用自定义表来存储税收信息?
1 回答
是否在 _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....
}