protected override void ExecuteWorkflowLogic() { var reviseQuoteRequest = new ReviseQuoteRequest() { ColumnSet = new ColumnSet("quoteid"), QuoteId = Quote.Get(Context.ExecutionContext).Id }; var reviseQuoteResponse = (ReviseQuoteResponse)Context.UserService.Execute(reviseQuoteRequest); RevisedQuote.Set(Context.ExecutionContext, reviseQuoteResponse.Entity.ToEntityReference()); }
/// <summary> /// Close existing <c>Quote</c> as <c>Revised</c> status and create a new <c>Quote</c> as <c>Draft</c> status. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.revisequoterequest(v=crm.7).aspx /// </para> /// </summary> /// <param name="id">Existing <c>Quote</c> Id</param> /// <param name="closeBeforeRevise"> /// Set this <c>true</c> if your <c>Quote</c> record is currently <c>Active</c> status. /// Otherwise SDK throws an exception "The quote cannot be revised because it is not in closed state." /// </param> /// <param name="retrieveColumns"> /// Default attributes are "quoteid", "name", "quotenumber", "revisionnumber". /// If you need more or different attributes please set this parameter /// </param> /// <returns> /// Returns revised /newly created <c>Queote</c> in <see cref="ReviseQuoteResponse.Entity"/> property with attributes that defined in <c>retrievedQuoteColums</c> parameter /// </returns> public ReviseQuoteResponse Revise(Guid id, bool closeBeforeRevise, params string[] retrieveColumns) { ExceptionThrow.IfGuidEmpty(id, "id"); string[] columns = !retrieveColumns.IsNullOrEmpty() ? retrieveColumns : _quoteColumns; if (closeBeforeRevise) { /* * INFO : We have to "Close" as revised current quote before revised. * Otherwise SDK throws an exception "The quote cannot be revised because it is not in closed state." */ Close(id, QuoteClosedStatusCode.Revised, 0, "", "", null); } ReviseQuoteRequest request = new ReviseQuoteRequest() { QuoteId = id, ColumnSet = new ColumnSet(columns) }; return((ReviseQuoteResponse)this.OrganizationService.Execute(request)); }
public void Execute(IServiceProvider serviceProvider) { // Instancia do servico e IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationService service = (IOrganizationService)serviceFactory.CreateOrganizationService(context.UserId); // Log de plugins - Trace ITracingService tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); tracing.Trace($"Forma de registrar um log no CDS para monitorar a execução do plug-in. {DateTime.Now}"); // ID da Conta Entity accountCreated = (Entity)context.InputParameters["Target"]; // 1 - QueryExpresion QueryExpression qe = new QueryExpression("account"); qe.ColumnSet.AddColumns("websiteurl"); qe.Criteria.AddCondition("accountid", ConditionOperator.Equal, accountCreated.Id); var resultSet_1 = service.RetrieveMultiple(qe); // 2 - FetchXml var fetchXml = "" + "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" + "<entity name='account'>" + "<attribute name='name' /> " + "<attribute name='primarycontactid' /> " + "<attribute name='telephone1' /> " + "<attribute name='accountid' /> " + "<order attribute='name' descending='false' /> " + "<filter type='and'> " + "<condition attribute='accountid' operator='eq' uiname='TESTING COMPANY' uitype='account' value='" + accountCreated.Id + "' />" + "</filter> " + "</entity> " + "</fetch>"; var resutSet_2 = service.RetrieveMultiple(new FetchExpression(fetchXml)); // 2 - Retrieve var accountRetrieved = service.Retrieve("account", accountCreated.Id, new ColumnSet("websiteurl")); Entity entity = new Entity("contact"); entity["fullname"] = "NOME FIXO"; entity["emailaddress1"] = accountRetrieved.GetAttributeValue <string>("websiteurl"); entity["parentcustomerid"] = new EntityReference(accountCreated.LogicalName, accountCreated.Id); var contatoId = service.Create(entity); // Update var updateContato = new Entity("contact", contatoId); updateContato["fullname"] = "Qualquer outra coisa"; service.Update(updateContato); // Delete service.Delete("contact", contatoId); // Execute - ReviseQuote var request = new ReviseQuoteRequest(); request.ColumnSet = new ColumnSet(true); request.QuoteId = new Guid("df8004eb-303f-eb11-a813-000d3ac058c3"); var response = (ReviseQuoteResponse)service.Execute(request); }
public void Should_Create_New_Quote_With_Lines_When_Revisioning() { var context = new XrmFakedContext(); var service = context.GetOrganizationService(); var quote = new Entity { LogicalName = "quote", Id = Guid.NewGuid(), Attributes = new AttributeCollection { { "statuscode", new OptionSetValue(1) }, { "name", "Adventure Quote" } } }; var quoteDetail = new Entity { LogicalName = "quotedetail", Id = Guid.NewGuid(), Attributes = new AttributeCollection { { "quoteid", quote.ToEntityReference() }, { "extendedamount", new Money(1000m) } } }; context.Initialize(new[] { quote, quoteDetail }); var executor = new ReviseQuoteRequestExecutor(); var req = new ReviseQuoteRequest { ColumnSet = new ColumnSet(true), QuoteId = quote.Id }; executor.Execute(req, context); quote = service.RetrieveMultiple(new QueryExpression("quote") { ColumnSet = new ColumnSet(true), Criteria = new FilterExpression(LogicalOperator.And) { Conditions = { new ConditionExpression("quoteid", ConditionOperator.NotEqual, quote.Id) } } }).Entities.SingleOrDefault(); Assert.NotNull(quote); Assert.Equal("Adventure Quote", quote.GetAttributeValue <string>("name")); var quoteLines = service.RetrieveMultiple(new QueryExpression("quotedetail") { ColumnSet = new ColumnSet(true), Criteria = new FilterExpression(LogicalOperator.And) { Conditions = { new ConditionExpression("quoteid", ConditionOperator.Equal, quote.ToEntityReference()) } } }).Entities.ToList(); Assert.Equal(1, quoteLines.Count); Assert.Equal(new Money(1000m), quoteLines.Single().GetAttributeValue <Money>("extendedamount")); }