Ações no CRM 2013 (SDK)
Uma das novas functionalidades do CRM 2013 é as Ações. As Ações são em poucas palavras, o encapsulamento de lógica de negócio numa só regra e através de código C# ou Javascript será possivel evocar essa mesma regra.
Um exemplo bastante comum e prático no CRM pode ser algo como um processo de aprovação. E em qualquer tipo de organização antes de se fazer determinada ação é necessária a aprovação de alguém superior. O administrador de CRM (parceiro CRM ou até mesmo administrador de CRM) poderá então criar um ação "Aprovação" e defini-la com alguns passos (criar uma tarefa, atribuir a uma Queue, envio de um email passado um determinado número de dias, caso a tarefa ainda esteja activa atribuir a tarefa directamente ao superior...). Através de SDK (C# ou Javascript), o programador poderá querer chamar a ação, sem necessitar de saber qual o negócio ou o conjunto de ações que corresponde a ação criada, neste nosso caso o processo de Aprovação. O cliente ou o administrador de CRM poderá então alterar a ação adicionando ou removendo determinados passos mas o código será sempre o mesmo.
O objectivo deste artigo é exemplicar a chamada de uma ação através de uma aplicação .NET, neste caso, uma aplicação consola.
Pré-requesitos:
- Visual Studio 2008, Visual Studio 2010 ou Visual Studio 2012
- SDK
- CRM 2013 (o pacote de actuliazação para o CRM 2013 é opcional).
- Windows Identity Foundation
Para começar é necessário criar uma ação no CRM 2013 (Definições > Processos). Com o CRM 2013 é nos dado a possibilidade de criação de quatro diferente tipos de processos: Ação, a qual vamos detalhar mais a baixo, Dialogo, Fluxo de Trabalho e Fluxo do Processo de Negocio.
Por exemplo, a ação será baseado num envio de email:
- Nome do processo: Send Custom Email
- Categoria: Ação
- Entidade: Conta
Ao clicar em OK uma nova janela aparecerá:
Podemos definir parametros de entrada e saída de vários tipos: Booleano, DateTime, Decimal, Dinheiro, Entidade, EntityCollection, EntityReference, Flutuante, Número inteiro, Picklist e String, como se pode verificar na imagem abaixo.
Por exemplo, a ação terá dois argumentos de entrada, um opcional e um necessário (obrigatório).
Clique em “+” para adicionar um novo parametro:
Nome: StringOptional
Tipo: String
Necessário: De
Clique em “+” para adicionar um novo parametro:
Nome: IntegerRequired
Tipo: String
Necessário: Check
A definição na ação é construída utilizando os mesmos mecanismos que os Diálogos e Fluxos de trabalho .
Para a execução da nossa ação iremos utilizar dois métodos diferentes:
Ao gerar as várias classes (Early Bound) através da execução do comando crmsvcutil é necessário activar a geração das classes relacionadas com as Ações. Foi então adicionado um novo parametro (generateActions):
CrmSvcUtil.exe /url:https://<serverName>/<organizationName>/XRMServices/2011/Organization.svc /out:<outputFilename>.cs /username:<username> /password:<password> /domain:<domainName> /namespace:<outputNamespace> /serviceContextName:<serviceContextName> /generateActions
- Abra o Visual Studio 2008, Visual Studio 2010 ou Visual Studio 2012.
- Crie um novo projecto: Aplicação de Consola.
- Adicionar as seguintes referencias ao projecto:
- Microsoft.Crm.Sdk.Proxy
- Microsoft.IdentityModel
- Micrososft.Xrm.Sdk
- System.DirectoryServices.AccountManagement
- Systme.Runtime.Serialization
- System.Security
- System.ServiceModel
- Adicione os seguintes ficheiros (.cs):
- Ficheiro gerado pelo crmsvcutil (<outputFilename>.cs).
- SDK\SampleCode\CS\HelperCode\DeviceIdManager.cs
- SDK\SampleCode\CS\HelperCode\CrmServiceHelpers.cs
- E adicione o seguinte código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
namespace Microsoft.Crm.Sdk.Samples
{
public static void Main(string[] args)
{
ServerConnection serverConnect = new ServerConnection();
ServerConnection.Configuration config = serverConnect.GetServerConfiguration();
using (OrganizationServiceProxy _serviceProxy = ServerConnection.GetOrganizationProxy(config))
{
_serviceProxy.EnableProxyTypes();
IOrganizationService _service = (IOrganizationService)_serviceProxy;
try{
// EARLY BOUND
new_SendCustomEmailRequest request = new new_SendCustomEmailRequest();
request.IntegerRequired = 0;
request.StringOptional = "Hello World";
request.BooleanOptional = false;
request.Target = new EntityReference("account", new Guid("04121E5E-9994-E311-A0CD-00155D407C68"));
new_SendCustomEmailResponse response = _serviceProxy.Execute(request) as new_SendCustomEmailResponse;
// LATE BOUND
OrganizationRequest req = new OrganizationRequest("new_SendCustomEmail");
req["Target"] = new EntityReference("account", new Guid("04121E5E-9994-E311-A0CD-00155D407C68")); // ACCOUNT GUID
req["IntegerRequired"] = 0;
//req["BooleanOptional"] = false;
OrganizationResponse resp = _service.Execute(req);
}
catch (Exception ex)
{
// TODO
}
}
Mais informação em: https://msdn.microsoft.com/en-us/library/dn481600(v=crm.6).aspx
Hélio Delgado.