Hello guys,
I have couple of plugins on the "quote" entity and they work just fine when the Price list is USD. When I create a new Quote, and set the Price List to something other than "USD", like "EUR" per say - I'm not allowed to create a quote product for this quote, and the error that I get is "ISV Code aborted the operation".
I know that this error is given when you have more than one plugin updating the same entity, but I don't use the pricelist for none of this plugins, except for one, that is not even triggered on create of quote, but on change of a yes/no field.
Here is the code that is in that plugin:
protected void ExecuteQuoteCreateOrders(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
// TODO: Implement your custom Plug-in business logic.
IPluginExecutionContext context = localContext.PluginExecutionContext;
IOrganizationService service = localContext.OrganizationService;
Guid quoteProductID = (Guid)((Entity)context.InputParameters["Target"]).Id;
var serviceContext = new OrganizationServiceContext(service);
ColumnSet set = new ColumnSet();
set.AllColumns = true;
var quote = service.Retrieve("quote", quoteProductID, set);
if (context.Depth > 1)
{
return;
}
else
{
var customerID = (EntityReference)quote["customerid"];
var customer = service.Retrieve(customerID.LogicalName, customerID.Id,
new ColumnSet() { AllColumns = true });
if (quote.Contains("new_createinvoice"))
{
var salesorderType = (OptionSetValue)quote["new_createinvoice"];
if (salesorderType.Value == 1)
{
string quoteName = (string)quote["name"];
string orderProductName = "Advance payment for " + quoteName;
var prepayedAmount = (Money)quote["new_prepayedamount"];
var advanceProductId = "14";
var salesorder = new Entity("salesorder");
salesorder["name"] = quoteName + " Invoice Order for the Prepayment";
salesorder["quoteid"] = new EntityReference(quote.LogicalName, quote.Id);
salesorder["customerid"] = new EntityReference(customer.LogicalName, customer.Id);
salesorder["pricelevelid"] = (EntityReference)quote["pricelevelid"];
salesorder["new_recommendedtotal"] = (Money)quote["new_prepayedamount"];
salesorder["new_pricingtype"] = new OptionSetValue(((OptionSetValue)quote["new_pricingtype"]).Value);
salesorder["new_reloadflag"] = false;
var orderID = (Guid)service.Create(salesorder);
//Create the order detail
var orderProduct = new Entity("salesorderdetail");
orderProduct["salesorderid"] = new EntityReference("salesorder", orderID);
//////retrieve product
ConditionExpression condition = new ConditionExpression();
condition.AttributeName = "name";
condition.Operator = ConditionOperator.Equal;
condition.Values.Add("pc");
FilterExpression filter = new FilterExpression();
filter.AddCondition(condition);
QueryExpression query = new QueryExpression();
query.EntityName = "uom";
query.ColumnSet = new ColumnSet(true);
query.Criteria = filter;
// Query for the UOM
ConditionExpression conditionProduct = new ConditionExpression();
conditionProduct.AttributeName = "productnumber";
conditionProduct.Operator = ConditionOperator.Equal;
conditionProduct.Values.Add(advanceProductId);
FilterExpression filterProduct = new FilterExpression();
filterProduct.AddCondition(conditionProduct);
QueryExpression queryProduct = new QueryExpression();
queryProduct.EntityName = "product";
queryProduct.ColumnSet = new ColumnSet(true);
queryProduct.Criteria = filterProduct;
EntityCollection uomCollection = service.RetrieveMultiple(query);
EntityCollection productCollection = service.RetrieveMultiple(queryProduct);
//uom.Entities.F
var firstUom = uomCollection.Entities.FirstOrDefault();
var firstProduct = productCollection.Entities.FirstOrDefault();
//foreach (var product in uom.Entities)
//{
// orderProduct["productid"] = product.ToEntityReference();
//}
//EntityCollection uoms = service.RetrieveMultiple(unitQuery);
//var uomProduct = uoms.Entities[0];
//var uom = service.Retrieve("uom", new Guid("06EBB338-468D-437B-B547-A3E600EB9A97"), new ColumnSet(){AllColumns=true});
var uom = service.Retrieve(firstUom.LogicalName, firstUom.Id, new ColumnSet() { AllColumns = true });
//throw new InvalidPluginExecutionException(firstProduct.Id.ToString());
//var product = service.Retrieve("product", new Guid("0DD28827-C9D5-E311-9397-00155D0A4E33"), new ColumnSet(){AllColumns=true});
var product = service.Retrieve(firstProduct.LogicalName, firstProduct.Id, new ColumnSet() { AllColumns = true });
orderProduct["productid"] = new EntityReference("product", product.Id);
orderProduct["uomid"] = new EntityReference("uom", uom.Id);
orderProduct["description"] = (string)orderProductName;
orderProduct["tax"] = (decimal)0;
orderProduct["new_pricingtype"] = new OptionSetValue(((OptionSetValue)quote["new_pricingtype"]).Value);
orderProduct["priceperunit"] = new Money(prepayedAmount.Value);
//throw new InvalidPluginExecutionException(prepayedAmount.Value.ToString());
orderProduct["quantity"] = (decimal)1;
orderProduct["new_pricingtype"] = new OptionSetValue(1);
orderProduct["new_ratio"] = (decimal)1;
orderProduct["manualdiscountamount"] = new Money(0);
orderProduct["new_specificdiscountpercentage"] = (decimal)0;
orderProduct["new_grossannualincome"] = new Money(prepayedAmount.Value);
orderProduct["new_gaixratio"] = new Money(prepayedAmount.Value);
orderProduct["new_recommendedvalue"] = new Money(prepayedAmount.Value);
orderProduct["new_fixedpriceplusratio"] = new Money(prepayedAmount.Value);
service.Create(orderProduct);
//service.Update(salesorder);
}
else if (salesorderType.Value == 2)
{
string quoteName = (string)quote["name"];
string orderProductName = "Advance payment for " + quoteName;
var prepayedAmount = (Money)quote["new_prepayedamount"];
var salesorder = new Entity("salesorder");
salesorder["name"] = quote["name"] + " Invoice Order for the Residual";
salesorder["quoteid"] = new EntityReference(quote.LogicalName, quote.Id);
salesorder["customerid"] = new EntityReference(customer.LogicalName, customer.Id);
salesorder["pricelevelid"] = (EntityReference)quote["pricelevelid"];
salesorder["new_recommendedtotal"] = (Money)quote["new_prepayedamount"];
salesorder["new_pricingtype"] = new OptionSetValue(((OptionSetValue)quote["new_pricingtype"]).Value);
salesorder["new_reloadflag"] = false;
var orderID = (Guid)service.Create(salesorder);
//Create the order detail
var orderProduct = new Entity("salesorderdetail");
orderProduct["salesorderid"] = new EntityReference("salesorder", orderID);
//////retrieve product
ConditionExpression condition = new ConditionExpression();
condition.AttributeName = "name";
condition.Operator = ConditionOperator.Equal;
condition.Values.Add("pc");
FilterExpression filter = new FilterExpression();
filter.AddCondition(condition);
QueryExpression query = new QueryExpression();
query.EntityName = "uom";
query.ColumnSet = new ColumnSet(true);
query.Criteria = filter;
// Query for the UOM
ConditionExpression conditionProduct = new ConditionExpression();
conditionProduct.AttributeName = "productnumber";
conditionProduct.Operator = ConditionOperator.Equal;
conditionProduct.Values.Add("14");
FilterExpression filterProduct = new FilterExpression();
filterProduct.AddCondition(conditionProduct);
QueryExpression queryProduct = new QueryExpression();
queryProduct.EntityName = "product";
queryProduct.ColumnSet = new ColumnSet(true);
queryProduct.Criteria = filterProduct;
EntityCollection uomCollection = service.RetrieveMultiple(query);
EntityCollection productCollection = service.RetrieveMultiple(queryProduct);
//uom.Entities.F
var firstUom = uomCollection.Entities.FirstOrDefault();
var firstProduct = productCollection.Entities.FirstOrDefault();
var uom = service.Retrieve(firstUom.LogicalName, firstUom.Id, new ColumnSet() { AllColumns = true });
var product = service.Retrieve(firstProduct.LogicalName, firstProduct.Id, new ColumnSet() { AllColumns = true });
orderProduct["productid"] = new EntityReference("product", product.Id);
orderProduct["uomid"] = new EntityReference("uom", uom.Id);
orderProduct["description"] = (string)orderProductName;
orderProduct["tax"] = (decimal)0;
orderProduct["new_pricingtype"] = new OptionSetValue(((OptionSetValue)quote["new_pricingtype"]).Value);
orderProduct["priceperunit"] = new Money(prepayedAmount.Value);
orderProduct["quantity"] = (decimal)1;
orderProduct["new_pricingtype"] = new OptionSetValue(1);
orderProduct["new_ratio"] = (decimal)1;
orderProduct["manualdiscountamount"] = new Money(0);
orderProduct["new_specificdiscountpercentage"] = (decimal)0;
orderProduct["new_grossannualincome"] = new Money(prepayedAmount.Value);
orderProduct["new_gaixratio"] = new Money(prepayedAmount.Value);
orderProduct["new_recommendedvalue"] = new Money(prepayedAmount.Value);
orderProduct["new_fixedpriceplusratio"] = new Money(prepayedAmount.Value);
service.Create(orderProduct);
};
}
}
}
Do you guys have any suggestions that may point me to the solution of this?
Thanks in Advance,
Georgi B