示例#1
0
        public static void CloneAttendance(Attendance attendance, bool isSubroom, Location location, AttendanceService attendanceService, Request req)
        {
            Attendance newAttendance = ( Attendance )attendance.Clone();

            newAttendance.Id               = 0;
            newAttendance.Guid             = new Guid();
            newAttendance.StartDateTime    = Rock.RockDateTime.Now;
            newAttendance.EndDateTime      = null;
            newAttendance.DidAttend        = true;
            newAttendance.Device           = null;
            newAttendance.SearchTypeValue  = null;
            newAttendance.LocationId       = req.LocationId;
            newAttendance.AttendanceCode   = null;
            newAttendance.AttendanceCodeId = attendance.AttendanceCodeId;
            if (isSubroom)
            {
                newAttendance.ForeignId = location.Id;
            }
            else
            {
                newAttendance.ForeignId = null;
            }
            attendanceService.Add(newAttendance);
            var stayedFifteenMinutes = (Rock.RockDateTime.Now - attendance.StartDateTime) > new TimeSpan(0, 15, 0);

            attendance.DidAttend   = stayedFifteenMinutes;
            attendance.EndDateTime = Rock.RockDateTime.Now;
            InMemoryPersonStatus.RemoveFromWorship(attendance.PersonAlias.PersonId);
            InMemoryPersonStatus.RemoveFromWithParent(attendance.PersonAlias.PersonId);
            CheckInCountCache.AddAttendance(newAttendance);
            CheckInCountCache.RemoveAttendance(attendance);
        }
示例#2
0
        public static void CloseActiveAttendances(RockContext rockContext, Attendance attendeeAttendance, Location location, bool isSubroom)
        {
            var  activeAttendances = ValidationHelper.GetActiveAttendances(rockContext, attendeeAttendance, location);
            bool didRemove         = false;

            foreach (var activeAttendance in activeAttendances)
            {
                didRemove = true;
                var stayedFifteenMinutes = (Rock.RockDateTime.Now - activeAttendance.StartDateTime) > new TimeSpan(0, 15, 0);
                activeAttendance.DidAttend   = stayedFifteenMinutes;
                activeAttendance.EndDateTime = Rock.RockDateTime.Now;
                AddExitHistory(rockContext, attendeeAttendance.Location, attendeeAttendance, isSubroom);
                CheckInCountCache.RemoveAttendance(activeAttendance);
            }
            if (didRemove)
            {
                var personId = attendeeAttendance.PersonAlias.PersonId;
                InMemoryPersonStatus.RemoveFromWorship(personId);
                InMemoryPersonStatus.RemoveFromWithParent(personId);
            }
        }
示例#3
0
        public static void CloneAttendance(Attendance attendance, bool isSubroom, Location location, AttendanceService attendanceService, Request req)
        {
            Attendance newAttendance = null;

            if (!isSubroom)
            {
                newAttendance = attendanceService.AddOrUpdate(attendance.PersonAliasId, attendance.StartDateTime.Date, attendance.Occurrence.GroupId,
                                                              location.Id, attendance.Occurrence.ScheduleId, location.CampusId,
                                                              null, null, null, null, null, null);
            }
            else
            {
                newAttendance = attendanceService.AddOrUpdate(attendance.PersonAliasId, attendance.StartDateTime.Date, attendance.Occurrence.GroupId,
                                                              location.ParentLocationId, attendance.Occurrence.ScheduleId, location.CampusId,
                                                              null, null, null, null, null, null);
            }
            newAttendance.StartDateTime    = Rock.RockDateTime.Now;
            newAttendance.EndDateTime      = null;
            newAttendance.DidAttend        = true;
            newAttendance.AttendanceCodeId = attendance.AttendanceCodeId;
            if (isSubroom)
            {
                newAttendance.ForeignId = location.Id;
            }
            else
            {
                newAttendance.ForeignId = null;
            }
            attendanceService.Add(newAttendance);
            var stayedFifteenMinutes = (Rock.RockDateTime.Now - attendance.StartDateTime) > new TimeSpan(0, 15, 0);

            attendance.DidAttend   = stayedFifteenMinutes;
            attendance.EndDateTime = Rock.RockDateTime.Now;
            InMemoryPersonStatus.RemoveFromWorship(attendance.PersonAlias.PersonId);
            InMemoryPersonStatus.RemoveFromWithParent(attendance.PersonAlias.PersonId);
            CheckInCountCache.AddAttendance(newAttendance);
            CheckInCountCache.RemoveAttendance(attendance);
        }
        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));
            }
        }