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…

Anúncios

Sobre Tiago Michelini Cardoso

I have been working with IT since 2006, almost of this time using Microsoft Dynamics CRM/365 as a source of solutions. I graduated in Bachelor of Information Systems at FIAP (Brazil) in 2012. I really love what I do! Technology has been my interest since always. Even in a tool different world of the current. When we didn't have internet, tablets, smartphones e social networks! Although I have worked in some roles, I can't give up "the developer life". Even so far of the greatest developers. Development in general is the thing that I love to work! I started my contributions about Dynamics in 2010. At the beginning, I used to help at MSDN and TechNet forums. But now, I'm dedicating all my time in my personal blog! Currently, I have the enormous honour of being the only Brazilian who got the award for Microsoft MVP (Most Valuable Professional) for Microsoft Dynamics CRM/365 product. I have been receiving the award since 2012.
Esse post foi publicado em Dynamics CRM e marcado , . Guardar link permanente.

8 respostas para CRM 2011 – Plugin CRM Online

  1. Christophe disse:

    Olá.

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

    Parabéns pelo post.

    Curtir

  2. Márcio Andrade disse:

    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

  3. João Leme disse:

    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

    • 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

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s