private static object GetSearchKey(Person person, RockContext rockContext) { var alternateIdSearchTypeValueId = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_SEARCH_KEYS_ALTERNATE_ID.AsGuid()).Id; var searchKey = person.GetPersonSearchKeys(rockContext).Where(k => k.SearchTypeValueId == alternateIdSearchTypeValueId).FirstOrDefault(); if (searchKey != null) { return(searchKey.SearchValue); } //Create Search Key if there is none. var personSearchKeyService = new PersonSearchKeyService(rockContext); var personService = new PersonService(rockContext); var personAlias = personService.Get(person.Id).Aliases.First(); PersonSearchKey personSearchKey = new PersonSearchKey() { PersonAlias = personAlias, SearchTypeValueId = alternateIdSearchTypeValueId, SearchValue = PersonSearchKeyService.GenerateRandomAlternateId(true, rockContext) }; personSearchKeyService.Add(personSearchKey); rockContext.SaveChanges(); return(personSearchKey.SearchValue); }
/// <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 family and persons to the database /// </summary> /// <param name="kioskCampusId">The kiosk campus identifier.</param> /// <param name="rockContext">The rock context.</param> /// <returns></returns> public SaveResult SaveFamilyAndPersonsToDatabase(int?kioskCampusId, RockContext rockContext) { SaveResult saveResult = new SaveResult(); FamilyRegistrationState editFamilyState = this; var personService = new PersonService(rockContext); var groupService = new GroupService(rockContext); var recordTypePersonId = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid()).Id; var maritalStatusMarried = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_MARITAL_STATUS_MARRIED.AsGuid()); var maritalStatusSingle = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_MARITAL_STATUS_SINGLE.AsGuid()); var numberTypeValueMobile = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_PHONE_TYPE_MOBILE.AsGuid()); int groupTypeRoleAdultId = GroupTypeCache.GetFamilyGroupType().Roles.FirstOrDefault(a => a.Guid == Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT.AsGuid()).Id; int groupTypeRoleChildId = GroupTypeCache.GetFamilyGroupType().Roles.FirstOrDefault(a => a.Guid == Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_CHILD.AsGuid()).Id; int?groupTypeRoleCanCheckInId = GroupTypeCache.Get(Rock.SystemGuid.GroupType.GROUPTYPE_KNOWN_RELATIONSHIPS.AsGuid()) ?.Roles.FirstOrDefault(r => r.Guid == Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_CAN_CHECK_IN.AsGuid())?.Id; bool?groupTypeDefaultSmsEnabled = GroupTypeCache.GetFamilyGroupType().GetAttributeValue(Rock.SystemKey.GroupTypeAttributeKey.CHECKIN_REGISTRATION_DEFAULTSMSENABLED).AsBooleanOrNull(); Group primaryFamily = null; if (editFamilyState.GroupId.HasValue) { primaryFamily = groupService.Get(editFamilyState.GroupId.Value); } // see if we can find matches for new people that were added, and also set the primary family if this is a new family, but a matching family was found foreach (var familyPersonState in editFamilyState.FamilyPersonListState.Where(a => !a.PersonId.HasValue && !a.IsDeleted)) { var personQuery = new PersonService.PersonMatchQuery(familyPersonState.FirstName, familyPersonState.LastName, familyPersonState.Email, familyPersonState.MobilePhoneNumber, familyPersonState.Gender, familyPersonState.BirthDate, familyPersonState.SuffixValueId); var matchingPerson = personService.FindPerson(personQuery, true); if (matchingPerson != null) { // newly added person, but a match was found, so set the PersonId, GroupId, and ConnectionStatusValueID to the matching person instead of creating a new person familyPersonState.PersonId = matchingPerson.Id; familyPersonState.GroupId = matchingPerson.GetFamily(rockContext)?.Id; familyPersonState.RecordStatusValueId = matchingPerson.RecordStatusValueId; familyPersonState.ConnectionStatusValueId = matchingPerson.ConnectionStatusValueId; familyPersonState.ConvertedToMatchedPerson = true; if (primaryFamily == null && familyPersonState.IsAdult) { // if this is a new family, but we found a matching adult person, use that person's family as the family primaryFamily = matchingPerson.GetFamily(rockContext); } } } // loop thru all people and add/update as needed foreach (var familyPersonState in editFamilyState.FamilyPersonListState.Where(a => !a.IsDeleted)) { Person person; if (!familyPersonState.PersonId.HasValue) { person = new Person(); personService.Add(person); saveResult.NewPersonList.Add(person); person.RecordTypeValueId = recordTypePersonId; person.FirstName = familyPersonState.FirstName; } else { person = personService.Get(familyPersonState.PersonId.Value); } // NOTE, Gender, MaritalStatusValueId, NickName, LastName are required fields so, always updated them to match the UI (even if a matched person was found) person.Gender = familyPersonState.Gender; person.MaritalStatusValueId = familyPersonState.IsMarried ? maritalStatusMarried.Id : maritalStatusSingle.Id; person.NickName = familyPersonState.FirstName; person.LastName = familyPersonState.LastName; // if the familyPersonState was converted to a Matched Person, don't overwrite existing values with blank values var saveEmptyValues = !familyPersonState.ConvertedToMatchedPerson; if (familyPersonState.SuffixValueId.HasValue || saveEmptyValues) { person.SuffixValueId = familyPersonState.SuffixValueId; } if (familyPersonState.BirthDate.HasValue || saveEmptyValues) { person.SetBirthDate(familyPersonState.BirthDate); } if (familyPersonState.DeceasedDate.HasValue || saveEmptyValues) { person.DeceasedDate = familyPersonState.DeceasedDate; } if (familyPersonState.Email.IsNotNullOrWhiteSpace() || saveEmptyValues) { person.Email = familyPersonState.Email; } if (familyPersonState.GradeOffset.HasValue || saveEmptyValues) { person.GradeOffset = familyPersonState.GradeOffset; } // if a matching person was found, the familyPersonState's RecordStatusValueId and ConnectinoStatusValueId was already updated to match the matched person person.RecordStatusValueId = familyPersonState.RecordStatusValueId; person.ConnectionStatusValueId = familyPersonState.ConnectionStatusValueId; rockContext.SaveChanges(); bool isNewPerson = !familyPersonState.PersonId.HasValue; if (!familyPersonState.PersonId.HasValue) { // if we added a new person, we know now the personId after SaveChanges, so set it familyPersonState.PersonId = person.Id; } if (familyPersonState.AlternateID.IsNotNullOrWhiteSpace()) { PersonSearchKey personAlternateValueIdSearchKey; PersonSearchKeyService personSearchKeyService = new PersonSearchKeyService(rockContext); if (isNewPerson) { // if we added a new person, a default AlternateId was probably added in the service layer. If a specific Alternate ID was specified, make sure that their SearchKey is updated personAlternateValueIdSearchKey = person.GetPersonSearchKeys(rockContext).Where(a => a.SearchTypeValueId == _personSearchAlternateValueId).FirstOrDefault(); } else { // see if the key already exists. If if it doesn't already exist, let a new one get created personAlternateValueIdSearchKey = person.GetPersonSearchKeys(rockContext).Where(a => a.SearchTypeValueId == _personSearchAlternateValueId && a.SearchValue == familyPersonState.AlternateID).FirstOrDefault(); } if (personAlternateValueIdSearchKey == null) { personAlternateValueIdSearchKey = new PersonSearchKey(); personAlternateValueIdSearchKey.PersonAliasId = person.PrimaryAliasId; personAlternateValueIdSearchKey.SearchTypeValueId = _personSearchAlternateValueId; personSearchKeyService.Add(personAlternateValueIdSearchKey); } if (personAlternateValueIdSearchKey.SearchValue != familyPersonState.AlternateID) { personAlternateValueIdSearchKey.SearchValue = familyPersonState.AlternateID; rockContext.SaveChanges(); } } person.LoadAttributes(); foreach (var attributeValue in familyPersonState.PersonAttributeValuesState) { // only set attribute values that are editable so we don't accidently delete any attribute values if (familyPersonState.EditableAttributes.Contains(attributeValue.Value.AttributeId)) { if (attributeValue.Value.Value.IsNotNullOrWhiteSpace() || saveEmptyValues) { person.SetAttributeValue(attributeValue.Key, attributeValue.Value.Value); } } } person.SaveAttributeValues(rockContext); if (familyPersonState.MobilePhoneNumber.IsNotNullOrWhiteSpace() || saveEmptyValues) { person.UpdatePhoneNumber(numberTypeValueMobile.Id, familyPersonState.MobilePhoneCountryCode, familyPersonState.MobilePhoneNumber, familyPersonState.MobilePhoneSmsEnabled ?? groupTypeDefaultSmsEnabled, false, rockContext); } rockContext.SaveChanges(); } if (primaryFamily == null) { // new family and no family found by looking up matching adults, so create a new family primaryFamily = new Group(); var familyLastName = editFamilyState.FamilyPersonListState.OrderBy(a => a.IsAdult).Where(a => !a.IsDeleted).Select(a => a.LastName).FirstOrDefault(); primaryFamily.Name = familyLastName + " Family"; primaryFamily.GroupTypeId = GroupTypeCache.GetFamilyGroupType().Id; // Set the Campus to the Campus of this Kiosk primaryFamily.CampusId = kioskCampusId; groupService.Add(primaryFamily); saveResult.NewFamilyList.Add(primaryFamily); rockContext.SaveChanges(); } if (!editFamilyState.GroupId.HasValue) { editFamilyState.GroupId = primaryFamily.Id; } primaryFamily.LoadAttributes(); foreach (var familyAttribute in editFamilyState.FamilyAttributeValuesState) { // only set attribute values that are editable so we don't accidently delete any attribute values if (editFamilyState.EditableFamilyAttributes.Contains(familyAttribute.Value.AttributeId)) { primaryFamily.SetAttributeValue(familyAttribute.Key, familyAttribute.Value.Value); } } primaryFamily.SaveAttributeValues(rockContext); var groupMemberService = new GroupMemberService(rockContext); // loop thru all people that are part of the same family (in the UI) and ensure they are all in the same primary family (in the database) foreach (var familyPersonState in editFamilyState.FamilyPersonListState.Where(a => !a.IsDeleted && a.InPrimaryFamily)) { var currentFamilyMember = primaryFamily.Members.FirstOrDefault(m => m.PersonId == familyPersonState.PersonId.Value); if (currentFamilyMember == null) { currentFamilyMember = new GroupMember { GroupId = primaryFamily.Id, PersonId = familyPersonState.PersonId.Value, GroupMemberStatus = GroupMemberStatus.Active }; if (familyPersonState.IsAdult) { currentFamilyMember.GroupRoleId = groupTypeRoleAdultId; } else { currentFamilyMember.GroupRoleId = groupTypeRoleChildId; } groupMemberService.Add(currentFamilyMember); rockContext.SaveChanges(); } } // make a dictionary of new related families (by lastname) so we can combine any new related children into a family with the same last name Dictionary <string, Group> newRelatedFamilies = new Dictionary <string, Group>(StringComparer.OrdinalIgnoreCase); // loop thru all people that are NOT part of the same family foreach (var familyPersonState in editFamilyState.FamilyPersonListState.Where(a => !a.IsDeleted && a.InPrimaryFamily == false)) { if (!familyPersonState.GroupId.HasValue) { // related person not in a family yet Group relatedFamily = newRelatedFamilies.GetValueOrNull(familyPersonState.LastName); if (relatedFamily == null) { relatedFamily = new Group(); relatedFamily.Name = familyPersonState.LastName + " Family"; relatedFamily.GroupTypeId = GroupTypeCache.GetFamilyGroupType().Id; // Set the Campus to the Campus of this Kiosk relatedFamily.CampusId = kioskCampusId; newRelatedFamilies.Add(familyPersonState.LastName, relatedFamily); groupService.Add(relatedFamily); saveResult.NewFamilyList.Add(relatedFamily); } rockContext.SaveChanges(); familyPersonState.GroupId = relatedFamily.Id; var familyMember = new GroupMember { GroupId = relatedFamily.Id, PersonId = familyPersonState.PersonId.Value, GroupMemberStatus = GroupMemberStatus.Active }; if (familyPersonState.IsAdult) { familyMember.GroupRoleId = groupTypeRoleAdultId; } else { familyMember.GroupRoleId = groupTypeRoleChildId; } groupMemberService.Add(familyMember); } // ensure there are known relationships between each adult in the primary family to this person that isn't in the primary family foreach (var primaryFamilyAdult in editFamilyState.FamilyPersonListState.Where(a => a.IsAdult && a.InPrimaryFamily)) { groupMemberService.CreateKnownRelationship(primaryFamilyAdult.PersonId.Value, familyPersonState.PersonId.Value, familyPersonState.ChildRelationshipToAdult); // if this is something other than the CanCheckIn relationship, but is a relationship that should ensure a CanCheckIn relationship, create a CanCheckinRelationship if (groupTypeRoleCanCheckInId.HasValue && familyPersonState.CanCheckIn && groupTypeRoleCanCheckInId != familyPersonState.ChildRelationshipToAdult) { groupMemberService.CreateKnownRelationship(primaryFamilyAdult.PersonId.Value, familyPersonState.PersonId.Value, groupTypeRoleCanCheckInId.Value); } } } return(saveResult); }
/// <summary> /// Writes to package. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="model">The model.</param> public static void WriteToPackage <T>(T model) { var typeName = model.GetType().Name; if (model is IImportModel) { var importModel = ( IImportModel )model; // check if a textwriter is needed for this model type if (!textWriters.ContainsKey(typeName)) { if (!Directory.Exists(_packageDirectory)) { InitalizePackageFolder(); } textWriters.Add(typeName, ( TextWriter )File.CreateText($@"{_packageDirectory}\{importModel.GetFileName()}")); // if model is for person create related writers if (importModel is Person) { // person attributes var personAttributeValue = new PersonAttributeValue(); textWriters.Add(personAttributeValue.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{personAttributeValue.GetFileName()}")); // person phones var personPhone = new PersonPhone(); textWriters.Add(personPhone.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{personPhone.GetFileName()}")); // person addresses var personAddress = new PersonAddress(); textWriters.Add(personAddress.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{personAddress.GetFileName()}")); // person search key var personSearchKey = new PersonSearchKey(); textWriters.Add(personSearchKey.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{personSearchKey.GetFileName()}")); } if (importModel is PersonAttributeValue) { var personAttributeValue = new PersonAttributeValue(); textWriters.Add(personAttributeValue.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{personAttributeValue.GetFileName()}")); } // if model is for financial batch create related writers if (importModel is FinancialBatch) { // financial transactions var financialTransaction = new FinancialTransaction(); textWriters.Add(financialTransaction.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{financialTransaction.GetFileName()}")); // financial transation details var financialTransactionDetail = new FinancialTransactionDetail(); textWriters.Add(financialTransactionDetail.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{financialTransactionDetail.GetFileName()}")); } // if model is for financial transaction create related writers if (importModel is FinancialTransaction) { // financial transation details var financialTransactionDetail = new FinancialTransactionDetail(); textWriters.Add(financialTransactionDetail.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{financialTransactionDetail.GetFileName()}")); } // if model is for group create related writers if (importModel is Group) { // group member var groupMember = new GroupMember(); textWriters.Add(groupMember.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{groupMember.GetFileName()}")); // group attributes var groupAttributeValue = new GroupAttributeValue(); textWriters.Add(groupAttributeValue.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{groupAttributeValue.GetFileName()}")); // group addresses var groupAddress = new GroupAddress(); textWriters.Add(groupAddress.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{groupAddress.GetFileName()}")); } // if model is for business create related writers if (importModel is Business) { // business attributes var businessAttributeValue = new BusinessAttributeValue(); textWriters.Add(businessAttributeValue.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{businessAttributeValue.GetFileName()}")); // business phones var businessPhone = new BusinessPhone(); textWriters.Add(businessPhone.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{businessPhone.GetFileName()}")); // business addresses var businessAddress = new BusinessAddress(); textWriters.Add(businessAddress.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{businessAddress.GetFileName()}")); // business contacts var businessContact = new BusinessContact(); textWriters.Add(businessContact.GetType().Name, ( TextWriter )File.CreateText($@"{_packageDirectory}\{businessContact.GetFileName()}")); } } var txtWriter = textWriters[typeName]; // check if a csvwriter is needed for this model type if (!csvWriters.ContainsKey(typeName)) { var newCsvWriter = new CsvWriter(txtWriter); csvWriters.Add(typeName, newCsvWriter); newCsvWriter.WriteHeader <T>(); //newCsvWriter.Configuration.QuoteAllFields = true; // if model is for person create related writers if (importModel is Person) { // person attributes var personAttributeValue = new PersonAttributeValue(); var newPersonAttributeValueCsvWriter = new CsvWriter(textWriters[personAttributeValue.GetType().Name]); csvWriters.Add(personAttributeValue.GetType().Name, newPersonAttributeValueCsvWriter); newPersonAttributeValueCsvWriter.WriteHeader <PersonAttributeValue>(); // person phones var personPhone = new PersonPhone(); var newPersonPhoneCsvWriter = new CsvWriter(textWriters[personPhone.GetType().Name]); csvWriters.Add(personPhone.GetType().Name, newPersonPhoneCsvWriter); newPersonPhoneCsvWriter.WriteHeader <PersonPhone>(); // person addresses var personAddress = new PersonAddress(); var newPersonAddressCsvWriter = new CsvWriter(textWriters[personAddress.GetType().Name]); csvWriters.Add(personAddress.GetType().Name, newPersonAddressCsvWriter); newPersonAddressCsvWriter.WriteHeader <PersonAddress>(); // person search keys var personSearchKey = new PersonSearchKey(); var newPersonSearchKeyCsvWriter = new CsvWriter(textWriters[personSearchKey.GetType().Name]); csvWriters.Add(personSearchKey.GetType().Name, newPersonSearchKeyCsvWriter); newPersonSearchKeyCsvWriter.WriteHeader <PersonSearchKey>(); } if (importModel is PersonAttributeValue) { var personAttributeValue = new PersonAttributeValue(); var newPersonAttributeValueCsvWriter = new CsvWriter(textWriters[personAttributeValue.GetType().Name]); csvWriters.Add(personAttributeValue.GetType().Name, newPersonAttributeValueCsvWriter); newPersonAttributeValueCsvWriter.WriteHeader <PersonAttributeValue>(); } // if model is for financial batch create related writers if (importModel is FinancialBatch) { // financial transaction var financialTransaction = new FinancialTransaction(); var newFinancialTransactionCsvWriter = new CsvWriter(textWriters[financialTransaction.GetType().Name]); csvWriters.Add(financialTransaction.GetType().Name, newFinancialTransactionCsvWriter); newFinancialTransactionCsvWriter.WriteHeader <FinancialTransaction>(); // financial transaction detail var financialTransactionDetail = new FinancialTransactionDetail(); var newFinancialTransactionDetailCsvWriter = new CsvWriter(textWriters[financialTransactionDetail.GetType().Name]); csvWriters.Add(financialTransactionDetail.GetType().Name, newFinancialTransactionDetailCsvWriter); newFinancialTransactionDetailCsvWriter.WriteHeader <FinancialTransactionDetail>(); } //if model is for financial transaction, create related writers if (importModel is FinancialTransaction) { // financial transaction detail var financialTransactionDetail = new FinancialTransactionDetail(); var newFinancialTransactionDetailCsvWriter = new CsvWriter(textWriters[financialTransactionDetail.GetType().Name]); csvWriters.Add(financialTransactionDetail.GetType().Name, newFinancialTransactionDetailCsvWriter); newFinancialTransactionDetailCsvWriter.WriteHeader <FinancialTransactionDetail>(); } // if model is for group create related writers if (importModel is Group) { // group member var groupMember = new GroupMember(); var newGroupMemberCsvWriter = new CsvWriter(textWriters[groupMember.GetType().Name]); csvWriters.Add(groupMember.GetType().Name, newGroupMemberCsvWriter); newGroupMemberCsvWriter.WriteHeader <GroupMember>(); // group attributes var groupAttributeValue = new GroupAttributeValue(); var newGroupAttributeValueCsvWriter = new CsvWriter(textWriters[groupAttributeValue.GetType().Name]); csvWriters.Add(groupAttributeValue.GetType().Name, newGroupAttributeValueCsvWriter); newGroupAttributeValueCsvWriter.WriteHeader <GroupAttributeValue>(); // group addresses var groupAddress = new GroupAddress(); var newGroupAddressCsvWriter = new CsvWriter(textWriters[groupAddress.GetType().Name]); csvWriters.Add(groupAddress.GetType().Name, newGroupAddressCsvWriter); newGroupAddressCsvWriter.WriteHeader <GroupAddress>(); } // if model is for business create related writers if (importModel is Business) { // business attributes var businessAttributeValue = new BusinessAttributeValue(); var newBusinessAttributeValueCsvWriter = new CsvWriter(textWriters[businessAttributeValue.GetType().Name]); csvWriters.Add(businessAttributeValue.GetType().Name, newBusinessAttributeValueCsvWriter); newBusinessAttributeValueCsvWriter.WriteHeader <BusinessAttributeValue>(); // business phones var businessPhone = new BusinessPhone(); var newBusinessPhoneCsvWriter = new CsvWriter(textWriters[businessPhone.GetType().Name]); csvWriters.Add(businessPhone.GetType().Name, newBusinessPhoneCsvWriter); newBusinessPhoneCsvWriter.WriteHeader <BusinessPhone>(); // business addresses var businessAddress = new BusinessAddress(); var newBusinessAddressCsvWriter = new CsvWriter(textWriters[businessAddress.GetType().Name]); csvWriters.Add(businessAddress.GetType().Name, newBusinessAddressCsvWriter); newBusinessAddressCsvWriter.WriteHeader <BusinessAddress>(); // business Contacts var businessContacts = new BusinessContact(); var newBusinessContactsCsvWriter = new CsvWriter(textWriters[businessContacts.GetType().Name]); csvWriters.Add(businessContacts.GetType().Name, newBusinessContactsCsvWriter); newBusinessContactsCsvWriter.WriteHeader <BusinessContact>(); } } var csvWriter = csvWriters[typeName]; csvWriter.WriteRecord <T>(model); // if person model write out any related models if (importModel is Person) { // person attributes var personAttributeValue = new PersonAttributeValue(); var csvPersonAttributeValueWriter = csvWriters[personAttributeValue.GetType().Name]; if (csvPersonAttributeValueWriter != null) { foreach (var attribute in (( Person )importModel).Attributes) { csvPersonAttributeValueWriter.WriteRecord(attribute); } } // person phones var personPhone = new PersonPhone(); var csvPersonPhoneWriter = csvWriters[personPhone.GetType().Name]; if (csvPersonPhoneWriter != null) { foreach (var phone in (( Person )importModel).PhoneNumbers) { csvPersonPhoneWriter.WriteRecord(phone); } } // person addresses var personAddress = new PersonAddress(); var csvPersonAddressWriter = csvWriters[personAddress.GetType().Name]; if (csvPersonAddressWriter != null) { foreach (var address in (( Person )importModel).Addresses) { if ((( Person )importModel).FamilyId.HasValue) { var familyAddress = new FamilyAddress { FamilyId = (( Person )importModel).FamilyId.Value, Street1 = address.Street1, PostalCode = address.PostalCode.Left(5) }; var index = _familyAddresses.FindIndex(a => a.FamilyId == (( Person )importModel).FamilyId.Value && a.Street1.Equals(address.Street1, StringComparison.OrdinalIgnoreCase) && a.PostalCode.Equals(address.PostalCode.Left(5))); if (index == -1) { _familyAddresses.Add(familyAddress); csvPersonAddressWriter.WriteRecord(address); } } else { csvPersonAddressWriter.WriteRecord(address); } } } // person search keys var personSearchKey = new PersonSearchKey(); var csvPersonSearchKeyWriter = csvWriters[personSearchKey.GetType().Name]; if (csvPersonSearchKeyWriter != null) { foreach (var searchKey in (( Person )importModel).PersonSearchKeys) { csvPersonSearchKeyWriter.WriteRecord(searchKey); } } } // if financial model write out any related models if (importModel is FinancialBatch) { // write out financial transactions and transaction details var financialTransaction = new FinancialTransaction(); var csvFinancialTransactionWriter = csvWriters[financialTransaction.GetType().Name]; var financialTransactionDetail = new FinancialTransactionDetail(); var csvFinancialTransactionDetailWriter = csvWriters[financialTransactionDetail.GetType().Name]; if (csvFinancialTransactionWriter != null && csvFinancialTransactionDetailWriter != null) { foreach (var transaction in (( FinancialBatch )importModel).FinancialTransactions) { csvFinancialTransactionWriter.WriteRecord(transaction); foreach (var transactionDetail in transaction.FinancialTransactionDetails) { csvFinancialTransactionDetailWriter.WriteRecord(transactionDetail); } } } } // if financial Transaction model write out any related models if (importModel is FinancialTransaction) { var financialTransactionDetail = new FinancialTransactionDetail(); var csvFinancialTransactionDetailWriter = csvWriters[financialTransactionDetail.GetType().Name]; if (csvFinancialTransactionDetailWriter != null) { foreach (var transactionDetail in (( FinancialTransaction )importModel).FinancialTransactionDetails) { csvFinancialTransactionDetailWriter.WriteRecord(transactionDetail); } } } // if group model write out any related models if (importModel is Group) { // group members var groupMember = new GroupMember(); var csvGroupMemberWriter = csvWriters[groupMember.GetType().Name]; if (csvGroupMemberWriter != null) { foreach (var groupMemberItem in (( Group )importModel).GroupMembers) { csvGroupMemberWriter.WriteRecord(groupMemberItem); } } // group attributes var groupAttributeValue = new GroupAttributeValue(); var csvGroupAttributeValueWriter = csvWriters[groupAttributeValue.GetType().Name]; if (csvGroupAttributeValueWriter != null) { foreach (var attribute in (( Group )importModel).Attributes) { csvGroupAttributeValueWriter.WriteRecord(attribute); } } // group addresses var groupAddress = new GroupAddress(); var csvGroupAddressWriter = csvWriters[groupAddress.GetType().Name]; if (csvGroupAddressWriter != null) { foreach (var address in (( Group )importModel).Addresses) { csvGroupAddressWriter.WriteRecord(address); } } } // if business model write out any related models if (importModel is Business) { // business attributes var personBusinessValue = new BusinessAttributeValue(); var csvBusinessAttributeValueWriter = csvWriters[personBusinessValue.GetType().Name]; if (csvBusinessAttributeValueWriter != null) { foreach (var attribute in (( Business )importModel).Attributes) { csvBusinessAttributeValueWriter.WriteRecord(attribute); } } // business phones var businessPhone = new BusinessPhone(); var csvBusinessPhoneWriter = csvWriters[businessPhone.GetType().Name]; if (csvBusinessPhoneWriter != null) { foreach (var phone in (( Business )importModel).PhoneNumbers) { csvBusinessPhoneWriter.WriteRecord(phone); } } // business addresses var businessAddress = new BusinessAddress(); var csvBusinessAddressWriter = csvWriters[businessAddress.GetType().Name]; if (csvBusinessAddressWriter != null) { foreach (var address in (( Business )importModel).Addresses) { csvBusinessAddressWriter.WriteRecord(address); } } // business contacts var businessContact = new BusinessContact(); var csvBusinessContactWriter = csvWriters[businessContact.GetType().Name]; if (csvBusinessContactWriter != null) { foreach (var contact in (( Business )importModel).Contacts) { csvBusinessAddressWriter.WriteRecord(contact); } } } } }
private bool UpdateSearchValueRecords(IJobExecutionContext context, int howManyToConvert, int commandTimeout) { bool anyRemaining = true; int howManyLeft = howManyToConvert; var attribute = AttributeCache.Get("8F528431-A438-4488-8DC3-CA42E66C1B37".AsGuid()); var searchTypeValue = DefinedValueCache.Get(SystemGuid.DefinedValue.PERSON_SEARCH_KEYS_ALTERNATE_ID.AsGuid()); if (attribute != null && searchTypeValue != null) { while (howManyLeft > 0) { using (var rockContext = new RockContext()) { var groupMemberService = new GroupMemberService(rockContext); var attributeValueService = new AttributeValueService(rockContext); var personSearchKeyService = new PersonSearchKeyService(rockContext); int take = howManyLeft < 100 ? howManyLeft : 100; var attributeValueRecords = attributeValueService .Queryable() .Where(v => v.AttributeId == attribute.Id && v.EntityId.HasValue) .OrderBy(v => v.Id) .Take(take) .ToList(); anyRemaining = attributeValueRecords.Count >= take; howManyLeft = anyRemaining ? howManyLeft - take : 0; foreach (var attributevalueRecord in attributeValueRecords) { var hoh = groupMemberService .Queryable() .Where(m => m.GroupId == attributevalueRecord.EntityId.Value) .HeadOfHousehold(); if (hoh != null && hoh.PrimaryAlias != null) { var keys = attributevalueRecord.Value.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); foreach (var key in keys) { var searchValue = new PersonSearchKey { PersonAliasId = hoh.PrimaryAlias.Id, SearchTypeValueId = searchTypeValue.Id, SearchValue = key }; personSearchKeyService.Add(searchValue); } } attributeValueService.Delete(attributevalueRecord); rockContext.SaveChanges(); } int numberMigrated = howManyToConvert - howManyLeft; var percentComplete = howManyToConvert > 0 ? (numberMigrated * 100.0) / howManyToConvert : 100.0; var statusMessage = $@"Progress: {numberMigrated} of {howManyToConvert} ({Math.Round( percentComplete, 1 )}%) Family Check-in Identifiers migrated to person search key values"; context.UpdateLastStatusMessage(statusMessage); rockContext.SaveChanges(disablePrePostProcessing: true); } } } return(anyRemaining); }
private static void CreatePersonWithPrimaryAndPreviousEmails() { var rockContext = new RockContext(); var personService = new PersonService(rockContext); var person = personService.Get(PersonGuid.PersonWithPrimaryAndPreviousEmailsGuid); if (person != null) { new PersonAliasService(rockContext).DeleteRange(person.Aliases); new PersonSearchKeyService(rockContext).DeleteRange(person.GetPersonSearchKeys(rockContext).ToList()); personService.Delete(person); rockContext.SaveChanges(); } person = new Person() { RecordTypeValueId = DefinedValueCache.GetId(Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid()), FirstName = "I Have A", LastName = "CommonLastName", Guid = PersonGuid.PersonWithPrimaryAndPreviousEmailsGuid, Email = Email.PrimaryEmail }; Group newPersonFamily = PersonService.SaveNewPerson(person, rockContext); person = personService.Get(PersonGuid.PersonWithPrimaryAndPreviousEmailsGuid); var primaryAliasId = person.PrimaryAliasId; var personSearchKeyService = new PersonSearchKeyService(rockContext); var searchTypeValue = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_SEARCH_KEYS_EMAIL.AsGuid()); PersonSearchKey personSearchKeyPreviousEmail1 = new PersonSearchKey() { PersonAliasId = primaryAliasId, SearchTypeValueId = searchTypeValue.Id, SearchValue = Email.PreviousEmail1 }; personSearchKeyService.Add(personSearchKeyPreviousEmail1); PersonSearchKey personSearchKeyPreviousEmail2 = new PersonSearchKey() { PersonAliasId = primaryAliasId, SearchTypeValueId = searchTypeValue.Id, SearchValue = Email.PreviousEmail2 }; personSearchKeyService.Add(personSearchKeyPreviousEmail2); PersonSearchKey personSearchKeyPreviousEmail3 = new PersonSearchKey() { PersonAliasId = primaryAliasId, SearchTypeValueId = searchTypeValue.Id, SearchValue = Email.PreviousEmail3 }; personSearchKeyService.Add(personSearchKeyPreviousEmail3); rockContext.SaveChanges(); }