Exemplo n.º 1
0
        private void AddPilotsFixture()
        {
            Frode = _context.Users.Add(new ApplicationUser
            {
                Name               = "Frode Fester",
                Email              = "*****@*****.**",
                PhoneNumber        = "4794279974",
                IsAdmin            = false,
                IsPilot            = true,
                Availabilities     = new List <PilotAvailability>(),
                MaxPassengerWeight = 100,
            }).Entity;
            _context.SaveChanges();

            Erik = _context.Users.Add(new ApplicationUser
            {
                Name               = "Erik Røthe Klette",
                Email              = "*****@*****.**",
                PhoneNumber        = "47999694616",
                IsAdmin            = false,
                IsPilot            = true,
                Availabilities     = new List <PilotAvailability>(),
                MinPassengerWeight = 60,
                MaxPassengerWeight = 120,
            }).Entity;
            _context.SaveChanges();

            Aasmund = _context.Users.Add(new ApplicationUser
            {
                Name               = "Åsmund Birkeland",
                Email              = "*****@*****.**",
                PhoneNumber        = "4792819387",
                IsAdmin            = false,
                IsPilot            = true,
                Availabilities     = new List <PilotAvailability>(),
                MinPassengerWeight = 40,
            }).Entity;

            Tore = _context.Users.Add(new ApplicationUser
            {
                Name           = "Tore Birkeland",
                Email          = "*****@*****.**",
                PhoneNumber    = "4798463072",
                IsAdmin        = true,
                IsPilot        = false,
                Availabilities = new List <PilotAvailability>()
            }).Entity;

            _context.SaveChanges();
        }
Exemplo n.º 2
0
        public ActionResult SetAvailability(DateTime date, bool available, string userId = null)
        {
            if (userId == null || !User.IsAdmin())
            {
                userId = _userManager.GetUserId(User);
            }

            if (available)
            {
                var pilotAvailability = new PilotAvailability()
                {
                    Date  = date.Date,
                    Pilot = _context.Users.Single(u => u.Id == userId)
                };
                _context.PilotAvailabilities.Add(pilotAvailability);
            }
            else
            {
                var availabilities = _context.PilotAvailabilities
                                     .Where(a => a.Pilot.Id == userId)
                                     .Where(a => a.Date >= date && a.Date < date.AddDays(1))
                                     .ToList();

                foreach (var pilotAvailability in availabilities)
                {
                    _context.PilotAvailabilities.Remove(pilotAvailability);
                }
            }
            _context.SaveChanges();

            return(Json(new { result = "ok" }));
        }
Exemplo n.º 3
0
 public static void AddAvailabilityFixture(this TandemBookingContext context, DateTime date,
     params ApplicationUser[] pilots)
 {
     foreach (var pilot in pilots)
         pilot.Availabilities.Add(new PilotAvailability
         {
             Date = date
         });
     context.SaveChanges();
 }
Exemplo n.º 4
0
        public async Task <ActionResult> EditUser(string id, ApplicationUser input)
        {
            if (ModelState.IsValid)
            {
                var user = _context.Users.First(u => u.Id == id);
                user.Name         = input.Name;
                user.Email        = input.Email;
                input.PhoneNumber = await _nexmo.FormatPhoneNumber(input.PhoneNumber);

                user.PhoneNumber = input.PhoneNumber;
                user.IsPilot     = input.IsPilot;
                user.IsAdmin     = input.IsAdmin;
                _context.SaveChanges();
            }

            return(View(input));
        }
Exemplo n.º 5
0
        public static Booking AddBookingFixture(this TandemBookingContext context, DateTime date, ApplicationUser pilot, int passengerFee=1700)
        {
            var booking = context.Bookings.Add(new Booking
            {
                AssignedPilot = pilot,
                DateRegistered = new DateTime(2016, 1, 1),
                BookingDate = date,
                Canceled = false,
                PassengerFee = passengerFee,
                BookedPilots = pilot != null 
                    ? new List<BookedPilot> {new BookedPilot {Pilot = pilot}} 
                    : new List<BookedPilot>()
            }).Entity;

            context.SaveChanges();

            return booking;
        }
        public async Task <ActionResult> EditUser(string id, ApplicationUser user)
        {
            if (ModelState.IsValid)
            {
                var updateUser = _context.Users.First(u => u.Id == id);
                updateUser.Name  = user.Name;
                updateUser.Email = user.Email;
                user.PhoneNumber = await _nexmo.FormatPhoneNumber(user.PhoneNumber);

                updateUser.PhoneNumber             = user.PhoneNumber;
                updateUser.IsPilot                 = user.IsPilot;
                updateUser.IsAdmin                 = user.IsAdmin;
                updateUser.IZettlePaymentAccountId = user.IZettlePaymentAccountId;
                updateUser.VippsPaymentAccountId   = user.VippsPaymentAccountId;
                _context.SaveChanges();
            }

            return(EditUser(id));
        }
Exemplo n.º 7
0
        public async Task SendNewBookingMessage(Booking primaryBooking, Booking[] additionalBookings, bool notifyPassenger, bool notifyPilot)
        {
            var allBookings = new[] { primaryBooking }.Union(additionalBookings).ToArray();
            var bookingDateString = primaryBooking.BookingDate.ToString("dd.MM.yyyy");

            //send message to pilot or booking coordinator
            foreach (var booking in allBookings)
            {
                var assignedPilot = booking.AssignedPilot;

                if (assignedPilot != null)
                {
                    _bookingService.AddEvent(booking, null,
                                             $"Tildelt pilot {assignedPilot.Name} ({assignedPilot.PhoneNumber.AsPhoneNumber()})");

                    //send message to pilot
                    if (notifyPilot)
                    {
                        //sms to pilot
                        if (assignedPilot.SmsNotification)
                        {
                            var message =
                                $"Du har en ny tandemtur {bookingDateString}: {booking.PassengerName}, {booking.PassengerEmail}, {booking.PassengerPhone.AsPhoneNumber()}, {booking.Comment}.";
                            await SendPilotMessage(assignedPilot, message, booking);
                        }
                        //mail to pilot
                        if (assignedPilot.EmailNotification)
                        {
                            var subject = $"Ny tandemtur  {bookingDateString}";
                            var message = $@"Hei {assignedPilot.Name},

Du har blitt tildelt en ny tandemtur:
Dato:                 {bookingDateString}. 
Passasjerens navn:    {booking.PassengerName},
Passasjerens telefon: {booking.PassengerPhone.AsPhoneNumber()},
Passasjerens epost:   {booking.PassengerEmail ?? "ikke oppgitt"}
Kommentar:
{booking.Comment}

Booking-lenke: http://tandembooking.bhpgk.club/BookingAdmin/Details/{booking.Id}

fly pent!
Bookingkoordinator
";
                            await _mailService.Send(assignedPilot.Email, subject, message);
                        }
                    }

                    //send booking assigned message to booking coordinator
                    var bookingCoordinatorMessage =
                        $"Ny tandemtur {bookingDateString} tildelt {assignedPilot.Name}, {booking.Comment}";
                    await _smsService.Send(_bookingCoordinatorSettings.PhoneNumber, bookingCoordinatorMessage, booking);
                }
                else
                {
                    _bookingService.AddEvent(booking, null,
                                             $"Ingen tilgjengelige piloter, melding er sendt til tandemkoordinator {_bookingCoordinatorSettings.Name} ({_bookingCoordinatorSettings.PhoneNumber.AsPhoneNumber()})");

                    //send no pilots available to booking coordinator
                    var message =
                        $"Vennligst finn en tandempilot til {bookingDateString}: {booking.PassengerName}, {booking.PassengerEmail}, {booking.PassengerPhone.AsPhoneNumber()}, {booking.Comment}";
                    await _smsService.Send(_bookingCoordinatorSettings.PhoneNumber, message, booking);
                }
            }

            //send message to passenger
            if (notifyPassenger)
            {
                string passengerMessage;
                if (allBookings.All(b => b.AssignedPilot != null))
                {
                    var assignedPilot = primaryBooking.AssignedPilot;
                    passengerMessage = additionalBookings.Any()
                        ? $"Fantastisk! Dine {allBookings.Length} tandemturer {bookingDateString} er bekreftet. Du vil bli kontaktet av {assignedPilot.Name} ({assignedPilot.PhoneNumber.AsPhoneNumber()}) for å avtale detaljene rundt flyturene."
                        : $"Fantastisk! Din tandemtur {bookingDateString} er bekreftet. Du vil bli kontaktet av {assignedPilot.Name} ({assignedPilot.PhoneNumber.AsPhoneNumber()}) for å avtale detaljene rundt flyturen.";
                }
                else
                {
                    passengerMessage = additionalBookings.Any()
                        ? $"Fantastisk! Vi prøver å finne {allBookings.Length} piloter som kan ta dere med i lufta {bookingDateString}. Dere vil snart bli kontaktet."
                        : $"Fantastisk Vi prøver å finne en pilot som kan ta deg med i lufta {bookingDateString}. Du vil snart bli kontaktet.";
                }

                if (!string.IsNullOrEmpty(primaryBooking.PassengerPhone))
                {
                    await _smsService.Send(primaryBooking.PassengerPhone, passengerMessage, primaryBooking);

                    _bookingService.AddEvent(primaryBooking, null,
                                             $"Bekreftelse er sendt pr. sms til {primaryBooking.PassengerName} ({primaryBooking.PassengerPhone.AsPhoneNumber()})");
                }

                if (!string.IsNullOrEmpty(primaryBooking.PassengerEmail))
                {
                    var assignedPilotMessage = "";
                    if (primaryBooking.AssignedPilot != null)
                    {
                        var pilotName  = primaryBooking.AssignedPilot.Name;
                        var pilotPhone = primaryBooking.AssignedPilot.PhoneNumber.AsPhoneNumber();
                        var pilotEmail = primaryBooking.AssignedPilot.Email;
                        assignedPilotMessage =
                            $@"
Din tildelte instruktør er {pilotName} ({pilotPhone}, {pilotEmail}), føl deg fri 
til å kontakte ham angående spørsmål du har angående flyturen.
";
                    }

                    var message = $@"Hei {primaryBooking.PassengerName},

Takk for at du booket en tandemtur med Bodø Hang & Paragliderklubb {bookingDateString}. Din booking
er bekreftet. En av våre instruktører vil kontakte deg for å organisere detaljene rundt 
når og hvor dere møtes, et par dager før flyturen.
{assignedPilotMessage}

Med vennlig hilsen,
{_bookingCoordinatorSettings.Name}
Bookingkoordinator
Bodø Hang & Paragliderklubb";
                    await _mailService.Send(primaryBooking.PassengerEmail, $"Tandemtur {bookingDateString}", message);

                    _bookingService.AddEvent(primaryBooking, null,
                                             $"Bekreftelse er sendt på epost til {primaryBooking.PassengerName} ({primaryBooking.PassengerEmail})");
                }
            }

            _context.SaveChanges();
        }
        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));
        }
Exemplo n.º 9
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));
        }
Exemplo n.º 10
0
        public async Task SendNewBookingMessage(Booking primaryBooking, Booking[] additionalBookings, bool notifyPassenger, bool notifyPilot, bool notifyBookingCoordinator)
        {
            var allBookings = new[] { primaryBooking }.Union(additionalBookings).ToArray();
            var bookingDateString = primaryBooking.BookingDate.ToString("dd.MM.yyyy");

            //send message to pilot or booking coordinator
            foreach (var booking in allBookings)
            {
                var assignedPilot = booking.AssignedPilot;

                if (assignedPilot != null)
                {
                    _bookingService.AddEvent(booking, null,
                                             $"Assigned to {assignedPilot.Name} ({assignedPilot.PhoneNumber.AsPhoneNumber()})");

                    //send message to pilot
                    if (notifyPilot)
                    {
                        //sms to pilot
                        if (assignedPilot.SmsNotification)
                        {
                            var message =
                                $"You have a new flight on {bookingDateString}: {booking.PassengerName}, {booking.PassengerEmail}, {booking.PassengerPhone.AsPhoneNumber()}, {booking.Comment}.";
                            await SendPilotMessage(assignedPilot, message, booking);
                        }
                        //mail to pilot
                        if (assignedPilot.EmailNotification)
                        {
                            var subject = $"New flight on {bookingDateString}";
                            var message = $@"Hi {assignedPilot.Name},

You have been assigned a new flight:
Date:            {bookingDateString}. 
Passenger Name:  {booking.PassengerName},
Passenger Phone: {booking.PassengerPhone.AsPhoneNumber()},
Passenger Email: {booking.PassengerEmail ?? "not specified"}
Comments:
{booking.Comment}

Booking Url: http://vossatandem.no/BookingAdmin/Details/{booking.Id}

fly safe!
Booking Coordinator
";
                            await _mailService.Send(assignedPilot.Email, subject, message);
                        }
                    }

                    //send booking assigned message to booking coordinator
                    if (booking.PassengerFee > 0)
                    {
                        var bookingCoordinatorMessage =
                            $"New flight on {bookingDateString} assigned to {assignedPilot.Name}, {booking.Comment}";
                        await _mailService.Send(_bookingCoordinatorSettings.Email, bookingCoordinatorMessage, bookingCoordinatorMessage);
                    }
                }
                else if (notifyBookingCoordinator || booking.PassengerFee > 0)
                {
                    _bookingService.AddEvent(booking, null,
                                             $"No pilots available, sent message to tandem coordinator {_bookingCoordinatorSettings.Name} ({_bookingCoordinatorSettings.PhoneNumber.AsPhoneNumber()})");

                    //send no pilots available to booking coordinator
                    var message =
                        $"Please find a pilot on {bookingDateString}: {booking.PassengerName}, {booking.PassengerEmail}, {booking.PassengerPhone.AsPhoneNumber()}, {booking.Comment}";
                    await _smsService.Send(_bookingCoordinatorSettings.PhoneNumber, message, booking);
                }
            }

            //send message to passenger
            if (notifyPassenger)
            {
                string passengerMessage;
                if (allBookings.All(b => b.AssignedPilot != null))
                {
                    var assignedPilot = primaryBooking.AssignedPilot;
                    passengerMessage = additionalBookings.Any()
                        ? $"Awesome! Your {allBookings.Length} tandem flights on {bookingDateString} are confirmed. You will be contacted by {assignedPilot.Name} ({assignedPilot.PhoneNumber.AsPhoneNumber()}) to coordinate your flights"
                        : $"Awesome! Your tandem flight on {bookingDateString} is confirmed. You will be contacted by {assignedPilot.Name} ({assignedPilot.PhoneNumber.AsPhoneNumber()}) to coordinate the details.";
                }
                else
                {
                    passengerMessage = additionalBookings.Any()
                        ? $"Awesome! We will try to find {allBookings.Length} pilots who can take you flying on {bookingDateString}. You will be contacted shortly."
                        : $"Awesome! We will try to find a pilot who can take you flying on {bookingDateString}. You will be contacted shortly.";
                }

                if (!string.IsNullOrEmpty(primaryBooking.PassengerPhone))
                {
                    await _smsService.Send(primaryBooking.PassengerPhone, passengerMessage, primaryBooking);

                    _bookingService.AddEvent(primaryBooking, null,
                                             $"Sent confirmation sms message to {primaryBooking.PassengerName} ({primaryBooking.PassengerPhone.AsPhoneNumber()})");
                }

                if (!string.IsNullOrEmpty(primaryBooking.PassengerEmail))
                {
                    var assignedPilotMessage = "";
                    if (primaryBooking.AssignedPilot != null)
                    {
                        var pilotName  = primaryBooking.AssignedPilot.Name;
                        var pilotPhone = primaryBooking.AssignedPilot.PhoneNumber.AsPhoneNumber();
                        var pilotEmail = primaryBooking.AssignedPilot.Email;
                        assignedPilotMessage =
                            $@"
Your assigned instructor is {pilotName} ({pilotPhone}, {pilotEmail}), feel free to 
contact him about any question you have regarding your flight.
";
                    }

                    var message = $@"Hi {primaryBooking.PassengerName},

Thank you for booking a tandem flight with Voss HPK on {bookingDateString}. Your booking 
has been confirmed. One of our instructors will contact you to organize the details 
of when and where you will meet a few days in advance of your flight. 

Unless you have agreed otherwise with your instructor, you meet your instructor near
the Minigolf Cafe at Holbergsplassen 2, 5700 Voss. 

It's reccomended to wear a long sleeve, trousers and sensible shoes for hiking / running. 
We might have to do a short hike to get from the road to the take off, and in order to 
take off we have to do a short sprint to get in the air. Choose footwear accordingly - 
high heels is not an option!

{assignedPilotMessage}

Kind regards,
{_bookingCoordinatorSettings.Name}
Booking Coordinator
Voss HPK";
                    await _mailService.Send(primaryBooking.PassengerEmail, $"Tandem flight on {bookingDateString}", message);

                    _bookingService.AddEvent(primaryBooking, null,
                                             $"Sent confirmation mail to {primaryBooking.PassengerName} ({primaryBooking.PassengerEmail})");
                }
            }

            _context.SaveChanges();
        }