/// <inheritdoc /> protected override void LoadViewState(object savedState) { base.LoadViewState(savedState); string json = ViewState["PersonPreviousNamesState"] as string; if (string.IsNullOrWhiteSpace(json)) { PersonPreviousNamesState = new List <PersonPreviousName>(); } else { PersonPreviousNamesState = PersonPreviousName.FromJsonAsList(json) ?? new List <PersonPreviousName>(); } json = ViewState["PersonSearchKeysState"] as string; if (string.IsNullOrWhiteSpace(json)) { PersonSearchKeysState = new List <PersonSearchKey>(); } else { PersonSearchKeysState = PersonSearchKey.FromJsonAsList(json) ?? new List <PersonSearchKey>(); } }
/// <summary> /// Saves the people. /// </summary> /// <param name="familyList">The family list.</param> /// <param name="visitorList">The visitor list.</param> /// <param name="previousNamesList">The previous names list.</param> private static void SavePeople(List <Group> familyList, List <Group> visitorList, Dictionary <Guid, string> previousNamesList) { var rockContext = new RockContext(); var groupMemberService = new GroupMemberService(rockContext); rockContext.WrapTransaction(() => { rockContext.Configuration.AutoDetectChangesEnabled = false; rockContext.Groups.AddRange(familyList); rockContext.SaveChanges(DisableAuditing); foreach (var familyGroups in familyList.GroupBy(g => g.ForeignId)) { var visitorsExist = familyGroups.Count() > 1; foreach (var newFamilyGroup in familyGroups) { foreach (var groupMember in newFamilyGroup.Members) { // don't call LoadAttributes, it only rewrites existing cache objects // groupMember.Person.LoadAttributes( rockContext ); var memberPersonAttributeValues = groupMember.Person.Attributes.Select(a => a.Value) .Select(a => new AttributeValue { AttributeId = a.Id, EntityId = groupMember.Person.Id, Value = groupMember.Person.AttributeValues[a.Key].Value }).ToList(); rockContext.AttributeValues.AddRange(memberPersonAttributeValues); // add a default person alias if (!groupMember.Person.Aliases.Any(a => a.AliasPersonId == groupMember.Person.Id)) { groupMember.Person.Aliases.Add(new PersonAlias { AliasPersonId = groupMember.Person.Id, AliasPersonGuid = groupMember.Person.Guid, ForeignId = groupMember.Person.ForeignId, ForeignKey = groupMember.Person.ForeignKey }); } // assign the previous name if (previousNamesList.Any(l => l.Key.Equals(groupMember.Person.Guid))) { var newPreviousName = new PersonPreviousName { LastName = previousNamesList[groupMember.Person.Guid], PersonAlias = groupMember.Person.Aliases.FirstOrDefault() }; rockContext.PersonPreviousNames.Add(newPreviousName); } // assign the giving group if (groupMember.GroupRoleId != FamilyChildRoleId) { groupMember.Person.GivingGroupId = newFamilyGroup.Id; } // Add known relationship group var knownGroupMember = new GroupMember { PersonId = groupMember.Person.Id, GroupRoleId = KnownRelationshipOwnerRoleId }; var knownRelationshipGroup = new Group { Name = KnownRelationshipGroupType.Name, GroupTypeId = KnownRelationshipGroupType.Id, IsPublic = true }; knownRelationshipGroup.Members.Add(knownGroupMember); rockContext.Groups.Add(knownRelationshipGroup); // Add implied relationship group var impliedGroupMember = new GroupMember { PersonId = groupMember.Person.Id, GroupRoleId = ImpliedRelationshipOwnerRoleId }; var impliedGroup = new Group { Name = ImpliedRelationshipGroupType.Name, GroupTypeId = ImpliedRelationshipGroupType.Id, IsPublic = true }; impliedGroup.Members.Add(impliedGroupMember); rockContext.Groups.Add(impliedGroup); if (visitorsExist) { // if this is a visitor, then add relationships to the family member(s) if (visitorList.Where(v => v.ForeignId == newFamilyGroup.ForeignId) .Any(v => v.Members.Any(m => m.Person.ForeignId.Equals(groupMember.Person.ForeignId)))) { var familyMembers = familyGroups.Except(visitorList).SelectMany(g => g.Members); foreach (var familyMember in familyMembers.Select(m => m.Person)) { var invitedByMember = new GroupMember { PersonId = familyMember.Id, GroupRoleId = InvitedByKnownRelationshipId }; knownRelationshipGroup.Members.Add(invitedByMember); if (groupMember.Person.Age < 18 && familyMember.Age > 18) { var allowCheckinMember = new GroupMember { PersonId = familyMember.Id, GroupRoleId = AllowCheckInByKnownRelationshipId }; knownRelationshipGroup.Members.Add(allowCheckinMember); } } } else { // not a visitor, add the visitors to the family member's known relationship var visitors = visitorList.Where(v => v.ForeignId == newFamilyGroup.ForeignId) .SelectMany(g => g.Members).ToList(); foreach (var visitor in visitors.Select(g => g.Person)) { var inviteeMember = new GroupMember { PersonId = visitor.Id, GroupRoleId = InviteeKnownRelationshipId }; knownRelationshipGroup.Members.Add(inviteeMember); // if visitor can be checked in and this person is considered an adult if (visitor.Age < 18 && groupMember.Person.Age > 18) { var canCheckInMember = new GroupMember { PersonId = visitor.Id, GroupRoleId = CanCheckInKnownRelationshipId }; knownRelationshipGroup.Members.Add(canCheckInMember); } } } } } } } rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges(DisableAuditing); }); // end wrap transaction // add the new people to our tracking list if (familyList.Any()) { var familyMembers = familyList.SelectMany(gm => gm.Members); ImportedPeople.AddRange(familyMembers.Select(m => new PersonKeys { PersonAliasId = (int)m.Person.PrimaryAliasId, PersonId = m.Person.Id, PersonForeignId = m.Person.ForeignId, GroupForeignId = m.Group.ForeignId, FamilyRoleId = m.Person.ReviewReasonNote.ConvertToEnum <FamilyRole>() }).ToList() ); } if (visitorList.Any()) { var visitors = visitorList.SelectMany(gm => gm.Members); ImportedPeople.AddRange(visitors.Select(m => new PersonKeys { PersonAliasId = (int)m.Person.PrimaryAliasId, PersonId = m.Person.Id, PersonForeignId = m.Person.ForeignId, GroupForeignId = m.Group.ForeignId, FamilyRoleId = m.Person.ReviewReasonNote.ConvertToEnum <FamilyRole>() }).ToList() ); } }
/// <summary> /// Adds the name of the previous. /// </summary> /// <param name="personAliasId">The person alias identifier.</param> /// <param name="previousLastName">Last name of the previous.</param> /// <param name="rockContext">The rock context.</param> private void AddPreviousName( int personAliasId, string previousLastName, RockContext rockContext ) { var personPreviousNameService = new PersonPreviousNameService( rockContext ); var previousName = new PersonPreviousName() { LastName = previousLastName, PersonAliasId = personAliasId }; personPreviousNameService.Add( previousName ); }
/// <summary> /// Saves the people. /// </summary> /// <param name="familyList">The family list.</param> /// <param name="visitorList">The visitor list.</param> /// <param name="ownerRole">The owner role.</param> /// <param name="childRoleId">The child role identifier.</param> /// <param name="inviteeRoleId">The invitee role identifier.</param> /// <param name="invitedByRoleId">The invited by role identifier.</param> /// <param name="canCheckInRoleId">The can check in role identifier.</param> /// <param name="allowCheckInByRoleId">The allow check in by role identifier.</param> private void SavePeople( List<Group> familyList, List<Group> visitorList, Dictionary<Guid, string> previousNamesList, GroupTypeRole ownerRole, int childRoleId, int inviteeRoleId, int invitedByRoleId, int canCheckInRoleId, int allowCheckInByRoleId ) { var rockContext = new RockContext(); var groupMemberService = new GroupMemberService( rockContext ); rockContext.WrapTransaction( () => { rockContext.Configuration.AutoDetectChangesEnabled = false; rockContext.Groups.AddRange( familyList ); rockContext.SaveChanges( DisableAuditing ); foreach ( var familyGroups in familyList.GroupBy<Group, int?>( g => g.ForeignId ) ) { bool visitorsExist = familyGroups.Count() > 1; foreach ( var newFamilyGroup in familyGroups ) { foreach ( var groupMember in newFamilyGroup.Members ) { // don't call LoadAttributes, it only rewrites existing cache objects // groupMember.Person.LoadAttributes( rockContext ); foreach ( var attributeCache in groupMember.Person.Attributes.Select( a => a.Value ) ) { var existingValue = rockContext.AttributeValues.FirstOrDefault( v => v.Attribute.Key == attributeCache.Key && v.EntityId == groupMember.Person.Id ); var newAttributeValue = groupMember.Person.AttributeValues[attributeCache.Key]; // set the new value and add it to the database if ( existingValue == null ) { existingValue = new AttributeValue(); existingValue.AttributeId = newAttributeValue.AttributeId; existingValue.EntityId = groupMember.Person.Id; existingValue.Value = newAttributeValue.Value; rockContext.AttributeValues.Add( existingValue ); } else { existingValue.Value = newAttributeValue.Value; rockContext.Entry( existingValue ).State = EntityState.Modified; } } // add a default person alias if ( !groupMember.Person.Aliases.Any( a => a.AliasPersonId == groupMember.Person.Id ) ) { groupMember.Person.Aliases.Add( new PersonAlias { AliasPersonId = groupMember.Person.Id, AliasPersonGuid = groupMember.Person.Guid, ForeignId = groupMember.Person.ForeignId, ForeignKey = groupMember.Person.ForeignKey } ); } // assign the previous name if ( previousNamesList.Any( l => l.Key.Equals( groupMember.Person.Guid ) ) ) { var newPreviousName = new PersonPreviousName(); newPreviousName.LastName = previousNamesList[groupMember.Person.Guid]; newPreviousName.PersonAlias = groupMember.Person.Aliases.FirstOrDefault(); rockContext.PersonPreviousNames.Add( newPreviousName ); } // assign the giving group if ( groupMember.GroupRoleId != childRoleId ) { groupMember.Person.GivingGroupId = newFamilyGroup.Id; } if ( visitorsExist ) { // Retrieve or create the group this person is an owner of var ownerGroup = groupMemberService.Queryable() .Where( m => m.PersonId == groupMember.Person.Id && m.GroupRoleId == ownerRole.Id ) .Select( m => m.Group ) .FirstOrDefault(); if ( ownerGroup == null ) { var ownerGroupMember = new GroupMember(); ownerGroupMember.PersonId = groupMember.Person.Id; ownerGroupMember.GroupRoleId = ownerRole.Id; ownerGroup = new Group(); ownerGroup.Name = ownerRole.GroupType.Name; ownerGroup.GroupTypeId = ownerRole.GroupTypeId.Value; ownerGroup.Members.Add( ownerGroupMember ); rockContext.Groups.Add( ownerGroup ); } // if this is a visitor, then add relationships to the family member(s) if ( visitorList.Where( v => v.ForeignId == newFamilyGroup.ForeignId ) .Any( v => v.Members.Any( m => m.Person.ForeignId.Equals( groupMember.Person.ForeignId ) ) ) ) { var familyMembers = familyGroups.Except( visitorList ).SelectMany( g => g.Members ); foreach ( var familyMember in familyMembers.Select( m => m.Person ) ) { var invitedByMember = new GroupMember(); invitedByMember.PersonId = familyMember.Id; invitedByMember.GroupRoleId = invitedByRoleId; ownerGroup.Members.Add( invitedByMember ); if ( groupMember.Person.Age < 18 && familyMember.Age > 18 ) { var allowCheckinMember = new GroupMember(); allowCheckinMember.PersonId = familyMember.Id; allowCheckinMember.GroupRoleId = allowCheckInByRoleId; ownerGroup.Members.Add( allowCheckinMember ); } } } else { // not a visitor, add the visitors to the family member's known relationship var visitors = visitorList.Where( v => v.ForeignId == newFamilyGroup.ForeignId ) .SelectMany( g => g.Members ).ToList(); foreach ( var visitor in visitors.Select( g => g.Person ) ) { var inviteeMember = new GroupMember(); inviteeMember.PersonId = visitor.Id; inviteeMember.GroupRoleId = inviteeRoleId; ownerGroup.Members.Add( inviteeMember ); // if visitor can be checked in and this person is considered an adult if ( visitor.Age < 18 && groupMember.Person.Age > 18 ) { var canCheckInMember = new GroupMember(); canCheckInMember.PersonId = visitor.Id; canCheckInMember.GroupRoleId = canCheckInRoleId; ownerGroup.Members.Add( canCheckInMember ); } } } } // Add known relationship group var knownRelationshipGroupType = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_KNOWN_RELATIONSHIPS ); var knownGroup = groupMemberService.Queryable() .Where( m => m.PersonId == groupMember.Person.Id && m.GroupRoleId == allowCheckInByRoleId && m.Group.GroupTypeId == knownRelationshipGroupType.Id ) .Select( m => m.Group ) .FirstOrDefault(); if ( knownGroup == null ) { var knownGroupMember = new GroupMember(); knownGroupMember.PersonId = groupMember.Person.Id; knownGroupMember.GroupRoleId = allowCheckInByRoleId; knownGroup = new Group(); knownGroup.Name = knownRelationshipGroupType.Name; knownGroup.GroupTypeId = knownRelationshipGroupType.Id; knownGroup.Members.Add( knownGroupMember ); rockContext.Groups.Add( knownGroup ); } // Add implied relationship group var impliedRelationshipGroupType = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_IMPLIED_RELATIONSHIPS ); var impliedGroup = groupMemberService.Queryable() .Where( m => m.PersonId == groupMember.Person.Id && m.GroupRoleId == ownerRole.Id && m.Group.GroupTypeId == impliedRelationshipGroupType.Id ) .Select( m => m.Group ) .FirstOrDefault(); if ( impliedGroup == null ) { var impliedGroupMember = new GroupMember(); impliedGroupMember.PersonId = groupMember.Person.Id; impliedGroupMember.GroupRoleId = ownerRole.Id; impliedGroup = new Group(); impliedGroup.Name = impliedRelationshipGroupType.Name; impliedGroup.GroupTypeId = impliedRelationshipGroupType.Id; impliedGroup.Members.Add( impliedGroupMember ); rockContext.Groups.Add( impliedGroup ); } } } } rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges( DisableAuditing ); // add the new people to our tracking list if ( familyList.Any() ) { var familyMembers = familyList.SelectMany( gm => gm.Members ); ImportedPeople.AddRange( familyMembers.Select( m => new PersonKeys { PersonAliasId = (int)m.Person.PrimaryAliasId, PersonId = m.Person.Id, IndividualId = m.Person.ForeignId, HouseholdId = m.Group.ForeignId, FamilyRoleId = m.Person.ReviewReasonNote.ConvertToEnum<FamilyRole>() } ).ToList() ); } if ( visitorList.Any() ) { var visitors = visitorList.SelectMany( gm => gm.Members ); ImportedPeople.AddRange( visitors.Select( m => new PersonKeys { PersonAliasId = (int)m.Person.PrimaryAliasId, PersonId = m.Person.Id, IndividualId = m.Person.ForeignId, HouseholdId = m.Group.ForeignId, FamilyRoleId = m.Person.ReviewReasonNote.ConvertToEnum<FamilyRole>() } ).ToList() ); } } ); // end wrap transaction }