用于计算税收的 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 为此提出一个新问题。

伙计,我现在头疼