用于计算税收的 CRM 插件
CRM Plugin to Calculate Tax
一个困扰我一段时间的问题是 Microsoft CRM Dynamics 不会自动计算税金。 CRM 坚持让用户手动输入税额。首先,计算出小数的 20% (2 d.p) 是一件很痛苦的事情,其次,也是最重要的,如果我们的销售人员必须单独打开每个报价产品,然后计算税金,请将其输入然后保存记录,他们会在销售方面惨败。我正在尝试开发一个在创建或更新消息上触发的插件,报价产品的预操作(实体逻辑名称 = quotedetail)使用金额 ["baseamount" 计算 "tax" 字段] 和任何手动折扣 ["manualdiscountamount"].
基本数学是税收 = (baseamount - manualdiscountamount) / 100 * 20
我似乎遇到的麻烦是,如果变量 _tax 被定义为直接十进制数,比如 30,则该值会正确传递给该字段,但如果我尝试使用以下值设置 _tax 值另一个字段,该值保持为 0.00。这是我的代码:
public void Execute(IServiceProvider serviceProvider)
{
// Sets the context for the plugin environment
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
// Required for tracing
ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
// Create empty entity variable
Entity entity = null;
// Check if the InputParameters property contains a target
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
// Obtain the target entity from the InputParameters
entity = (Entity)context.InputParameters["Target"];
// If message type is not Create OR Update AND it is not a Quote Product, exit gracefully
if (context.MessageName != "Create"
|| context.MessageName != "Update"
&& context.PrimaryEntityName != "quotedetail")
{
return;
}
}
else
{
return;
}
try
{
// Used to access Data and Metadata for the platform
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
// Cast the 2 entity methods to access properties from entity retrived by context
QuoteDetail currentEntity = entity.ToEntity<QuoteDetail>();
// Set the variables
int _taxPercent = 20;
decimal _amount = currentEntity.BaseAmount.Value;
decimal _manualDiscount = currentEntity.ManualDiscountAmount.Value;
decimal _preTaxAmount = _amount - _manualDiscount;
// Do the math and store in _tax
decimal _tax = _preTaxAmount / 100 * taxPercent;
// Set Tax field to value stored in _tax
currentEntity.Tax = new Money(_tax);
}
catch (FaultException<OrganizationServiceFault> ex)
{
trace.Trace("Exception: " + ex.Message + " " + ex.StackTrace);
throw new InvalidPluginExecutionException("An error occured in the plugin.", ex);
}
}
我认为我的问题是在创建报价产品期间,十进制变量的 .Values 尚未传递到上下文中,因为这是在操作前发生的。
有人知道我如何完成这项任务吗?我很惊讶 MS 将此排除在 CRM 之外。
这似乎是一个很大的问题。
编辑 1:变量的正确语法是:
Money _amount = new Money(currentEntity.BaseAmount.Value);
没有
decimal _amount = currentEntity.BaseAmount.Value;
这是因为它们是货币字段,但是,在创建消息的预操作期间,BaseAmount 的值似乎是 0.00
编辑 2:昨晚使用 ITracingService 调试了我的插件。我发现 quotedetail 实体也在创建消息之后触发更新消息。我仍然无法解决的是何时填充字段数据,即何时单价字段实际接收到从 Produt 实体传入的数据。我有这个工作。我的过程涉及在 PreCreate 消息期间设置字段值和可为空的对象值,获取 PreUpdate 图像并将其传递给 PreUpdate 消息,该消息在创建消息后立即触发。
您可能 运行 在没有手动折扣的情况下遇到问题。您是否尝试过逐步调试代码以查看它是否崩溃?
您还将 运行 遇到更新问题,因为只有更改的字段在 属性 包中,您还需要检查预映像。
好的,伙计们,我有一个答案,有点 - 但我会 post 下一个新问题。借助此视频 (https://www.youtube.com/watch?v=54Zibk9v338),我有一个工作插件 - 计算 quotedetail 实体上的税收字段。
我认为让我感到困惑的是,当您将新产品添加到报价单时,创建消息会触发并将项目添加到表单,然后更新消息会应用这些值。我正在研究没有更新消息的概念,因为我没有更新表单...
我需要的是触发创建消息的步骤,首先设置变量,如税收百分比 (20) 并初始化其他字段的变量,然后是触发更新消息的第二步获取值并设置税字段。
我现在拥有的是一个可以计算的税款字段,但如果我更改手动折扣金额字段则不会更新。如果我更改数量字段,它会发生,因为两个字段的代码相同....但我会 post 为此提出一个新问题。
伙计,我现在头疼
一个困扰我一段时间的问题是 Microsoft CRM Dynamics 不会自动计算税金。 CRM 坚持让用户手动输入税额。首先,计算出小数的 20% (2 d.p) 是一件很痛苦的事情,其次,也是最重要的,如果我们的销售人员必须单独打开每个报价产品,然后计算税金,请将其输入然后保存记录,他们会在销售方面惨败。我正在尝试开发一个在创建或更新消息上触发的插件,报价产品的预操作(实体逻辑名称 = quotedetail)使用金额 ["baseamount" 计算 "tax" 字段] 和任何手动折扣 ["manualdiscountamount"].
基本数学是税收 = (baseamount - manualdiscountamount) / 100 * 20
我似乎遇到的麻烦是,如果变量 _tax 被定义为直接十进制数,比如 30,则该值会正确传递给该字段,但如果我尝试使用以下值设置 _tax 值另一个字段,该值保持为 0.00。这是我的代码:
public void Execute(IServiceProvider serviceProvider)
{
// Sets the context for the plugin environment
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
// Required for tracing
ITracingService trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
// Create empty entity variable
Entity entity = null;
// Check if the InputParameters property contains a target
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
// Obtain the target entity from the InputParameters
entity = (Entity)context.InputParameters["Target"];
// If message type is not Create OR Update AND it is not a Quote Product, exit gracefully
if (context.MessageName != "Create"
|| context.MessageName != "Update"
&& context.PrimaryEntityName != "quotedetail")
{
return;
}
}
else
{
return;
}
try
{
// Used to access Data and Metadata for the platform
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
// Cast the 2 entity methods to access properties from entity retrived by context
QuoteDetail currentEntity = entity.ToEntity<QuoteDetail>();
// Set the variables
int _taxPercent = 20;
decimal _amount = currentEntity.BaseAmount.Value;
decimal _manualDiscount = currentEntity.ManualDiscountAmount.Value;
decimal _preTaxAmount = _amount - _manualDiscount;
// Do the math and store in _tax
decimal _tax = _preTaxAmount / 100 * taxPercent;
// Set Tax field to value stored in _tax
currentEntity.Tax = new Money(_tax);
}
catch (FaultException<OrganizationServiceFault> ex)
{
trace.Trace("Exception: " + ex.Message + " " + ex.StackTrace);
throw new InvalidPluginExecutionException("An error occured in the plugin.", ex);
}
}
我认为我的问题是在创建报价产品期间,十进制变量的 .Values 尚未传递到上下文中,因为这是在操作前发生的。
有人知道我如何完成这项任务吗?我很惊讶 MS 将此排除在 CRM 之外。
这似乎是一个很大的问题。
编辑 1:变量的正确语法是:
Money _amount = new Money(currentEntity.BaseAmount.Value);
没有
decimal _amount = currentEntity.BaseAmount.Value;
这是因为它们是货币字段,但是,在创建消息的预操作期间,BaseAmount 的值似乎是 0.00
编辑 2:昨晚使用 ITracingService 调试了我的插件。我发现 quotedetail 实体也在创建消息之后触发更新消息。我仍然无法解决的是何时填充字段数据,即何时单价字段实际接收到从 Produt 实体传入的数据。我有这个工作。我的过程涉及在 PreCreate 消息期间设置字段值和可为空的对象值,获取 PreUpdate 图像并将其传递给 PreUpdate 消息,该消息在创建消息后立即触发。
您可能 运行 在没有手动折扣的情况下遇到问题。您是否尝试过逐步调试代码以查看它是否崩溃? 您还将 运行 遇到更新问题,因为只有更改的字段在 属性 包中,您还需要检查预映像。
好的,伙计们,我有一个答案,有点 - 但我会 post 下一个新问题。借助此视频 (https://www.youtube.com/watch?v=54Zibk9v338),我有一个工作插件 - 计算 quotedetail 实体上的税收字段。
我认为让我感到困惑的是,当您将新产品添加到报价单时,创建消息会触发并将项目添加到表单,然后更新消息会应用这些值。我正在研究没有更新消息的概念,因为我没有更新表单...
我需要的是触发创建消息的步骤,首先设置变量,如税收百分比 (20) 并初始化其他字段的变量,然后是触发更新消息的第二步获取值并设置税字段。
我现在拥有的是一个可以计算的税款字段,但如果我更改手动折扣金额字段则不会更新。如果我更改数量字段,它会发生,因为两个字段的代码相同....但我会 post 为此提出一个新问题。
伙计,我现在头疼