public Get ( string street1, string street2, string city, string state, string postalCode, string country, bool verifyLocation = true ) : Location | ||
street1 | string | A |
street2 | string | A |
city | string | A |
state | string | A |
postalCode | string | A |
country | string | The country. |
verifyLocation | bool | if set to |
return | Location |
/// <summary> /// Returns the field's current value(s) /// </summary> /// <param name="parentControl">The parent control.</param> /// <param name="value">Information about the value</param> /// <param name="configurationValues">The configuration values.</param> /// <param name="condensed">Flag indicating if the value should be condensed (i.e. for use in a grid column)</param> /// <returns></returns> public override string FormatValue( Control parentControl, string value, Dictionary<string, ConfigurationValue> configurationValues, bool condensed ) { string formattedValue = string.Empty; if ( !string.IsNullOrWhiteSpace( value ) ) { var service = new LocationService(); var location = service.Get( new Guid( value ) ); if ( location != null ) { formattedValue = location.ToString(); } } return base.FormatValue( parentControl, formattedValue, null, condensed ); }
/// <summary> /// Handles the Click event of the _btnSelect control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void _btnSelect_Click( object sender, EventArgs e ) { LocationService locationService = new LocationService( new RockContext() ); var location = locationService.Get( _tbAddress1.Text, _tbAddress2.Text, _tbCity.Text, _ddlState.SelectedItem.Text, _tbZip.Text ); Location = location; _btnPickerLabel.InnerHtml = string.Format( "<i class='fa fa-user'></i>{0}<b class='fa fa-caret-down pull-right'></b>", this.AddressSummaryText ); }
/// <summary> /// Handles adding groups from the given XML element snippet. /// </summary> /// <param name="elemGroups">The elem groups.</param> /// <param name="rockContext">The rock context.</param> /// <exception cref="System.NotSupportedException"></exception> private void AddGroups( XElement elemGroups, RockContext rockContext ) { // Add groups if ( elemGroups == null ) { return; } GroupService groupService = new GroupService( rockContext ); DefinedTypeCache smallGroupTopicType = DefinedTypeCache.Read( Rock.SystemGuid.DefinedType.SMALL_GROUP_TOPIC.AsGuid() ); // Next create the group along with its members. foreach ( var elemGroup in elemGroups.Elements( "group" ) ) { Guid guid = elemGroup.Attribute( "guid" ).Value.Trim().AsGuid(); string type = elemGroup.Attribute( "type" ).Value; Group group = new Group() { Guid = guid, Name = elemGroup.Attribute( "name" ).Value.Trim(), IsActive = true, IsPublic = true }; // skip any where there is no group type given -- they are invalid entries. if ( string.IsNullOrEmpty( elemGroup.Attribute( "type" ).Value.Trim() ) ) { return; } int? roleId; GroupTypeCache groupType; switch ( elemGroup.Attribute( "type" ).Value.Trim() ) { case "serving": groupType = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_SERVING_TEAM.AsGuid() ); group.GroupTypeId = groupType.Id; roleId = groupType.DefaultGroupRoleId; break; case "smallgroup": groupType = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_SMALL_GROUP.AsGuid() ); group.GroupTypeId = groupType.Id; roleId = groupType.DefaultGroupRoleId; break; default: throw new NotSupportedException( string.Format( "unknown group type {0}", elemGroup.Attribute( "type" ).Value.Trim() ) ); } if ( elemGroup.Attribute( "description" ) != null ) { group.Description = elemGroup.Attribute( "description" ).Value; } if ( elemGroup.Attribute( "parentGroupGuid" ) != null ) { var parentGroup = groupService.Get( elemGroup.Attribute( "parentGroupGuid" ).Value.AsGuid() ); if ( parentGroup != null ) { group.ParentGroupId = parentGroup.Id; } } // Set the group's meeting location if ( elemGroup.Attribute( "meetsAtHomeOfFamily" ) != null ) { int meetingLocationValueId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_MEETING_LOCATION.AsGuid() ).Id; var groupLocation = new GroupLocation() { IsMappedLocation = false, IsMailingLocation = false, GroupLocationTypeValueId = meetingLocationValueId, LocationId = _familyLocationDictionary[elemGroup.Attribute( "meetsAtHomeOfFamily" ).Value.AsGuid()], }; // Set the group location's GroupMemberPersonId if given (required?) if ( elemGroup.Attribute( "meetsAtHomeOfPerson" ) != null ) { groupLocation.GroupMemberPersonAliasId = _peopleAliasDictionary[elemGroup.Attribute( "meetsAtHomeOfPerson" ).Value.AsGuid()]; } group.GroupLocations.Add( groupLocation ); } group.LoadAttributes( rockContext ); // Set the study topic if ( elemGroup.Attribute( "studyTopic" ) != null ) { var topic = elemGroup.Attribute( "studyTopic" ).Value; DefinedValue smallGroupTopicDefinedValue = _smallGroupTopicDefinedType.DefinedValues.FirstOrDefault( a => a.Value == topic ); // add it as new if we didn't find it. if ( smallGroupTopicDefinedValue == null ) { smallGroupTopicDefinedValue = AddDefinedTypeValue( topic, _smallGroupTopicDefinedType, rockContext ); } group.SetAttributeValue( "Topic", smallGroupTopicDefinedValue.Guid.ToString() ); } // Set the schedule and meeting time if ( elemGroup.Attribute( "groupSchedule" ) != null ) { string[] schedule = elemGroup.Attribute( "groupSchedule" ).Value.SplitDelimitedValues( whitespace: false ); if ( schedule[0] == "weekly" ) { var dow = schedule[1]; var time = schedule[2]; AddWeeklySchedule( group, dow, time ); } } // Add each person as a member foreach ( var elemPerson in elemGroup.Elements( "person" ) ) { Guid personGuid = elemPerson.Attribute( "guid" ).Value.Trim().AsGuid(); GroupMember groupMember = new GroupMember(); groupMember.GroupMemberStatus = GroupMemberStatus.Active; if ( elemPerson.Attribute( "isLeader" ) != null ) { bool isLeader = elemPerson.Attribute( "isLeader" ).Value.Trim().AsBoolean(); if ( isLeader ) { var gtLeaderRole = groupType.Roles.Where( r => r.IsLeader ).FirstOrDefault(); if ( gtLeaderRole != null ) { groupMember.GroupRoleId = gtLeaderRole.Id; } } } else { groupMember.GroupRoleId = roleId ?? -1; } groupMember.PersonId = _peopleDictionary[personGuid]; group.Members.Add( groupMember ); } groupService.Add( group ); // Now we have to save changes in order for the attributes to be saved correctly. rockContext.SaveChanges(); group.SaveAttributeValues( rockContext ); if ( !_groupDictionary.ContainsKey( group.Guid ) ) { _groupDictionary.Add( group.Guid, group.Id ); } // Now add any group location schedules LocationService locationService = new LocationService( rockContext ); ScheduleService scheduleService = new ScheduleService( rockContext ); Guid locationTypeMeetingLocationGuid = new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_MEETING_LOCATION ); var locationTypeMeetingLocationId = Rock.Web.Cache.DefinedValueCache.Read( locationTypeMeetingLocationGuid ).Id; foreach ( var elemLocation in elemGroup.Elements( "location" ) ) { Guid locationGuid = elemLocation.Attribute( "guid" ).Value.Trim().AsGuid(); Location location = locationService.Get( locationGuid ); GroupLocation groupLocation = new GroupLocation(); groupLocation.Location = location; groupLocation.GroupLocationTypeValueId = locationTypeMeetingLocationId; group.GroupLocations.Add( groupLocation ); foreach ( var elemSchedule in elemLocation.Elements( "schedule" ) ) { try { Guid scheduleGuid = elemSchedule.Attribute( "guid" ).Value.Trim().AsGuid(); Schedule schedule = scheduleService.Get( scheduleGuid ); groupLocation.Schedules.Add( schedule ); } catch { } } TimeSpan ts = _stopwatch.Elapsed; AppendFormat( "{0:00}:{1:00}.{2:00} group location schedules added<br/>", ts.Minutes, ts.Seconds, ts.Milliseconds / 10 ); } } }
/// <summary> /// Loads the family data. /// </summary> /// <param name="csvData">The CSV data.</param> private int LoadFamily( CsvDataModel csvData ) { // Required variables var lookupContext = new RockContext(); var locationService = new LocationService( lookupContext ); int familyGroupTypeId = GroupTypeCache.GetFamilyGroupType().Id; int numImportedFamilies = ImportedPeople.Select( p => p.ForeignId ).Distinct().Count(); int homeLocationTypeId = DefinedValueCache.Read( new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_HOME ) ).Id; int workLocationTypeId = DefinedValueCache.Read( new Guid( "E071472A-F805-4FC4-917A-D5E3C095C35C" ) ).Id; var currentFamilyGroup = new Group(); var newFamilyList = new List<Group>(); var newGroupLocations = new Dictionary<GroupLocation, string>(); string currentFamilyId = string.Empty; int completed = 0; ReportProgress( 0, string.Format( "Starting family import ({0:N0} already exist).", numImportedFamilies ) ); string[] row; // Uses a look-ahead enumerator: this call will move to the next record immediately while ( ( row = csvData.Database.FirstOrDefault() ) != null ) { string rowFamilyId = row[FamilyId]; string rowFamilyName = row[FamilyName]; if ( !string.IsNullOrWhiteSpace( rowFamilyId ) && rowFamilyId != currentFamilyGroup.ForeignId ) { currentFamilyGroup = ImportedPeople.FirstOrDefault( p => p.ForeignId == rowFamilyId ); if ( currentFamilyGroup == null ) { currentFamilyGroup = new Group(); currentFamilyGroup.ForeignId = rowFamilyId; currentFamilyGroup.Name = row[FamilyName]; currentFamilyGroup.CreatedByPersonAliasId = ImportPersonAlias.Id; currentFamilyGroup.GroupTypeId = familyGroupTypeId; newFamilyList.Add( currentFamilyGroup ); } // Set the family campus string campusName = row[Campus]; if ( !string.IsNullOrWhiteSpace( campusName ) ) { var familyCampus = CampusList.Where( c => c.Name.StartsWith( campusName ) || c.ShortCode.StartsWith( campusName ) ).FirstOrDefault(); if ( familyCampus == null ) { familyCampus = new Campus(); familyCampus.IsSystem = false; familyCampus.Name = campusName; lookupContext.Campuses.Add( familyCampus ); lookupContext.SaveChanges( true ); } // This won't assign a campus if the family already exists because the context doesn't get saved currentFamilyGroup.CampusId = familyCampus.Id; } // Add the family addresses since they exist in this file string famAddress = row[Address]; string famAddress2 = row[Address2]; string famCity = row[City]; string famState = row[State]; string famZip = row[Zip]; string famCountry = row[Country]; // Use the core Rock location service to add or lookup an address Location primaryAddress = locationService.Get( famAddress, famAddress2, famCity, famState, famZip, famCountry ); if ( primaryAddress != null ) { primaryAddress.Name = currentFamilyGroup.Name + " Home"; var primaryLocation = new GroupLocation(); primaryLocation.LocationId = primaryAddress.Id; primaryLocation.IsMailingLocation = true; primaryLocation.IsMappedLocation = true; primaryLocation.GroupLocationTypeValueId = homeLocationTypeId; newGroupLocations.Add( primaryLocation, rowFamilyId ); } string famSecondAddress = row[SecondaryAddress]; string famSecondAddress2 = row[SecondaryAddress2]; string famSecondCity = row[SecondaryCity]; string famSecondState = row[SecondaryState]; string famSecondZip = row[SecondaryZip]; string famSecondCountry = row[SecondaryCountry]; Location secondaryAddress = locationService.Get( famSecondAddress, famSecondAddress2, famSecondCity, famSecondState, famSecondZip, famSecondCountry ); if ( secondaryAddress != null ) { secondaryAddress.Name = currentFamilyGroup.Name + " Work"; var secondaryLocation = new GroupLocation(); secondaryLocation.LocationId = primaryAddress.Id; secondaryLocation.IsMailingLocation = true; secondaryLocation.IsMappedLocation = true; secondaryLocation.GroupLocationTypeValueId = workLocationTypeId; newGroupLocations.Add( secondaryLocation, rowFamilyId ); } completed++; if ( completed % ( ReportingNumber * 10 ) < 1 ) { ReportProgress( 0, string.Format( "{0:N0} families imported.", completed ) ); } else if ( completed % ReportingNumber < 1 ) { SaveFamilies( newFamilyList, newGroupLocations ); ReportPartialProgress(); // Reset lookup context lookupContext = new RockContext(); locationService = new LocationService( lookupContext ); newFamilyList.Clear(); newGroupLocations.Clear(); } } } // Check to see if any rows didn't get saved to the database if ( newGroupLocations.Any() ) { SaveFamilies( newFamilyList, newGroupLocations ); } ReportProgress( 0, string.Format( "Finished family import: {0:N0} families imported.", completed ) ); return completed; }
/// <summary> /// Handles the Click event of the btnStandardize control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnStandardize_Click( object sender, EventArgs e ) { int locationId = hfLocationId.Value.AsInteger(); var rockContext = new RockContext(); var service = new LocationService( rockContext ); var location = service.Get( locationId ); if (location == null) { // if they are adding a new named location, there won't be a location record yet, so just make a new one for the verification location = new Location(); } acAddress.GetValues( location ); service.Verify( location, true ); acAddress.SetValues( location ); geopPoint.SetValue( location.GeoPoint ); lStandardizationUpdate.Text = String.Format( "<div class='alert alert-info'>Standardization Result: {0}<br/>Geocoding Result: {1}</div>", location.StandardizeAttemptedResult.IfEmpty( "No Result" ), location.GeocodeAttemptedResult.IfEmpty( "No Result" ) ); }
/// <summary> /// Handles the Click event of the btnEdit control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnEdit_Click( object sender, EventArgs e ) { LocationService locationService = new LocationService( new RockContext() ); Location location = locationService.Get( int.Parse( hfLocationId.Value ) ); ShowEditDetails( location ); }
/// <summary> /// Handles the Click event of the btnCancel control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnCancel_Click( object sender, EventArgs e ) { if ( hfLocationId.Value.Equals( "0" ) ) { int? parentLocationId = PageParameter( "ParentLocationId" ).AsIntegerOrNull(); if ( parentLocationId.HasValue ) { // Cancelling on Add, and we know the parentLocationId, so we are probably in treeview mode, so navigate to the current page var qryParams = new Dictionary<string, string>(); qryParams["LocationId"] = parentLocationId.ToString(); qryParams["ExpandedIds"] = PageParameter( "ExpandedIds" ); NavigateToPage( RockPage.Guid, qryParams ); } else { // Cancelling on Add. Return to Grid NavigateToParentPage(); } } else { // Cancelling on Edit. Return to Details LocationService locationService = new LocationService( new RockContext() ); Location location = locationService.Get( int.Parse( hfLocationId.Value ) ); ShowReadonlyDetails( location ); } }
/// <summary> /// Binds the grid. /// </summary> protected void BindGrid() { AddScheduleColumns(); var rockContext = new RockContext(); var groupLocationService = new GroupLocationService( rockContext ); var groupTypeService = new GroupTypeService( rockContext ); var groupService = new GroupService( rockContext ); IEnumerable<GroupTypePath> groupPaths = new List<GroupTypePath>(); var groupLocationQry = groupLocationService.Queryable(); List<int> currentAndDescendantGroupTypeIds = new List<int>(); var currentGroupTypeIds = this.CurrentGroupTypeIds.ToList(); currentAndDescendantGroupTypeIds.AddRange( currentGroupTypeIds ); foreach ( var templateGroupType in groupTypeService.Queryable().Where( a => currentGroupTypeIds.Contains( a.Id ) ) ) { foreach ( var childGroupType in groupTypeService.GetChildGroupTypes( templateGroupType.Id ) ) { currentAndDescendantGroupTypeIds.Add( childGroupType.Id ); currentAndDescendantGroupTypeIds.AddRange( groupTypeService.GetAllAssociatedDescendents( childGroupType.Id ).Select( a => a.Id ).ToList() ); } } groupLocationQry = groupLocationQry.Where( a => currentAndDescendantGroupTypeIds.Contains( a.Group.GroupTypeId ) ); groupLocationQry = groupLocationQry.OrderBy( a => a.Group.Name ).ThenBy( a => a.Location.Name ); List<int> currentDeviceLocationIdList = this.GetGroupTypesLocations( rockContext ).Select( a => a.Id ).Distinct().ToList(); var qryList = groupLocationQry .Where( a => currentDeviceLocationIdList.Contains( a.LocationId ) ) .Select( a => new { GroupLocationId = a.Id, a.Location, GroupId = a.GroupId, GroupName = a.Group.Name, ScheduleIdList = a.Schedules.Select( s => s.Id ), GroupTypeId = a.Group.GroupTypeId } ).ToList(); var locationService = new LocationService( rockContext ); // put stuff in a datatable so we can dynamically have columns for each Schedule DataTable dataTable = new DataTable(); dataTable.Columns.Add( "GroupLocationId" ); dataTable.Columns.Add( "GroupId" ); dataTable.Columns.Add( "GroupName" ); dataTable.Columns.Add( "GroupPath" ); dataTable.Columns.Add( "LocationName" ); dataTable.Columns.Add( "LocationPath" ); foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { dataTable.Columns.Add( field.DataField, typeof( bool ) ); } var locationPaths = new Dictionary<int, string>(); foreach ( var row in qryList ) { DataRow dataRow = dataTable.NewRow(); dataRow["GroupLocationId"] = row.GroupLocationId; dataRow["GroupName"] = groupService.GroupAncestorPathName( row.GroupId ); dataRow["GroupPath"] = groupPaths.Where( gt => gt.GroupTypeId == row.GroupTypeId ).Select( gt => gt.Path ).FirstOrDefault(); dataRow["LocationName"] = row.Location.Name; if ( row.Location.ParentLocationId.HasValue ) { int locationId = row.Location.ParentLocationId.Value; if ( !locationPaths.ContainsKey( locationId ) ) { var locationNames = new List<string>(); var parentLocation = locationService.Get( locationId ); while ( parentLocation != null ) { locationNames.Add( parentLocation.Name ); parentLocation = parentLocation.ParentLocation; } if ( locationNames.Any() ) { locationNames.Reverse(); locationPaths.Add( locationId, locationNames.AsDelimited( " > " ) ); } else { locationPaths.Add( locationId, string.Empty ); } } dataRow["LocationPath"] = locationPaths[locationId]; } foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { int scheduleId = int.Parse( field.DataField.Replace( "scheduleField_", string.Empty ) ); dataRow[field.DataField] = row.ScheduleIdList.Any( a => a == scheduleId ); } dataTable.Rows.Add( dataRow ); } gGroupLocationSchedule.EntityTypeId = EntityTypeCache.Read<GroupLocation>().Id; gGroupLocationSchedule.DataSource = dataTable; gGroupLocationSchedule.DataBind(); }
/// <summary> /// Handles adding groups from the given XML element snippet. /// </summary> /// <param name="elemGroups">The elem groups.</param> /// <param name="rockContext">The rock context.</param> /// <exception cref="System.NotSupportedException"></exception> private void AddGroups( XElement elemGroups, RockContext rockContext ) { // Add groups if ( elemGroups == null ) { return; } GroupService groupService = new GroupService( rockContext ); // Next create the group along with its members. foreach ( var elemGroup in elemGroups.Elements( "group" ) ) { Guid guid = elemGroup.Attribute( "guid" ).Value.Trim().AsGuid(); string type = elemGroup.Attribute( "type" ).Value; Group group = new Group() { Guid = guid, Name = elemGroup.Attribute( "name" ).Value.Trim() }; // skip any where there is no group type given -- they are invalid entries. if ( string.IsNullOrEmpty( elemGroup.Attribute( "type" ).Value.Trim() ) ) { return; } int? roleId; GroupTypeCache groupType; switch ( elemGroup.Attribute( "type" ).Value.Trim() ) { case "serving": groupType = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_SERVING_TEAM.AsGuid() ); group.GroupTypeId = groupType.Id; roleId = groupType.DefaultGroupRoleId; break; case "smallgroup": groupType = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_SMALL_GROUP.AsGuid() ); group.GroupTypeId = groupType.Id; roleId = groupType.DefaultGroupRoleId; break; default: throw new NotSupportedException( string.Format( "unknown group type {0}", elemGroup.Attribute( "type" ).Value.Trim() ) ); } if ( elemGroup.Attribute( "description" ) != null ) { group.Description = elemGroup.Attribute( "description" ).Value; } if ( elemGroup.Attribute( "parentGroupGuid" ) != null ) { var parentGroup = groupService.Get( elemGroup.Attribute( "parentGroupGuid" ).Value.AsGuid() ); group.ParentGroupId = parentGroup.Id; } // Set the group's meeting location if ( elemGroup.Attribute( "meetsAtHomeOfFamily" ) != null ) { int meetingLocationValueId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_MEETING_LOCATION.AsGuid() ).Id; var groupLocation = new GroupLocation() { IsMappedLocation = false, IsMailingLocation = false, GroupLocationTypeValueId = meetingLocationValueId, LocationId = _familyLocationDictionary[elemGroup.Attribute( "meetsAtHomeOfFamily" ).Value.AsGuid()], }; // Set the group location's GroupMemberPersonId if given (required?) if ( elemGroup.Attribute( "meetsAtHomeOfPerson" ) != null ) { groupLocation.GroupMemberPersonId = _peopleDictionary[elemGroup.Attribute( "meetsAtHomeOfPerson" ).Value.AsGuid()]; } group.GroupLocations.Add( groupLocation ); } group.LoadAttributes( rockContext ); // Set the study topic if ( elemGroup.Attribute( "studyTopic" ) != null ) { group.SetAttributeValue( "StudyTopic", elemGroup.Attribute( "studyTopic" ).Value ); } // Set the meeting time if ( elemGroup.Attribute( "meetingTime" ) != null ) { group.SetAttributeValue( "MeetingTime", elemGroup.Attribute( "meetingTime" ).Value ); } // Add each person as a member foreach ( var elemPerson in elemGroup.Elements( "person" ) ) { Guid personGuid = elemPerson.Attribute( "guid" ).Value.Trim().AsGuid(); GroupMember groupMember = new GroupMember(); groupMember.GroupMemberStatus = GroupMemberStatus.Active; groupMember.GroupRoleId = roleId ?? -1; groupMember.PersonId = _peopleDictionary[personGuid]; group.Members.Add( groupMember ); } groupService.Add( group ); // Now we have to save changes in order for the attributes to be saved correctly. rockContext.SaveChanges(); group.SaveAttributeValues( rockContext ); // Now add any group location schedules LocationService locationService = new LocationService( rockContext ); ScheduleService scheduleService = new ScheduleService( rockContext ); Guid locationTypeMeetingLocationGuid = new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_MEETING_LOCATION ); var locationTypeMeetingLocationId = Rock.Web.Cache.DefinedValueCache.Read( locationTypeMeetingLocationGuid ).Id; foreach ( var elemLocation in elemGroup.Elements( "location" ) ) { Guid locationGuid = elemLocation.Attribute( "guid" ).Value.Trim().AsGuid(); Location location = locationService.Get( locationGuid ); GroupLocation groupLocation = new GroupLocation(); groupLocation.Location = location; groupLocation.GroupLocationTypeValueId = locationTypeMeetingLocationId; group.GroupLocations.Add( groupLocation ); foreach ( var elemSchedule in elemLocation.Elements( "schedule" ) ) { try { Guid scheduleGuid = elemSchedule.Attribute( "guid" ).Value.Trim().AsGuid(); Schedule schedule = scheduleService.Get( scheduleGuid ); groupLocation.Schedules.Add( schedule ); } catch { } } TimeSpan ts = _stopwatch.Elapsed; _sb.AppendFormat( "{0:00}:{1:00}.{2:00} group location schedules added<br/>", ts.Minutes, ts.Seconds, ts.Milliseconds / 10 ); } } }
/// <summary> /// Handles the ItemCommand event of the rptrAddresses control. /// </summary> /// <param name="source">The source of the event.</param> /// <param name="e">The <see cref="RepeaterCommandEventArgs"/> instance containing the event data.</param> protected void rptrAddresses_ItemCommand( object source, RepeaterCommandEventArgs e ) { int locationId = int.MinValue; if ( int.TryParse( e.CommandArgument.ToString(), out locationId ) ) { using ( var rockContext = new RockContext() ) { var service = new LocationService( rockContext ); var location = service.Get( locationId ); if ( location != null ) { switch ( e.CommandName ) { case "verify": { service.Verify( location, true ); rockContext.SaveChanges(); break; } case "settings": { NavigateToLinkedPage( "LocationDetailPage", new Dictionary<string, string> { { "LocationId", location.Id.ToString() }, { "PersonId", Person.Id.ToString() } } ); break; } } } } } BindGroups(); }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { Location location; var rockContext = new RockContext(); LocationService locationService = new LocationService( rockContext ); AttributeService attributeService = new AttributeService( rockContext ); AttributeQualifierService attributeQualifierService = new AttributeQualifierService( rockContext ); int locationId = int.Parse( hfLocationId.Value ); if ( locationId == 0 ) { location = new Location(); location.Name = string.Empty; } else { location = locationService.Get( locationId ); } location.Name = tbName.Text; location.IsActive = cbIsActive.Checked; location.LocationTypeValueId = ddlLocationType.SelectedValueAsId(); if ( gpParentLocation != null && gpParentLocation.Location != null ) { location.ParentLocationId = gpParentLocation.Location.Id; } else { location.ParentLocationId = null; } location.PrinterDeviceId = ddlPrinter.SelectedValueAsInt(); var addrLocation = locapAddress.Location; if ( addrLocation != null ) { location.Street1 = addrLocation.Street1; location.Street2 = addrLocation.Street2; location.City = addrLocation.City; location.State = addrLocation.State; location.Zip = addrLocation.Zip; } location.GeoPoint = geopPoint.SelectedValue; if ( geopPoint.SelectedValue != null ) { location.IsGeoPointLocked = true; } location.GeoFence = geopFence.SelectedValue; location.IsGeoPointLocked = cbGeoPointLocked.Checked; location.LoadAttributes( rockContext ); Rock.Attribute.Helper.GetEditValues( phAttributeEdits, location ); if ( !Page.IsValid ) { return; } if ( !location.IsValid ) { // Controls will render the error messages return; } RockTransactionScope.WrapTransaction( () => { if ( location.Id.Equals( 0 ) ) { locationService.Add( location ); } rockContext.SaveChanges(); location.SaveAttributeValues( rockContext ); } ); var qryParams = new Dictionary<string, string>(); qryParams["LocationId"] = location.Id.ToString(); NavigateToPage( RockPage.Guid, qryParams ); }
/// <summary> /// Maps the family address. /// </summary> /// <param name="tableData">The table data.</param> /// <returns></returns> private void MapFamilyAddress( IQueryable<Row> tableData ) { var lookupContext = new RockContext(); var locationService = new LocationService( lookupContext ); List<GroupMember> familyGroupMemberList = new GroupMemberService( lookupContext ).Queryable().AsNoTracking() .Where( gm => gm.Group.GroupType.Guid == new Guid( Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY ) ).ToList(); var groupLocationDefinedType = DefinedTypeCache.Read( new Guid( Rock.SystemGuid.DefinedType.GROUP_LOCATION_TYPE ), lookupContext ); int homeGroupLocationTypeId = groupLocationDefinedType.DefinedValues .FirstOrDefault( dv => dv.Guid == new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_HOME ) ).Id; int workGroupLocationTypeId = groupLocationDefinedType.DefinedValues .FirstOrDefault( dv => dv.Guid == new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_WORK ) ).Id; int previousGroupLocationTypeId = groupLocationDefinedType.DefinedValues .FirstOrDefault( dv => dv.Guid == new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_PREVIOUS ) ).Id; string otherGroupLocationName = "Other (Imported)"; int? otherGroupLocationTypeId = groupLocationDefinedType.DefinedValues .Where( dv => dv.TypeName == otherGroupLocationName ) .Select( dv => (int?)dv.Id ).FirstOrDefault(); if ( otherGroupLocationTypeId == null ) { var otherGroupLocationType = new DefinedValue(); otherGroupLocationType.Value = otherGroupLocationName; otherGroupLocationType.DefinedTypeId = groupLocationDefinedType.Id; otherGroupLocationType.IsSystem = false; otherGroupLocationType.Order = 0; lookupContext.DefinedValues.Add( otherGroupLocationType ); lookupContext.SaveChanges( DisableAuditing ); otherGroupLocationTypeId = otherGroupLocationType.Id; } var newGroupLocations = new List<GroupLocation>(); int completed = 0; int totalRows = tableData.Count(); int percentage = ( totalRows - 1 ) / 100 + 1; ReportProgress( 0, string.Format( "Verifying address import ({0:N0} found).", totalRows ) ); foreach ( var row in tableData.Where( r => r != null ) ) { int? individualId = row["Individual_ID"] as int?; int? householdId = row["Household_ID"] as int?; var personKeys = GetPersonKeys( individualId, householdId, includeVisitors: false ); if ( personKeys != null ) { var familyGroup = familyGroupMemberList.Where( gm => gm.PersonId == personKeys.PersonId ) .Select( gm => gm.Group ).FirstOrDefault(); if ( familyGroup != null ) { var groupLocation = new GroupLocation(); string street1 = row["Address_1"] as string; string street2 = row["Address_2"] as string; string city = row["City"] as string; string state = row["State"] as string; string country = row["country"] as string; // NOT A TYPO: F1 has property in lower-case string zip = row["Postal_Code"] as string ?? string.Empty; // restrict zip to 5 places to prevent duplicates Location familyAddress = locationService.Get( street1, street2, city, state, zip.Left( 5 ), country, verifyLocation: false ); if ( familyAddress != null ) { familyAddress.CreatedByPersonAliasId = ImportPersonAliasId; familyAddress.Name = familyGroup.Name; familyAddress.IsActive = true; groupLocation.GroupId = familyGroup.Id; groupLocation.LocationId = familyAddress.Id; groupLocation.IsMailingLocation = true; groupLocation.IsMappedLocation = true; string addressType = row["Address_Type"].ToString().ToLower(); if ( addressType.Equals( "primary" ) ) { groupLocation.GroupLocationTypeValueId = homeGroupLocationTypeId; } else if ( addressType.Equals( "business" ) || addressType.ToLower().Equals( "org" ) ) { groupLocation.GroupLocationTypeValueId = workGroupLocationTypeId; } else if ( addressType.Equals( "previous" ) ) { groupLocation.GroupLocationTypeValueId = previousGroupLocationTypeId; } else if ( !string.IsNullOrEmpty( addressType ) ) { // look for existing group location types, otherwise mark as imported var customTypeId = groupLocationDefinedType.DefinedValues.Where( dv => dv.Value.ToLower().Equals( addressType ) ) .Select( dv => (int?)dv.Id ).FirstOrDefault(); groupLocation.GroupLocationTypeValueId = customTypeId ?? otherGroupLocationTypeId; } newGroupLocations.Add( groupLocation ); completed++; if ( completed % percentage < 1 ) { int percentComplete = completed / percentage; ReportProgress( percentComplete, string.Format( "{0:N0} addresses imported ({1}% complete).", completed, percentComplete ) ); } else if ( completed % ReportingNumber < 1 ) { SaveFamilyAddress( newGroupLocations ); // Reset context newGroupLocations.Clear(); lookupContext = new RockContext(); locationService = new LocationService( lookupContext ); ReportPartialProgress(); } } } } } if ( newGroupLocations.Any() ) { SaveFamilyAddress( newGroupLocations ); } ReportProgress( 100, string.Format( "Finished address import: {0:N0} addresses imported.", completed ) ); }
void rptrAddresses_ItemCommand( object source, RepeaterCommandEventArgs e ) { int locationId = int.MinValue; if ( int.TryParse( e.CommandArgument.ToString(), out locationId ) ) { var service = new LocationService(); var location = service.Get( locationId ); switch ( e.CommandName ) { case "geocode": service.Geocode( location, CurrentPersonId ); break; case "standardize": service.Standardize( location, CurrentPersonId ); break; } service.Save( location, CurrentPersonId ); } BindFamilies(); }
/// <summary> /// Reads new values entered by the user for the field ( as Guid ) /// </summary> /// <param name="control">Parent control that controls were added to in the CreateEditControl() method</param> /// <param name="configurationValues">The configuration values.</param> /// <returns></returns> public override string GetEditValue( Control control, Dictionary<string, ConfigurationValue> configurationValues ) { var addressControl = control as AddressControl; var locationService = new LocationService( new RockContext() ); string result = null; if ( addressControl != null ) { var guid = Guid.Empty; var location = locationService.Get( addressControl.Street1, addressControl.Street2, addressControl.City, addressControl.State, addressControl.PostalCode, addressControl.Country ); if ( location != null ) { guid = location.Guid; } result = guid.ToString(); } return result; }
public bool FindDuplicates() { Duplicates = new Dictionary<Guid, List<Person>>(); var rockContext = new RockContext(); var locationService = new LocationService( rockContext ); var groupService = new GroupService( rockContext ); var personService = new PersonService( rockContext ); // Find any other group members (any group) that have same location var othersAtAddress = new List<int>(); string locationKey = GetLocationKey(); if ( !string.IsNullOrWhiteSpace(locationKey) && _verifiedLocations.ContainsKey( locationKey)) { int? locationId = _verifiedLocations[locationKey]; if ( locationId.HasValue ) { var location = locationService.Get( locationId.Value ); if ( location != null ) { othersAtAddress = groupService .Queryable().AsNoTracking() .Where( g => g.GroupTypeId == _locationType.Id && g.GroupLocations.Any( l => l.LocationId == location.Id ) ) .SelectMany( g => g.Members ) .Select( m => m.PersonId ) .ToList(); } } } foreach ( var person in GroupMembers .Where( m => m.Person != null && m.Person.FirstName != "" ) .Select( m => m.Person ) ) { bool otherCriteria = false; var personQry = personService .Queryable().AsNoTracking() .Where( p => p.FirstName == person.FirstName || p.NickName == person.FirstName ); if ( othersAtAddress.Any() ) { personQry = personQry .Where( p => othersAtAddress.Contains( p.Id ) ); } if ( person.BirthDate.HasValue ) { otherCriteria = true; personQry = personQry .Where( p => p.BirthDate.HasValue && p.BirthDate.Value == person.BirthDate.Value ); } if ( _homePhone != null ) { var homePhoneNumber = person.PhoneNumbers.Where( p => p.NumberTypeValueId == _homePhone.Id ).FirstOrDefault(); if ( homePhoneNumber != null ) { otherCriteria = true; personQry = personQry .Where( p => p.PhoneNumbers.Any( n => n.NumberTypeValueId == _homePhone.Id && n.Number == homePhoneNumber.Number ) ); } } if ( _cellPhone != null ) { var cellPhoneNumber = person.PhoneNumbers.Where( p => p.NumberTypeValueId == _cellPhone.Id ).FirstOrDefault(); if ( cellPhoneNumber != null ) { otherCriteria = true; personQry = personQry .Where( p => p.PhoneNumbers.Any( n => n.NumberTypeValueId == _cellPhone.Id && n.Number == cellPhoneNumber.Number ) ); } } if ( !string.IsNullOrWhiteSpace( person.Email ) ) { otherCriteria = true; personQry = personQry .Where( p => p.Email == person.Email ); } var dups = new List<Person>(); if ( otherCriteria ) { // If a birthday, email, phone, or address was entered, find anyone with same info and same first name dups = personQry.ToList(); } else { // otherwise find people with same first and last name dups = personQry .Where( p => p.LastName == person.LastName ) .ToList(); } if ( dups.Any() ) { Duplicates.Add( person.Guid, dups ); } } return Duplicates.Any(); }
/// <summary> /// Shows the report. /// </summary> private void ShowMap() { string mapStylingFormat = @" <style> #map_wrapper {{ height: {0}px; }} #map_canvas {{ width: 100%; height: 100%; border-radius: 8px; }} </style>"; lMapStyling.Text = string.Format( mapStylingFormat, GetAttributeValue( "MapHeight" ) ); // add styling to map string styleCode = "null"; DefinedValueCache dvcMapStyle = DefinedValueCache.Read( GetAttributeValue( "MapStyle" ).AsGuid() ); if ( dvcMapStyle != null ) { styleCode = dvcMapStyle.GetAttributeValue( "DynamicMapStyle" ); } var polygonColorList = GetAttributeValue( "PolygonColors" ).Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries ).ToList(); string polygonColors = polygonColorList.AsDelimited( "," ); string latitude = "39.8282"; string longitude = "-98.5795"; string zoom = "4"; var orgLocation = GlobalAttributesCache.Read().OrganizationLocation; if ( orgLocation != null && orgLocation.GeoPoint != null ) { latitude = orgLocation.GeoPoint.Latitude.Value.ToString( System.Globalization.CultureInfo.GetCultureInfo( "en-US" ) ); longitude = orgLocation.GeoPoint.Longitude.Value.ToString( System.Globalization.CultureInfo.GetCultureInfo( "en-US" ) ); zoom = "12"; } var rockContext = new RockContext(); var campuses = CampusCache.All(); var locationService = new LocationService( rockContext ); CampusMarkersData = string.Empty; if ( cbShowCampusLocations.Checked ) { foreach ( var campus in campuses ) { if ( campus.LocationId.HasValue ) { var location = locationService.Get( campus.LocationId.Value ); if ( location != null && location.GeoPoint != null ) { CampusMarkersData += string.Format( "{{ location: new google.maps.LatLng({0},{1}), campusName:'{2}' }},", location.GeoPoint.Latitude, location.GeoPoint.Longitude, campus.Name ); } } } CampusMarkersData.TrimEnd( new char[] { ',' } ); } // show geofences if a group was specified this.GroupId = this.PageParameter( "GroupId" ).AsIntegerOrNull(); if ( !this.GroupId.HasValue && gpGroupToMap.Visible ) { // if a page parameter wasn't specified, use the selected group from the filter this.GroupId = gpGroupToMap.SelectedValue.AsIntegerOrNull(); } var groupMemberService = new GroupMemberService( rockContext ); var groupTypeFamily = GroupTypeCache.GetFamilyGroupType(); int groupTypeFamilyId = groupTypeFamily.Id; var groupRoleAdultId = groupTypeFamily.Roles.FirstOrDefault( a => a.Guid == Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT.AsGuid() ).Id; var groupLocationTypeHomeId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_HOME.AsGuid() ).Id; int[] connectionStatusValueIds = new[] { DefinedValueCache.Read(Rock.SystemGuid.DefinedValue.PERSON_CONNECTION_STATUS_ATTENDEE.AsGuid()).Id, DefinedValueCache.Read(Rock.SystemGuid.DefinedValue.PERSON_CONNECTION_STATUS_MEMBER.AsGuid()).Id }; int recordStatusActiveId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_STATUS_ACTIVE.AsGuid() ).Id; // if there is a DataViewId page parameter, use that instead of the Block or Filter dataview setting (the filter control won't be visible if there is a DataViewId page parameter) int? dataViewId = this.PageParameter( "DataViewId" ).AsIntegerOrNull(); Guid? dataViewGuid = null; if ( !dataViewId.HasValue ) { dataViewGuid = this.GetAttributeValue( "DataView" ).AsGuidOrNull(); } if ( ddlUserDataView.Visible ) { dataViewGuid = ddlUserDataView.SelectedValue.AsGuidOrNull(); } IQueryable<int> qryPersonIds = null; if ( dataViewId.HasValue || dataViewGuid.HasValue ) { DataView dataView = null; // if a DataViewId page parameter was specified, use that, otherwise use the blocksetting or filter selection if ( dataViewId.HasValue ) { dataView = new DataViewService( rockContext ).Get( dataViewId.Value ); } else { dataView = new DataViewService( rockContext ).Get( dataViewGuid.Value ); } if ( dataView != null ) { List<string> errorMessages; qryPersonIds = dataView.GetQuery( null, rockContext, null, out errorMessages ).OfType<Person>().Select( a => a.Id ); } } if ( qryPersonIds == null ) { // if no dataview was specified, show nothing qryPersonIds = new PersonService( rockContext ).Queryable().Where( a => false ).Select( a => a.Id ); } var qryGroupMembers = groupMemberService.Queryable(); var campusIds = cpCampuses.SelectedCampusIds; if ( campusIds.Any() ) { qryGroupMembers = qryGroupMembers.Where( a => a.Group.CampusId.HasValue && campusIds.Contains( a.Group.CampusId.Value ) ); } var qryLocationGroupMembers = qryGroupMembers .Where( a => a.Group.GroupTypeId == groupTypeFamilyId ) .Where( a => a.Group.IsActive ) .Select( a => new { GroupGeoPoint = a.Group.GroupLocations.Where( gl => gl.IsMappedLocation && gl.GroupLocationTypeValueId == groupLocationTypeHomeId && gl.Location.IsActive && gl.Location.GeoPoint != null ).Select( x => x.Location.GeoPoint ).FirstOrDefault(), a.Group.CampusId, a.PersonId } ) .Where( a => ( a.GroupGeoPoint != null ) && qryPersonIds.Contains( a.PersonId ) ) .GroupBy( a => new { a.GroupGeoPoint.Latitude, a.GroupGeoPoint.Longitude } ) .Select( s => new { s.Key.Longitude, s.Key.Latitude, MemberCount = s.Count() } ); var locationList = qryLocationGroupMembers.ToList() .Select( a => new LatLongWeighted( a.Latitude.Value, a.Longitude.Value, a.MemberCount ) ) .ToList(); List<LatLongWeighted> points = locationList; // cluster points that are close together double? milesPerGrouping = this.GetAttributeValue( "PointGrouping" ).AsDoubleOrNull(); if ( !milesPerGrouping.HasValue ) { // default to a 1/10th of a mile milesPerGrouping = 0.10; } if ( milesPerGrouping.HasValue && milesPerGrouping > 0 ) { var metersPerLatitudePHX = 110886.79; var metersPerLongitudePHX = 94493.11; double metersPerMile = 1609.34; var squareLengthHeightMeters = metersPerMile * milesPerGrouping.Value; var longitudeRoundFactor = metersPerLongitudePHX / squareLengthHeightMeters; var latitudeRoundFactor = metersPerLatitudePHX / squareLengthHeightMeters; points = points.GroupBy( a => new { rLat = Math.Round( a.Lat * latitudeRoundFactor ), rLong = Math.Round( a.Lat * longitudeRoundFactor ), } ).Select( a => new LatLongWeighted( a.Average( x => x.Lat ), a.Average( x => x.Long ), a.Sum( x => x.Weight ) ) ).ToList(); } this.HeatMapData = points.Select( a => a.Weight > 1 ? string.Format( "{{location: new google.maps.LatLng({0}, {1}), weight: {2}}}", a.Lat, a.Long, a.Weight ) : string.Format( "new google.maps.LatLng({0}, {1})", a.Lat, a.Long ) ).ToList().AsDelimited( ",\n" ); StyleCode = styleCode; hfPolygonColors.Value = polygonColors; hfCenterLatitude.Value = latitude.ToString(); hfCenterLongitude.Value = longitude.ToString(); hfZoom.Value = zoom.ToString(); }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { Location location = null; var rockContext = new RockContext(); LocationService locationService = new LocationService( rockContext ); AttributeService attributeService = new AttributeService( rockContext ); AttributeQualifierService attributeQualifierService = new AttributeQualifierService( rockContext ); int locationId = int.Parse( hfLocationId.Value ); if ( locationId != 0 ) { location = locationService.Get( locationId ); FlushCampus( locationId ); } if ( location == null ) { location = new Location(); location.Name = string.Empty; } string previousName = location.Name; int? orphanedImageId = null; if ( location.ImageId != imgImage.BinaryFileId ) { orphanedImageId = location.ImageId; location.ImageId = imgImage.BinaryFileId; } location.Name = tbName.Text; location.IsActive = cbIsActive.Checked; location.LocationTypeValueId = ddlLocationType.SelectedValueAsId(); if ( gpParentLocation != null && gpParentLocation.Location != null ) { location.ParentLocationId = gpParentLocation.Location.Id; } else { location.ParentLocationId = null; } location.PrinterDeviceId = ddlPrinter.SelectedValueAsInt(); acAddress.GetValues(location); location.GeoPoint = geopPoint.SelectedValue; if ( geopPoint.SelectedValue != null ) { location.IsGeoPointLocked = true; } location.GeoFence = geopFence.SelectedValue; location.IsGeoPointLocked = cbGeoPointLocked.Checked; location.SoftRoomThreshold = nbSoftThreshold.Text.AsIntegerOrNull(); location.FirmRoomThreshold = nbFirmThreshold.Text.AsIntegerOrNull(); location.LoadAttributes( rockContext ); Rock.Attribute.Helper.GetEditValues( phAttributeEdits, location ); if ( !Page.IsValid ) { return; } // if the location IsValid is false, and the UI controls didn't report any errors, it is probably because the custom rules of location didn't pass. // So, make sure a message is displayed in the validation summary cvLocation.IsValid = location.IsValid; if ( !cvLocation.IsValid ) { cvLocation.ErrorMessage = location.ValidationResults.Select( a => a.ErrorMessage ).ToList().AsDelimited( "<br />" ); return; } rockContext.WrapTransaction( () => { if ( location.Id.Equals( 0 ) ) { locationService.Add( location ); } rockContext.SaveChanges(); if (orphanedImageId.HasValue) { BinaryFileService binaryFileService = new BinaryFileService( rockContext ); var binaryFile = binaryFileService.Get( orphanedImageId.Value ); if ( binaryFile != null ) { // marked the old images as IsTemporary so they will get cleaned up later binaryFile.IsTemporary = true; rockContext.SaveChanges(); } } location.SaveAttributeValues( rockContext ); } ); // If this is a names location (or was previouisly) if ( !string.IsNullOrWhiteSpace( location.Name ) || ( previousName ?? string.Empty ) != (location.Name ?? string.Empty ) ) { // flush the checkin config Rock.CheckIn.KioskDevice.FlushAll(); } if ( _personId.HasValue ) { NavigateToParentPage( new Dictionary<string, string> { { "PersonId", _personId.Value.ToString() } } ); } else { Rock.CheckIn.KioskDevice.FlushAll(); var qryParams = new Dictionary<string, string>(); qryParams["LocationId"] = location.Id.ToString(); qryParams["ExpandedIds"] = PageParameter( "ExpandedIds" ); NavigateToPage( RockPage.Guid, qryParams ); } }
/// <summary> /// Handles the Click event of the btnStandardize control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnStandardize_Click( object sender, EventArgs e ) { int locationId = int.Parse( hfLocationId.Value ); var rockContext = new RockContext(); var service = new LocationService( rockContext ); var location = service.Get( locationId ); acAddress.GetValues( location ); service.Verify( location, true ); acAddress.SetValues( location ); geopPoint.SetValue( location.GeoPoint ); lStandardizationUpdate.Text = String.Format( "<div class='alert alert-info'>Standardization Result: {0}<br/>Geocoding Result: {1}</div>", location.StandardizeAttemptedResult.IfEmpty( "No Result" ), location.GeocodeAttemptedResult.IfEmpty( "No Result" ) ); }
/// <summary> /// Handles the Click event of the _btnSelect control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void _btnSelect_Click( object sender, EventArgs e ) { LocationService locationService = new LocationService( new RockContext() ); var location = locationService.Get( _acAddress.Street1, _acAddress.Street2, _acAddress.City, _acAddress.State, _acAddress.PostalCode, _acAddress.Country ); Location = location; _btnPickerLabel.InnerHtml = string.Format( "<i class='fa fa-user'></i>{0}<b class='fa fa-caret-down pull-right'></b>", this.AddressSummaryText ); ShowDropDown = false; }
/// <summary> /// Binds the grid. /// </summary> protected void BindGrid() { AddScheduleColumns(); var rockContext = new RockContext(); var groupLocationService = new GroupLocationService( rockContext ); var groupTypeService = new GroupTypeService( rockContext ); var groupService = new GroupService( rockContext ); IEnumerable<GroupTypePath> groupPaths = new List<GroupTypePath>(); var groupLocationQry = groupLocationService.Queryable(); int groupTypeId; // if this page has a PageParam for groupTypeId use that to limit which groupTypeId to see. Otherwise, use the groupTypeId specified in the filter int? groupTypeIdPageParam = this.PageParameter( "groupTypeId" ).AsIntegerOrNull(); if ( groupTypeIdPageParam.HasValue ) { groupTypeId = groupTypeIdPageParam ?? Rock.Constants.All.Id; } else { groupTypeId = ddlGroupType.SelectedValueAsInt() ?? Rock.Constants.All.Id; } if ( groupTypeId != Rock.Constants.All.Id ) { var descendantGroupTypeIds = groupTypeService.GetAllAssociatedDescendents( groupTypeId ).Select( a => a.Id ); // filter to groups that either are of the GroupType or are of a GroupType that has the selected GroupType as a parent (ancestor) groupLocationQry = groupLocationQry.Where( a => a.Group.GroupType.Id == groupTypeId || descendantGroupTypeIds.Contains( a.Group.GroupTypeId ) ); groupPaths = groupTypeService.GetAllAssociatedDescendentsPath( groupTypeId ); } else { // if no specific GroupType is specified, show all GroupTypes with GroupTypePurpose of Checkin Template and their descendents (since this blocktype is specifically for Checkin) int groupTypePurposeCheckInTemplateId = DefinedValueCache.Read( new Guid( Rock.SystemGuid.DefinedValue.GROUPTYPE_PURPOSE_CHECKIN_TEMPLATE ) ).Id; List<int> descendantGroupTypeIds = new List<int>(); foreach ( var templateGroupType in groupTypeService.Queryable().Where( a => a.GroupTypePurposeValueId == groupTypePurposeCheckInTemplateId ) ) { foreach ( var childGroupType in groupTypeService.GetChildGroupTypes( templateGroupType.Id ) ) { descendantGroupTypeIds.Add( childGroupType.Id ); descendantGroupTypeIds.AddRange( groupTypeService.GetAllAssociatedDescendents( childGroupType.Id ).Select( a => a.Id ).ToList() ); } } groupLocationQry = groupLocationQry.Where( a => descendantGroupTypeIds.Contains( a.Group.GroupTypeId ) ); } if ( gGroupLocationSchedule.SortProperty != null ) { groupLocationQry = groupLocationQry.Sort( gGroupLocationSchedule.SortProperty ); } else { groupLocationQry = groupLocationQry.OrderBy( a => a.Group.Name ).ThenBy( a => a.Location.Name ); } var qryList = groupLocationQry .Where( a => a.Location != null ) .Select( a => new { GroupLocationId = a.Id, a.Location, GroupId = a.GroupId, GroupName = a.Group.Name, ScheduleIdList = a.Schedules.Select( s => s.Id ), GroupTypeId = a.Group.GroupTypeId } ).ToList(); var locationService = new LocationService( rockContext ); int parentLocationId = pkrParentLocation.SelectedValueAsInt() ?? Rock.Constants.All.Id; if ( parentLocationId != Rock.Constants.All.Id ) { var currentAndDescendantLocationIds = new List<int>(); currentAndDescendantLocationIds.Add( parentLocationId ); currentAndDescendantLocationIds.AddRange( locationService.GetAllDescendents( parentLocationId ).Select( a => a.Id ) ); qryList = qryList.Where( a => currentAndDescendantLocationIds.Contains( a.Location.Id ) ).ToList(); } // put stuff in a datatable so we can dynamically have columns for each Schedule DataTable dataTable = new DataTable(); dataTable.Columns.Add( "GroupLocationId" ); dataTable.Columns.Add( "GroupId" ); dataTable.Columns.Add( "GroupName" ); dataTable.Columns.Add( "GroupPath" ); dataTable.Columns.Add( "LocationName" ); dataTable.Columns.Add( "LocationPath" ); foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { dataTable.Columns.Add( field.DataField, typeof( bool ) ); } var locationPaths = new Dictionary<int, string>(); foreach ( var row in qryList ) { DataRow dataRow = dataTable.NewRow(); dataRow["GroupLocationId"] = row.GroupLocationId; dataRow["GroupName"] = groupService.GroupAncestorPathName( row.GroupId ); dataRow["GroupPath"] = groupPaths.Where( gt => gt.GroupTypeId == row.GroupTypeId ).Select( gt => gt.Path ).FirstOrDefault(); dataRow["LocationName"] = row.Location.Name; if ( row.Location.ParentLocationId.HasValue ) { int locationId = row.Location.ParentLocationId.Value; if ( !locationPaths.ContainsKey( locationId ) ) { var locationNames = new List<string>(); var parentLocation = locationService.Get( locationId ); while ( parentLocation != null ) { locationNames.Add( parentLocation.Name ); parentLocation = parentLocation.ParentLocation; } if ( locationNames.Any() ) { locationNames.Reverse(); locationPaths.Add( locationId, locationNames.AsDelimited( " > " ) ); } else { locationPaths.Add( locationId, string.Empty ); } } dataRow["LocationPath"] = locationPaths[locationId]; } foreach ( var field in gGroupLocationSchedule.Columns.OfType<CheckBoxEditableField>() ) { int scheduleId = int.Parse( field.DataField.Replace( "scheduleField_", string.Empty ) ); dataRow[field.DataField] = row.ScheduleIdList.Any( a => a == scheduleId ); } dataTable.Rows.Add( dataRow ); } gGroupLocationSchedule.EntityTypeId = EntityTypeCache.Read<GroupLocation>().Id; gGroupLocationSchedule.DataSource = dataTable; gGroupLocationSchedule.DataBind(); }
/// <summary> /// Handles the Click event of the btnDelete control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnDelete_Click( object sender, EventArgs e ) { int? parentLocationId = null; var rockContext = new RockContext(); LocationService locationService = new LocationService( rockContext ); Location location = locationService.Get( hfLocationId.Value.AsInteger() ); if ( location != null ) { parentLocationId = location.ParentLocationId; string errorMessage; if ( !locationService.CanDelete( location, out errorMessage ) ) { mdDeleteWarning.Show( errorMessage, ModalAlertType.Information ); return; } FlushCampus( location.Id ); locationService.Delete( location ); rockContext.SaveChanges(); } // reload page, selecting the deleted location's parent var qryParams = new Dictionary<string, string>(); if ( parentLocationId != null ) { qryParams["LocationId"] = parentLocationId.ToString(); } qryParams["ExpandedIds"] = PageParameter( "ExpandedIds" ); NavigateToPage( RockPage.Guid, qryParams ); }
/// <summary> /// Maps the family address. /// </summary> /// <param name="tableData">The table data.</param> /// <returns></returns> private void MapFamilyAddress( IQueryable<Row> tableData ) { var locationService = new LocationService(); int groupEntityTypeId = EntityTypeCache.Read( "Rock.Model.Group" ).Id; List<DefinedValue> groupLocationTypeList = new DefinedValueService().Queryable().Where( dv => dv.DefinedType.Guid == new Guid( Rock.SystemGuid.DefinedType.GROUP_LOCATION_TYPE ) ).ToList(); List<GroupMember> groupMembershipList = new GroupMemberService().Queryable().Where( gm => gm.Group.GroupType.Guid == new Guid( Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY ) ).ToList(); int homeGroupLocationTypeId = groupLocationTypeList.FirstOrDefault( dv => dv.Guid == new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_HOME ) ).Id; int workGroupLocationTypeId = groupLocationTypeList.FirstOrDefault( dv => dv.Guid == new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_WORK ) ).Id; int previousGroupLocationTypeId = groupLocationTypeList.FirstOrDefault( dv => dv.Guid == new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_PREVIOUS ) ).Id; var newGroupLocations = new List<GroupLocation>(); int completed = 0; int totalRows = tableData.Count(); int percentage = ( totalRows - 1 ) / 100 + 1; ReportProgress( 0, string.Format( "Checking address import ({0:N0} found).", totalRows ) ); foreach ( var row in tableData ) { int? individualId = row["Individual_ID"] as int?; int? householdId = row["Household_ID"] as int?; int? associatedPersonId = GetPersonId( individualId, householdId ); if ( associatedPersonId != null ) { var familyGroup = groupMembershipList.Where( gm => gm.PersonId == (int)associatedPersonId ) .Select( gm => gm.Group ).FirstOrDefault(); if ( familyGroup != null ) { var groupLocation = new GroupLocation(); string address = row["Address_1"] as string; string supplemental = row["Address_2"] as string; string city = row["City"] as string; string state = row["State"] as string; string country = row["country"] as string; // NOT A TYPO: F1 has property in lower-case string zip = row["Postal_Code"] as string; // Get new or existing location and associate it with group var familyAddress = locationService.Get( address, supplemental, city, state, zip ); familyAddress.CreatedByPersonAliasId = ImportPersonAlias.Id; familyAddress.Name = familyGroup.Name; familyAddress.IsActive = true; groupLocation.GroupId = familyGroup.Id; groupLocation.LocationId = familyAddress.Id; groupLocation.IsMailingLocation = true; groupLocation.IsMappedLocation = true; string addressType = row["Address_Type"] as string; if ( addressType.Equals( "Primary" ) ) { groupLocation.GroupLocationTypeValueId = homeGroupLocationTypeId; } else if ( addressType.Equals( "Business" ) || addressType.Equals( "Org" ) ) { groupLocation.GroupLocationTypeValueId = workGroupLocationTypeId; } else if ( addressType.Equals( "Previous" ) ) { groupLocation.GroupLocationTypeValueId = previousGroupLocationTypeId; } else if ( !string.IsNullOrEmpty( addressType ) ) { groupLocation.GroupLocationTypeValueId = groupLocationTypeList.Where( dv => dv.Name.Equals( addressType ) ) .Select( dv => (int?)dv.Id ).FirstOrDefault(); } newGroupLocations.Add( groupLocation ); completed++; if ( completed % percentage < 1 ) { int percentComplete = completed / percentage; ReportProgress( percentComplete, string.Format( "{0:N0} addresses imported ({1}% complete).", completed, percentComplete ) ); } else if ( completed % ReportingNumber < 1 ) { RockTransactionScope.WrapTransaction( () => { var groupLocationService = new GroupLocationService(); groupLocationService.RockContext.GroupLocations.AddRange( newGroupLocations ); groupLocationService.RockContext.SaveChanges(); } ); ReportPartialProgress(); } } } } RockTransactionScope.WrapTransaction( () => { var groupLocationService = new GroupLocationService(); groupLocationService.RockContext.GroupLocations.AddRange( newGroupLocations ); groupLocationService.RockContext.SaveChanges(); } ); ReportProgress( 100, string.Format( "Finished address import: {0:N0} addresses imported.", completed ) ); }
/// <summary> /// Handles the Click event of the btnSave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> protected void btnSave_Click( object sender, EventArgs e ) { Location location; var rockContext = new RockContext(); LocationService locationService = new LocationService( rockContext ); AttributeService attributeService = new AttributeService( rockContext ); AttributeQualifierService attributeQualifierService = new AttributeQualifierService( rockContext ); int locationId = int.Parse( hfLocationId.Value ); if ( locationId == 0 ) { location = new Location(); location.Name = string.Empty; } else { location = locationService.Get( locationId ); FlushCampus( locationId ); } int? orphanedImageId = null; if ( location.ImageId != imgImage.BinaryFileId ) { orphanedImageId = location.ImageId; location.ImageId = imgImage.BinaryFileId; } location.Name = tbName.Text; location.IsActive = cbIsActive.Checked; location.LocationTypeValueId = ddlLocationType.SelectedValueAsId(); if ( gpParentLocation != null && gpParentLocation.Location != null ) { location.ParentLocationId = gpParentLocation.Location.Id; } else { location.ParentLocationId = null; } location.PrinterDeviceId = ddlPrinter.SelectedValueAsInt(); acAddress.GetValues(location); location.GeoPoint = geopPoint.SelectedValue; if ( geopPoint.SelectedValue != null ) { location.IsGeoPointLocked = true; } location.GeoFence = geopFence.SelectedValue; location.IsGeoPointLocked = cbGeoPointLocked.Checked; location.LoadAttributes( rockContext ); Rock.Attribute.Helper.GetEditValues( phAttributeEdits, location ); if ( !Page.IsValid ) { return; } if ( !location.IsValid ) { // Controls will render the error messages return; } rockContext.WrapTransaction( () => { if ( location.Id.Equals( 0 ) ) { locationService.Add( location ); } rockContext.SaveChanges(); if (orphanedImageId.HasValue) { BinaryFileService binaryFileService = new BinaryFileService( rockContext ); var binaryFile = binaryFileService.Get( orphanedImageId.Value ); if ( binaryFile != null ) { // marked the old images as IsTemporary so they will get cleaned up later binaryFile.IsTemporary = true; rockContext.SaveChanges(); } } location.SaveAttributeValues( rockContext ); } ); var qryParams = new Dictionary<string, string>(); qryParams["LocationId"] = location.Id.ToString(); qryParams["ExpandedIds"] = PageParameter( "ExpandedIds" ); NavigateToPage( RockPage.Guid, qryParams ); }
void rptrAddresses_ItemCommand( object source, RepeaterCommandEventArgs e ) { int locationId = int.MinValue; if ( int.TryParse( e.CommandArgument.ToString(), out locationId ) ) { var rockContext = new RockContext(); var service = new LocationService( rockContext ); var location = service.Get( locationId ); switch ( e.CommandName ) { case "verify": service.Verify( location, true ); break; } rockContext.SaveChanges(); } BindFamilies(); }
/// <summary> /// Shows the edit details. /// </summary> /// <param name="location">The location.</param> private void ShowEditDetails( Location location ) { if ( location.Id == 0 ) { lReadOnlyTitle.Text = ActionTitle.Add( Location.FriendlyTypeName ).FormatAsHtmlTitle(); hlInactive.Visible = false; } else { if ( string.IsNullOrWhiteSpace( location.Name ) ) { lReadOnlyTitle.Text = location.ToString().FormatAsHtmlTitle(); } else { lReadOnlyTitle.Text = location.Name.FormatAsHtmlTitle(); } } SetEditMode( true ); imgImage.BinaryFileId = location.ImageId; imgImage.NoPictureUrl = System.Web.VirtualPathUtility.ToAbsolute( "~/Assets/Images/no-picture.svg?" ); tbName.Text = location.Name; cbIsActive.Checked = location.IsActive; acAddress.SetValues( location ); ddlPrinter.SetValue( location.PrinterDeviceId ); geopPoint.SetValue( location.GeoPoint ); geopFence.SetValue( location.GeoFence ); cbGeoPointLocked.Checked = location.IsGeoPointLocked ?? false; Guid mapStyleValueGuid = GetAttributeValue( "MapStyle" ).AsGuid(); geopPoint.MapStyleValueGuid = mapStyleValueGuid; geopFence.MapStyleValueGuid = mapStyleValueGuid; var rockContext = new RockContext(); var locationService = new LocationService( rockContext ); var attributeService = new AttributeService( rockContext ); ddlLocationType.BindToDefinedType( DefinedTypeCache.Read( Rock.SystemGuid.DefinedType.LOCATION_TYPE.AsGuid() ), true ); gpParentLocation.Location = location.ParentLocation ?? locationService.Get( location.ParentLocationId ?? 0 ); // LocationType depends on Selected ParentLocation if ( location.Id == 0 && ddlLocationType.Items.Count > 1 ) { // if this is a new location ddlLocationType.SelectedIndex = 0; } else { ddlLocationType.SetValue( location.LocationTypeValueId ); } location.LoadAttributes( rockContext ); BuildAttributeEdits( location, true ); }
/// <summary> /// Loads the family data. /// </summary> /// <param name="csvData">The CSV data.</param> private int LoadFamily( CSVInstance csvData ) { // Required variables var lookupContext = new RockContext(); var locationService = new LocationService( lookupContext ); int familyGroupTypeId = GroupTypeCache.GetFamilyGroupType().Id; int numImportedFamilies = ImportedFamilies.Count(); int homeLocationTypeId = DefinedValueCache.Read( new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_HOME ) ).Id; int workLocationTypeId = DefinedValueCache.Read( new Guid( Rock.SystemGuid.DefinedValue.GROUP_LOCATION_TYPE_WORK ) ).Id; var newGroupLocations = new Dictionary<GroupLocation, string>(); var currentFamilyGroup = new Group(); var newFamilyList = new List<Group>(); var updatedFamilyList = new List<Group>(); var dateFormats = new[] { "yyyy-MM-dd", "MM/dd/yyyy", "MM/dd/yy" }; string currentFamilyKey = string.Empty; int completed = 0; ReportProgress( 0, string.Format( "Starting family import ({0:N0} already exist).", numImportedFamilies ) ); string[] row; // Uses a look-ahead enumerator: this call will move to the next record immediately while ( (row = csvData.Database.FirstOrDefault()) != null ) { string rowFamilyKey = row[FamilyId]; int? rowFamilyId = rowFamilyKey.AsType<int?>(); string rowFamilyName = row[FamilyName]; if ( rowFamilyKey != null && rowFamilyKey != currentFamilyGroup.ForeignKey ) { currentFamilyGroup = ImportedFamilies.FirstOrDefault( g => g.ForeignKey == rowFamilyKey ); if ( currentFamilyGroup == null ) { currentFamilyGroup = new Group(); currentFamilyGroup.ForeignKey = rowFamilyKey; currentFamilyGroup.ForeignId = rowFamilyId; currentFamilyGroup.Name = row[FamilyName]; currentFamilyGroup.CreatedByPersonAliasId = ImportPersonAliasId; currentFamilyGroup.GroupTypeId = familyGroupTypeId; newFamilyList.Add( currentFamilyGroup ); } else { lookupContext.Groups.Attach( currentFamilyGroup ); } // Set the family campus string campusName = row[Campus]; if ( !string.IsNullOrWhiteSpace( campusName ) ) { var familyCampus = CampusList.Where( c => c.Name.Equals( campusName, StringComparison.InvariantCultureIgnoreCase ) || c.ShortCode.Equals( campusName, StringComparison.InvariantCultureIgnoreCase ) ).FirstOrDefault(); if ( familyCampus == null ) { familyCampus = new Campus(); familyCampus.IsSystem = false; familyCampus.Name = campusName; familyCampus.ShortCode = campusName.RemoveWhitespace(); lookupContext.Campuses.Add( familyCampus ); lookupContext.SaveChanges( DisableAuditing ); CampusList.Add( familyCampus ); } currentFamilyGroup.CampusId = familyCampus.Id; } // Add the family addresses since they exist in this file string famAddress = row[Address]; string famAddress2 = row[Address2]; string famCity = row[City]; string famState = row[State]; string famZip = row[Zip]; string famCountry = row[Country]; Location primaryAddress = locationService.Get( famAddress, famAddress2, famCity, famState, famZip, famCountry, verifyLocation: false ); if ( primaryAddress != null ) { var primaryLocation = new GroupLocation(); primaryLocation.LocationId = primaryAddress.Id; primaryLocation.IsMailingLocation = true; primaryLocation.IsMappedLocation = true; primaryLocation.GroupLocationTypeValueId = homeLocationTypeId; newGroupLocations.Add( primaryLocation, rowFamilyKey ); } string famSecondAddress = row[SecondaryAddress]; string famSecondAddress2 = row[SecondaryAddress2]; string famSecondCity = row[SecondaryCity]; string famSecondState = row[SecondaryState]; string famSecondZip = row[SecondaryZip]; string famSecondCountry = row[SecondaryCountry]; Location secondaryAddress = locationService.Get( famSecondAddress, famSecondAddress2, famSecondCity, famSecondState, famSecondZip, famSecondCountry, verifyLocation: false ); if ( secondaryAddress != null ) { var secondaryLocation = new GroupLocation(); secondaryLocation.LocationId = secondaryAddress.Id; secondaryLocation.IsMailingLocation = true; secondaryLocation.IsMappedLocation = true; secondaryLocation.GroupLocationTypeValueId = workLocationTypeId; newGroupLocations.Add( secondaryLocation, rowFamilyKey ); } DateTime createdDateValue; if ( DateTime.TryParseExact( row[CreatedDate], dateFormats, CultureInfo.InvariantCulture, DateTimeStyles.None, out createdDateValue ) ) { currentFamilyGroup.CreatedDateTime = createdDateValue; currentFamilyGroup.ModifiedDateTime = ImportDateTime; } else { currentFamilyGroup.CreatedDateTime = ImportDateTime; currentFamilyGroup.ModifiedDateTime = ImportDateTime; } completed++; if ( completed % (ReportingNumber * 10) < 1 ) { ReportProgress( 0, string.Format( "{0:N0} families imported.", completed ) ); } else if ( completed % ReportingNumber < 1 ) { SaveFamilies( newFamilyList, newGroupLocations ); ReportPartialProgress(); // Reset lookup context lookupContext.SaveChanges(); lookupContext = new RockContext(); locationService = new LocationService( lookupContext ); newFamilyList.Clear(); newGroupLocations.Clear(); } } } // Check to see if any rows didn't get saved to the database if ( newGroupLocations.Any() ) { SaveFamilies( newFamilyList, newGroupLocations ); } lookupContext.SaveChanges(); DetachAllInContext( lookupContext ); lookupContext.Dispose(); ReportProgress( 0, string.Format( "Finished family import: {0:N0} families added or updated.", completed ) ); return completed; }