/// <summary> /// Saves all family changes. /// </summary> private void SaveFamilies(List <Group> newFamilyList, Dictionary <GroupLocation, string> newGroupLocations) { var rockContext = new RockContext(); // First save any unsaved families if (newFamilyList.Any()) { rockContext.WrapTransaction(() => { rockContext.Groups.AddRange(newFamilyList); rockContext.SaveChanges(DisableAuditing); }); // Add these new families to the global list ImportedFamilies.AddRange(newFamilyList); } // Now save locations if (newGroupLocations.Any()) { // Set updated family id on locations foreach (var locationPair in newGroupLocations) { int?familyGroupId = ImportedFamilies.Where(g => g.ForeignKey == locationPair.Value).Select(g => ( int? )g.Id).FirstOrDefault(); if (familyGroupId != null) { locationPair.Key.GroupId = ( int )familyGroupId; } } // Save locations rockContext.WrapTransaction(() => { rockContext.Configuration.AutoDetectChangesEnabled = false; rockContext.GroupLocations.AddRange(newGroupLocations.Keys); rockContext.ChangeTracker.DetectChanges(); rockContext.SaveChanges(DisableAuditing); }); } }
/// <summary> /// Saves the individuals. /// </summary> /// <param name="newFamilyList">The family list.</param> /// <param name="visitorList">The optional visitor list.</param> private void SaveIndividuals(List <Group> newFamilyList, List <Group> visitorList = null, List <Note> newNoteList = null) { if (newFamilyList.Any()) { var rockContext = new RockContext(); rockContext.WrapTransaction(() => { rockContext.Groups.AddRange(newFamilyList); rockContext.SaveChanges(DisableAuditing); ImportedFamilies.AddRange(newFamilyList); foreach (var familyGroups in newFamilyList.GroupBy <Group, string>(g => g.ForeignKey)) { bool visitorsExist = visitorList.Any() && familyGroups.Any(); foreach (var newFamilyGroup in familyGroups) { foreach (var person in newFamilyGroup.Members.Select(m => m.Person)) { // Set notes on this person if (newNoteList.Any(n => n.ForeignKey == person.ForeignKey)) { newNoteList.Where(n => n.ForeignKey == person.ForeignKey).ToList() .ForEach(n => n.EntityId = person.Id); } // Set attributes on this person foreach (var attributeCache in person.Attributes.Select(a => a.Value)) { var existingValue = rockContext.AttributeValues.FirstOrDefault(v => v.Attribute.Key == attributeCache.Key && v.EntityId == person.Id); var newAttributeValue = 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 = person.Id; existingValue.Value = newAttributeValue.Value; rockContext.AttributeValues.Add(existingValue); } else { existingValue.Value = newAttributeValue.Value; rockContext.Entry(existingValue).State = EntityState.Modified; } } // Set aliases on this person if (!person.Aliases.Any(a => a.PersonId == person.Id)) { person.Aliases.Add(new PersonAlias { AliasPersonId = person.Id, AliasPersonGuid = person.Guid, ForeignKey = person.ForeignKey, ForeignId = person.ForeignId, PersonId = person.Id }); } person.GivingGroupId = newFamilyGroup.Id; if (visitorsExist) { var groupTypeRoleService = new GroupTypeRoleService(rockContext); var ownerRole = groupTypeRoleService.Get(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_OWNER)); int inviteeRoleId = groupTypeRoleService.Get(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_INVITED)).Id; int invitedByRoleId = groupTypeRoleService.Get(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_INVITED_BY)).Id; int canCheckInRoleId = groupTypeRoleService.Get(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_CAN_CHECK_IN)).Id; int allowCheckInByRoleId = groupTypeRoleService.Get(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_ALLOW_CHECK_IN_BY)).Id; // Retrieve or create the group this person is an owner of var ownerGroup = new GroupMemberService(rockContext).Queryable() .Where(m => m.PersonId == person.Id && m.GroupRoleId == ownerRole.Id) .Select(m => m.Group).FirstOrDefault(); if (ownerGroup == null) { var ownerGroupMember = new GroupMember(); ownerGroupMember.PersonId = 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); } // Visitor, add relationships to the family members if (visitorList.Where(v => v.ForeignKey == newFamilyGroup.ForeignKey) .Any(v => v.Members.Any(m => m.Person.ForeignKey.Equals(person.ForeignKey)))) { var familyMembers = familyGroups.Except(visitorList).SelectMany(g => g.Members); foreach (var familyMember in familyMembers) { // Add visitor invitedBy relationship var invitedByMember = new GroupMember(); invitedByMember.PersonId = familyMember.Person.Id; invitedByMember.GroupRoleId = invitedByRoleId; ownerGroup.Members.Add(invitedByMember); if (person.Age < 18 && familyMember.Person.Age > 15) { // Add visitor allowCheckInBy relationship var allowCheckinMember = new GroupMember(); allowCheckinMember.PersonId = familyMember.Person.Id; allowCheckinMember.GroupRoleId = allowCheckInByRoleId; ownerGroup.Members.Add(allowCheckinMember); } } } else { // Family member, add relationships to the visitor(s) var familyVisitors = visitorList.Where(v => v.ForeignKey == newFamilyGroup.ForeignKey).SelectMany(g => g.Members).ToList(); foreach (var visitor in familyVisitors) { // Add invited visitor relationship var inviteeMember = new GroupMember(); inviteeMember.PersonId = visitor.Person.Id; inviteeMember.GroupRoleId = inviteeRoleId; ownerGroup.Members.Add(inviteeMember); if (visitor.Person.Age < 18 && person.Age > 15) { // Add canCheckIn visitor relationship var canCheckInMember = new GroupMember(); canCheckInMember.PersonId = visitor.Person.Id; canCheckInMember.GroupRoleId = canCheckInRoleId; ownerGroup.Members.Add(canCheckInMember); } } } } } } } // Save notes and all changes rockContext.Notes.AddRange(newNoteList); rockContext.SaveChanges(DisableAuditing); }); } }
/// <summary> /// Saves the individuals. /// </summary> /// <param name="newFamilyList">The family list.</param> /// <param name="visitorList">The optional visitor list.</param> /// <param name="newNoteList">The new note list.</param> private void SaveIndividuals(List <Group> newFamilyList, List <Group> visitorList = null, List <Note> newNoteList = null) { if (newFamilyList.Any()) { var rockContext = new RockContext(); rockContext.WrapTransaction(() => { rockContext.Groups.AddRange(newFamilyList); rockContext.SaveChanges(DisableAuditing); // #TODO find out how to track family groups without context locks ImportedFamilies.AddRange(newFamilyList); foreach (var familyGroups in newFamilyList.GroupBy(g => g.ForeignKey)) { var visitorsExist = visitorList.Any() && familyGroups.Any(); foreach (var newFamilyGroup in familyGroups) { foreach (var person in newFamilyGroup.Members.Select(m => m.Person)) { // Set notes on this person var personNotes = newNoteList.Where(n => n.ForeignKey == person.ForeignKey).ToList(); if (personNotes.Any()) { personNotes.ForEach(n => n.EntityId = person.Id); } // Set attributes on this person var personAttributeValues = person.Attributes.Select(a => a.Value) .Select(a => new AttributeValue { AttributeId = a.Id, EntityId = person.Id, Value = person.AttributeValues[a.Key].Value }).ToList(); rockContext.AttributeValues.AddRange(personAttributeValues); // Set aliases on this person if (!person.Aliases.Any(a => a.PersonId == person.Id)) { person.Aliases.Add(new PersonAlias { AliasPersonId = person.Id, AliasPersonGuid = person.Guid, ForeignKey = person.ForeignKey, ForeignId = person.ForeignId, PersonId = person.Id }); } person.GivingGroupId = newFamilyGroup.Id; if (visitorsExist) { // Retrieve or create the group this person is an owner of var ownerGroup = new GroupMemberService(rockContext).Queryable() .Where(m => m.PersonId == person.Id && m.GroupRoleId == KnownRelationshipOwnerRoleId) .Select(m => m.Group).FirstOrDefault(); if (ownerGroup == null) { var ownerGroupMember = new GroupMember { PersonId = person.Id, GroupRoleId = KnownRelationshipOwnerRoleId }; ownerGroup = new Group { Name = KnownRelationshipGroupType.Name, GroupTypeId = KnownRelationshipGroupType.Id }; ownerGroup.Members.Add(ownerGroupMember); rockContext.Groups.Add(ownerGroup); } // Visitor, add relationships to the family members if (visitorList.Where(v => v.ForeignKey == newFamilyGroup.ForeignKey) .Any(v => v.Members.Any(m => m.Person.ForeignKey.Equals(person.ForeignKey)))) { var familyMembers = familyGroups.Except(visitorList).SelectMany(g => g.Members); foreach (var familyMember in familyMembers) { // Add visitor invitedBy relationship var invitedByMember = new GroupMember { PersonId = familyMember.Person.Id, GroupRoleId = InvitedByKnownRelationshipId }; ownerGroup.Members.Add(invitedByMember); if (person.Age < 18 && familyMember.Person.Age > 15) { // Add visitor allowCheckInBy relationship var allowCheckinMember = new GroupMember { PersonId = familyMember.Person.Id, GroupRoleId = AllowCheckInByKnownRelationshipId }; ownerGroup.Members.Add(allowCheckinMember); } } } else { // Family member, add relationships to the visitor(s) var familyVisitors = visitorList.Where(v => v.ForeignKey == newFamilyGroup.ForeignKey).SelectMany(g => g.Members).ToList(); foreach (var visitor in familyVisitors) { // Add invited visitor relationship var inviteeMember = new GroupMember { PersonId = visitor.Person.Id, GroupRoleId = InviteeKnownRelationshipId }; ownerGroup.Members.Add(inviteeMember); if (visitor.Person.Age < 18 && person.Age > 15) { // Add canCheckIn visitor relationship var canCheckInMember = new GroupMember { PersonId = visitor.Person.Id, GroupRoleId = CanCheckInKnownRelationshipId }; ownerGroup.Members.Add(canCheckInMember); } } } } } } } // Save notes and all changes rockContext.Notes.AddRange(newNoteList); rockContext.SaveChanges(DisableAuditing); if (refreshIndividualListEachCycle) { // add reference to imported people now that we have ID's ImportedPeopleKeys.AddRange( newFamilyList.Where(m => m.ForeignKey != null) .SelectMany(m => m.Members) .Select(p => new PersonKeys { PersonAliasId = (int)p.Person.PrimaryAliasId, GroupForeignId = p.Group.ForeignId, PersonId = p.Person.Id, PersonForeignId = p.Person.ForeignId, PersonForeignKey = p.Person.ForeignKey }) ); ImportedPeopleKeys = ImportedPeopleKeys.OrderBy(k => k.PersonForeignId).ThenBy(k => k.PersonForeignKey).ToList(); } }); } }