Esempio n. 1
0
        private static int LoadByGuid2(Guid guid, RockContext rockContext)
        {
            var workflowActivityTypeService = new WorkflowActivityTypeService(rockContext);

            return(workflowActivityTypeService
                   .Queryable().AsNoTracking()
                   .Where(c => c.Guid.Equals(guid))
                   .Select(c => c.Id)
                   .FirstOrDefault());
        }
Esempio n. 2
0
        private static WorkflowActivityTypeCache LoadById2(int id, RockContext rockContext)
        {
            var workflowActivityTypeService = new WorkflowActivityTypeService(rockContext);
            var workflowActivityTypeModel   = workflowActivityTypeService
                                              .Queryable()
                                              .Where(t => t.Id == id)
                                              .FirstOrDefault();

            if (workflowActivityTypeModel != null)
            {
                return(new WorkflowActivityTypeCache(workflowActivityTypeModel));
            }

            return(null);
        }
        /// <summary>
        /// Handles the Click event of the btnSave control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void btnSave_Click(object sender, EventArgs e)
        {
            WorkflowType        workflowType;
            WorkflowTypeService service = new WorkflowTypeService();

            int workflowTypeId = int.Parse(hfWorkflowTypeId.Value);

            if (workflowTypeId == 0)
            {
                workflowType          = new WorkflowType();
                workflowType.IsSystem = false;
                workflowType.Name     = string.Empty;
            }
            else
            {
                workflowType = service.Get(workflowTypeId);
            }

            workflowType.Name        = tbName.Text;
            workflowType.Description = tbDescription.Text;
            workflowType.CategoryId  = cpCategory.SelectedValueAsInt();
            workflowType.Order       = int.Parse(tbOrder.Text);
            workflowType.WorkTerm    = tbWorkTerm.Text;
            if (!string.IsNullOrWhiteSpace(tbProcessingInterval.Text))
            {
                workflowType.ProcessingIntervalSeconds = int.Parse(tbProcessingInterval.Text);
            }

            workflowType.IsPersisted  = cbIsPersisted.Checked;
            workflowType.LoggingLevel = ddlLoggingLevel.SelectedValueAsEnum <WorkflowLoggingLevel>();
            workflowType.IsActive     = cbIsActive.Checked;

            if (!Page.IsValid)
            {
                return;
            }

            if (!workflowType.IsValid)
            {
                // Controls will render the error messages
                return;
            }

            RockTransactionScope.WrapTransaction(() =>
            {
                List <WorkflowActivityTypeEditor> workflowActivityTypeEditorList = phActivities.Controls.OfType <WorkflowActivityTypeEditor>().ToList();

                // delete WorkflowActionTypes that aren't assigned in the UI anymore
                WorkflowActionTypeService workflowActionTypeService = new WorkflowActionTypeService();
                List <WorkflowActionType> actionTypesInDB           = workflowActionTypeService.Queryable().Where(a => a.ActivityType.WorkflowTypeId.Equals(workflowType.Id)).ToList();
                List <WorkflowActionType> actionTypesInUI           = new List <WorkflowActionType>();
                foreach (WorkflowActivityTypeEditor workflowActivityTypeEditor in workflowActivityTypeEditorList)
                {
                    foreach (WorkflowActionTypeEditor editor in workflowActivityTypeEditor.Controls.OfType <WorkflowActionTypeEditor>())
                    {
                        actionTypesInUI.Add(editor.WorkflowActionType);
                    }
                }

                var deletedActionTypes = from actionType in actionTypesInDB
                                         where !actionTypesInUI.Select(u => u.Guid).Contains(actionType.Guid)
                                         select actionType;

                deletedActionTypes.ToList().ForEach(actionType =>
                {
                    workflowActionTypeService.Delete(actionType, CurrentPersonId);
                    workflowActionTypeService.Save(actionType, CurrentPersonId);
                });

                // delete WorkflowActivityTypes that aren't assigned in the UI anymore
                WorkflowActivityTypeService workflowActivityTypeService = new WorkflowActivityTypeService();
                List <WorkflowActivityType> activityTypesInDB           = workflowActivityTypeService.Queryable().Where(a => a.WorkflowTypeId.Equals(workflowType.Id)).ToList();
                List <WorkflowActivityType> activityTypesInUI           = workflowActivityTypeEditorList.Select(a => a.GetWorkflowActivityType()).ToList();

                var deletedActivityTypes = from activityType in activityTypesInDB
                                           where !activityTypesInUI.Select(u => u.Guid).Contains(activityType.Guid)
                                           select activityType;

                deletedActivityTypes.ToList().ForEach(activityType =>
                {
                    workflowActivityTypeService.Delete(activityType, CurrentPersonId);
                    workflowActivityTypeService.Save(activityType, CurrentPersonId);
                });

                // add or update WorkflowActivityTypes(and Actions) that are assigned in the UI
                int workflowActivityTypeOrder = 0;
                foreach (WorkflowActivityTypeEditor workflowActivityTypeEditor in workflowActivityTypeEditorList)
                {
                    WorkflowActivityType editorWorkflowActivityType = workflowActivityTypeEditor.GetWorkflowActivityType();
                    WorkflowActivityType workflowActivityType       = workflowType.ActivityTypes.FirstOrDefault(a => a.Guid.Equals(editorWorkflowActivityType.Guid));

                    if (workflowActivityType == null)
                    {
                        workflowActivityType = editorWorkflowActivityType;
                        workflowType.ActivityTypes.Add(workflowActivityType);
                    }
                    else
                    {
                        workflowActivityType.Name                    = editorWorkflowActivityType.Name;
                        workflowActivityType.Description             = editorWorkflowActivityType.Description;
                        workflowActivityType.IsActive                = editorWorkflowActivityType.IsActive;
                        workflowActivityType.IsActivatedWithWorkflow = editorWorkflowActivityType.IsActivatedWithWorkflow;
                    }

                    workflowActivityType.Order = workflowActivityTypeOrder++;

                    int workflowActionTypeOrder = 0;
                    foreach (WorkflowActionTypeEditor workflowActionTypeEditor in workflowActivityTypeEditor.Controls.OfType <WorkflowActionTypeEditor>())
                    {
                        WorkflowActionType editorWorkflowActionType = workflowActionTypeEditor.WorkflowActionType;
                        WorkflowActionType workflowActionType       = workflowActivityType.ActionTypes.FirstOrDefault(a => a.Guid.Equals(editorWorkflowActionType.Guid));
                        if (workflowActionType == null)
                        {
                            workflowActionType = editorWorkflowActionType;
                            workflowActivityType.ActionTypes.Add(workflowActionType);
                        }
                        else
                        {
                            workflowActionType.Name         = editorWorkflowActionType.Name;
                            workflowActionType.EntityTypeId = editorWorkflowActionType.EntityTypeId;
                            workflowActionType.IsActionCompletedOnSuccess   = editorWorkflowActionType.IsActionCompletedOnSuccess;
                            workflowActionType.IsActivityCompletedOnSuccess = editorWorkflowActionType.IsActivityCompletedOnSuccess;
                            workflowActionType.Attributes      = editorWorkflowActionType.Attributes;
                            workflowActionType.AttributeValues = editorWorkflowActionType.AttributeValues;
                        }


                        workflowActionType.Order = workflowActionTypeOrder++;
                    }
                }

                if (workflowType.Id.Equals(0))
                {
                    service.Add(workflowType, CurrentPersonId);
                }

                service.Save(workflowType, CurrentPersonId);

                foreach (var activityType in workflowType.ActivityTypes)
                {
                    foreach (var workflowActionType in activityType.ActionTypes)
                    {
                        Rock.Attribute.Helper.SaveAttributeValues(workflowActionType, CurrentPersonId);
                    }
                }
            });

            var qryParams = new Dictionary <string, string>();

            qryParams["workflowTypeId"] = workflowType.Id.ToString();
            NavigateToPage(RockPage.Guid, qryParams);
        }
