public async Task <BookingResponseModel> ConfirmBookingAsync(BookingModel bookingModel) { var response = new BookingResponseModel { IsSuccess = true, BookingReference = bookingModel.BookingReference }; var booking = await _context.Set <Booking>().Include(b => b.Seat).FirstOrDefaultAsync(b => b.BookingReference == bookingModel.BookingReference); if (booking == null) { response.IsSuccess = false; response.ErrorMessage = $"There is no booking found for the booking reference {bookingModel.BookingReference}"; return(response); } response.CompleteByDate = await _workingDayService.GetCompleteByDateAsync(booking.VisitStartDate); response.SeatNumber = booking.Seat.Number; _context.Attach(booking); booking.CompleteByDate = response.CompleteByDate; booking.ReaderTicket = bookingModel.ReaderTicket; booking.FirstName = bookingModel.FirstName; booking.LastName = bookingModel.LastName; booking.Email = bookingModel.Email; booking.Phone = bookingModel.Phone; booking.IsAcceptTsAndCs = bookingModel.IsAcceptTsAndCs; booking.IsAcceptCovidCharter = bookingModel.IsAcceptCovidCharter; booking.IsNoFaceCovering = bookingModel.IsNoFaceCovering; await _context.SaveChangesAsync(); if (!string.IsNullOrWhiteSpace(bookingModel.Email)) { bookingModel.SeatType = (SeatTypes)booking.Seat.SeatTypeId; bookingModel.BookingType = (BookingTypes)booking.BookingTypeId; bookingModel.CompleteByDate = response.CompleteByDate; bookingModel.SeatNumber = response.SeatNumber; bookingModel.VisitStartDate = booking.VisitStartDate; bookingModel.OrderDocuments = new List <OrderDocumentModel>(); await _emailService.SendEmailAsync(EmailType.ReservationConfirmation, bookingModel.Email, bookingModel); } return(response); }
public async Task <BookingResponseModel> CreateMultiDayBookingAsync(BookingModelMultiDay multiDayBooking) { var response = new BookingResponseModel { IsSuccess = true }; using var transaction = await _context.Database.BeginTransactionAsync(System.Data.IsolationLevel.RepeatableRead); try { var completeByDate = await _workingDayService.GetCompleteByDateAsync(multiDayBooking.VisitStartDate); var bookingId = (await _context.Set <Booking>().OrderByDescending(b => b.Id).FirstOrDefaultAsync())?.Id ?? 0 + 1; response.BookingReference = IdGenerator.GenerateBookingReference(bookingId); response.CreatedDate = DateTime.UtcNow; var booking = new Booking() { CreatedDate = response.CreatedDate, CompleteByDate = completeByDate, BookingReference = response.BookingReference, BookingTypeId = (int)BookingTypes.StandardOrderVisit, ReaderTicket = multiDayBooking.ReaderTicket, FirstName = multiDayBooking.FirstName, LastName = multiDayBooking.LastName, Email = multiDayBooking.Email, IsAcceptTsAndCs = true, IsAcceptCovidCharter = true, IsNoFaceCovering = false, IsNoShow = false, SeatId = multiDayBooking.SeatId, BookingStatusId = (int)BookingStatuses.Submitted, VisitStartDate = multiDayBooking.VisitStartDate, VisitEndDate = multiDayBooking.VisitEndDate, LastModifiedBy = Modified_By }; var bookingModel = new BookingModel() { BookingReference = booking.BookingReference, BookingType = BookingTypes.StandardOrderVisit, ReaderTicket = booking.ReaderTicket, VisitStartDate = booking.VisitStartDate, VisitEndDate = booking.VisitEndDate, CreatedDate = booking.CreatedDate, CompleteByDate = booking.CompleteByDate, FirstName = booking.FirstName, LastName = booking.LastName, Email = booking.Email, IsAcceptTsAndCs = true, IsAcceptCovidCharter = true, IsNoFaceCovering = false, IsNoShow = false, SeatId = booking.SeatId, BookingStatus = BookingStatuses.Submitted, OrderDocuments = new List <OrderDocumentModel>(), LastModifiedBy = Modified_By }; await _context.Set <Booking>().AddAsync(booking); // Check that the seat booked in the back office application is still available. List <SeatModel> availableSeats = await _availabilityService.GetAvailabileSeatsForMultiDayVisitAsync(booking.VisitStartDate, booking.VisitEndDate, true); SeatModel selectedSeat = availableSeats.SingleOrDefault(s => s.Id == booking.SeatId); if (selectedSeat == null) { throw new Exception($"Error creating booking for user {booking.FirstName} {booking.LastName}, email {booking.Email} fromm the Back Office. The requested seat id {booking.SeatId} is no longer available for the date range {booking.VisitStartDate} to {booking.VisitEndDate}."); } await _context.SaveChangesAsync(); await transaction.CommitAsync(); await _emailService.SendEmailAsync(EmailType.BookingConfirmation, multiDayBooking.Email, bookingModel); } catch (Exception) { await transaction?.RollbackAsync(); response.IsSuccess = false; response.ErrorMessage = "Error creating multi day booking"; } return(response); }