CRM 2011 – Plugin CRM Online


Com a possibilidade de criarmos nossos plugins no CRM 2011 Online, algumas dúvidas surgiram em como registrar nossos scripts na nuvem. Assim, neste post descreverei como criarmos um plugin no CRM Online na entidade cliente potecial.

Para facilitar o processo, estou utilizando o Developer Toolkit (SDK\tools\developertoolkit\crmdevelopertools_installer.msi), precisamos de alguns pré-requisitos para iniciarmos:

Nota: Se já possuir alguma versão do Developer Toolkit, desinstale e depois instale novamente a versão superior.

Após o término da instalação, abra o Visual Studio e crie um novo projeto utilizando um Visual Studio Solution Template for Dynamics CRM 2011:

Antes do projeto ser criado, será necessário criar um canal de comunicação com o CRM, assim precisamos informar alguns campos:

Seguem observações:

  • CRM Discovery Server Name: É a URL de acesso do CRM sem o “https”
  • User Name e Password: São suas credenciais do Live ID ou Office 365;
  • Domain: Apenas para uso em organizações OnPremises;
  • Organization: Em um ambiente com várias organizações, selecione a que deseja trabalhar;
  • Solution Name: Caso exista várias soluções, selecione a que deseja trabalhar;

Após a configuração, terá como resultado a imagem abaixo, veja ainda que uma nova caixa de ferramentas, denominada CRM Explorer aparece no Visual Studio, com ela temos acesso direto ao CRM, atuando em todas suas customizações.

Enfim podemos iniciar a construção de nosso plugin, como havia dito será um plugin registrado na entidade cliente potencial (lead), entrando em funcionamento na criação de novos registros (create), sendo executado após a gravação no banco de dados (POST) e de forma síncrona.

Primeiramente, precisamos criar uma chave de nome forte para o projeto de Plugins (como já fazíamos no CRM 4), veja:

Nota: Infelizmente ainda não existe o suporte para o Custom Workflows no modo Online, sendo assim remova o projeto de Workflows para não termos problemas no deploy. (Editado em 07/04/2013: anterior ao Polaris)

Nota: Repita o mesmo processo para os demais projetos.

Agora poderemos observar o “poder” de utilizar um assistente ao invés de criarmos tudo do zero, navegue até o CRM Explorer, vá na entidade cliente potencial, clique com o botão direito e selecione “Create Plug-in“:

Uma nova tela aparecerá e precisaremos configurar o plugin da seguinte forma:

Note que uma nova classe foi criada “PostCreateClientePotencial.cs”, esta classe já vem pré-configurada, assim somente temos que nos preocupar em realizar a funcionalidade do plugin, pois por herdar da classe Plugin.cs (do mesmo projeto), as configurações de registro do plugin e recuperação de contexto são abstraídas de nosso controle.

Neste exemplo, criarei uma tarefa assim que o cliente potencial for criado, mas poderíamos fazer diversas outras coisas, como integrar os dados com outro sistema, consumir um Web Service, acessar um banco de dados e etc. Outro ponto seria a codificação, como o intuito do post é mais em “Como criar um plugin no CRM Online”, não detalharei o código neste post. Vejam o resultado:

//
// Copyright (c) 2012 All Rights Reserved
//
//
//
//
Implements the PostClientePotencialCreate Plugin.
//
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.1
//
namespace Solution.Plugins
{
    using System;
    using System.ServiceModel;
    using Microsoft.Xrm.Sdk;
    using System.Diagnostics;
    using Plugins;
    using System.Text;

    ///
/// PostClientePotencialCreate Plugin.
    ///
    public class PostClientePotencialCreate: Plugin
    {
        ///
/// Initializes a new instance of the  class.
        ///
        public PostClientePotencialCreate()
            : base(typeof(PostClientePotencialCreate))
        {
            base.RegisteredEvents.Add(new Tuple<int, string, string, Action>(40, "Create", "lead", new Action(ExecutePostClientePotencialCreate)));

            // Note : you can register for more events here if this plugin is not specific to an individual entity and message combination.
            // You may also need to update your RegisterFile.crmregister plug-in registration file to reflect any change.
        }

