public string GetReservationAction(HttpContextBase context) { SchedulerContextHelper helper = GetContextHelper(context); context.Session.Remove("ActiveReservationMessage"); context.Session.Remove("ShowStartConfirmationDialog"); var now = DateTime.Now; var util = Reservations.Create(Provider, now); var requestedState = GetReservationState(context); var rsv = helper.GetReservation(); var res = helper.GetResource(rsv.ResourceID); var client = helper.GetReservationClient(rsv); var args = ReservationStateArgs.Create(rsv, client, now); var state = ReservationStateUtility.Create(now).GetReservationState(args); var currentView = GetView(context); var currentUser = context.CurrentUser(Provider); bool confirm = false; int reservationId = 0; helper.AppendLog($"ReservationController.GetReservationAction: reservationId = {rsv.ReservationID}, requestedState = {requestedState}, state = {state}, currentView = {currentView}"); switch (requestedState) { case ReservationState.StartOnly: case ReservationState.StartOrDelete: // If there are previous unended reservations, then ask for confirmation var endable = Provider.Scheduler.Reservation.SelectEndableReservations(rsv.ResourceID); if (endable.Count() > 0) { var endableReservations = string.Join(",", endable.Select(x => x.ReservationID)); context.Session["ActiveReservationMessage"] = $"[Previous ReservationID: {endableReservations}, Current ReservationID: {rsv.ReservationID}]"; confirm = true; reservationId = rsv.ReservationID; } else { util.Start(rsv, helper.GetReservationClient(rsv), currentUser.ClientID); } break; case ReservationState.Endable: // End reservation if (state == ReservationState.Endable) { util.End(rsv, DateTime.Now, currentUser.ClientID); } else { string actualBeginDateTime = rsv.ActualBeginDateTime.HasValue ? rsv.ActualBeginDateTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "null"; throw new InvalidOperationException($"ReservationID {rsv.ReservationID} state is {state}, not Endable. ActualBeginDateTime: {actualBeginDateTime}"); } break; case ReservationState.PastSelf: if (currentView == ViewType.DayView || currentView == ViewType.WeekView) { context.SetWeekStartDate(rsv.BeginDateTime.Date); } return(SchedulerUtility.GetReturnUrl("ReservationRunNotes.aspx", PathInfo.Create(res), context.Request.SelectedLocationPath(), rsv.ReservationID, context.Request.SelectedDate())); case ReservationState.Other: case ReservationState.Invited: case ReservationState.PastOther: return(SchedulerUtility.GetReturnUrl("Contact.aspx", PathInfo.Create(res), context.Request.SelectedLocationPath(), rsv.ReservationID, context.Request.SelectedDate())); default: // invalid state detected! // throw new NotImplementedException($"ReservationState = {state} is not implemented"); context.Session["ErrorMessage"] = $"The current reservation state, {state}, is invalid. No actions are defined for this state. [RequestedState = {requestedState}, ReservationID = {reservationId}]"; var vars = new Dictionary <string, object> { ["current state"] = state, ["requested state"] = requestedState, ["reservationId"] = reservationId, ["tool_engineer"] = args.IsToolEngineer, ["inlab"] = args.IsInLab, ["reserver"] = args.IsReserver, ["invited"] = args.IsInvited, ["authorized"] = args.IsAuthorized, ["before_mct"] = args.IsBeforeMinCancelTime(), ["startable"] = args.IsStartable() }; helper.SendDebugEmail("ReservationController.GetReservationAction", "Invalid state detected!", "Invalid state detected!", vars); return(SchedulerUtility.Create(Provider).GetReservationViewReturnUrl(currentView, false, reservationId)); } string result = SchedulerUtility.Create(Provider).GetReservationViewReturnUrl(currentView, confirm, reservationId); return(result); }
public void ProcessRequest(HttpContext context) { HttpContextBase ctx = new HttpContextWrapper(context); SchedulerContextHelper helper = GetContextHelper(ctx); string command = GetCommand(ctx); ViewType currentView = GetView(ctx); ctx.SetCurrentViewType(currentView); IClient currentUser = helper.CurrentUser(); string redirectUrl; var util = SchedulerUtility.Create(Provider); helper.AppendLog($"ReservationController.ProcessRequest: url = {ctx.Request.Url}"); try { ctx.Session.Remove("ErrorMessage"); if (command == "ReservationAction") { redirectUrl = GetReservationAction(ctx); } else { IReservationItem rsv; IResource res; switch (command) { case "ChangeHourRange": string range = ctx.Request.QueryString["Range"]; helper.AppendLog($"ReservationController.ProcessRequest: range = {range}"); if (range == "FullDay") { ctx.SetDisplayDefaultHours(false); } else { ctx.SetDisplayDefaultHours(true); } redirectUrl = util.GetReservationViewReturnUrl(currentView); break; case "NewReservation": var canCreate = CanCreateNewReservation(ctx); helper.AppendLog($"ReservationController.ProcessRequest: canCreate = {canCreate}"); if (canCreate) { redirectUrl = SchedulerUtility.GetReservationReturnUrl(ctx.Request.SelectedPath(), ctx.Request.SelectedLocationPath(), 0, ctx.Request.SelectedDate(), GetReservationTime(ctx), currentView); } else { redirectUrl = util.GetReservationViewReturnUrl(currentView); } break; case "ModifyReservation": rsv = helper.GetReservationWithInvitees(); res = helper.GetResourceTreeItemCollection().GetResource(rsv.ResourceID); var currentDate = ctx.Request.SelectedDate(); var currentTime = GetReservationTime(ctx); redirectUrl = SchedulerUtility.GetReservationReturnUrl(PathInfo.Create(res), ctx.Request.SelectedLocationPath(), rsv.ReservationID, currentDate, currentTime, currentView); break; case "DeleteReservation": rsv = helper.GetReservationWithInvitees(); Reservations.Create(Provider, DateTime.Now).Delete(rsv, currentUser.ClientID); redirectUrl = util.GetReservationViewReturnUrl(currentView); break; default: throw new NotImplementedException($"Command not implemented: {command}"); } } } catch (Exception ex) { string errmsg = ex.Message; ctx.Session["ErrorMessage"] = errmsg; helper.AppendLog($"ReservationController.ProcessRequest: errmsg = {errmsg}"); try { redirectUrl = util.GetReservationViewReturnUrl(currentView); } catch { redirectUrl = string.Empty; } } if (string.IsNullOrEmpty(redirectUrl)) { redirectUrl = "~"; } helper.AppendLog($"ReservationController.ProcessRequest: redirectUrl = {redirectUrl}"); ctx.Response.Redirect(redirectUrl); }
public void CanShowLabCleanWarning() { bool isLabCleanTime; DateTime beginDateTime; DateTime endDateTime; using (StartUnitOfWork()) { // Monday beginDateTime = DateTime.Parse("2020-09-14 08:00:00"); endDateTime = DateTime.Parse("2020-09-14 10:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-14 07:00:00"); endDateTime = DateTime.Parse("2020-09-14 08:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-14 07:00:00"); endDateTime = DateTime.Parse("2020-09-14 08:30:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-14 07:00:00"); endDateTime = DateTime.Parse("2020-09-14 08:35:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-14 10:15:00"); endDateTime = DateTime.Parse("2020-09-14 11:15:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-14 10:10:00"); endDateTime = DateTime.Parse("2020-09-14 11:15:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); // Thursday beginDateTime = DateTime.Parse("2020-09-17 08:00:00"); endDateTime = DateTime.Parse("2020-09-17 10:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-17 07:00:00"); endDateTime = DateTime.Parse("2020-09-17 08:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-17 07:00:00"); endDateTime = DateTime.Parse("2020-09-17 08:30:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-17 07:00:00"); endDateTime = DateTime.Parse("2020-09-17 08:35:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-17 10:15:00"); endDateTime = DateTime.Parse("2020-09-17 11:15:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-17 10:10:00"); endDateTime = DateTime.Parse("2020-09-17 11:15:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); // Wednesday beginDateTime = DateTime.Parse("2020-09-16 07:00:00"); endDateTime = DateTime.Parse("2020-09-16 19:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); // Multi-day beginDateTime = DateTime.Parse("2020-09-16 23:00:00"); endDateTime = DateTime.Parse("2020-09-17 08:35:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-16 23:00:00"); endDateTime = DateTime.Parse("2020-09-17 08:30:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-18 23:00:00"); endDateTime = DateTime.Parse("2020-09-21 08:35:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-18 23:00:00"); endDateTime = DateTime.Parse("2020-09-21 08:30:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); // Holiday beginDateTime = DateTime.Parse("2020-09-08 07:00:00"); endDateTime = DateTime.Parse("2020-09-08 08:35:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-08 10:10:00"); endDateTime = DateTime.Parse("2020-09-09 08:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsTrue(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-08 10:15:00"); endDateTime = DateTime.Parse("2020-09-09 08:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-06 08:15:00"); endDateTime = DateTime.Parse("2020-09-07 10:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); beginDateTime = DateTime.Parse("2020-09-07 08:0:00"); endDateTime = DateTime.Parse("2020-09-07 11:00:00"); isLabCleanTime = SchedulerUtility.Create(Provider).ShowLabCleanWarning(beginDateTime, endDateTime); Assert.IsFalse(isLabCleanTime); } }