CRM 4 – Remover Compartilhamentos

Permitir que um determinado registro seja compartilhado com outro usuário/equipe/fila é um recurso bem interessante de ser utilizado, em determinadas circunstâncias torna-se necessário e é independente das configurações das Unidade de Negócio e Direitos de Acesso, ou seja, não importa se a conta A é proprietária de um usuário A e que o usuário B não está na mesma unidade de negócio e não possui direitos de acesso que permitem a visualização da conta. Se o usuário A possuir permissão de compartilhar um registro com o usuário B, logo este usuário poderá utilizar o registro que lhe foi concedido.

Deste modo, podemos imaginar vários cenários sendo atendidos com a funcionalidade de compartilhamento, certo? Isso mesmo, apenas existe um problema! O problema neste caso, seria quando necessitamos de remover o compartilhamento de “N” registros e de uma só vez… A IDE do CRM não permite remover compartilhamos de “N” registros de uma só vez, sendo assim eu criei um breve exemplo de como realizar a remoção programaticamente.

Criaremos um Custom Workflow Activity para solucionar o problema, ele poderá ser utilizado em qualquer entidade, da forma que eu fiz este exemplo o único parâmetro de entrada seria o “login” do usuário ao qual desejamos remover, mas podemo incrementar bem isso, criando uma entidade por exemplo, um arquivo de configuração ou ainda, permitir que sejam removidos os compartilhamentos de equipes também. Mas como eu disse é só um exemplo…

Vamos ao código:

using System;
using System.Collections;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using System.Reflection;</code>

using Microsoft.Crm.Workflow;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk.Query;

namespace NAMESPACE
{
[CrmWorkflowActivity("Remover Compartilhamento", "Utilities")]
public class RemoverCompartilhamento : Activity
{
//Define the dependency properties. CRM requires dependency properties used.
public static DependencyProperty LoginUsuarioProperty = DependencyProperty.Register("LoginUsuario", typeof(string), typeof(RemoverCompartilhamento));

[CrmInput("Login Usuário")] //Input Label
[ValidationOption(ValidationOption.Required)]
public string LoginUsuario
{
get
{
return (String)base.GetValue(LoginUsuarioProperty);
}
set
{
base.SetValue(LoginUsuarioProperty, value);
}
}

protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
{
// Declara objetos
IContextService contextService;
IWorkflowContext context;
ICrmService crmService;
SecurityPrincipal principal;
TargetOwnedAccount target;
RevokeAccessRequest revoke;
systemuser usuario;
Guid entidadeId = Guid.Empty;

try
{
// Obtém contexto e CrmService
contextService = (IContextService)executionContext.GetService(typeof(IContextService));
context = contextService.Context;
crmService = context.CreateCrmService();

// Cria objetos
principal = new SecurityPrincipal();
target = new TargetOwnedAccount();
revoke = new RevokeAccessRequest();

// Método para busca o ID de um usuário, passando o Login como parâmetro
usuario = this.PesquisaIDUsuario(crmService, this.LoginUsuario);

// Verifica se obteve ID da entidade
if (context.InputParameters.Properties.Contains("EntityId"))
entidadeId = new Guid(context.InputParameters.Properties["EntityId"].ToString().Replace("{","").Replace("}",""));

// Verifica se encontrou o Id da entidade e o usuário
if (entidadeId != Guid.Empty &amp;&amp; usuario != null)
{
// Create the SecurityPrincipal.
principal.Type = SecurityPrincipalType.User;

// PrincipalId is the GUID of the user whose access is being revoked.
principal.PrincipalId = usuario.systemuserid.Value;

// EntityId is the GUID of the account to which access is being revoked.
target.EntityId = entidadeId;

// Set the properties of the request object.
revoke.Revokee = principal;
revoke.Target = target;

// Execute the request.
crmService.Execute(revoke);

// Executa o Workflow
return base.Execute(executionContext);
}
else
return ActivityExecutionStatus.Canceling;
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException("Erro: " + ex.StackTrace);
}
}
}
}

Depois de criar esta classe compilar, basta registrar no Plugin Registration Tool, como já é o procedimento comum adotado para plugins e workflows customizados. Caso tenha dúvida acesse o link:

http://archive.msdn.microsoft.com/crmplugin

Por fim, crie um workflow e referencie o workflow customizado, conforme figura à baixo:

Insira o parâmetro LoginUsuario e publique, pronto é só utilizar!

Att,

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.

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