/// <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);
        }
Beispiel #4
0
        /// <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"));
        }