【问题标题】:CRM Plugin to Calculate Tax用于计算税款的 CRM 插件
【发布时间】:2015-11-02 06:27:03
【问题描述】:

困扰我一段时间的一个问题是 Microsoft CRM Dynamics 不会自动计算税款。 CRM 坚持让用户手动输入税额。首先,计算 20% 的十进制数字 (2 d.p) 很痛苦,其次,最重要的是,如果我们的销售人员必须单独打开每个报价产品,然后计算税收,输入然后保存记录,他们会在卖东西方面惨败。我正在尝试开发一个在创建或更新消息上触发的插件,报价产品的预操作(实体逻辑名称=quotedetail)计算“税”字段,使用金额 [“baseamount”] 和任何手册折扣 ["manualdiscountamount"]。

基本的数学公式是 tax = (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;

这是因为它们是 Money 字段,但是在 Create 消息的 Pre-Operation 期间 BaseAmount 的值似乎是 0.00

编辑 2:昨晚使用 ITracingService 调试了我的插件。我发现quotedetail 实体也在创建消息后触发了更新消息。我仍然无法解决的是何时填充字段数据,即当每单位价格字段实际接收从 Produt 实体传入的数据时。我有这个工作。我的过程涉及在 PreCreate 消息期间设置字段值和可为空的对象值,获取 PreUpdate 图像并将其传递给在创建消息之后立即触发的 PreUpdate 消息。

【问题讨论】:

  • 十进制_taxPercent = 20.0;随后应用适当的四舍五入....

标签: c# plugins dynamics-crm crm dynamics-crm-2015


【解决方案1】:

例如,如果没有手动折扣,您可能会遇到问题。您是否尝试过单步调试代码以查看它是否崩溃? 您还会在更新时遇到问题,因为只有更改的字段在属性包中,您还需要检查原图。

【讨论】:

  • 感谢您的评论。我知道对原图的要求,只是我还没有到开发的那个阶段。
  • 很抱歉缩短了这个答案。如果手动折扣超过 0.00,则运行 if 语句?我只是在调试时阅读此内容,因为该项目只是一个类库:msdn.microsoft.com/en-us/library/aa291243(v=vs.71).aspx
  • 我不认为创建和“十进制变量的值尚未传递到上下文中”是问题所在。当您进行创建时,表单中的所有值都会在上下文中传递,但是,如果您没有提供任何税值,则可能会出现问题。你可以有一个“十进制 _taxpercent = currentEntity.Attributes.Exists("new_taxpercent") ? currentEntity.new_taxpercent : 0;”或类似的东西。您是否对代码运行了任何调试器以查看它为什么或在何处变为 0?
  • 我还没有运行调试器。这只是一个类库,我还没有花时间研究如何调试它。这是我第一次涉足 C# 编程和 CRM 开发,所以目前还只是起步阶段。我认为问题在于只有在创建操作完成后才会将值传递给上下文(如果我错了,请纠正我,因为我会走错路)。因此,在我的计算过程中,baseamount 和 manualdiscountamount 的值实际上可能为 null 或 0.00?我确实有一个“new_UKTaxPercent”字段,我也会尝试将其用于 20% 的数字
  • 值被传递到上下文中,进入 CRM 的内容存在于上下文中,这是 CRM 的巧妙之处之一,因此您可以在操作前步骤中操作传入的数据。要调试插件,最简单的方法是在服务器上安装一个 VS,在数据库或磁盘的程序集文件夹中注册插件,而不是在沙箱中。在程序集文件夹中放置一个最新的 pdb 文件并将 VS 连接到 w3wp 进程。这样,您应该能够逐步调试代码运行时。您将锁定服务器,所以不要在生产中这样做:)
【解决方案2】:

好的,伙计们,我有一个答案,有点 - 但我会在下一点发布一个新问题。在这个视频 (https://www.youtube.com/watch?v=54Zibk9v338) 的帮助下,我有一个工作插件 - 计算引用的实体上的税字段。

我认为让我印象深刻的是,当您将新产品添加到报价单时,创建消息会触发并将项目添加到表单中,然后更新消息会应用这些值。我正在研究没有更新消息的概念,因为我没有更新表单......

我需要的是在 Create 消息上触发的步骤,以首先设置变量,如税收百分比 (20) 并初始化其他字段的变量,然后在 Update 消息上触发第二个步骤以获取值并设置税金字段。

我现在拥有的是一个可以计算的税款字段,但如果我更改手动折扣金额字段,它不会更新。如果我更改奇怪的金额字段,因为这两个字段的代码相同......但我会为此发布一个新问题。

我的头现在很痛

【讨论】:

  • 我认为你遇到的问题是看看事情发生在哪里。 1)在这里创建,运行所有东西,因为您希望在创建时计算税款,如果不这样做,则代码存在某种问题。 2)更新,您还需要在更新时运行您的代码,因为您可能会更改值。如果您更改手动折扣,您希望发生什么以及实际发生什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2016-12-06
  • 2022-06-17
  • 2019-01-21
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多