        ///
/// Executes the plug-in.
        ///
        ///The  which contains the
        /// ,
        ///
        /// and
        ///
        ///
        /// For improved performance, Microsoft Dynamics CRM caches plug-in instances.
        /// The plug-in's Execute method should be written to be stateless as the constructor
        /// is not called for every invocation of the plug-in. Also, multiple system threads
        /// could execute the plug-in at the same time. All per invocation state information
        /// is stored in the context. This means that you should not use global variables in plug-ins.
        ///
        protected void ExecutePostClientePotencialCreate(LocalPluginContext localContext)
        {
            if (localContext == null)
            {
                throw new ArgumentNullException("localContext");
            }

            // TODO: Implement your custom Plug-in business logic.
            IPluginExecutionContext context = localContext.PluginExecutionContext;
            ITracingService tracingService = localContext.TracingService;

            // 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 parmameters.
                Entity entity = (Entity)context.InputParameters["Target"];

                // Verify that the target entity represents an lead.
                // If not, this plug-in was not registered correctly.
                if (entity.LogicalName != "lead")
                    return;

                try
                {
                    // Create a task activity to follow up with the lead in 7 days.
                    Entity followup = new Entity("task");

                    followup["subject"] = "Send e-mail to the new lead.";
                    followup["description"] = "Follow up with the lead. Check if there are any new issues that need resolution.";
                    followup["scheduledstart"] = DateTime.Now.AddDays(7);
                    followup["scheduledend"] = DateTime.Now.AddDays(7);
                    followup["category"] = context.PrimaryEntityName;

                    // Refer to the lead in the task activity.
                    if (context.OutputParameters.Contains("id"))
                    {
                        Guid regardingobjectid = new Guid(context.OutputParameters["id"].ToString());
                        string regardingobjectidType = "lead";

                        followup["regardingobjectid"] = new EntityReference(regardingobjectidType, regardingobjectid);
                    }

                    // Create the task in Microsoft Dynamics CRM.
                    localContext.OrganizationService.Create(followup);
                }
                catch (FaultException ex)
                {
                    StringBuilder errors = new StringBuilder();

                    foreach (var item in ex.Detail.ErrorDetails)
                        errors.Append(item.Key + ":" + item.Value);

                    #if TRACE == true
                    tracingService.Trace(@"ErrorCode: {0}
                        ErrorDetails: {1}
                        Message: {2}
                        TraceText: {3}",
                        ex.Detail.ErrorCode,
                        errors.ToString(),
                        ex.Detail.Message,
                        ex.Detail.TraceText
                    );
                    #endif

                    //throw new InvalidPluginExecutionException(ex.StackTrace, ex);
                    throw new InvalidPluginExecutionException(String.Concat("Um erro ocorreu na execução do plugin ", ex.Message, Environment.NewLine, ex.StackTrace));
                }
            }

        }
    }
}

Com a codificação concluída, é hora de compilarmos o projeto e realizarmos o deploy. Clique com o botão sob o projeto de Plugins e selecione “Rebuild“, após o término, navegue até o CrmPackage e faça o “Deploy“:

Pronto, para testar, vá até a entidade Cliente Potencial no CRM e crie uma novo registro, veja que uma atividade do tipo tarefa foi atrelado ao novo cliente:

É isso! Para maiores detalhes consulte o SDK e o post ao qual aprendi a fazer tudo que escrevi aqui, tudo foi muito bem descrito pelo MVP Daniel Cai agradeço imensamente a sua contribuição.

Plugins na “Sandbox” ainda darão muitos posts por aqui, não deixe de conferir…

8 comentários em “CRM 2011 – Plugin CRM Online

  1. Olá.

    Apenas uma pequena correção. Nao é possível criar fluxos personalizados (custom activity) no crm 2011 online.

    Parabéns pelo post.

    Curtir

  2. Olá Thiago, muito bom o seu post. Gostaria de lhe pedir uma ajuda. Estou precisando trazer dados de um entidade(Produto) para outra(Produto da Cotação) e não estou conseguindo, como posso fazer isso?

    Aguardo seu retorno.

    Curtir

      1. Thiago,

        Primeiramente obrigado pelo retorno, mas já consegui.

        Eu já tinha tentado via mapeamento, mas como não obtive sucesso optei pelo plugin.

        Att,

        Márcio Andrade.

        Curtir

  3. Acho que faltou a observação de excluir os demais projetos (Silverlight, Silv WEB e Workflow) se não vão receber o erro “Error registering plugins and/or workflows. Public Assembly must have public key Done building project “CrmPackage.csproj” — FAILED”. Ou então incluir strong name key para todos eles.

    Curtir

    1. Bom dia João, existe uma Nota que diz sobre isso, dê uma olhada:

      Nota: Infelizmente ainda não existe o suporte para o Custom Workflows no modo Online, sendo assim remova o projeto de Workflows para não termos problemas no deploy.

      Pois o artido destina-se apenas ao CRM Online e na época não tinhamos os Custom Workflows…

      Alterei a nota.

      Obrigado pela ajuda.

      Att,
      Tiago Cardoso

      Curtir

Deixe um comentário

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.