Hoje em um cliente, surgiu a necessidade de poder desativar os assuntos que não serão mais utilizados na árvore de assuntos. Isto infelizmente não é possível realizar na forma nativa pois o CRM não permite desativar, além disso ele também não permite que seja feita a exclusão do registro devido há alguns relacionamentos terem na exclusão como restritiva, como no caso da ocorrência.
Então como resolver isto?
Pois bem, para isto podemos utilizar um plugin, para fazer com que não apresente os assuntos que desejamos desativar, não gerando sujeira na interface do usuário.
Primeiramente vamos criar um assunto na raiz na árvore denominado “Inativo”, após isso adicione os assuntos que deseja desativar.
Agora vamos a mágica! Vamos criar um plugin para que qualquer chamada para entidade assuntos ignoraremos os assuntos abaixo do valor “Inativo” e o próprio assunto inativo.
Para isto utilizaremos a mensagem de “RetrieveMutiple” do plugin, isto porque qualquer busca de vários dados no Dynamics CRM é realizado através deste Request. Todo e qualquer Retrieve dentro da plataforma utiliza como base a Classe QueryExpression para a busca de dados. O que faremos então? Adicionaremos filtros nesta query.
Com isso coloque esse código no método execute() do seu plugin:
protected void ExecuteHideSubject(LocalPluginContext localContext) { if (localContext == null) { throw new ArgumentNullException("localContext"); } //Valida se os parametros de entrada contém uma query if (localContext.PluginExecutionContext.InputParameters.Contains("Query")) { // Aqui é um ponto importante // somente vamos alterar na primeira chamada pois vamos utilizar dentro // deste plugin o próprio RetrieveMutiple if (localContext.PluginExecutionContext.Depth > 1) return; // Valida se é do tipo QueryExpression if (localContext.PluginExecutionContext.InputParameters["Query"] is QueryExpression) { if (HttpContext.Current != null) { // Neste ponto vamos ignorar o filtro na tela de cadastro de assunto e no lookup if (!HttpContext.Current.Request.Path.Contains("subjecteditor.aspx") && !HttpContext.Current.Request.Path.Contains("lookupsubject.aspx") && !HttpContext.Current.Request.Path.Contains("SubjectManager.asmx")) { // Aqui vem a query para buscar o Id do assunto "Inativo" QueryExpression queryInativo = new QueryExpression("subject"); queryInativo.ColumnSet = new ColumnSet("title", "subjectid"); queryInativo.Criteria.AddCondition("title", ConditionOperator.Equal, "Inativo"); EntityCollection resultQueryInativo = localContext.OrganizationService.RetrieveMultiple(queryInativo); Entity assuntoInativo = null; if (resultQueryInativo.Entities.Count == 1) { assuntoInativo = resultQueryInativo.Entities.First(); } if (assuntoInativo != null) { // Neste passo vamos alterar a query que está no contexto da execução // pega-se o parametro de entrada denominado "Query" e converte para um objeto do tipo QueryExpression // Após colocamos dois filtro para pegar todos diferentes em que são filhos do "Inativo" e ele próprio QueryExpression objQueryExpression = (QueryExpression)localContext.PluginExecutionContext.InputParameters["Query"]; objQueryExpression.Criteria.AddCondition("subjectid", ConditionOperator.NotEqual, assuntoInativo.Id); objQueryExpression.Criteria.AddCondition("parentsubject", ConditionOperator.NotEqual, assuntoInativo.Id); localContext.PluginExecutionContext.InputParameters["Query"] = objQueryExpression; } } } } } }
Agora abra o formulário onde onde tem a entidade de assunto referenciada, como na ocorrência, para visualizar todos os assuntos menos os inativos.
Com isso conseguimos desativar assuntos e a árvore não fica visivelmente suja para o usuário final.
Aproveitem a dica!
Muito show de bola!
Show de Bola! Funcionou perfeitamente para um do nossos clientes.
Abraço e sucesso.