14. Oktober 2015 14:06
15. Oktober 2015 10:08
15. Oktober 2015 14:26
using System;
using System.Diagnostics;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Xrm.Sdk.Query;
namespace ZugeordnetesProduktCreate
{
   public class AuftragProduktCreate: IPlugin
   {
        private IOrganizationService _service; 
      /// <summary>
        /// Dieses Plugin wird bei jedem Create eines zugeordneten Produktes wie Verkaufschance Produkt, Angebots Produkt etc. ausgeführt.
        /// Gerade wenn die Produkte über die Schnellerfassung angelegt werden ist dies wichtig damit die Felder die aus dem Produktkatalog gezogen
        /// werden müssen auch gezogen werden.
        /// Früher ging dies beim öffen des Formulars im Status Create über JavaScript aber nach einer Schnellerfassung steht das Form schon im Status
        /// Update bevor es das erste mal geöffnet wird.
      /// </summary>
        /// <remarks>Register this plug-in on the Create message, account entity,
        /// and pre-operation stage.
        /// </remarks>
        public void Execute(IServiceProvider serviceProvider)
      {
            // Obtain the execution context from the service provider.
            Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                _service = factory.CreateOrganizationService(null);
            // The InputParameters collection contains all the data passed in the message request.
         if (context.InputParameters.Contains("Target") &&
            context.InputParameters["Target"] is Entity)
            {
                // Obtain the target entity from the input parameters.
            Entity entity = (Entity)context.InputParameters["Target"];
                // Überprüfen ob es sich um ein Auftrag Produkt handelt
                // Wenn nicht wurde das Plugin falsch registiert.
                if (entity.LogicalName == SalesOrderDetail.EntityLogicalName) 
                {
                    //Wenn Create vollen datensatz holen
                    if (context.MessageName == "Create")
                    {
                        //Prüfen ob Preise gesperrt in übergeordnetem Auftrag gesetzt ist. Falls ja dürfen die Felder Einheit Preis per Unit und Produkt
                        //nicht vom Plugin gesetzt werdne sonst gibt es einen Fehler
                        Boolean priceLocked = true;
                        ColumnSet salesOrderDetailCols = new ColumnSet(new String[] { "salesorderid" });
                        Guid salesOrderDetailId = entity.Id;
                        SalesOrderDetail retrievedSalesOrderDetail =
                            (SalesOrderDetail)_service.Retrieve("salesorderdetail", entity.Id, salesOrderDetailCols);
                        ColumnSet salesOrderCols = new ColumnSet(new String[] { "ispricelocked" });
                        if (retrievedSalesOrderDetail.SalesOrderId != null)
                        {
                            EntityReference salesOrderReference = (EntityReference)retrievedSalesOrderDetail.SalesOrderId;
                            Guid salesOrderRefId = salesOrderReference.Id;
                            SalesOrder retrievedSalesOrder =
                                (SalesOrder)_service.Retrieve("salesorder", salesOrderRefId, salesOrderCols);
                            if (retrievedSalesOrder.IsPriceLocked != null)
                            {
                                priceLocked = (Boolean) retrievedSalesOrder.IsPriceLocked;
                            }
                        }
                        if (priceLocked)
                        {
                            //Preise sind gesperrt hier muss noch Lösung gefunden werden wie Daten gezogen werden können
                            //auch reines update der entität ohne veränderung geht nicht
                        }
                        else
                        {
                            //Preise sind nicht gesperrt hier können Daten ohne Probleme gezogen werden
                            //Wenn ein Produkt angegeben wird, dieses ermitteln und Daten in angebotprodukt schreiben
                            if (entity.Attributes.Contains("productid") && entity.Attributes["productid"] != null)
                            {
                                //Referenz auslesen und ID holen
                                EntityReference productEntityRef = (EntityReference)entity.Attributes["productid"];
                                Guid productRef = productEntityRef.Id;
                                // Retrieve the product containing several of its attributes.
                                ColumnSet cols = new ColumnSet(
                                    new String[] { "defaultuomid", "price", "name",  "cust_ueberschrift_kalkulation",
                                    "cust_produktnameenglisch", "customization_it", "customization_autom", 
                                    "customization_e_plan", "customization_hardware", "cust_purchase_price", 
                                    "cust_html_description_de", "cust_html_description_en"}); 
                                Product retrievedProduct = (Product)_service.Retrieve("product", productRef, cols);
                                entity.Attributes["uomid"] = retrievedProduct.DefaultUoMId;
                                entity.Attributes["cust_ics_shortdescription"] = retrievedProduct.Name;
                                entity.Attributes["cust_kurzbeschreibungenglisch"] = retrievedProduct.Cust_Produktnameenglisch;
                                entity.Attributes["cust_html_description_de"] = retrievedProduct.Cust_html_description_de;
                                entity.Attributes["cust_html_description_en"] = retrievedProduct.Cust_html_description_en;
                                entity.Attributes["priceperunit"] = retrievedProduct.Price;
                                Money listenpreis = retrievedProduct.Price;
                                if (retrievedProduct.cust_ueberschrift_kalkulation != null)
                                {
                                    Boolean isueberschrift = (Boolean)retrievedProduct.Cust_ueberschrift_kalkulation;
                                    if (listenpreis.Equals(new Money(0)) && isueberschrift.Equals(true))
                                    {
                                        entity.Attributes["priceperunit"] = new Money(0);
                                        entity.Attributes["ispriceoverridden"] = true;
                                    }
                                }                    
                                entity.Attributes["customization_it"] = retrievedProduct.Customization_it;
                                entity.Attributes["customization_autom"] = retrievedProduct.Customization_autom;
                                entity.Attributes["customization_e_plan"] = retrievedProduct.Customization_e_plan;
                                entity.Attributes["customization_hardware"] = retrievedProduct.Customization_hardware;
                                entity.Attributes["cust_purchase_price_per_unit"] = retrievedProduct.Cust_purchase_price;
                                entity.Attributes["cust_purchase_price_total"] = retrievedProduct.Cust_Einkaufspreiskostengesamt;                            
                                // Update the Auftragprodukt record.
                                _service.Update(entity);
                            }
                        }
                        
                    }   
            }
            }
      }
   }
}
16. Oktober 2015 08:06
19. Oktober 2015 09:48
19. Oktober 2015 10:40
19. Oktober 2015 11:02
// Unlock the order pricing
UnlockSalesOrderPricingRequest unlockOrderRequest =
  new UnlockSalesOrderPricingRequest()
  {
    SalesOrderId = salesOrderReference.Id
  };
_service.Execute(unlockOrderRequest);
//Lock the order pricing
LockSalesOrderPricingRequest lockOrderRequest =
  new LockSalesOrderPricingRequest()
  {
    SalesOrderId = salesOrderReference.Id
  };
_service.Execute(lockOrderRequest);