public async Task AssignAvailablePilot() { Context.AddAvailabilityFixture(new DateTime(2016, 11, 1), _pilots.Frode, _pilots.Erik); var booking = Context.AddBookingFixture(new DateTime(2016, 11, 1), null); var pilot = await _bookingService.AssignNewPilotAsync(booking); Context.SaveChanges(); //assigned pilot is one of available pilots Assert.True(pilot == _pilots.Frode || pilot == _pilots.Erik); //assigned pilot is both on AssignedPilot and in BookedPilots Assert.Equal(pilot, booking.AssignedPilot); Assert.Equal(1, booking.BookedPilots.Count); Assert.All(booking.BookedPilots, bookedPilot => { Assert.Equal(pilot, bookedPilot.Pilot); Assert.False(bookedPilot.Canceled); }); }
public async Task <ActionResult> Create(CreateBookingViewModel input) { try { if (ModelState.IsValid) { if (input.Date == null) { ModelState.AddModelError("Date", "Please select a date"); return(View(input)); } //if phone number is provided, make sure it is valid. //if no phone number is provided, that's ok as well string phoneNumber = null; if (!string.IsNullOrEmpty(input.PhoneNumber)) { phoneNumber = await _nexmo.FormatPhoneNumber(input.PhoneNumber); if (phoneNumber == null) { ModelState.AddModelError("PhoneNumber", "Please enter a valid phone number"); return(View(input)); } } //Fetch primary booking if this is a clone Booking primaryBooking = null; if (input.PrimaryBookingId != null) { primaryBooking = _context.Bookings .FirstOrDefault(b => b.Id == input.PrimaryBookingId); } //create booking var booking = new Booking() { BookingDate = input.Date.Value.Date, DateRegistered = DateTime.UtcNow, PassengerEmail = input.Email, PassengerName = input.Name, PassengerWeight = input.Weight, PassengerPhone = phoneNumber, Comment = input.Comment, BookingEvents = new List <BookingEvent>(), PrimaryBooking = primaryBooking, PassengerFee = input.PassengerFee, }; _context.Add(booking); //assign pilot if (string.IsNullOrEmpty(input.PilotId)) { //if no pilot is selected, find a new one await _bookingService.AssignNewPilotAsync(booking); } else { //or use pilot as provided var pilot = await _userManager.FindByIdAsync(input.PilotId); _bookingService.AssignNewPilot(booking, pilot); } _context.SaveChanges(); await _messageService.SendNewBookingMessage(booking, new Booking[] {}, input.NotifyPassenger, input.NotifyPilot); //redirect to edit action return(RedirectToAction("Details", new { id = booking.Id })); } } catch (Exception ex) { _logger.LogError(0, $"Error creating booking, {ex.Message}, {ex}"); ModelState.AddModelError("", $"An unexpected error occured during booking, please contact the booking coordinator, {_bookingCoordinatorSettings.Name}, on {_bookingCoordinatorSettings.PhoneNumber}"); } return(View(input)); }
public async Task <ActionResult> Index(BookingViewModel input) { try { if (ModelState.IsValid) { //validate phone number var phoneNumber = await _nexmo.FormatPhoneNumber(input.IntlPhoneNumber); if (phoneNumber == null) { ModelState.AddModelError("PhoneNumber", "Please enter a valid phone number"); return(View(input)); } if (input.Date == null) { ModelState.AddModelError("Date", "Please select a date"); return(View(input)); } if (string.IsNullOrWhiteSpace(input.Name)) { ModelState.AddModelError("Name", "Please enter your name"); return(View(input)); } if (input.AdditionalPassengers?.Any(a => string.IsNullOrWhiteSpace(a.Name)) ?? false) { ModelState.AddModelError("AdditionalPassengers", "Please enter the name of the additional passengers"); return(View(input)); } var booking = new Booking() { BookingDate = input.Date.Value.Date, DateRegistered = DateTime.UtcNow, PassengerEmail = input.Email, PassengerName = input.Name, PassengerPhone = phoneNumber, PassengerWeight = input.Weight, PassengerFee = _bookingCoordinatorSettings.DefaultPassengerFee, Comment = input.Comment, BookingEvents = new List <BookingEvent>(), }; _context.Add(booking); var additionalPassengers = input.AdditionalPassengers ?.Select((a, i) => new { Name = a.Name, Weight = a.Weight, Index = i + 1, }) .ToList(); if (additionalPassengers?.Any() ?? false) { booking.Comment += $", booking 1/{additionalPassengers.Count() + 1}"; } //Create separate bookings for the additional passengers var additionalBookings = additionalPassengers?.Select(additionalPassenger => { var commentExtra = $"booking {additionalPassenger.Index + 1}/{additionalPassengers.Count() + 1}"; var additionalBooking = new Booking() { BookingDate = input.Date.Value.Date, PrimaryBooking = booking, DateRegistered = DateTime.UtcNow, PassengerEmail = input.Email, PassengerName = additionalPassenger.Name, PassengerWeight = additionalPassenger.Weight, PassengerPhone = phoneNumber, PassengerFee = booking.PassengerFee, Comment = $"{input.Comment}, {commentExtra}", BookingEvents = new List <BookingEvent>(), }; _context.Add(additionalBooking); return(additionalBooking); }).ToArray() ?? new Booking[] { }; //Assign pilots var bookings = new [] { booking }.Union(additionalBookings).ToList(); await _bookingService.AssignNewPilotAsync(bookings); _context.SaveChanges(); await _messageService.SendNewBookingMessage(booking, additionalBookings, true, true, true); return(RedirectToAction("Confirm", new { bookingId = booking.Id })); } } catch (Exception ex) { _logger.LogError(0, $"Error creating booking, {ex.Message}, {ex}"); ModelState.AddModelError("", $"An unexpected error occured during booking, please contact the booking coordinator, {_bookingCoordinatorSettings.Name}, on {_bookingCoordinatorSettings.PhoneNumber.AsPhoneNumber()}"); } return(View(input)); }