public ActionResult OppositionMPs(int id, OppositionMPs model)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                if (ModelState.IsValid)
                {
                    slippingRequest.OppositionMPsAttending = model.YesNo;
                    slippingRequest.OppositionMPs          = model.MPs;
                    CreateOrUpdate(slippingRequest);
                    return(RedirectToAction("CheckYourAnswers"));
                }
                else
                {
                    if (model.YesNo == null && model.MPs == null)
                    {
                        model.MPs = new List <OppositionMP>()
                        {
                            new OppositionMP()
                        };
                    }
                    return(View(model));
                }
            }
            else
            {
                return(RedirectToAction("NotFound"));
            }
        }
예제 #2
0
        private AbsenceRequest GetAbsenceRequest(SlippingRequest slippingRequest, int MPID, int userId)
        {
            AbsenceRequest absenceRequest;

            if (slippingRequest.ID == 0)
            {
                absenceRequest = new AbsenceRequest()
                {
                    CreatedBy   = userId,
                    CreatedDate = DateTime.UtcNow,
                    MPID        = MPID
                };
            }
            else
            {
                absenceRequest = db.AbsenceRequests.Find(slippingRequest.ID);
            }

            if (absenceRequest != null)
            {
                absenceRequest.LastChangedBy          = userId;
                absenceRequest.LastChangedDate        = DateTime.UtcNow;
                absenceRequest.ReasonID               = slippingRequest.ReasonID;
                absenceRequest.Details                = slippingRequest.Details;
                absenceRequest.StatusID               = slippingRequest.StatusID;
                absenceRequest.FromDate               = slippingRequest.FromDate.ToUtcFromUkTime();
                absenceRequest.ToDate                 = slippingRequest.ToDate.HasValue ? ((DateTime)slippingRequest.ToDate).ToUtcFromUkTime() : slippingRequest.ToDate;
                absenceRequest.DecisionNotes          = slippingRequest.DecisionNotes;
                absenceRequest.Location               = slippingRequest.Location;
                absenceRequest.TravelTimeInHours      = slippingRequest.TravelTimeInHours;
                absenceRequest.OppositionMPsAttending = slippingRequest.OppositionMPsAttending;
            }

            return(absenceRequest);
        }
        public ActionResult OppositionMPs(int id)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                if (slippingRequest.OppositionMPs == null)
                {
                    slippingRequest.OppositionMPs = new List <OppositionMP>();
                }

                if (slippingRequest.OppositionMPs.Count == 0)
                {
                    slippingRequest.OppositionMPs.Add(new OppositionMP()
                    {
                        ID = 0, MPID = 0, FullName = null
                    });
                }

                var model = new OppositionMPs
                {
                    ID    = slippingRequest.ID,
                    YesNo = slippingRequest.OppositionMPsAttending,
                    MPs   = slippingRequest.OppositionMPs
                };
                return(View(model));
            }
            else
            {
                return(RedirectToAction("NotFound", "Home"));
            }
        }
