private void ShowDetail(Guid personGuid) { using ( var rockContext = new RockContext() ) { var personService = new PersonService( new RockContext() ); var person = personService.Get( personGuid ); if ( person != null ) { lName.Text = person.FullName; string photoTag = Rock.Model.Person.GetPhotoImageTag( person, 120, 120 ); if ( person.PhotoId.HasValue ) { lPhoto.Text = string.Format( "<a href='{0}'>{1}</a>", person.PhotoUrl, photoTag ); } else { lPhoto.Text = photoTag; } lEmail.Visible = !string.IsNullOrWhiteSpace( person.Email ); lEmail.Text = person.GetEmailTag( ResolveRockUrl( "/" ), "btn btn-default", "<i class='fa fa-envelope'></i>" ); var childGuid = Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_CHILD.AsGuid(); var isFamilyChild = new Dictionary<int, bool>(); var allFamilyMembers = person.GetFamilyMembers( true ).ToList(); allFamilyMembers.Where( m => m.PersonId == person.Id ).ToList().ForEach( m => isFamilyChild.Add( m.GroupId, m.GroupRole.Guid.Equals( childGuid ) ) ); string urlRoot = Request.Url.ToString().ReplaceCaseInsensitive( personGuid.ToString(), "" ); var familyMembers = allFamilyMembers.Where( m => m.PersonId != person.Id ) .OrderBy( m => m.GroupId ) .ThenBy( m => m.Person.BirthDate ) .Select( m => new { Url = urlRoot + m.Person.Guid.ToString(), FullName = m.Person.FullName, Gender = m.Person.Gender, FamilyRole = m.GroupRole, Note = isFamilyChild[m.GroupId] ? ( m.GroupRole.Guid.Equals( childGuid ) ? " (Sibling)" : "(Parent)" ) : ( m.GroupRole.Guid.Equals( childGuid ) ? " (Child)" : "" ) } ) .ToList(); rcwFamily.Visible = familyMembers.Any(); rptrFamily.DataSource = familyMembers; rptrFamily.DataBind(); rptrPhones.DataSource = person.PhoneNumbers.Where( p => !p.IsUnlisted ).ToList(); rptrPhones.DataBind(); var schedules = new ScheduleService( rockContext ).Queryable() .Where( s => s.CheckInStartOffsetMinutes.HasValue ) .ToList(); var scheduleIds = schedules.Select( s => s.Id ).ToList(); var activeScheduleIds = new List<int>(); foreach ( var schedule in schedules ) { if ( schedule.IsScheduleOrCheckInActive ) { activeScheduleIds.Add( schedule.Id ); } } int? personAliasId = person.PrimaryAliasId; if ( !personAliasId.HasValue ) { personAliasId = new PersonAliasService( rockContext ).GetPrimaryAliasId( person.Id ); } var attendances = new AttendanceService( rockContext ) .Queryable( "Schedule,Group,Location" ) .Where( a => a.PersonAliasId.HasValue && a.PersonAliasId == personAliasId && a.ScheduleId.HasValue && a.GroupId.HasValue && a.LocationId.HasValue && a.DidAttend.HasValue && a.DidAttend.Value && scheduleIds.Contains( a.ScheduleId.Value ) ) .OrderByDescending( a => a.StartDateTime ) .Take( 20 ) .Select( a => new AttendanceInfo { Date = a.StartDateTime, GroupId = a.Group.Id, Group = a.Group.Name, LocationId = a.LocationId.Value, Location = a.Location.Name, Schedule = a.Schedule.Name, IsActive = a.StartDateTime > DateTime.Today && activeScheduleIds.Contains( a.ScheduleId.Value ) } ).ToList(); // Set active locations to be a link to the room in manager page var qryParam = new Dictionary<string, string>(); qryParam.Add( "Group", "" ); qryParam.Add( "Location", "" ); foreach ( var attendance in attendances.Where( a => a.IsActive ) ) { qryParam["Group"] = attendance.GroupId.ToString(); qryParam["Location"] = attendance.LocationId.ToString(); attendance.Location = string.Format( "<a href='{0}'>{1}</a>", LinkedPageUrl( "ManagerPage", qryParam ), attendance.Location ); } rcwCheckinHistory.Visible = attendances.Any(); gHistory.DataSource = attendances; gHistory.DataBind(); } } }
protected void lbSearch_Click( object sender, EventArgs e ) { using ( var rockContext = new RockContext() ) { // Get all the schedules that allow checkin var schedules = new ScheduleService( rockContext ) .Queryable().AsNoTracking() .Where( s => s.CheckInStartOffsetMinutes.HasValue ) .ToList(); // Get a lit of the schedule ids var scheduleIds = schedules.Select( s => s.Id ).ToList(); // Get a list of the schedule id that are currently active for checkin var activeScheduleIds = new List<int>(); foreach ( var schedule in schedules ) { if ( schedule.IsScheduleOrCheckInActive ) { activeScheduleIds.Add( schedule.Id ); } } // Get a list of all the groups that we're concerned about var groupIds = NavData.Groups.Select( g => g.Id ).ToList(); // Get a list of all the people that are currently checked in var today = RockDateTime.Today; var attendanceService = new AttendanceService( rockContext ); var currentAttendeeIds = attendanceService .Queryable().AsNoTracking() .Where( a => a.ScheduleId.HasValue && a.GroupId.HasValue && a.LocationId.HasValue && a.PersonAlias != null && a.DidAttend.HasValue && a.DidAttend.Value && a.StartDateTime > today && activeScheduleIds.Contains( a.ScheduleId.Value ) && groupIds.Contains( a.GroupId.Value ) ) .Select( a => a.PersonAlias.PersonId ) .Distinct(); // Create a qry to get the last checkin date (used in next statement's join) var attendanceQry = attendanceService .Queryable().AsNoTracking() .Where( a => a.ScheduleId.HasValue && a.GroupId.HasValue && a.LocationId.HasValue && a.PersonAliasId.HasValue && a.DidAttend.Value && scheduleIds.Contains( a.ScheduleId.Value ) && groupIds.Contains( a.GroupId.Value ) ) .GroupBy( a => new { PersonId = a.PersonAlias.PersonId } ) .Select( g => new PersonResult { Id = g.Key.PersonId, Guid = Guid.Empty, Name = "", PhotoId = null, LastCheckin = g.Max( a => a.StartDateTime ), CheckedInNow = false, ScheduleGroupNames = "" } ); // Do the person search bool reversed = false; var results = new PersonService( rockContext ) .GetByFullName( tbSearch.Text, false, false, false, out reversed ) .ToList() .GroupJoin( attendanceQry, p => p.Id, a => a.Id, ( p, a ) => a .Select( c => new PersonResult { Id = p.Id, Guid = p.Guid, Name = ( reversed ? p.LastName + ", " + p.NickName : p.NickName + " " + p.LastName ), PhotoId = p.PhotoId, Age = p.Age.ToString() ?? "", LastCheckin = c.LastCheckin, CheckedInNow = currentAttendeeIds.Contains( p.Id ), ScheduleGroupNames = "" } ) .DefaultIfEmpty( new PersonResult { Id = p.Id, Guid = p.Guid, Name = ( reversed ? p.LastName + ", " + p.NickName : p.NickName + " " + p.LastName ), PhotoId = p.PhotoId, Age = p.Age.ToString() ?? "", LastCheckin = null, CheckedInNow = false, ScheduleGroupNames = "" } ) ) .SelectMany( a => a ) .Distinct() .OrderByDescending( a => a.CheckedInNow ) .ThenByDescending( a => a.LastCheckin ) .ThenBy( a => a.Name ) .ToList(); pnlNavHeading.Attributes["onClick"] = upnlContent.GetPostBackEventReference( CurrentNavPath ); lNavHeading.Text = "Back"; rptNavItems.Visible = false; rptPeople.Visible = true; rptPeople.DataSource = results; rptPeople.DataBind(); } RegisterStartupScript(); }
/// <summary> /// Reads new values entered by the user for the field /// </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 picker = control as SchedulePicker; string result = null; if ( picker != null ) { var ids = picker.SelectedValuesAsInt(); var schedules = new ScheduleService( new RockContext() ).Queryable().Where( a => ids.Contains( a.Id ) ); if ( schedules.Any() ) { result = schedules.Select( s => s.Guid.ToString() ).ToList().AsDelimited( "," ); } } return result; }
private void ShowDetail(Guid personGuid) { using ( var rockContext = new RockContext() ) { var personService = new PersonService( rockContext ); var person = personService.Queryable( "PhoneNumbers.NumberTypeValue,RecordTypeValue", true, true ) .FirstOrDefault( a => a.Guid == personGuid ); if ( person != null ) { lName.Text = person.FullName; string photoTag = Rock.Model.Person.GetPersonPhotoImageTag( person, 120, 120 ); if ( person.PhotoId.HasValue ) { lPhoto.Text = string.Format( "<div class='photoframe'><a href='{0}'>{1}</a></div>", person.PhotoUrl, photoTag ); } else { lPhoto.Text = photoTag; } lGender.Text = person.Gender != Gender.Unknown ? person.Gender.ConvertToString() : ""; if ( person.BirthDate.HasValue ) { string ageText = ( person.BirthYear.HasValue && person.BirthYear != DateTime.MinValue.Year ) ? string.Format( "{0} yrs old ", person.BirthDate.Value.Age() ) : string.Empty; lAge.Text = string.Format( "{0} <small>({1})</small><br/>", ageText, person.BirthDate.Value.ToShortDateString() ); } else { lAge.Text = string.Empty; } lGrade.Text = person.GradeFormatted; lEmail.Visible = !string.IsNullOrWhiteSpace( person.Email ); lEmail.Text = person.GetEmailTag( ResolveRockUrl( "/" ), "btn btn-default", "<i class='fa fa-envelope'></i>" ); // Get all family member from all families ( including self ) var allFamilyMembers = personService.GetFamilyMembers( person.Id, true ).ToList(); // Add flag for this person in each family indicating if they are a child in family. var childGuid = Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_CHILD.AsGuid(); var isFamilyChild = new Dictionary<int, bool>(); foreach ( var thisPerson in allFamilyMembers.Where( m => m.PersonId == person.Id ) ) { isFamilyChild.Add( thisPerson.GroupId, thisPerson.GroupRole.Guid.Equals( childGuid ) ); } // Get the current url's root (without the person's guid) string urlRoot = Request.Url.ToString().ReplaceCaseInsensitive( personGuid.ToString(), "" ); // Get the other family members and the info needed for rendering var familyMembers = allFamilyMembers.Where( m => m.PersonId != person.Id ) .OrderBy( m => m.GroupId ) .ThenBy( m => m.Person.BirthDate ) .Select( m => new { Url = urlRoot + m.Person.Guid.ToString(), FullName = m.Person.FullName, Gender = m.Person.Gender, FamilyRole = m.GroupRole, Note = isFamilyChild[m.GroupId] ? ( m.GroupRole.Guid.Equals( childGuid ) ? " (Sibling)" : "(Parent)" ) : ( m.GroupRole.Guid.Equals( childGuid ) ? " (Child)" : "" ) } ) .ToList(); rcwFamily.Visible = familyMembers.Any(); rptrFamily.DataSource = familyMembers; rptrFamily.DataBind(); rptrPhones.DataSource = person.PhoneNumbers.Where( p => !p.IsUnlisted ).ToList(); rptrPhones.DataBind(); var schedules = new ScheduleService( rockContext ) .Queryable().AsNoTracking() .Where( s => s.CheckInStartOffsetMinutes.HasValue ) .ToList(); var scheduleIds = schedules.Select( s => s.Id ).ToList(); var activeScheduleIds = new List<int>(); foreach ( var schedule in schedules ) { if ( schedule.IsScheduleOrCheckInActive ) { activeScheduleIds.Add( schedule.Id ); } } int? personAliasId = person.PrimaryAliasId; if ( !personAliasId.HasValue ) { personAliasId = new PersonAliasService( rockContext ).GetPrimaryAliasId( person.Id ); } var attendances = new AttendanceService( rockContext ) .Queryable( "Schedule,Group,Location,AttendanceCode" ) .Where( a => a.PersonAliasId.HasValue && a.PersonAliasId == personAliasId && a.ScheduleId.HasValue && a.GroupId.HasValue && a.LocationId.HasValue && a.DidAttend.HasValue && a.DidAttend.Value && scheduleIds.Contains( a.ScheduleId.Value ) ) .OrderByDescending( a => a.StartDateTime ) .Take( 20 ) .ToList() // Run query to get recent most 20 checkins .OrderByDescending( a => a.StartDateTime ) // Then sort again by startdatetime and schedule start (which is not avail to sql query ) .ThenByDescending( a => a.Schedule.StartTimeOfDay ) .Select( a => new AttendanceInfo { Date = a.StartDateTime, GroupId = a.Group.Id, Group = a.Group.Name, LocationId = a.LocationId.Value, Location = a.Location.Name, Schedule = a.Schedule.Name, IsActive = a.StartDateTime > DateTime.Today && activeScheduleIds.Contains( a.ScheduleId.Value ), Code = a.AttendanceCode != null ? a.AttendanceCode.Code : "" } ).ToList(); // Set active locations to be a link to the room in manager page var qryParam = new Dictionary<string, string>(); qryParam.Add( "Group", "" ); qryParam.Add( "Location", "" ); foreach ( var attendance in attendances.Where( a => a.IsActive ) ) { qryParam["Group"] = attendance.GroupId.ToString(); qryParam["Location"] = attendance.LocationId.ToString(); attendance.Location = string.Format( "<a href='{0}'>{1}</a>", LinkedPageUrl( "ManagerPage", qryParam ), attendance.Location ); } rcwCheckinHistory.Visible = attendances.Any(); gHistory.DataSource = attendances; gHistory.DataBind(); } } }