/// <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>(); Guid? groupGuid = null; string filterValue = string.Empty; string filterKey = string.Empty; // get the group attribute groupGuid = GetAttributeValue(action, "SelectionGroup").AsGuid(); if (!groupGuid.HasValue) { errorMessages.Add("The selection group could not be found!"); } // get filter key filterKey = GetAttributeValue(action, "GroupMemberAttributeKey"); // get the filter value filterValue = GetAttributeValue(action, "FilterValue"); Guid?filterValueGuid = filterValue.AsGuidOrNull(); if (filterValueGuid.HasValue) { filterValue = action.GetWorklowAttributeValue(filterValueGuid.Value); } else { filterValue = filterValue.ResolveMergeFields(GetMergeFields(action)); } // get group members var qry = new GroupMemberService(rockContext).Queryable().AsNoTracking() .Where(g => g.Group.Guid == groupGuid); if (!string.IsNullOrWhiteSpace(filterKey)) { qry = qry.WhereAttributeValue(rockContext, filterKey, filterValue); } var groupMembers = qry.Select(g => new { g.Person.NickName, g.Person.LastName, g.Person.SuffixValueId, PrimaryAliasGuid = g.Person.Aliases.FirstOrDefault().Guid }) .ToList(); if (groupMembers.Count() > 0) { // get random group member from options Random rnd = new Random(); int r = rnd.Next(groupMembers.Count); var selectedGroupMember = groupMembers[r]; // set value Guid selectPersonGuid = GetAttributeValue(action, "SelectedPerson").AsGuid(); if (!selectPersonGuid.IsEmpty()) { var selectedPersonAttribute = AttributeCache.Read(selectPersonGuid, rockContext); if (selectedPersonAttribute != null) { // If this is a person type attribute if (selectedPersonAttribute.FieldTypeId == FieldTypeCache.Read(Rock.SystemGuid.FieldType.PERSON.AsGuid(), rockContext).Id) { SetWorkflowAttributeValue(action, selectPersonGuid, selectedGroupMember.PrimaryAliasGuid.ToString()); } else if (selectedPersonAttribute.FieldTypeId == FieldTypeCache.Read(Rock.SystemGuid.FieldType.TEXT.AsGuid(), rockContext).Id) { SetWorkflowAttributeValue(action, selectPersonGuid, Person.FormatFullName(selectedGroupMember.NickName, selectedGroupMember.LastName, selectedGroupMember.SuffixValueId)); } } } } else { errorMessages.Add("No group member for the selected campus could be found."); } errorMessages.ForEach(m => action.AddLogEntry(m, true)); return(true); }