public string GetReservationFromTime(DateTime time) { DateTime reservationDate = Date.Add(time.TimeOfDay); ReservationViewModel reservation = ReservationList.Find(x => x.StartDate.CompareTo(reservationDate) <= 0 && x.EndDate.CompareTo(reservationDate) > 0); string result = string.Empty; if (reservation != null) { UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext); result = String.Format("<a href=\"{0}\">{1} {2}</a>", url.Action("Details", new { id = reservation.Id }), reservation.Member.FirstName, reservation.Member.LastName); } return(result); }
public static Reservation ConvertToReservation(this ReservationViewModel viewModel) { return(new Reservation() { Id = viewModel.Id, Aircraft = viewModel.Aircraft, AircraftId = viewModel.AircraftId, EndDate = viewModel.EndDate.Date.Add(TimeSpan.Parse(viewModel.EndTime)), //Instructor = viewModel.Instructor, InstructorId = viewModel.InstructorId == 0 ? null : viewModel.InstructorId, Member = viewModel.Member, MemberId = viewModel.MemberId, StartDate = viewModel.StartDate.Date.Add(TimeSpan.Parse(viewModel.StartTime)), Destination = viewModel.Destination, Notes = viewModel.Notes }); }
public ActionResult Create(int? aircraftId, DateTime? startDate) { string startTime = "06:00"; string endTime = "07:00"; DateTime endDate = DateTime.Now; if (startDate == null || startDate.Value < DateTime.Now) { startDate = DateTime.Now.Date; startTime = DateTime.Now.AddHours(1).ToString("HH:00"); endDate = DateTime.Now.AddHours(2); endTime = endDate.ToString("HH:00"); } var model = new ReservationViewModel() { MemberId = Convert.ToInt32(HttpContext.Profile.GetPropertyValue("MemberId")),//TODO: replace with common call to profile service AircraftId = aircraftId != null ? aircraftId.Value : 0, InstructorId = 0, StartDate = startDate.Value, StartTime = startTime, EndDate = endDate, EndTime = endTime, AircraftList = _dataService.GetAllAirplanes(), InstructorList = _dataService.GetMembersByRoleAndStatus(UserRoles.Instructor, MemberStatus.Active), TimeList = new List<DateTime>().GetListFromRange(DateTime.MinValue.AddHours(6), DateTime.MinValue.AddHours(22), new TimeSpan(0, 30, 0)).ConvertAll(x => new SelectListItem() { Value = x.ToString("HH:mm"), Text = x.ToString("HH:mm") }).ToList(), Destination = "TKI" }; // for default selection model.InstructorList.Add(new Member() { Id = -1, FirstName = "" }); if (HttpContext.Request.UrlReferrer != null) model.UrlReferrer = HttpContext.Request.UrlReferrer; else model.UrlReferrer = new Uri(Url.Action("Index", null, null, Request.Url.Scheme)); model.AircraftList.Insert(0, new Aircraft()); model.InstructorList.Insert(0, new Member()); return View(model); }
public ActionResult Create(ReservationViewModel model) { if (ModelState.IsValid) { ValidateReservation(model); } if(ModelState.IsValid) { _dataService.SaveReservation(model.ConvertToReservation()); if (model.InstructorId != 0) { try { Member pilot = _dataService.GetMember(model.MemberId); Member instructor = _dataService.GetMember((int)model.InstructorId); Aircraft aircraft = _dataService.GetAircraftById(model.AircraftId); MailMessage message = new MailMessage(); message.From = new MailAddress("*****@*****.**"); message.To.Add(new MailAddress(instructor.Login.Email)); message.Subject = "Flight lesson notification"; message.Body = "NTXFC club member " + pilot.FullName + " has scheduled flight lesson in " + aircraft.RegistrationNumber + " starting at " + model.StartTime + " on " + model.StartDate.ToString("yyyy-MM-dd") + "\t" + "If you are not able please contact pilot at " + pilot.Login.Email + " or " + pilot.Phone + "\t"; SendEmail(message); } catch (Exception ex) { string msg = "Error while trying to send Reservation notification:\t" + ex.ToString(); LogError(msg); } } return RedirectToAction("AircraftByWeek", new { aircraftId = model.AircraftId, startDate = model.StartDate }); } model.AircraftList = _dataService.GetAllAirplanes(); model.InstructorList = _dataService.GetMembersByRoleAndStatus(UserRoles.Instructor, MemberStatus.Active); model.TimeList = new List<DateTime>().GetListFromRange(DateTime.MinValue.AddHours(6), DateTime.MinValue.AddHours(22), new TimeSpan(0, 30, 0)).ConvertAll(x => new SelectListItem() { Value = x.ToString("HH:mm"), Text = x.ToString("HH:mm") }).ToList(); model.AircraftList.Insert(0, new Aircraft()); model.InstructorList.Insert(0, new Member()); return View(model); }
public ActionResult Edit(ReservationViewModel model) { if (ModelState.IsValid) { if(ValidateReservation(model)) { Reservation reservation = _dataService.GetReservation(model.Id); reservation.AircraftId = model.AircraftId; reservation.Destination = model.Destination; reservation.EndDate = model.EndDate.Add(TimeSpan.Parse(model.EndTime)); reservation.InstructorId = model.InstructorId != 0 ? model.InstructorId : null; reservation.MemberId = model.MemberId; reservation.Notes = model.Notes; reservation.StartDate = model.StartDate.Add(TimeSpan.Parse(model.StartTime)); _dataService.SaveReservation(reservation); return RedirectToAction("Details", new { id = model.Id }); } } model.AircraftList = _dataService.GetAllAirplanes(); model.InstructorList = _dataService.GetAllMembersByRole("Instructor"); model.TimeList = new List<DateTime>().GetListFromRange(DateTime.MinValue.AddHours(6), DateTime.MinValue.AddHours(22), new TimeSpan(0, 30, 0)).ConvertAll(x => new SelectListItem() { Value = x.ToString("HH:mm"), Text = x.ToString("HH:mm") }).ToList(); model.AircraftList.Insert(0, new Aircraft()); model.InstructorList.Insert(0, new Member()); return View(model); }
private bool ValidateReservation(ReservationViewModel model) { if (!_dataService.IsValidReservationDateRange(model.Id, model.AircraftId, model.StartDate.Date.Add(TimeSpan.Parse(model.StartTime)), model.EndDate.Date.Add(TimeSpan.Parse(model.EndTime)))) { ModelState.AddModelError(string.Empty, "A reservation already exists for this time period."); } // require provide instructor for non-checked out aircraft if ((model.InstructorId == null || model.InstructorId == 0)) { // exclude instructors and this aircraft owners if (!(User.IsInRole(UserRoles.Instructor.ToString()) | _dataService.IsAircraftOwner(model.MemberId, model.AircraftId))) { Member member = _dataService.GetMemberWithPilotData(model.MemberId); if (member.Checkouts.FirstOrDefault(c => c.AircraftId == model.AircraftId) == null) { ModelState.AddModelError(String.Empty, "Records indicate you are not checked out in this airplane.\nPlease add club instructor to your reservation or use different airplane."); } } } List<Reservation> existingReservations = _dataService.GetReservationListByMember(model.MemberId); DateTime today = DateTime.Now; // do not allow more than one reservation more than 10 days ahead if (model.StartDate >= today.AddDays(10)) { // find all other with start date more than 10 days Reservation advanceReservation = existingReservations.FirstOrDefault(r => (r.StartDate >= today.AddDays(10)) && r.Id != model.Id); if (advanceReservation != null) { ModelState.AddModelError(string.Empty, String.Format("One reservation already exists for time period 10 or more days ahead (start date {0}).\nYou are only allowed to have one reservation more than 10 days in advance", advanceReservation.StartDate.ToString("yyyy-MM-dd hh:mm"))); } } // check if there are any other aircraft reservations for the same period (excluding current one if updating) DateTime newReservationStart = model.StartDate.Add(TimeSpan.Parse(model.StartTime)); DateTime newReservationEnd = model.EndDate.Add(TimeSpan.Parse(model.EndTime)); Reservation overlapReservation = existingReservations.FirstOrDefault(r => r.Id != model.Id && ( (r.StartDate <= newReservationStart && r.EndDate > newReservationStart) || (r.StartDate < newReservationEnd && r.EndDate >= newReservationEnd) || (r.StartDate >= newReservationStart && r.EndDate <= newReservationEnd) )); if (overlapReservation != null) { Aircraft ac = _dataService.GetAircraftById(overlapReservation.AircraftId); ModelState.AddModelError(String.Empty, String.Format("Reservation conflicts with another reservation for {0} which starts at {1} and ends at {2}.\nPlease adjust your reservation times so there's no overlap.", ac.RegistrationNumber, overlapReservation.StartDate.ToString("yyyy-MM-dd hh:mm"), overlapReservation.EndDate.ToString("yyyy-MM-dd hh:mm"))); } return ModelState.IsValid; }