Notificador de notas

by Administrator 24. November 2015 18:50

Boas pessoal,

Recentemente um post nos fóruns perguntou se era possível haver notificações quando um utilizador referi-se outro nas notas. A minha primeira resposta foi referenciar o Yammer que servia para isso mesmo, mas a resposta não agradou ao utilizador e eu referi se a necessidade fosse muito básica e através de um plugin era possível resolvermos esta questão e prometi realizar este plugin, sei que já vou atrasado mas promessas são promessas.

O plugin é bastante básico mas tenciono depois melhorar com mais funcionalidades num futuro próximo o mais provável para o inicio de 2016. Mas para já vamos-nos focar em implementar este plugin que no futuro deverá evoluir para uma solução.

Este plugin será para ser registado na entidade Annotation e na fase Post-Create. O primeiro objetivo será obter as informações da Nota:

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
 
Entity entity = (Entity)context.InputParameters["Target"];
 
var noteTitle = (string)entity["subject"];
var noteDescr = (string)entity["notetext"];
var objectid = (EntityReference)entity["objectid"];

Vamos a procura de referências a utilizadores recorrendo a @, para este caso eu vou assumir que vamos referir ao nome sem o domínio, por exemplo se tivermos pedro@psa201505.onmicrosoft.com que necessitamos de escrever apenas @pedro. A pesquisa por utilizadores fica da seguinte maneira:

List<string> usersToNotificate = new List<string>();
int indexAt = 0;
while (true)
{
    indexAt = noteDescr.IndexOf('@', indexAt);
    if (indexAt == -1)
        break;
 
    var indexSpace = noteDescr.IndexOf(' ', indexAt);
    if (indexSpace == -1)
        indexSpace = noteDescr.Length - (indexAt + 1);
 
    string userNotification = noteDescr.Substring(indexAt + 1, indexSpace - (indexAt + 1));
    usersToNotificate.Add(userNotification);
    indexAt = indexSpace;
}

Então neste momento já temos quais os utilizadores a notificar agora temos que verificar se realmente são utilizadores do CRM:

usersToNotificate.ForEach(x =>
{
    var queryUser = new QueryExpression("systemuser");
    var filter = new FilterExpression(LogicalOperator.And);
    filter.AddCondition("domainname", ConditionOperator.Like, x + "%");
    queryUser.Criteria = filter;
    queryUser.ColumnSet = new ColumnSet(true);
    EntityCollection retrievedUsers  = service.RetrieveMultiple(queryUser);
 
    if (retrievedUsers.Entities.Count > 0)
    {
        ...
    }
});

Caso seja utilizador vamos montar o nosso email com um link tanto para o objeto onde estamos a criar as notas, bem como para a anotação:

if (retrievedUsers.Entities.Count > 0)
{
    var systemuserid = (Guid)retrievedUsers.Entities[0]["systemuserid"];
 
    var fromParty = new ActivityParty { PartyId = new EntityReference(SystemUser.EntityLogicalName, context.UserId) };
    var toParty = new ActivityParty { PartyId = new EntityReference(SystemUser.EntityLogicalName, systemuserid) };
 
    var entObject = service.Retrieve(objectid.LogicalName, objectid.Id, new ColumnSet(new string[] { "name" }));
 
    var req = new RetrieveEntityRequest();
    req.RetrieveAsIfPublished = true;
    req.LogicalName = objectid.LogicalName;
    req.EntityFilters = EntityFilters.Entity;
    var resp = (RetrieveEntityResponse)service.Execute(req);
 
    var urlObj = String.Format("https://{0}/main.aspx?etc=" + resp.EntityMetadata.ObjectTypeCode + "&id=%7b{1}%7d&pagetype=entityrecord", ServerUrl, objectid.Id);
    var objectURL = "<a href=" + urlObj + ">" + entObject["name"] + "</a>";
    var urlNote = String.Format("https://{0}/main.aspx?etc=5&id=%7b{1}%7d&pagetype=entityrecord", ServerUrl, entity["annotationid"]);
    var noteURL = "<a href=" + urlObj + ">nota</a>";
 
    var email = new Email
    {
        To = new ActivityParty[] { toParty },
        From = new ActivityParty[] { fromParty },
        Subject = "Foi mencionado numa " + resp.EntityMetadata.DisplayName.UserLocalizedLabel.Label,
        Description = "Foi mencionado numa " + resp.EntityMetadata.DisplayName.UserLocalizedLabel.Label + " com o nome " + objectURL + ", veja a " + noteURL,
        DirectionCode = true
    };
    var emailGuid = service.Create(email);
 
    var sendEmailReq = new SendEmailRequest
    {
        EmailId = emailGuid,
        TrackingToken = "",
        IssueSend = true
    };
 
    var sendEmailResp = (SendEmailResponse)service.Execute(sendEmailReq);
}

