예제 #1
0
        public ReservationModel(SchedulerContextHelper helper, DateTime now)
        {
            Helper = helper;
            Now    = now;

            int reservationId = helper.GetReservationID();

            if (reservationId > 0)
            {
                IReservationItem rsv = helper.Provider.Scheduler.Reservation.GetReservation(reservationId);
                var res = helper.Provider.Scheduler.Resource.GetResource(rsv.ResourceID);

                Reservation  = rsv;
                ActivityID   = rsv.ActivityID;
                AccountID    = rsv.AccountID;
                RecurrenceID = rsv.RecurrenceID;
                Notes        = rsv.Notes;
                AutoEnd      = rsv.ReservationAutoEnd;
                KeepAlive    = rsv.KeepAlive;
                Resource     = res;
            }

            if (Resource == null)
            {
                var resourceId = helper.Context.Request.SelectedPath().ResourceID;
                Resource = helper.Provider.Scheduler.Resource.GetResource(resourceId);
            }
        }
예제 #2
0
 protected TreeViewNode(SchedulerContextHelper helper, SchedulerResourceTreeView view, T item)
 {
     Helper = helper;
     Item   = item;
     View   = view;
     Parent = null;
 }
        public void CanConfirmYes()
        {
            var qs = new NameValueCollection
            {
                ["Path"] = "4-1-18-40061",
                ["Date"] = "2019-03-25"
            };

            using (var test = new SchedulerContextManager(username: "******", queryString: qs))
            {
                DateTime now = DateTime.Parse("2019-03-25 13:00");

                var helper = new SchedulerContextHelper(test.ContextBase, ServiceProvider.Current);

                ReservationModel model = new ReservationModel(helper, now)
                {
                    ActivityID = 6,                              //ddlActivity.SelectedValue
                    AccountID  = 67,                             //ddlAccount.SelectedValue
                    AutoEnd    = false,                          //chkAutoEnd.Checked
                    KeepAlive  = true,                           //chkKeepAlive.Checked
                    Notes      = string.Empty,                   //txtNotes.Text
                    ReservationProcessInfoJson = string.Empty,   //hidProcessInfoData.Value
                    DurationText                 = string.Empty, //txtDuration.Text
                    DurationSelectedValue        = "60",         //ddlDuration.SelectedValue
                    StartTimeHourSelectedValue   = "20",         //ddlStartTimeHour.SelectedValue
                    StartTimeMinuteSelectedValue = "0"           //dlStartTimeMin.SelectedValue
                };

                var rsv = model.CreateOrModifyReservation();

                Assert.IsNull(test.ContextBase.Session["ErrorMessage"]);
                Assert.AreEqual("/sselscheduler/ResourceDayWeek.aspx?Path=4-1-18-40061&Date=2019-03-25", test.ContextBase.Response.RedirectLocation);
            }
        }
        public static StartReservationItem CreateStartReservationItem(HttpContextBase context, IProvider provider, IReservationItem rsv)
        {
            var now = DateTime.Now;

            var item = new StartReservationItem
            {
                ReservationID        = rsv.ReservationID,
                ResourceID           = rsv.ResourceID,
                ResourceName         = rsv.ResourceName,
                ReservedByClientID   = rsv.ClientID,
                ReservedByClientName = string.Format("{0} {1}", rsv.FName, rsv.LName)
            };

            var currentUser = context.CurrentUser(provider);

            if (rsv.ClientIDBegin.HasValue)
            {
                if (rsv.ClientIDBegin.Value > 0)
                {
                    IClient startedBy = provider.Data.Client.GetClient(rsv.ClientIDBegin.Value);
                    item.StartedByClientID   = startedBy.ClientID;
                    item.StartedByClientName = string.Format("{0} {1}", startedBy.FName, startedBy.LName);
                }
                else
                {
                    item.StartedByClientID   = 0;
                    item.StartedByClientName = string.Empty;
                }
            }
            else
            {
                item.StartedByClientID = currentUser.ClientID;

                item.StartedByClientName = string.Format("{0} {1}", currentUser.FName, currentUser.LName);
            }

            var reservationItem    = provider.Scheduler.Reservation.GetReservationWithInvitees(rsv.ReservationID);
            var helper             = new SchedulerContextHelper(context, provider);
            var args               = ReservationStateArgs.Create(reservationItem, helper.GetReservationClient(reservationItem), now);
            var stateUtil          = ReservationStateUtility.Create(now);
            ReservationState state = stateUtil.GetReservationState(args);

            item.Startable           = stateUtil.IsStartable(state);
            item.NotStartableMessage = GetNotStartableMessage(state);

            var inst = ActionInstances.Find(ActionType.Interlock, rsv.ResourceID);

            item.HasInterlock = inst != null;

            var res = provider.Scheduler.Resource.GetResource(rsv.ResourceID);

            item.ReturnUrl = GetResourceUrl(context, res);

            return(item);
        }
예제 #5
0
        public void Initialize()
        {
            _requestMock = new Mock <HttpRequestBase>();
            _requestMock.Setup(x => x.UserHostAddress).Returns("141.213.6.57");

            _contextMock = new Mock <HttpContextBase>();
            _contextMock.Setup(x => x.Request).Returns(_requestMock.Object);
            _contextMock.Setup(x => x.Items).Returns(_items);
            Context = _contextMock.Object;

            ContainerContextFactory.Current.NewThreadScopedContext();
            var containerContext = ContainerContextFactory.Current.GetContext();

            Container = containerContext.Container;
            var config = new ThreadStaticContainerConfiguration(containerContext);

            config.RegisterAllTypes();
            ServiceProvider.Setup(Provider);

            Helper = new SchedulerContextHelper(Context, Provider);
        }
        public static object Start(HttpContextBase context, IProvider provider, int reservationId, int clientId)
        {
            try
            {
                var helper = new SchedulerContextHelper(context, provider);
                var util   = Reservations.Create(provider, DateTime.Now);
                var rsv    = provider.Scheduler.Reservation.GetReservationWithInvitees(reservationId);
                var client = provider.Data.Client.GetClient(clientId);

                if (rsv != null)
                {
                    util.Start(rsv, helper.GetReservationClient(rsv, client), context.CurrentUser(provider).ClientID);
                    return(new { Error = false, Message = "OK" });
                }
                else
                {
                    return(new { Error = true, Message = $"Cannot find record for ReservationID {reservationId}" });
                }
            }
            catch (Exception ex)
            {
                return(new { Error = true, ex.Message });
            }
        }
예제 #7
0
 public LocationLabNode(SchedulerContextHelper helper, SchedulerResourceTreeView view, LocationTreeItemCollection locationTree, ILab item) : base(helper, view, item)
 {
     _locationTree = locationTree ?? throw new ArgumentNullException("locationTree");
     Load();
 }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
 public BuildingNode(SchedulerContextHelper helper, SchedulerResourceTreeView view, IBuilding item) : base(helper, view, item)
 {
     Load();
 }