Plugin para intervir na operações especiais - Ganho e Perda da Oportunidade

by Pedro Azevedo 18. May 2014 19:21

Boas pessoal,

Na continuação deste post vou aqui relatar como realizar o dito plugin, um plugin que interfere em operações especiais. Neste caso vai-se referenciar as operações na entidade Oportunidade que permite marcar um registo como Ganho ou Perdido. Imaginamos que se quer verificar se um determinado campo está preenchido, neste caso quero obrigar que o utilizador preencha a descrição antes de fechar a oportunidade.

O código é o seguinte:

public class CloseOpportunity : IPlugin {
	public void Execute(IServiceProvider serviceProvider) {
		ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
		IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

		if (context.InputParameters.Contains("OpportunityClose") && context.InputParameters["OpportunityClose"] is Entity) {
			Guid oppId = ((EntityReference)((Entity)context.InputParameters["OpportunityClose"]).Attributes["opportunityid"]).Id;

			IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
			IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

			Entity opportunity = service.Retrieve("opportunity", oppId, new Xrm.Sdk.Query.ColumnSet(true));
			if (!opportunity.Contains("description") || string.IsNullOrEmpty(opportunity["description"].ToString()))
				throw new InvalidPluginExecutionException("Para fechar a Oportunidade terá que preencher a descrição");
		}
	}
}

O normal em plugins é esperarmos a entidade no parâmetro “Target” neste caso, esta informação está no parâmetro “OpportunityClose”, ou seja, vem na forma do objecto final, pois quando fechamos uma Oportunidade temos que preencher informações, do estado, receita real, data de fecho e caso seja perdida qual o concorrente que ganhou.

Para verificarmos as propriedades da Oportunidade teremos que obter e no objecto “OpportunityClose” tem o ID da Oportunidade e é com esse ID que vamos obter a Oportunidade relacionada.

No código ainda se pode ressalvar como cancelamos a operação, com recurso a excepção “InvalidPluginExecutionException”, a mensagem que colocamos na excepção é a mensagem que vai aparecer ao utilizador.

Depois do código completo temos que registar o plugin com as seguintes configurações:

  •         Mensagem: Win ou Lose
  •         Entidade Primária: Opportunity
  •         Entidade Secundária: Nenhuma

E registamos no event Pre-Operation para que não seja gravado na BD.

Vamos ver diretamente no Plugin Registration como fica, depois de realizarmos uma ligação, podemos registar o nosso assembly:

 Após selecionarmos a opção "Register New Assembly" aparecerá um formulário para colocarmos o caminho do assembly que contém o nosso plugin e escolhemos qual o Plugin que queremos registar, neste caso estou a selecionar o Plugin acima:

 Se tudo correr bem obtém-se a seguinte mensagem:

Irá aparecer um novo nó com o assembly que se acabou de criar e sobre este vamos adicionar um "passo" (Register New Step):

No formulário a seguir configuramos em que mensagem queremos nos registar, qual a entidade primária, em que fase do pipeline e o modo de execução:

Com isto temos o nosso Plugin registado e pronto a funcionar.

Até a próxima.

Tags: , , , ,

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About

Muito bem casado, Pai babado e um gosto muito grande pela tecnologia.

Tenho um lema "Sharing is Learning"

Mais aqui -> http://www.psazevedo.com

Month List