Deste modo temos o nosso plugin finalizado, como vêm ficou um código bastante simples e com muitos pontos de melhoria que espero em breve complementar.

Até a próxima.

Tags: , ,

Addon Microsoft Dynamics CRM

by Pedro Azevedo 26. February 2014 21:38

Boas pessoal,

Uma das resoluções que tinha era contribuir com uma solução que permita melhorar o Dynamics CRM. Inspirado nos live tiles do Windows Phone e Windows 8, penso que ter uma visualização rápida e apelativa de um conjunto de registos. Sempre adorei a ideia de ter quadrados vivos (e penso que é um dos grandes diferenciativos que existe perante outros sistemas operativos móveis) sempre a mostrar informação e por essa razão quero implementar a mesma ideia dentro do Dynamics CRM.

A ideia deste post é apresentar como funcionará este “addon”. Comecei com um teste de conceito, veja este pequeno vídeo:

Depois de ter comprovado a sua utilidade vem o mais difícil, conseguir uma configuração o mais genérica possível. Como vimos no vídeo este addon pode ter quatro tipos de “quadrados”, denominados por live-tile:

  • ·         Flip
  • ·         Slide
  • ·         Carrousel
  • ·         Quadrante

Para além de escolher o tipo de live-tile teremos que escolher a entidade relacionada, ou seja, num cliente por exemplo queremos ver todas as oportunidades e propostas em aberto, contactos e um resumo das actividades, no fundo ter uma forma visual das subgrids.

Depois dentro de cada entidade relacionada a mostrar quais as propriedades que vamos querer mostrar.

Depois de configurar é só colocarmos o Recurso Web daquele tipo e já está. Vamos ver se consigo uma primeira versão no meio de Maio.

 

Até a próxima.

Tags: , , , ,

Ferramenta - Site Map Editor

by Pedro Azevedo 12. February 2014 23:47

 Boas pessoal,

Continuando a série sobre ferramentas, esta ferramenta permite editar o site map. Bom no CRM 2011 permitia mexer no menu a esquerda, no CRM 2013 serve para editar a Barra de Navegação. Eu vou demonstrar sobre a versão CRM 2013 mas é similar para a versão do CRM 2011.

A ferramenta que utilizo realizada pela Microsoft foi retirada do Pinpoint. Por isso o nosso amigo Scott Durow disponibilizou noutro sítio.

Depois de fazerem download da solução e a instalarem, terão esta entrada nas várias soluções:

Ao abrirmos esta solução, ele vai abrir no modo configuração e aparecer a página que permite editarmos o site map.

Aqui podemos adicionar\eliminar áreas, grupos e os próprios elementos aqui designados como subarea. Basicamente são os três botões mais a direita. O botão de save permite guardar as configurações mas não publica as alterações, por isso teremos que publicar todas as customizações. Outra funcionalidade que podermos reorganizar os vários elementos com um simples drag na drop.

Sobre cada elemento temos várias opções:

 

Aqui configuramos as áreas, em que costumamos a ter as áreas de Vendas, Marketing, Serviço, Definições e o Help. Ou seja são as seguintes áreas:

A seguir podemos definir as propriedades do grupo:

 

Podemos ver o grupo do MyWork (em português “O Meu Trabalho”):

Vejam que os vários elementos estão agrupados em grupos e tem o tútulo que configuramos. Podemos ver o outro grupo que é o grupo “Clientes”.

A seguir podemos ver os elementos em concreto:

 

 

Aqui temos mais opções para configurar, mas penso que todos intuitivos.

E é isto uma ferramenta simples mas muito útil. Existe pelo menos mais uma alternativa que ainda não explorei mas prometo que vou explorar e digo-vos alguma coisa. A alternativa está dentro de um conjunto de ferramentas muito poderosa que é a XRMToolbox. Eu já uso algumas destas ferramentas, muito úteis. Mas com certeza será o meu próximo alvo de análise.

Até a próxima.

Tags: , , ,

Ferramenta - Ribbon Workbench

by Pedro Azevedo 6. December 2013 08:05

 Boas pessoal,

Inicio agora formalmente uma nova série de posts, que tem como objetivo mostrar as várias ferramentas\utilitários\bibliotecas disponíveis para o CRM e que tem como objetivo auxiliar-nos no dia-a-dia. A primeira “vítima” foi a biblioteca XrmServiceToolkit.

Hoje vou apresentar uma ferramenta muito útil e que não se pode viver sem ela. Estou a falar da ferramenta Ribbon Workbench. Como o próprio nome denúncia serve para customizar a Ribbon. Existem outras alternativas, tais como, Ribbon Editor, Pragma Toolkit e Visual Ribbon Editor mas a que mais utilizo é realmente a Ribbon Workbench. Esta já suporta CRM 2013 as outras ferramentas não tenho a certeza.

