/// <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; }