public async Task <ActionResult <AccessPeriod> > AddAccesPeriod(AccessPeriod accessPeriod) { var user = await context.Users.Where(u => u.UserId == GetUserIdFromClaim(User)).Include(u => u.Facilities).FirstOrDefaultAsync(); if (user == null) { return(BadRequest("Incorrect user")); } Facility fac = user.Facilities.Where(f => f.FacilityId == accessPeriod.FacilityId).FirstOrDefault(); if (fac == null) { return(BadRequest("User doesn't own that facility")); } if (!DataHelper.CheckTime(accessPeriod.StartHour ?? 0, accessPeriod.StartMinute ?? 0, accessPeriod.EndHour ?? 0, accessPeriod.EndHour ?? 0)) { return(BadRequest("Incorrect time data")); } //get facility periods of day var facs = context.AccessPeriods.Where(a => a.FacilityId == accessPeriod.FacilityId).Where(a => a.DayOfWeek == accessPeriod.DayOfWeek).ToList(); if (facs != null) { foreach (AccessPeriod a in facs) { var f1 = new TimeSpan(accessPeriod.StartHour ?? 0, accessPeriod.StartMinute ?? 0, 0); var t1 = new TimeSpan(accessPeriod.EndHour ?? 0, accessPeriod.EndMinute ?? 0, 0); var f2 = new TimeSpan(a.StartHour ?? 0, a.StartMinute ?? 0, 0); var t2 = new TimeSpan(a.EndHour ?? 0, a.EndMinute ?? 0, 0); if (DataHelper.IsTimeOverlapping(f1, t1, f2, t2)) { return(BadRequest("Time periods overlapping on existing ones")); } } } accessPeriod.FromDate = DateTime.Now; accessPeriod.Facility = fac; context.AccessPeriods.Add(accessPeriod); await context.SaveChangesAsync(); return(Ok(accessPeriod)); }
public static Reservation GetExistingOrEmpty(AccessPeriod accessPeriod, List <Reservation> booked, List <Reservation> inactive) { var date = DataHelper.Date.GetNextDayOfWeekDate(accessPeriod.DayOfWeek); DateTime startTime = new DateTime(date.Year, date.Month, date.Day, accessPeriod.StartHour ?? 0, accessPeriod.StartMinute ?? 0, 0); DateTime endTime = new DateTime(date.Year, date.Month, date.Day, accessPeriod.EndHour ?? 0, accessPeriod.EndMinute ?? 0, 0); //Check if term already booked var res = booked.Where(r => r.StartTime == startTime && r.EndTime == endTime).FirstOrDefault(); if (res != null) { return(res); } //Check if access period date expired if (!((accessPeriod.FromDate != null && accessPeriod.FromDate <= startTime) || (accessPeriod.ToDate != null && accessPeriod.ToDate > endTime))) { return(null); } //Check if collaps with inactive date foreach (var inact in inactive) { if (AreDatesCollapsing(inact, new Reservation() { StartTime = startTime, EndTime = endTime })) { return(inact); } } return(new Reservation() { StartTime = startTime, EndTime = endTime, Status = ReservationStatus.NotBooked, AccessPeriodId = accessPeriod.AccessPeriodId, }); }