Para instalar basta ir a página http://www.develop1.net/public/page/Ribbon-Workbench-for-Dynamics-CRM-2011.aspx aqui temos várias informações e podemos escolher sobre qual versão do CRM queremos trabalhar.

Em ambos os casos vai fazer download da solução que devemos instalar na nossa organização. Depois de instalarmos a solução devemos ter a seguinte visualização:

Para aceder é selecionar o botão “Personalizado” no CRM 2011 tem o seguinte aspecto:

Depois de entrarmos no Ribbon Workbench temos que escolher a solução quer queremos customizar, por isso, já temos que ter criado uma solução e que esta inclua a entidade sobre a qual queremos customizar a ribbon, neste caso concreto adicionei a entidade Proposta (quote).

 

Depois de carregar a solução temos o seguinte aspecto:

Vamos então analisar cada uma destas secções individualmente:

 

Aqui vemos quais os botões que são possíveis de ver nas várias visualizações:

·         Home – é o menu que é mostrado nos ecrãs principais.

·         Sub-Grid – menu que é mostrado quando selecionamos uma subgrid, ou seja, no CRM 2011 sempre que selecionavamos uma subgrid a ribbon mudava para o contexto da entidade da subgird. No CRM 2013 não existe esta funcionalidade. Quer dizer existir existe por exemplo quando estamos num cliente e se virmos a lista de contactos:

 

Quando carregamos na lista aparece a lista em baixo:

 

Onde aqui aparece este menu.

·         Form – menu que aparece quando abrimos um registo de uma entidade.

De referir que temos a opção de ver a ribbon que aparece no cliente para o Outlook e que por ter a mesma estrutura que a barra de comandos e como vamos ver em futuros posts nós conseguimos recorrendo a ribbon acrescentar botões que não existem na barra de comandos.

Na próxima secção mostra os vários controlos que poderemos inserir na barra de comandos:

 

O tab permite agrupar botões, a tab scale define como os botões mudam quando existem retrições de tamanho. O grupo permite dar contexto a um conjunto de botões dentro de um determinado tab. E depois os vários tipos de botões, ou seja, Button, Split Button e Flyout. O Menu Section é o chamado Jewel Menu, que basicamente é o menu File que aparece no CRM 2011.

No CRM 2013 temos mais algumas definições. Na imagem estamos a ver a barra de comandos que pode mostrar até 5 comandos, os três pontos permite expandir as opções e é designado por overflow. Dentro da barra de comandos podemos ver os botões “normais”, os botões flyout podem estar dentro da barra de comandos e dentro do overflow:

 

Na secção final que vamos analisar temos as acções que poderemos realizar sobre os botões:

 

Na lista de entidades vemos as entidades que estavam na solução que escolhemos quando lançamos a ferramenta. Na lista ao lado temos os elementos da solução, incluindo os comandos que são executados, bem como as regras de mostrar ou não os botões. Este assunto dava para um livro por isso eu demonstrando nos vários posts que pretendo criar.

A última lista estão as propriedades dos elementos gráficos ou dos comandos ou regras.

A última acção e a mais importante é publicarmos as mudanças que realizamos, para isso basta carregar no botão "Publish".

Espero que tenham ficado com uma ideia desta magnifica ferramenta, um bem haja ao Scott Durow. Em futuros posts eu vou demonstrar como podemos acrescentar, esconder botões.

Até a próxima.

Tags: , , ,

Biblioteca XrmServiceToolkit

by Pedro Azevedo 5. January 2013 23:17

Boas pessoal,

Hoje queria ressalvar um grande projeto oferecido a comunidade. É a biblioteca XrmServiceToolkit que podemos fazer download daqui: https://xrmservicetoolkit.codeplex.com/.

Esta biblioteca que tem um ficheiro único XrmServiceToolkit.js e basta colocar como Recurso Web. Nela temos funções genéricas, SOAP ou REST e que esconde toda a construção destas chamadas e que ajuda muito especialmente em requisições SOAP. Existe também os chamados métodos extendidos que permite por exemplo trabalhar com OptionSet dependentes.

Temos a possibilidade de fazermos estas chamadas síncronas ou assíncronas. Para além de suportar qualquer deploy do Dynamics CRM 2011 (On-Prem; IFD e Online)

Em resumo um espectáculo e mais qualquer alteração por exemplo na questão de suportar outros browsers e não podermos usar esta declaração var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"), esta biblioteca foi logo atualizada por isso só mudou um sitio.

 

