public async Task <ReservationServiceModel> MakeReservation(CreateReservationBindingModel viewModel, ReserveTableUserServiceModel user, RestaurantServiceModel restaurant) { var dateTime = DateTime.Parse(viewModel.Date + " " + viewModel.Time); var tablesWithExactCountSeats = restaurant.Tables .Where(t => t.SeatsCount == viewModel.SeatsCount) .ToList(); var tablesWithSeatsCountPlusOne = restaurant.Tables .Where(t => t.SeatsCount == viewModel.SeatsCount + 1) .ToList(); ReservationServiceModel reservationServiceModel = new ReservationServiceModel(); if (tablesWithExactCountSeats.Any()) { foreach (var table in tablesWithExactCountSeats) { return(await FindTable(viewModel, user, restaurant, dateTime, reservationServiceModel, table)); } } else if (tablesWithSeatsCountPlusOne.Any()) { foreach (var biggerTable in tablesWithSeatsCountPlusOne) { return(await FindTable(viewModel, user, restaurant, dateTime, reservationServiceModel, biggerTable)); } } return(null); }
public IActionResult Make(CreateBindingModel input) { if (!ModelState.IsValid) { return(Redirect("/Flight/Create")); } var flightId = input.FlightId; var reservation = new ReservationServiceModel { FirstName = input.FirstName, SecondName = input.SecondName, LastName = input.LastName, EGN = input.EGN, PhoneNumber = input.PhoneNumber, Nationality = input.Nationality, TicketType = input.TicketType, TicketsCount = input.TicketsCount, IsConfirmed = false, FlightId = input.FlightId, Email = input.Email }; reservationService.Make(reservation); return(Redirect("/Home/Index")); }
public async Task <IActionResult> Create(string city, string restaurant, CreateReservationBindingModel viewModel) { var dateTime = DateTime.Parse(viewModel.Date + " " + viewModel.Time); var isDateValid = await reservationsService.IsDateValid(dateTime); if (isDateValid) { RestaurantServiceModel restaurantFromDb = await restaurantService.GetRestaurantByNameAndCity(city, restaurant); ReserveTableUserServiceModel user = await usersService.GetUserByUsername(this.User.Identity.Name); ReservationServiceModel reservation = await reservationsService.MakeReservation(viewModel, user, restaurantFromDb); if (reservation == null) { ModelState.AddModelError("NoAvailableTables", "There are no available tables."); return(this.View()); } return(this.Redirect("/Reservations/My")); } else { ModelState.AddModelError("InvalidData", "Your date is not valid."); } return(this.View()); }
public async Task GetReservationById_WithData_ShouldReturnCorrectResults() { string errorMessage = "ReservationService GetReservationById() method does not work properly."; var context = ReserveTableDbContextInMemoryFactory.InitializeContext(); this.reservationService = new ReservationService(context); await SeedData(context); string reservationId = "1"; var actualResult = await reservationService.GetReservationById(reservationId); ReservationServiceModel expectedResult = new ReservationServiceModel { Id = "1", ForDate = new DateTime(2019, 9, 5, 20, 0, 0), RestaurantId = "1", IsCancelled = false, SeatsCount = 2, TableId = "1", UserId = "1", Restaurant = new RestaurantServiceModel { Id = "1", Address = "New Street", AverageRating = 10, CityId = "1", Name = "Happy", PhoneNumber = "0888888888", Photo = "/src/happy.jpg", Tables = new List <TableServiceModel>() { new TableServiceModel { Id = "1", SeatsCount = 2, RestaurantId = "1" } } } }; Assert.True(actualResult.RestaurantId == expectedResult.RestaurantId, errorMessage + " " + "Restaurant Id is not returned properly."); Assert.True(actualResult.SeatsCount == expectedResult.SeatsCount, errorMessage + " " + "Seats Count is not returned properly."); Assert.True(actualResult.IsCancelled == expectedResult.IsCancelled, errorMessage + " " + "Is Cancelled is not returned properly."); Assert.True(actualResult.TableId == expectedResult.TableId, errorMessage + " " + "Table Id is not returned properly."); Assert.True(actualResult.ForDate == expectedResult.ForDate, errorMessage + " " + "For Date is not returned properly."); }
public void Make(ReservationServiceModel input) { if (input.TicketsCount <= 0) { return; } var flight = context.Flights.SingleOrDefault(f => f.Id == input.FlightId); if (input.TicketType == TicketType.Business && input.TicketsCount > flight.FreeBusinessSeats) { return; } if (input.TicketType == TicketType.Normal && input.TicketsCount > flight.FreePassengersSeats) { return; } var reservation = new Reservation() { FirstName = input.FirstName, SecondName = input.SecondName, LastName = input.LastName, EGN = input.EGN, Email = input.Email, FlightId = input.FlightId, IsConfirmed = false, Nationality = input.Nationality, TicketsCount = input.TicketsCount, TicketType = input.TicketType, PhoneNumber = input.PhoneNumber }; context.Reservations.Add(reservation); context.SaveChanges(); var message = $@"Dear {reservation.FirstName} {reservation.LastName}, do you wish to confirm your reservation for {reservation.TicketsCount} {reservation.TicketType} Tickets from {flight.From} to {flight.To}? <br/> <a href='{GlobalConstants.AppAddress}Reservation/Confirm?id={reservation.Id}'>Click here</a> to confirm it. <br/> <a href='{GlobalConstants.AppAddress}Reservation/Delete?id={reservation.Id}'>Click here</a> to delete it. "; emailSender.SendEmailAsync(reservation.Email, "Confirm Your Reservation", message).GetAwaiter().GetResult(); }
public void MakeReservation(ReservationServiceModel input) { if (input.TicketsCount <= 0) { return; } var flight = context.Flights.SingleOrDefault(f => f.FlightId == input.FlightId); if (input.TicketType == TicketType.BUSSINESS_CLASS && input.TicketsCount > flight.FreeSeatsBussiness) { return; } if (input.TicketType == TicketType.NORMAL && input.TicketsCount > flight.FreeSeatsPassanger) { return; } var reservation = new Reservation() { FirstName = input.FirstName, SecondName = input.SecondName, LastName = input.LastName, SSN = input.SSN, Email = input.Email, FlightId = input.FlightId, Confirmed = false, Nationality = input.Nationality, TicketsCount = input.TicketsCount, TicketType = input.TicketType, PhoneNumber = input.PhoneNumber }; context.Reservations.Add(reservation); context.SaveChanges(); var message = $@"Confirm {reservation.TicketsCount} tickets for flight from {flight.StartDestination} to {flight.EndDestination} on {flight.TakeOffTime}. <br/> <a href='https://localhost:44322/Reservation/Confirm?id={reservation.Id}'>Confirm Reservation</a> <br/> <a href='https://localhost:44322/Reservation/Delete?id={reservation.Id}'>Abort Reservation</a> "; emailSender.SendEmailAsync(reservation.Email, "Confirm Reservation", message).GetAwaiter().GetResult(); }
private static void InitializeReservation(CreateReservationBindingModel viewModel, ReserveTableUserServiceModel user, RestaurantServiceModel restaurant, DateTime dateTime, ReservationServiceModel reservationServiceModel, TableServiceModel table) { reservationServiceModel.ForDate = dateTime; reservationServiceModel.SeatsCount = viewModel.SeatsCount; reservationServiceModel.UserId = user.Id; reservationServiceModel.TableId = table.Id; reservationServiceModel.RestaurantId = restaurant.Id; }
private async Task <ReservationServiceModel> FindTable(CreateReservationBindingModel viewModel, ReserveTableUserServiceModel user, RestaurantServiceModel restaurant, DateTime dateTime, ReservationServiceModel reservationServiceModel, TableServiceModel table) { if (table.Reservations.Any(t => (dateTime > t.ForDate && dateTime < t.EndOfReservation) && t.IsCancelled == false)) { return(null); } else { InitializeReservation(viewModel, user, restaurant, dateTime, reservationServiceModel, table); var reservation = AutoMapper.Mapper.Map <Reservation>(reservationServiceModel); await dbContext.Reservations.AddAsync(reservation); await dbContext.SaveChangesAsync(); return(reservationServiceModel); } }
public async Task MakeReservation_WithCorrectData_ShouldCreateSucessfully(int seats) { string errorMessage = "ReservationService MakeReservation() method does not work properly."; var context = ReserveTableDbContextInMemoryFactory.InitializeContext(); this.reservationService = new ReservationService(context); await SeedData(context); CreateReservationBindingModel reservationBindingModel = new CreateReservationBindingModel { Date = "09/08/2019 20:00:00", SeatsCount = seats, Restaurant = "Happy" }; ReserveTableUserServiceModel user = new ReserveTableUserServiceModel { Id = "1", Email = "*****@*****.**", UserName = "******" }; RestaurantServiceModel restaurant = new RestaurantServiceModel { Id = "1", Address = "New Street", AverageRating = 10, CityId = "1", Name = "Happy", PhoneNumber = "0888888888", Photo = "/src/happy.jpg", Tables = new List <TableServiceModel>() { new TableServiceModel { Id = "1", SeatsCount = 2, RestaurantId = "1", Reservations = new List <ReservationServiceModel>() } } }; var expectedResult = new ReservationServiceModel { ForDate = new DateTime(2019, 08, 09, 20, 0, 0), Restaurant = new RestaurantServiceModel { Id = "1", Address = "New Street", AverageRating = 10, CityId = "1", Name = "Happy", PhoneNumber = "0888888888", Photo = "/src/happy.jpg", Tables = new List <TableServiceModel>() { new TableServiceModel { Id = "1", SeatsCount = 2, RestaurantId = "1", Reservations = new List <ReservationServiceModel>() } } }, SeatsCount = seats, UserId = "1" }; var actualResult = await reservationService.MakeReservation(reservationBindingModel, user, restaurant); Assert.True(expectedResult.SeatsCount == actualResult.SeatsCount, errorMessage + " " + "Seats Count is not returned properly"); Assert.True(expectedResult.ForDate == actualResult.ForDate, errorMessage + " " + "For Date is not returned properly"); Assert.True(expectedResult.UserId == actualResult.UserId, errorMessage + " " + "User Id is not returned properly"); }