/// <summary> /// Execute FetchXMl query to retrieve related data /// </summary> /// <param name="relatedQuery">Related query</param> /// <param name="primaryEntity">primary entity</param> /// <param name="parameters">list of parameters attribute</param> /// <param name="filter">list of filter which need to apply</param> /// <param name="service">organization service</param> /// <returns>collection of related entities</returns> internal static EntityCollection RetrieveRelatedEntity(Entity relatedQuery, Entity primaryEntity, Dictionary <string, dynamic> parameters, List <QueryFilter> filter, IOrganizationService service) { if (relatedQuery.Contains("didd_query") && relatedQuery.Contains("didd_sequencenumber")) { // Query string in from of fetchXMl string queryString = Convert.ToString(relatedQuery.Attributes["didd_query"], CultureInfo.InvariantCulture); // Replace Placeholder in query string string query = NotificationTokenReplacer.ReplacePlaceHolders(null, primaryEntity, parameters, string.Empty, queryString); // get filter to apply for query string var queryFilter = filter.Where(x => x.SequenceNumber == (int)relatedQuery.Attributes["didd_sequencenumber"]).OrderBy(o => o.SubsequenceNumber).ToList <QueryFilter>(); // add filter in query string List <string> param = new List <string>(); foreach (var lst in queryFilter) { param.Add(lst.Value); } // Execute query string FetchExpression fetchQuery = new FetchExpression(string.Format(CultureInfo.InvariantCulture, query, param.ToArray <string>())); return(service.RetrieveMultiple(fetchQuery)); } else { throw new InvalidPluginExecutionException(string.Format(CultureInfo.InvariantCulture, "Notification Template Data Query is not configured properly. Please contact administrator.")); } }
/// <summary> /// Get Party List through custom query /// </summary> /// <param name="customQuery">custom query</param> /// <param name="primaryEntity">primary record</param> /// <param name="parameters">list of parameters attribute</param> /// <param name="service">organization service</param> /// <returns>collection of custom party</returns> internal static EntityCollection GetCustomPartyList(string customQuery, Entity primaryEntity, Dictionary <string, dynamic> parameters, IOrganizationService service) { // execute fetch query dynamically for custom party list string fetchPartyListQuery = NotificationTokenReplacer.ReplacePlaceHolders(null, primaryEntity, parameters, null, customQuery); FetchExpression fetchQuery = new FetchExpression(fetchPartyListQuery); return(service.RetrieveMultiple(fetchQuery)); }
/// <summary> /// Create Email /// </summary> /// <param name="relatedEntity">Related entity</param> /// <param name="toParty">Email to</param> /// <param name="carbonCopyParty">Email carbon copy</param> /// <param name="bccParty">Email blank carbon copy</param> /// <param name="task">created task entity</param> /// <param name="globalConfiguration">global config details</param> /// <param name="emailObject">email object</param> /// <returns>created email record id</returns> internal static Entity CreateEmailInstance(Entity relatedEntity, List <PartyList> toParty, List <PartyList> carbonCopyParty, List <PartyList> bccParty, Entity task, Dictionary <string, dynamic> globalConfiguration, Entity emailObject) { // initialize email entity components var fromActivityParty = new EntityCollection(); var toActivityParty = new EntityCollection(); var carbonCopyActivityParty = new EntityCollection(); var bccActivityParty = new EntityCollection(); // get email instance Entity email = null; if (emailObject == null) { email = new Entity("email"); } else { email = emailObject; } // Add email subject if (relatedEntity.Contains("emailsubject")) { email.Attributes["subject"] = (string)relatedEntity.Attributes["emailsubject"]; } // Add From Entity activityParty = new Entity("activityparty"); activityParty.Attributes["partyid"] = (EntityReference)globalConfiguration["SendEmailFrom"]; fromActivityParty.Entities.Add(activityParty); // Add to in activity party list foreach (PartyList lst in toParty) { Entity activityparty = new Entity("activityparty"); activityparty.Attributes["partyid"] = lst.PartyId; toActivityParty.Entities.Add(activityparty); } // Add cc in activity party list foreach (PartyList lst in carbonCopyParty) { Entity activityparty = new Entity("activityparty"); activityparty.Attributes["partyid"] = lst.PartyId; carbonCopyActivityParty.Entities.Add(activityparty); } // add bcc in activity party list foreach (PartyList lst in bccParty) { Entity activityparty = new Entity("activityparty"); activityparty.Attributes["partyid"] = lst.PartyId; bccActivityParty.Entities.Add(activityparty); } if (toActivityParty.Entities.Count > 0) { email.Attributes["to"] = toActivityParty; } if (carbonCopyActivityParty.Entities.Count > 0) { email.Attributes["cc"] = carbonCopyActivityParty; } if (bccActivityParty.Entities.Count > 0) { email.Attributes["bcc"] = bccActivityParty; } if (fromActivityParty.Entities.Count > 0) { email.Attributes["from"] = fromActivityParty; } // add email description if (task == null && relatedEntity.Contains("emaildescription")) { email.Attributes["description"] = (string)relatedEntity.Attributes["emaildescription"]; } else if (task != null && relatedEntity.Contains("emaildescription")) { // if task is associated with email, then add task URL string taskURL = NotificationTokenReplacer.ReplaceURL(task, (string)globalConfiguration["RecordBaseURL"]); string emailDescription = (string)relatedEntity.Attributes["emaildescription"]; emailDescription = emailDescription.Replace("{!%URL}", taskURL); email.Attributes["description"] = emailDescription; } // add regarding if (relatedEntity.Contains("regarding")) { email.Attributes["regardingobjectid"] = (EntityReference)relatedEntity.Attributes["regarding"]; } // Guid emailId = service.Create(email); return(email); }
/// <summary> /// Send Notifications to stake holders based on Configuration data /// </summary> /// <param name="pluginContext">execution context</param> /// <param name="service">organization service</param> /// <param name="tracing">tracing service</param> public void SendNotifications(IExecutionContext pluginContext, IOrganizationService service, ITracingService tracing) { if (tracing == null || pluginContext == null || service == null) { return; } tracing.Trace(string.Format(CultureInfo.InvariantCulture, "{0}: Entering NotifyStakeHolders.", "PostNotifyHelper")); tracingService = tracing; // get Notification global configuration data this.globalConfiguration = NotificationDataContext.GetNotificationGlobalData(service); // Extracting Input parameter from Action Guid recordId = new Guid((string)pluginContext.InputParameters["EntityRecordId"]); string filterCondition = (string)pluginContext.InputParameters["FilterCondition"]; string templateValue = (string)pluginContext.InputParameters["TemplateId"]; string entityLogicalName = (string)pluginContext.InputParameters["EntityLogicalName"]; string parameterCollections = (string)pluginContext.InputParameters["ParameterCollections"]; string partyListParameters = (string)pluginContext.InputParameters["PartyListParameters"]; if (string.IsNullOrEmpty(parameterCollections)) { parameterCollections = "[]"; } if (string.IsNullOrEmpty(partyListParameters)) { partyListParameters = "[]"; } tracingService.Trace("Party List Parameters :- " + partyListParameters); Dictionary <string, dynamic> parameter = (Dictionary <string, dynamic>)JsonHelper.GetObject(parameterCollections, new Dictionary <string, dynamic>().GetType()); Guid templateId = NotificationDataContext.GetNotificationTemplateId(templateValue, service); List <QueryFilter> filter = NotificationDataContext.GetFilterCriteria(filterCondition); Entity primaryEntity = NotificationDataContext.GetPrimaryEntity(entityLogicalName, recordId, service); // Get Notification Template Entity data EntityCollection notificationTemplate = NotificationDataContext.RetrieveNotificationTemplate(templateId, service); // Get Notification Template Query Entity data EntityCollection relatedQueries = NotificationDataContext.RetrieveRelatedQueries(templateId, service); int countQueries = relatedQueries.Entities.Count; List <Entity> relatedEntities = new List <Entity>(); // if no related entity is found, work on primary entity if (countQueries == 0) { relatedQueries = new EntityCollection(); relatedQueries.EntityName = entityLogicalName; relatedQueries.Entities.Add(primaryEntity); relatedEntities.AddRange(relatedQueries.Entities); } // Execute Related Queries for (int i = 0; i < countQueries; i++) { var relatedEntityColl = NotificationDataContext.RetrieveRelatedEntity(relatedQueries.Entities[i], primaryEntity, parameter, filter, service); if (relatedEntityColl.Entities.Count > 0) { relatedEntities.AddRange(relatedEntityColl.Entities); } } // remove duplicates from related Query relatedEntities = relatedEntities.GroupBy(x => x.Id).Select(r => r.First()).ToList <Entity>(); Guid?emailTemplateId = null; int? emailTemplateOption = null; if (notificationTemplate[0].Contains("didd_emailtemplate") && notificationTemplate[0].Contains("didd_emailtemplateoption")) { emailTemplateId = RenderEmailTemplate.GetTemplateId((string)notificationTemplate[0].Attributes["didd_emailtemplate"], service); emailTemplateOption = ((OptionSetValue)notificationTemplate[0].Attributes["didd_emailtemplateoption"]).Value; } if (relatedEntities == null || relatedEntities.Count == 0) { // no relatedentities records found return; } // Get setup data from notification template bool isTask = (bool)notificationTemplate.Entities[0].Attributes["didd_task"]; bool isEmail = (bool)notificationTemplate.Entities[0].Attributes["didd_email"]; bool isSendEmail = (bool)notificationTemplate.Entities[0].Attributes["didd_sendemail"]; // Replace token in notification template NotificationTokenReplacer ndr = new NotificationTokenReplacer(); ndr.ReplaceTemplateData(primaryEntity, relatedEntities, parameter, notificationTemplate.Entities[0], this.globalConfiguration["RecordBaseURL"]); // Get all party List defined in notification template party List <PartyList> partylist = NotificationPartyHandler.GetTemplateParties(notificationTemplate, primaryEntity, parameter, partyListParameters, this.globalConfiguration, service); if (isTask && isEmail) { // Create Email and task both and embed link of task into email EntityCollection entColl = NotificationPartyHandler.GenerateEmailAndTask(relatedEntities, partylist, this.globalConfiguration, emailTemplateId, emailTemplateOption, service); RenderEmailTemplate.ProcessEmail(entColl, isSendEmail, emailTemplateId, emailTemplateOption, service); } else if (isTask && !isEmail) { // Create task NotificationPartyHandler.GenerateTask(relatedEntities, partylist, service); } else if (!isTask && isEmail) { // Create Email EntityCollection entColl = NotificationPartyHandler.GenerateEmail(relatedEntities, partylist, this.globalConfiguration, emailTemplateId, emailTemplateOption, service); RenderEmailTemplate.ProcessEmail(entColl, isSendEmail, emailTemplateId, emailTemplateOption, service); } tracingService.Trace(string.Format(CultureInfo.InvariantCulture, "{0}: Exiting NotifyStakeHolders.", "PostNotifyHelper")); }