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.

árvore de assuntos

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.

 

Assunto Inativos não são apresentados

Com isso conseguimos desativar assuntos e a árvore não fica visivelmente suja para o usuário final.

Aproveitem a dica!

 

2 thoughts on “Desativando assunto na árvore de assuntos”
  1. Show de Bola! Funcionou perfeitamente para um do nossos clientes.

    Abraço e sucesso.

Leave a Reply

Your email address will not be published. Required fields are marked *

Protected by WP Anti Spam