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));
            }
        }