예제 #4
0
        private SlippingRequest GetSlippingRequest(AbsenceRequest absenceRequest, ICollection <AbsenceRequestOppositionMP> absenceRequestOppositionMPs)
        {
            SlippingRequest slippingRequest = new SlippingRequest()
            {
                ID                     = absenceRequest.ID,
                MPID                   = absenceRequest.MPID,
                ReasonID               = absenceRequest.ReasonID,
                Reason                 = absenceRequest.ReasonID.HasValue ? absenceRequest.AbsenceRequestReason.Reason : string.Empty,
                Details                = absenceRequest.Details,
                StatusID               = absenceRequest.StatusID,
                Status                 = absenceRequest.AbsenceRequestStatus.Status,
                FromDate               = absenceRequest.FromDate.ToUkTimeFromUtc(),
                ToDate                 = absenceRequest.ToDate.HasValue ? ((DateTime)absenceRequest.ToDate).ToUkTimeFromUtc() : absenceRequest.ToDate,
                DecisionNotes          = absenceRequest.DecisionNotes,
                CreatedBy              = (int)absenceRequest.CreatedBy,
                LastChangedBy          = absenceRequest.LastChangedBy,
                Location               = absenceRequest.Location,
                TravelTimeInHours      = absenceRequest.TravelTimeInHours,
                OppositionMPsAttending = absenceRequest.OppositionMPsAttending,
                OppositionMPs          = absenceRequestOppositionMPs.Count > 0 ? absenceRequestOppositionMPs.Select(a => new OppositionMP {
                    ID = a.ID, MPID = a.MPID, FullName = a.MPFullName
                }).ToList() : new List <OppositionMP>()
            };

            return(slippingRequest);
        }
        public ActionResult FromDate(int?id)
        {
            var model = new DateAndTime();

            if (id.HasValue)
            {
                SlippingRequest slippingRequest = Get(id.Value);

                if (slippingRequest != null && !IsSubmitted(slippingRequest))
                {
                    model = new DateAndTime
                    {
                        ID     = slippingRequest.ID,
                        Date   = slippingRequest.FromDate,
                        Hour   = slippingRequest.FromDate.ToString("HH"),
                        Minute = slippingRequest.FromDate.ToString("mm")
                    };
                }
                else
                {
                    return(RedirectToAction("NotFound"));
                }
            }
            return(View(model));
        }
예제 #6
0
 public int SubmitSlippingRequest(SlippingRequest slippingRequest, int userId)
 {
     if (UserCanActForMP(userId, slippingRequest.MPID))
     {
         var absenceRequest = db.AbsenceRequests.Find(slippingRequest.ID).StatusID = 1;
         db.SaveChanges();
         return(slippingRequest.ID);
     }
     throw new Exception("Unauthorised");
 }
        public ActionResult Confirmation(int id)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null)
            {
                return(View(slippingRequest));
            }
            else
            {
                return(RedirectToAction("NotFound", "Home"));
            }
        }
        public ActionResult CheckYourAnswers(int id)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                return(View(slippingRequest));
            }
            else
            {
                return(RedirectToAction("NotFound", "Home"));
            }
        }
예제 #9
0
 public SlippingRequest Get(int requestId, int userId)
 {
     if (Exists(requestId, userId))
     {
         AbsenceRequest  absenceRequest = db.AbsenceRequests.Find(requestId);
         var             absenceRequestOppositionMPs = absenceRequest.AbsenceRequestOppositionMPs;
         SlippingRequest slippingRequest             = GetSlippingRequest(absenceRequest, absenceRequestOppositionMPs);
         return(slippingRequest);
     }
     else
     {
         return(null);
     }
 }
