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);