Esempio n. 1
0
        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());
        }
Esempio n. 4
0
        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();
        }
Esempio n. 6
0
        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();
        }
Esempio n. 7
0
 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;
 }
Esempio n. 8
0
        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);
            }
        }
Esempio n. 9
0
        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");
        }