public List <AttendanceEntry> GetRoster(int locationId) { try { var tomorrow = Rock.RockDateTime.Today.AddDays(1); RockContext rockContext = new RockContext(); Location location = new LocationService(rockContext).Get(locationId); if (location == null) { return(new List <AttendanceEntry>()); } var isSubroom = ValidationHelper.IsSubRoom(location); if (isSubroom) { locationId = location.ParentLocationId ?? 0; } AttendanceService attendanceService = new AttendanceService(rockContext); var qry = attendanceService.Queryable() .Where(a => a.LocationId == locationId && a.StartDateTime > Rock.RockDateTime.Today && a.StartDateTime < tomorrow); if (isSubroom) { qry = qry.Where(a => (a.DidAttend == true && a.ForeignId == location.Id) || a.DidAttend != true); } var roster = qry.Select(a => new AttendanceEntry() { Id = a.Id, PersonId = a.PersonAlias.Person.Id, LastName = a.PersonAlias.Person.LastName, NickName = a.PersonAlias.Person.NickName, StartDateTime = a.StartDateTime, EndDateTime = a.EndDateTime, AttendanceGuid = a.Guid.ToString(), DidAttend = a.DidAttend ?? false, IsVolunteer = VolunteerGroupIds.Contains(a.GroupId ?? 0) || a.GroupId == null }) .OrderBy(ae => ae.Id) .ToList(); foreach (var entry in roster) { entry.InWorship = InMemoryPersonStatus.IsInWorship(entry.PersonId); entry.WithParent = InMemoryPersonStatus.IsWithParent(entry.PersonId); } return(roster); } catch (Exception e) { ExceptionLogService.LogException(e, System.Web.HttpContext.Current); return(new List <AttendanceEntry>()); } }
public Response Exit([FromBody] Request req) { try { RockContext rockContext = new RockContext(); Attendance attendeeAttendance = ValidationHelper.GetAttendeeAttendance(req, rockContext); if (attendeeAttendance == null) { return(new Response(false, "Attendance record not found.", false)); } if (Rock.RockDateTime.Today != attendeeAttendance.StartDateTime.Date) { return(new Response(false, "Attendance record not from today.", false)); } var person = attendeeAttendance.PersonAlias.Person; var location = new LocationService(rockContext).Get(req.LocationId); bool isSubroom = ValidationHelper.IsSubRoom(location); if (isSubroom) { req.LocationId = location.ParentLocationId ?? 0; } var attendances = ValidationHelper.GetAttendancesForAttendee(rockContext, attendeeAttendance); attendances = attendances.Where(a => a.LocationId == req.LocationId); //If person is a volunteer, children are checked in, and would result in less than 2 volunteers //Then don't allow for check-out if ((attendances.Where(a => VolunteerGroupIds.Contains(a.GroupId ?? 0)).Any() || attendances.Where(a => a.GroupId == 0 || a.GroupId == null).Any()) && AreChildrenCheckedIn(req.LocationId) && NumberOfVolunteersCheckedIn(req.LocationId) <= 2) { return(new Response(false, "Cannot checkout volunteer with children still in class. Two volunteers are required at all times.", false)); } foreach (var attendance in attendances) { var stayedFifteenMinutes = (Rock.RockDateTime.Now - attendance.StartDateTime) > new TimeSpan(0, 15, 0); attendance.DidAttend = stayedFifteenMinutes; attendance.EndDateTime = Rock.RockDateTime.Now; CheckInCountCache.RemoveAttendance(attendance); var personId = attendeeAttendance.PersonAlias.PersonId; InMemoryPersonStatus.RemoveFromWorship(personId); InMemoryPersonStatus.RemoveFromWithParent(personId); } //Add history of exit DataHelper.AddExitHistory(rockContext, location, attendeeAttendance, isSubroom); rockContext.SaveChanges(); var message = string.Format("{0} has been checked-out of {1}.", person.FullName, location.Name); return(new Response(true, message, false, personId: person.Id)); } catch (Exception e) { ExceptionLogService.LogException(e, System.Web.HttpContext.Current); return(new Response(false, "An error occured", false)); } }