예제 #1
0
        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));
        }
예제 #3
0
        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));
        }