Esta biblioteca depende de outras duas bibliotecas jQuery e JSON. Vocês podem ver as versões necessárias no site que referi.

Exemplo funções genéricas:

XrmServiceToolkit.Common.enableField(fieldName);

Exemplo Actualizar REST:

var account = {};
account.Name = "My Name";
account.Address1_City = "Lisboa";
account.Address1_Line1 = "Minha Rua";
account.EMailAddress1 = "psa@psazevedo.com";

XrmServiceToolkit.Rest.Update(
	accountId,
	account,
	"AccountSet",
	function () {
		alert("Foi atualizado");
	},
	function (error) {
		alert("ups... Erro")
	},
	false
);


Exemplo Retorno Múltiplo em REST:

XrmServiceToolkit.Rest.RetrieveMultiple(
    "ContactSet",
    "$select=ContactId, FullName",
    function (results) {
        alert(results.length);
        var fullname = results[0].FullName;
        alert(fullname);
    },
    function (error) {
        alert(error)
    },
    function onComplete() {
        alert('completed')
    },
    false
);

Exemplo Criação em SOAP:

var createContact = new XrmServiceToolkit.Soap.BusinessEntity("contact");
createContact.attributes["firstname"] = "Pedro";
createContact.attributes["lastname"] = "Azevedo";
createContact.attributes["gendercode"] = { value: 2, type: "OptionSetValue" };
createContact.attributes["birthdate"] = birthDate;
createContact.attributes["donotemail"] = true;
createContact.attributes["donotphone"] = false;
createContact.attributes["parentcustomerid"] = { id: accountId, logicalName: "account", type: "EntityReference" };
contactId = XrmServiceToolkit.Soap.Create(createContact);

Exemplo Pesquisa pelo ID:

var contactid = Xrm.Page.getAttribute("primarycontactid").getValue()[0].id;
var cols = ["firstname", "lastname", "middlename", "familystatuscode"];
var retrievedContact = XrmServiceToolkit.Soap.Retrieve("contact", contactid, cols);
alert(retrievedContact.attributes['lastname'].value);

Aproveitem estas benesses que a comunidade nos dá. Futuramente irei falar de outras bilbliotecas\ferramentas para nos auxiliar no dia-a-dia. Um bem haja ao Jaimie.

Até a próxima

Tags: , , , ,

Ativar o trace no Dynamics CRM

by Pedro Azevedo 21. December 2012 03:36

Boas pessoal,

Uma das primeiras coisas que aprendi quando comecei a mexer no Dynamics CRM foi ativar o trace, para controlar erros que não se apanham na interface gráfica e para ver detalhes de erros reportados pelos utilizadores.

Trace CRM Dynamics

Para ativar o trace “basta” ir ao registry e mudar uma chave. O caminho do registry é este: HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\MSCRM e muda-se a chave TraceEnabled para 1. Quando é activado os logs vão para esta diretoria: C:\Program Files\Microsoft Dynamics CRM\Trace.

 

Costumo utilizar uma ferramenta para gerir estes logs: https://crmdiagtool2011.codeplex.com/. Lanço aqui um alerta para termos cuidado com o crescimento dos logs no disco. Se deixarmos muito tempo pode assumir rapidamente alguns GBs.

Event Viewer

Outro sítio onde costumo controlar erros que acontecem no CRM é no Event Viewer vejam aqui um exemplo.

 

Existem outros logs, que são "automáticos" pelos menos por defeito. Aqui vão a localização destes mesmos logs:

Reporting Services

%programfiles%\Microsoft SQL Server\MSRS10_50.(INSTANCENAME)\Reporting Services\LogFiles

Outlook

Outlook (Máquina do cliente) ou Logs de Instalação: Users\<User>\AppData\Roaming\Microsoft\MSCRM\Logs (Por vezes em alguma máquinas em vez de Roaming é Local penso que tenha a ver com a versão do windows):

 

PS: Tenciono melhorar este post com os logs de instalação, outlook, etc.

Email Router

Para o email router temos que ir a pasta de instalação C:\Program Files\Microsoft CRM Email\Service teremos que encontrar um ficheiro Microsoft.CRM.Tools.EmailAgent.xml. Dentro deste ficheiro temos o seguinte código:

<ConfigUpdatePeriod>3600000</ConfigUpdatePeriod>
<LogLevel>1</LogLevel>
<LogFile></LogFile>

Dentro deste XML colocamos colocamos o LogLevel a 3 e colocarmos um caminho para o log, por exemplo: C:\Program Files\Microsoft CRM Email\Setup\log.txt

 

Até a próxima.

Tags: , , ,

About

Muito bem casado, Pai babado e um gosto muito grande pela tecnologia.

Tenho um lema "Sharing is Learning"

Mais aqui -> http://www.psazevedo.com

Month List