Как равномерно разделить скидку на все возможности - PullRequest
1 голос
/ 21 мая 2019

Я создаю плагин, который будет равномерно распределять скидку.Я хочу поровну разделить сумму скидки на все продукты. Так что, если у продукта есть цена 2000, а у другого - 1000, поэтому я хочу дать скидку 300, так что она делится на сумму 200, то должна быть 2000 и 100-100 в crm.

public class DivideEqualDiscount : IPlugin

{
    static IOrganizationService _service;
    public void Execute(IServiceProvider serviceProvider)
    {


        IPluginExecutionContext context = (IPluginExecutionContext)
        serviceProvider.GetService(typeof(IPluginExecutionContext));

        ITracingService tracingService =


    (ITracingService)serviceProvider.GetService(typeof(ITracingService));

        if (context.InputParameters.Contains("Target") &&
            context.InputParameters["Target"] is Entity)
        {
            Entity target = (Entity)context.InputParameters["Target"];

            if (target.Attributes.Contains("new_amount"))
            {
                target["new_amount"] = "52";
            }
            if (target.Attributes.Contains("new_discount"))
            {
                target["new_discount"] = "52";
            }


            string fetchData = @"
               <entity name='opportunityproduct' >
               <attribute name='manualdiscountamount' />
               <attribute name='priceperunit' />
               <attribute name='volumediscountamount' />
               <attribute name='quantity' />
               <attribute name='extendedamount' />
               </entity>
              </fetch>";

            EntityCollection ec = ExecuteFetch(fetchData);
            foreach (var item in ec.Entities)
            {

                if (item.Attributes.Contains("msdyn_costpriceperunit"))
                {

                    target["new_discountamount"] = "";
                    target["new_discountpercentage"] = "";
                }
                if (item.Attributes.Contains("quantity"))
                {

                }
                if (item.Attributes.Contains("extendedamount"))
                {

                }

            }

        }

    }
    public static EntityCollection ExecuteFetch(string fetchXmlString)
    {
        return _service.RetrieveMultiple(new FetchExpression(fetchXmlString));
    }
}

}

1 Ответ

1 голос
/ 21 мая 2019

Один из подходов состоит в том, чтобы рассчитать процент скидки по отношению к общему количеству возможностей, а затем применить эту процентную скидку к каждой строке.

Например:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Tooling.Connector;
using System;
using System.Collections.Generic;
using System.Linq;

public override void Run()
{            
    var totalDiscount = 200000;
    using (var ctx = new OrganizationServiceContext(svc))
    {
        var q = from l in ctx.CreateQuery("opportunityproduct")
                where l.GetAttributeValue<EntityReference>("opportunityid").Id.Equals(new Guid("D80E0283-5BF2-E311-945F-6C3BE5A8DD64"))                             
                select l;
        var lines = q.ToList();

        var total = lines.Sum(l => getLineTotal(l));
        var discountPercent = totalDiscount / total;

        lines.ForEach(l =>
        {
            var discount = discountPercent * getLineTotal(l);
            l["manualdiscountamount"] = new Money(discount);
            ctx.UpdateObject(l);
        });
        ctx.SaveChanges();
    }
}

private decimal getLineTotal(Entity line) => 
    line.GetAttributeValue<Money>("priceperunit").Value * line.GetAttributeValue<decimal>("quantity");

До:
Before

После применения скидки в размере 200 000 долларов:
After

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...