Esempio n. 4
0
        /// <summary>
        /// Executes the specified workflow.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="action">The action.</param>
        /// <param name="entity">The entity.</param>
        /// <param name="errorMessages">The error messages.</param>
        /// <returns></returns>
        public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages)
        {
            errorMessages = new List <string>();

            double hoursElapsed = HoursElapsed(action);
            string emailStatus  = EmailStatus(action);

            if (hoursElapsed <= 0)
            {
                SendEmail(rockContext, action);
            }
            else
            {
                var timedOut = false;

                var activityTypeService = new WorkflowActivityTypeService(rockContext);

                WorkflowActivityType unopenedActivityType = null;
                int? unopenedTimeout = null;
                Guid?guid            = GetAttributeValue(action, "UnopenedTimeoutActivity").AsGuidOrNull();
                if (guid.HasValue)
                {
                    unopenedActivityType = activityTypeService.Queryable().Where(a => a.Guid.Equals(guid.Value)).FirstOrDefault();
                    unopenedTimeout      = GetAttributeValue(action, "UnopenedTimeoutLength").AsIntegerOrNull();

                    if (emailStatus != OPENED_STATUS &&
                        emailStatus != CLICKED_STATUS &&
                        unopenedActivityType != null &&
                        unopenedTimeout.HasValue &&
                        unopenedTimeout.Value < hoursElapsed)
                    {
                        action.AddLogEntry("Unopened Timeout Occurred", true);
                        WorkflowActivity.Activate(unopenedActivityType, action.Activity.Workflow, rockContext);
                        timedOut = true;
                    }
                }

                WorkflowActivityType noActionActivityType = null;
                int?noActionTimeout = null;
                guid = GetAttributeValue(action, "NoActionTimeoutActivity").AsGuidOrNull();
                if (guid.HasValue)
                {
                    noActionActivityType = activityTypeService.Queryable().Where(a => a.Guid.Equals(guid.Value)).FirstOrDefault();
                    noActionTimeout      = GetAttributeValue(action, "NoActionTimeoutLength").AsIntegerOrNull();

                    if (emailStatus != CLICKED_STATUS &&
                        noActionActivityType != null &&
                        noActionTimeout.HasValue &&
                        noActionTimeout.Value < hoursElapsed)
                    {
                        action.AddLogEntry("No Action Timeout Occurred", true);
                        WorkflowActivity.Activate(noActionActivityType, action.Activity.Workflow, rockContext);
                        timedOut = true;
                    }
                }

                if (timedOut)
                {
                    UpdateEmailStatus(action.Guid, TIMEOUT_STATUS, string.Empty, rockContext, false);
                    return(true);
                }
            }

            return(false);
        }