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: , ,

Slides do Evento comunidade Office 365

by Administrator 14. November 2015 17:35

Boas pessoal,

Como sempre deixo aqui os slides que me serviram de suporte para a apresentação na Comunidade Office 365, foi referente a 5ª reunião desta comunidade que se realizou ontem.

Espero que tenham gostado.

Até a próxima

Tags: , ,

Participação na Comunidade Office 365

by Administrator 4. November 2015 12:32

Boas pessoal,

É com grande orgulho que anuncio que vou participar como orador na 5ª reunião da Comunidade Office 365 com o tema “Dynamics CRM com Office 365”. Esta reunião ocorrerá no dia 14 de Novembro.

O objetivo será falar como é que o Dynamics CRM tira proveito do Office 365.

Apareçam, sei que custa mas vale a pena Smile

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