예제 #10
0
        public int CreateOrUpdate(SlippingRequest slippingRequest, int MPID, int userId)
        {
            AbsenceRequest absenceRequest = GetAbsenceRequest(slippingRequest, MPID, userId);

            if (absenceRequest.ID == 0)
            {
                db.AbsenceRequests.Add(absenceRequest);
            }
            else
            {
                db.Entry(absenceRequest).State = EntityState.Modified;
            }

            if (absenceRequest.OppositionMPsAttending == true)
            {
                var removedMPs = new List <AbsenceRequestOppositionMP>();
                foreach (var mp in absenceRequest.AbsenceRequestOppositionMPs)
                {
                    if (!slippingRequest.OppositionMPs.Select(m => m.ID).Contains(mp.ID))
                    {
                        removedMPs.Add(mp);
                    }
                }
                db.AbsenceRequestOppositionMPs.RemoveRange(removedMPs);

                foreach (var mp in slippingRequest.OppositionMPs)
                {
                    var absenceRequestOppositionMP = GetAbsenceRequestOppositionMP(mp, absenceRequest.ID, userId);
                    if (absenceRequestOppositionMP.ID == 0)
                    {
                        db.AbsenceRequestOppositionMPs.Add(absenceRequestOppositionMP);
                    }
                    else
                    {
                        db.Entry(absenceRequestOppositionMP).State = EntityState.Modified;
                    }
                }
            }
            else
            {
                foreach (var mp in db.AbsenceRequestOppositionMPs.Where(m => m.AbsenceRequestID == absenceRequest.ID))
                {
                    db.AbsenceRequestOppositionMPs.Remove(mp);
                }
            }

            db.SaveChanges();

            return(absenceRequest.ID);
        }
        public ActionResult FromDate(int?id, DateAndTime model)
        {
            var fromDate = model.GetDateTime();

            if (fromDate < DateTime.UtcNow.ToUkTimeFromUtc().AddMinutes(15))
            {
                ModelState.AddModelError("Hour", "Start time must be at least 15 minutes from now");
                ModelState.AddModelError("Minute", string.Empty);
            }

            if (DatesOverlapExistingSlip(MPID, fromDate))
            {
                ModelState.AddModelError("Date", "You have already submitted a slip for this date");
            }

            if (ModelState.IsValid)
            {
                if (id.HasValue)
                {
                    // Update an existing record
                    SlippingRequest slippingRequest = Get(id.Value);

                    if (slippingRequest != null && !IsSubmitted(slippingRequest))
                    {
                        slippingRequest.FromDate = model.GetDateTime();
                        CreateOrUpdate(slippingRequest);
                        return(RedirectToAction("ToDate", new { id }));
                    }
                    else
                    {
                        return(RedirectToAction("NotFound", "Home"));
                    }
                }
                else
                {
                    // Create a new record
                    SlippingRequest slippingRequest = new SlippingRequest()
                    {
                        FromDate = model.GetDateTime()
                    };
                    int requestId = CreateOrUpdate(slippingRequest);
                    return(RedirectToAction("ToDate", new { id = requestId }));
                }
            }
            else
            {
                return(View(model));
            }
        }
        public ActionResult Location(int id)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                var model = new LocationAndHours
                {
                    ID       = slippingRequest.ID,
                    Location = slippingRequest.Location ?? string.Empty,
                    Hours    = slippingRequest.TravelTimeInHours.HasValue ? slippingRequest.TravelTimeInHours.ToString() : string.Empty
                };
                return(View(model));
            }
            else
            {
                return(RedirectToAction("NotFound"));
            }
        }
        public ActionResult ToDate(int id, DateAndTime model)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                DateTime toDate = model.GetDateTime();

                if (toDate.Date < slippingRequest.FromDate.Date)
                {
                    ModelState.AddModelError("Date", "Finish date cannot be before start date");
                }

                if (toDate.Date == slippingRequest.FromDate.Date)
                {
                    if (toDate.TimeOfDay <= slippingRequest.FromDate.TimeOfDay)
                    {
                        ModelState.AddModelError("Hour", "Finish time must be at least 15 minutes after start time");
                        ModelState.AddModelError("Minute", string.Empty);
                    }
                }

                if (DatesOverlapExistingSlip(MPID, slippingRequest.FromDate, toDate))
                {
                    ModelState.AddModelError("Date", "The period you have selected overlaps with an existing slip you have submitted");
                }

                if (ModelState.IsValid)
                {
                    slippingRequest.ToDate = model.GetDateTime();
                    CreateOrUpdate(slippingRequest);
                    return(RedirectToAction("Location", new { id }));
                }
                else
                {
                    return(View(model));
                }
            }
            else
            {
                return(RedirectToAction("NotFound"));
            }
        }
        public ActionResult ToDate(int id)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                var model = new DateAndTime
                {
                    ID     = slippingRequest.ID,
                    Date   = slippingRequest.ToDate ?? slippingRequest.FromDate,
                    Hour   = slippingRequest.ToDate.HasValue ? slippingRequest.ToDate.Value.ToString("HH") : slippingRequest.FromDate.AddHours(1).ToString("HH"),
                    Minute = slippingRequest.ToDate.HasValue ? slippingRequest.ToDate.Value.ToString("mm") : slippingRequest.FromDate.ToString("mm")
                };
                return(View(model));
            }
            else
            {
                return(RedirectToAction("NotFound", "Home"));
            }
        }
        public ActionResult Reason(int id)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                var model = new ReasonAndDetails
                {
                    Reasons = ReasonRepository.Get().Where(r => r.ID != 4).ToList(),
                    ID      = slippingRequest.ID,
                    Reason  = slippingRequest.ReasonID.HasValue ? slippingRequest.ReasonID.ToString() : "-1"
                };

                switch (model.Reason)
                {
                case "1":
                    model.Details1 = slippingRequest.Details ?? string.Empty;
                    break;

                case "2":
                    model.Details2 = slippingRequest.Details ?? string.Empty;
                    break;

                case "3":
                    model.Details3 = slippingRequest.Details ?? string.Empty;
                    break;

                case "5":
                    model.Details4 = slippingRequest.Details ?? string.Empty;
                    break;
                }

                return(View(model));
            }
            else
            {
                return(RedirectToAction("NotFound"));
            }
        }
        public ActionResult Location(int id, LocationAndHours model)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                if (ModelState.IsValid)
                {
                    slippingRequest.Location          = model.Location;
                    slippingRequest.TravelTimeInHours = 0;//Convert.ToInt32(model.Hours);
                    CreateOrUpdate(slippingRequest);
                    return(RedirectToAction("Reason"));
                }
                else
                {
                    return(View(model));
                }
            }
            else
            {
                return(RedirectToAction("NotFound"));
            }
        }
 private bool IsSubmitted(SlippingRequest slippingRequest)
 {
     return(slippingRequest.StatusID != 0);
 }
 private int SubmitSlippingRequest(SlippingRequest slippingRequest)
 {
     return(SlippingRepository.SubmitSlippingRequest(slippingRequest, SlippingUser.ID));
 }
 private int CreateOrUpdate(SlippingRequest slippingRequest)
 {
     return(SlippingRepository.CreateOrUpdate(slippingRequest, MPID, SlippingUser.ID));
 }
        public ActionResult Reason(int id, ReasonAndDetails model)
        {
            SlippingRequest slippingRequest = Get(id);

            //mapping correct reason details
            switch (model.Reason)
            {
            case "1":
                if (string.IsNullOrWhiteSpace(model.Details1))
                {
                    ModelState.AddModelError("Details1", "A description of the reason is required");
                }
                break;

            case "2":
                if (string.IsNullOrWhiteSpace(model.Details2))
                {
                    ModelState.AddModelError("Details2", "A description of the reason is required");
                }
                break;

            case "3":
                if (string.IsNullOrWhiteSpace(model.Details3))
                {
                    ModelState.AddModelError("Details3", "A description of the reason is required");
                }
                break;

            case "5":
                if (string.IsNullOrWhiteSpace(model.Details4))
                {
                    ModelState.AddModelError("Details4", "A description of the reason is required");
                }
                break;
            }

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                if (ModelState.IsValid)
                {
                    slippingRequest.ReasonID = Convert.ToInt32(model.Reason);
                    switch (model.Reason)
                    {
                    case "1":
                        slippingRequest.Details = model.Details1;
                        break;

                    case "2":
                        slippingRequest.Details = model.Details2;
                        break;

                    case "3":
                        slippingRequest.Details = model.Details3;
                        break;

                    case "5":
                        slippingRequest.Details = model.Details4;
                        break;
                    }

                    CreateOrUpdate(slippingRequest);
                    return(RedirectToAction("OppositionMPs"));
                }
                else
                {
                    model.Reasons = ReasonRepository.Get().Where(r => r.ID != 4).ToList();
                    return(View(model));
                }
            }
            else
            {
                return(RedirectToAction("NotFound"));
            }
        }
        public ActionResult CheckYourAnswers(int id, SlippingRequest model)
        {
            SlippingRequest slippingRequest = Get(id);

            if (slippingRequest != null && !IsSubmitted(slippingRequest))
            {
                if (slippingRequest.FromDate < DateTime.UtcNow.ToUkTimeFromUtc().AddMinutes(15))
                {
                    ModelState.AddModelError("FromDate", "From Time must be at least 15 minutes from now");
                }

                if (slippingRequest.ToDate == null)
                {
                    ModelState.AddModelError("ToDate", "To Date and Time must be supplied");
                }
                else
                {
                    if (((DateTime)slippingRequest.ToDate).Date < slippingRequest.FromDate.Date)
                    {
                        ModelState.AddModelError("ToDate", "To Date cannot be before From Date");
                    }

                    if (((DateTime)slippingRequest.ToDate).Date == slippingRequest.FromDate.Date)
                    {
                        if (((DateTime)slippingRequest.ToDate).TimeOfDay <= slippingRequest.FromDate.TimeOfDay)
                        {
                            ModelState.AddModelError("ToDate", "To Time must be at least 15 minutes after From Time");
                        }
                    }
                }

                if (string.IsNullOrEmpty(slippingRequest.Location))
                {
                    ModelState.AddModelError("Location", "Location must be supplied");
                }

                //if (slippingRequest.TravelTimeInHours == null)
                // {
                //     ModelState.AddModelError("TravelTimeInHours", "Travel time to Westminster must be supplied");
                // }

                if (slippingRequest.ReasonID == null)
                {
                    ModelState.AddModelError("Reason", "Reason must be supplied");
                }

                if (string.IsNullOrEmpty(slippingRequest.Details))
                {
                    ModelState.AddModelError("Details", "Details must be supplied");
                }

                if (slippingRequest.OppositionMPsAttending == null)
                {
                    ModelState.AddModelError("OppositionMPsAttending", "Any opposition MPs in attendance? must be supplied");
                }

                if (ModelState.IsValid)
                {
                    SubmitSlippingRequest(slippingRequest);

                    string displayDate = GetDateForEmail(slippingRequest.FromDate, (DateTime)slippingRequest.ToDate);

                    if (!string.IsNullOrEmpty(NotifyTemplateId_SlippingRequestReceivedUser))
                    {
                        if (!SlippingUser.IsMP)
                        {
                            SendNotification(NotifyTemplateId_SlippingRequestReceivedUser, SlippingUser.EmailAddress, new Dictionary <string, dynamic>()
                            {
                                { "name", string.Format("{0} {1}", SlippingUser.Forenames, SlippingUser.Surname) },
                                { "absence_date", displayDate },
                                { "reference", slippingRequest.ID }
                            });
                        }

                        MP mp = this.MPRepository.Get(slippingRequest.MPID, SlippingUser.ID);

                        if (mp != null)
                        {
                            SendNotification(NotifyTemplateId_SlippingRequestReceivedUser, GetMPEmailAddress(slippingRequest.MPID, SlippingUser.ID), new Dictionary <string, dynamic>()
                            {
                                { "name", mp.Name },
                                { "absence_date", displayDate },
                                { "reference", slippingRequest.ID }
                            });
                        }
                        else
                        {
                            throw new Exception(string.Format("Unable to find MP for Slip {0}", slippingRequest.ID));
                        }
                    }
                    else
                    {
                        throw new Exception("NotifyTemplateId_SlippingRequestReceivedUser in web.config missing or invalid");
                    }

                    if (!string.IsNullOrEmpty(NotifyTemplateId_SlippingRequestReceivedAdmin) && !string.IsNullOrEmpty(SlippingRequestReviewersEmailAddress))
                    {
                        SendNotification(NotifyTemplateId_SlippingRequestReceivedAdmin, SlippingRequestReviewersEmailAddress, new Dictionary <string, dynamic>()
                        {
                            { "name", string.Format("{0} {1}", SlippingUser.Forenames, SlippingUser.Surname) },
                            { "absence_date", displayDate },
                            { "reference", slippingRequest.ID }
                        });
                    }
                    else
                    {
                        throw new Exception("NotifyTemplateId_SlippingRequestReceivedAdmin and/or SlippingRequestReviewersEmailAddress in web.config missing or invalid");
                    }
                    return(RedirectToAction("Confirmation"));
                }
                else
                {
                    return(View(slippingRequest));
                }
            }
            else
            {
                return(RedirectToAction("NotFound"));
            }
        }