public static Group SaveNewGroup( RockContext rockContext, int groupTypeId, Guid? parentGroupGuid, string groupName, List<GroupMember> groupMembers, int? campusId, bool savePersonAttributes )
{
var groupType = GroupTypeCache.Read( groupTypeId );
var familyChanges = new List<string>();
var familyMemberChanges = new Dictionary<Guid, List<string>>();
var personDemographicChanges = new Dictionary<Guid, List<string>>();
if ( groupType != null )
{
var isFamilyGroupType = groupType.Guid.Equals( Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY.AsGuid() );
var groupService = new GroupService( rockContext );
var group = new Group();
group.GroupTypeId = groupType.Id;
if ( parentGroupGuid.HasValue )
{
var parentGroup = groupService.Get( parentGroupGuid.Value );
if ( parentGroup != null )
{
group.ParentGroupId = parentGroup.Id;
}
}
group.Name = groupName;
History.EvaluateChange( familyChanges, "Family", string.Empty, group.Name );
if ( isFamilyGroupType )
{
if ( campusId.HasValue )
{
History.EvaluateChange( familyChanges, "Campus", string.Empty, CampusCache.Read( campusId.Value ).Name );
}
group.CampusId = campusId;
}
int? adultRoleId = null;
var adultRole = new GroupTypeRoleService( rockContext ).Get( new Guid( Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT ) );
if ( adultRole != null )
{
adultRoleId = adultRole.Id;
}
foreach ( var groupMember in groupMembers )
{
var person = groupMember.Person;
if ( person != null )
{
person.FirstName = person.FirstName.FixCase();
person.NickName = person.NickName.FixCase();
person.MiddleName = person.MiddleName.FixCase();
person.LastName = person.LastName.FixCase();
group.Members.Add( groupMember );
var demographicChanges = new List<string>();
demographicChanges.Add( "Created" );
History.EvaluateChange( demographicChanges, "Record Type", string.Empty, person.RecordTypeValueId.HasValue ? DefinedValueCache.GetName( person.RecordTypeValueId.Value ) : string.Empty );
History.EvaluateChange( demographicChanges, "Record Status", string.Empty, person.RecordStatusValueId.HasValue ? DefinedValueCache.GetName( person.RecordStatusValueId.Value ) : string.Empty );
History.EvaluateChange( demographicChanges, "Record Status Reason", string.Empty, person.RecordStatusReasonValueId.HasValue ? DefinedValueCache.GetName( person.RecordStatusReasonValueId.Value ) : string.Empty );
History.EvaluateChange( demographicChanges, "Connection Status", string.Empty, person.ConnectionStatusValueId.HasValue ? DefinedValueCache.GetName( person.ConnectionStatusValueId ) : string.Empty );
History.EvaluateChange( demographicChanges, "Deceased", false.ToString(), ( person.IsDeceased ).ToString() );
History.EvaluateChange( demographicChanges, "Title", string.Empty, person.TitleValueId.HasValue ? DefinedValueCache.GetName( person.TitleValueId ) : string.Empty );
History.EvaluateChange( demographicChanges, "First Name", string.Empty, person.FirstName );
History.EvaluateChange( demographicChanges, "Nick Name", string.Empty, person.NickName );
History.EvaluateChange( demographicChanges, "Middle Name", string.Empty, person.MiddleName );
History.EvaluateChange( demographicChanges, "Last Name", string.Empty, person.LastName );
History.EvaluateChange( demographicChanges, "Suffix", string.Empty, person.SuffixValueId.HasValue ? DefinedValueCache.GetName( person.SuffixValueId ) : string.Empty );
History.EvaluateChange( demographicChanges, "Birth Date", null, person.BirthDate );
History.EvaluateChange( demographicChanges, "Gender", null, person.Gender );
History.EvaluateChange( demographicChanges, "Marital Status", string.Empty, person.MaritalStatusValueId.HasValue ? DefinedValueCache.GetName( person.MaritalStatusValueId ) : string.Empty );
History.EvaluateChange( demographicChanges, "Anniversary Date", null, person.AnniversaryDate );
History.EvaluateChange( demographicChanges, "Graduation Year", null, person.GraduationYear );
History.EvaluateChange( demographicChanges, "Email", string.Empty, person.Email );
History.EvaluateChange( demographicChanges, "Email Active", false.ToString(), person.IsEmailActive.ToString() );
History.EvaluateChange( demographicChanges, "Email Note", string.Empty, person.EmailNote );
History.EvaluateChange( demographicChanges, "Email Preference", null, person.EmailPreference );
History.EvaluateChange( demographicChanges, "Inactive Reason Note", string.Empty, person.InactiveReasonNote );
History.EvaluateChange( demographicChanges, "System Note", string.Empty, person.SystemNote );
personDemographicChanges.Add( person.Guid, demographicChanges );
if ( isFamilyGroupType )
{
var memberChanges = new List<string>();
string roleName = groupType.Roles
.Where( r => r.Id == groupMember.GroupRoleId )
.Select( r => r.Name )
.FirstOrDefault();
History.EvaluateChange( memberChanges, "Role", string.Empty, roleName );
familyMemberChanges.Add( person.Guid, memberChanges );
}
}
}
groupService.Add( group );
rockContext.SaveChanges();
var personService = new PersonService( rockContext );
foreach ( var groupMember in groupMembers )
{
var person = groupMember.Person;
if ( savePersonAttributes )
{
var newValues = person.AttributeValues;
person.LoadAttributes();
foreach ( var attributeCache in person.Attributes.Select( a => a.Value ) )
{
string oldValue = person.GetAttributeValue( attributeCache.Key ) ?? string.Empty;
string newValue = string.Empty;
if ( newValues != null &&
newValues.ContainsKey( attributeCache.Key ) &&
newValues[attributeCache.Key] != null )
{
newValue = newValues[attributeCache.Key].Value ?? string.Empty;
}
if ( !oldValue.Equals( newValue ) )
{
History.EvaluateChange( personDemographicChanges[person.Guid], attributeCache.Name,
attributeCache.FieldType.Field.FormatValue( null, oldValue, attributeCache.QualifierValues, false ),
attributeCache.FieldType.Field.FormatValue( null, newValue, attributeCache.QualifierValues, false ) );
Rock.Attribute.Helper.SaveAttributeValue( person, attributeCache, newValue );
}
}
}
person = personService.Get( groupMember.PersonId );
if ( person != null )
{
bool updateRequired = false;
var changes = personDemographicChanges[person.Guid];
if ( groupMember.GroupRoleId == adultRoleId )
{
person.GivingGroupId = group.Id;
updateRequired = true;
History.EvaluateChange( changes, "Giving Group", string.Empty, group.Name );
}
if ( updateRequired )
{
rockContext.SaveChanges();
}
int? modifiedByPersonAliasId = person.ModifiedAuditValuesAlreadyUpdated ? person.ModifiedByPersonAliasId : ( int? ) null;
HistoryService.SaveChanges( rockContext, typeof( Person ), Rock.SystemGuid.Category.HISTORY_PERSON_DEMOGRAPHIC_CHANGES.AsGuid(),
person.Id, changes, true, modifiedByPersonAliasId );
if ( isFamilyGroupType )
{
HistoryService.SaveChanges( rockContext, typeof( Person ), Rock.SystemGuid.Category.HISTORY_PERSON_FAMILY_CHANGES.AsGuid(),
person.Id, familyMemberChanges[person.Guid], group.Name, typeof( Group ), group.Id, true, modifiedByPersonAliasId );
HistoryService.SaveChanges( rockContext, typeof( Person ), Rock.SystemGuid.Category.HISTORY_PERSON_FAMILY_CHANGES.AsGuid(),
person.Id, familyChanges, group.Name, typeof( Group ), group.Id, true, modifiedByPersonAliasId );
}
}
}
return group;
}
return null;
}