Example #1
0
        /// <summary>
        /// Calculates (or re-calculates) the requirements, then updates the results on the UI
        /// </summary>
        private void CalculateRequirements()
        {
            var rockContext = new RockContext();
            var groupMember = new GroupMemberService(rockContext).Get(hfGroupMemberId.Value.AsInteger());

            if (groupMember != null && !groupMember.IsNewOrChangedGroupMember(rockContext))
            {
                groupMember.CalculateRequirements(rockContext, true);
            }

            ShowGroupRequirementsStatuses();
        }
        /// <summary>
        /// Execute method to check for any workflows to launch and will also recalculate group member requirements when a member is added
        /// </summary>
        public void Execute()
        {
            // if a GroupMember is getting added, call CalculateRequirements to make sure that group member requirements are calculated (if the group has requirements)
            if (State == EntityState.Added || (PreviousIsArchived && IsArchived != PreviousIsArchived))
            {
                if (GroupMemberGuid.HasValue)
                {
                    using (var rockContext = new RockContext())
                    {
                        var groupMember = new GroupMemberService(rockContext).Get(GroupMemberGuid.Value);
                        if (groupMember != null)
                        {
                            groupMember.CalculateRequirements(rockContext, true);
                        }
                    }
                }
            }

            GroupMemberWorkflowTriggerType[] groupMemberWorkflowChangeTriggers = new GroupMemberWorkflowTriggerType[] { GroupMemberWorkflowTriggerType.MemberAddedToGroup, GroupMemberWorkflowTriggerType.MemberRemovedFromGroup, GroupMemberWorkflowTriggerType.MemberStatusChanged, GroupMemberWorkflowTriggerType.MemberRoleChanged };

            // Verify that valid ids were saved
            if (GroupId.HasValue && PersonId.HasValue)
            {
                // Get all the triggers from cache
                var cachedTriggers = GroupMemberWorkflowTriggerService.GetCachedTriggers();

                // If any triggers exist
                if (cachedTriggers != null && cachedTriggers.Any())
                {
                    // Get the ACTIVE group member triggers associated to the group
                    var groupTriggers = cachedTriggers
                                        .Where(w =>
                                               groupMemberWorkflowChangeTriggers.Contains(w.TriggerType) &&
                                               w.IsActive &&
                                               w.GroupId.HasValue &&
                                               w.GroupId.Value == GroupId.Value)
                                        .OrderBy(w => w.Order)
                                        .ToList();

                    // Get any ACTIVE triggers associated to a group type ( if any are found, will then filter by group type )
                    var groupTypeTriggers = cachedTriggers
                                            .Where(w =>
                                                   groupMemberWorkflowChangeTriggers.Contains(w.TriggerType) &&
                                                   w.IsActive &&
                                                   w.GroupTypeId.HasValue)
                                            .OrderBy(w => w.Order)
                                            .ToList();

                    if (groupTriggers.Any() || groupTypeTriggers.Any())
                    {
                        using (var rockContext = new RockContext())
                        {
                            // If there were any group type triggers, will now need to read the group's group type id
                            // and then further filter these triggers by the current transaction's group type
                            if (groupTypeTriggers.Any())
                            {
                                // Get the current transaction's group type id
                                if (!GroupTypeId.HasValue)
                                {
                                    GroupTypeId = new GroupService(rockContext)
                                                  .Queryable().AsNoTracking()
                                                  .Where(g => g.Id == GroupId.Value)
                                                  .Select(g => g.GroupTypeId)
                                                  .FirstOrDefault();
                                }

                                // Further filter the group type triggers by the group type id
                                groupTypeTriggers = groupTypeTriggers
                                                    .Where(t =>
                                                           t.GroupTypeId.HasValue &&
                                                           t.GroupTypeId.Equals(GroupTypeId))
                                                    .OrderBy(t => t.Order)
                                                    .ToList();
                            }

                            // Combine group and group type triggers
                            var triggers = groupTriggers.Union(groupTypeTriggers).ToList();

                            // If any triggers were found
                            if (triggers.Any())
                            {
                                // Loop through triggers and launch appropriate workflow
                                foreach (var trigger in triggers)
                                {
                                    switch (trigger.TriggerType)
                                    {
                                    case GroupMemberWorkflowTriggerType.MemberAddedToGroup:
                                    {
                                        if (State == EntityState.Added && QualifiersMatch(rockContext, trigger, GroupMemberStatus, GroupMemberStatus, GroupMemberRoleId, GroupMemberRoleId))
                                        {
                                            LaunchWorkflow(rockContext, trigger.WorkflowTypeId, trigger.Name);
                                        }
                                        break;
                                    }

                                    case GroupMemberWorkflowTriggerType.MemberRemovedFromGroup:
                                    {
                                        if (State == EntityState.Deleted && QualifiersMatch(rockContext, trigger, PreviousGroupMemberStatus, PreviousGroupMemberStatus, PreviousGroupMemberRoleId, PreviousGroupMemberRoleId))
                                        {
                                            LaunchWorkflow(rockContext, trigger.WorkflowTypeId, trigger.Name);
                                        }
                                        break;
                                    }

                                    case GroupMemberWorkflowTriggerType.MemberRoleChanged:
                                    {
                                        if (State == EntityState.Modified && PreviousGroupMemberRoleId != GroupMemberRoleId && QualifiersMatch(rockContext, trigger, PreviousGroupMemberRoleId, GroupMemberRoleId))
                                        {
                                            LaunchWorkflow(rockContext, trigger.WorkflowTypeId, trigger.Name);
                                        }
                                        break;
                                    }

                                    case GroupMemberWorkflowTriggerType.MemberStatusChanged:
                                    {
                                        if (State == EntityState.Modified && PreviousGroupMemberStatus != GroupMemberStatus && QualifiersMatch(rockContext, trigger, PreviousGroupMemberStatus, GroupMemberStatus))
                                        {
                                            LaunchWorkflow(rockContext, trigger.WorkflowTypeId, trigger.Name);
                                        }
                                        break;
                                    }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }