示例#1
0
        public async Task Send(string recipient, string messageText, Booking booking)
        {
            var message = new SentSmsMessage()
            {
                Booking         = booking,
                RecipientNumber = recipient,
                MessageText     = messageText,
                SentDate        = DateTime.UtcNow,
                SmsMessageParts = new List <SentSmsMessagePart>(),
            };

            _context.Add(message);
            await _context.SaveChangesAsync();

            //send message
            var result = await _nexmoService.SendSms("BHPGK", message.RecipientNumber, message.MessageText);

            //save status
            foreach (var nexmoPart in result.Messages)
            {
                message.SmsMessageParts.Add(new SentSmsMessagePart()
                {
                    GatewayMessageId = nexmoPart.MessageId,
                    StatusCode       = nexmoPart.Status,
                    StatusText       = nexmoPart.ErrorText,
                });
            }

            await _context.SaveChangesAsync();
        }
        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));
        }