Esempio n. 1
0
        private async Task <List <string> > ValidateReservation(HotelReservationRequest reservation)
        {
            var errors      = new List <string>();
            var currentDate = DateTime.Now.Date;

            if (reservation.StartDate.Date < currentDate || reservation.EndDate.Date < currentDate || reservation.EndDate.Date < reservation.StartDate.Date)
            {
                errors.Add("Дати резервації вибрано не коректно!");
            }

            if (!errors.Any())
            {
                var room = await _roomRepository.FindById(reservation.RoomId);

                if (reservation.Adults > room.Adults || reservation.Children > room.Children)
                {
                    errors.Add("Кількість людей перевищує вмістимість номеру!");
                }
            }

            if (!errors.Any())
            {
                var isAvailable = await _bookingRepository.IsAvailableHotelRoomAsync(reservation.HotelId, reservation.StartDate.Date, reservation.EndDate.Date);

                if (!isAvailable)
                {
                    errors.Add("Нажаль, не має вільного номеру за вказаними датами");
                }
            }

            return(errors);
        }
Esempio n. 2
0
        public async Task <HotelReservationResponse> CreateReservationAsync(HotelReservationRequest reservation)
        {
            var validationMsgs = await ValidateReservation(reservation);

            var response = new HotelReservationResponse()
            {
                IsSuccessful = !validationMsgs.Any(),
                Messages     = validationMsgs
            };

            if (!validationMsgs.Any())
            {
                var booking = await _bookingRepository.CreateBookingAsync(reservation);

                await _bookingRepository.SaveChanges();

                var prices = await _seasonRoomPricingRepository.GetRoomPricesAsync(reservation.RoomId, reservation.StartDate.Date, reservation.EndDate.Date);

                await _hotelBookingPaymentRepository.AddBookingPaymentInfoAsync(booking.Id, prices);

                await _hotelBookingPaymentRepository.SaveChanges();

                reservation.Id          = booking.Id;
                reservation.BookingDate = booking.BookDate;
                reservation.Price       = prices.Sum(x => x.Value);
            }

            return(response);
        }
Esempio n. 3
0
        // GET: Hotel
        public async Task <ActionResult> Index(HotelReservationRequest request)
        {
            var hotels = await _repository.GetListAsync(request);

            ViewBag.Request = request;

            return(View(hotels));
        }
 public async Task <HotelBooking> CreateBookingAsync(HotelReservationRequest reservation)
 {
     return(await base.CreateAsync(new HotelBooking()
     {
         HotelRoom = new HotelRoom()
         {
             Id = reservation.RoomId
         },
         Adults = reservation.Adults,
         Children = reservation.Children,
         EndDate = reservation.EndDate.Date,
         StartDate = reservation.StartDate.Date,
         UserId = reservation.UserId,
         BookDate = reservation.BookingDate,
         IsConfirmed = true
     }));
 }
Esempio n. 5
0
        public async Task <ActionResult> Details(HotelReservationRequest request)
        {
            var resJson = TempData["ReservationRequest"] as string;

            if (!string.IsNullOrEmpty(resJson))
            {
                ViewBag.Request = JsonConvert.DeserializeObject <HotelReservationRequest>(resJson);
            }

            if (_signInManager.IsSignedIn(User))
            {
                request.UserId = Guid.Parse((await _userManager.GetUserAsync(User)).Id);
            }

            var hotelInfo = await _repository.GetDetails(request);

            return(View(hotelInfo));
        }
Esempio n. 6
0
        public async Task <List <HotelListItem> > GetListAsync(HotelReservationRequest request)
        {
            if (!request.IsValid)
            {
                return(new List <HotelListItem>());
            }

            var availableRooms = (
                from rooms in dbContext.Set <HotelRoom>()
                from hotelBookins in dbContext.Set <HotelBooking>()
                .Where(b => b.HotelRoom.Id == rooms.Id &&
                       ((b.StartDate < request.EndDate && request.EndDate <= b.EndDate) ||
                        (request.StartDate < b.EndDate && request.StartDate >= b.StartDate) ||
                        (request.StartDate <= b.StartDate && b.EndDate <= request.EndDate)))
                .DefaultIfEmpty()
                where
                rooms.Adults >= request.Adults && rooms.Children >= request.Children
                group hotelBookins.Id by new { rooms.Id, rooms.RoomsCount } into grouped
                where grouped.Count() < grouped.Key.RoomsCount
                select grouped.Key.Id)
                                 .ToList();

            var roomPrices = dbContext.Set <SeasonRoomPricing>()
                             .Where(p => availableRooms.Contains(p.HotelRoom.Id) &&
                                    ((p.StartDate < request.EndDate && request.EndDate <= p.EndDate) ||
                                     (request.StartDate < p.EndDate && request.StartDate >= p.StartDate) ||
                                     (request.StartDate <= p.StartDate && p.EndDate <= request.EndDate)))
                             .Select(p => new { p.Id, HotelId = p.HotelRoom.Hotel.Id, RoomId = p.HotelRoom.Id, p.Price })
                             .GroupBy(p => p.HotelId)
                             .Select(p => p.First(x => x.Price == p.Min(m => m.Price)))
                             .ToList();

            var priceIds = roomPrices.Select(x => x.Id);
            var roomIds  = roomPrices.Select(x => x.RoomId);

            var query =
                from hotels in dbContext.Set <Hotel>()
                from rooms in dbContext.Set <HotelRoom>()
                .Where(r => r.Hotel.Id == hotels.Id && roomIds.Contains(r.Id))
                .DefaultIfEmpty()
                from prices in dbContext.Set <SeasonRoomPricing>()
                .Where(p => priceIds.Contains(p.Id) && p.HotelRoom.Id == rooms.Id)
                .DefaultIfEmpty()
                select new HotelListItem()
            {
                Id          = hotels.Id,
                Name        = hotels.Name,
                Description = hotels.Description,
                PhotoPath   = hotels.Photo.Path,
                Stars       = hotels.Stars,
                Raiting     = hotels.Raiting,
                PriceFrom   = prices == null ? 0 : prices.Price
            };

            if (request.SortOrder == SortOrderEnum.Asc)
            {
                switch (request.Sort)
                {
                case HotelSortEnum.Price:
                    query = query.OrderBy(x => x.PriceFrom);
                    query = query.OrderBy(x => x.PriceFrom == 0 ? 1 : 0);
                    break;

                case HotelSortEnum.Raiting:
                    query = query.OrderBy(x => x.Raiting);
                    break;

                case HotelSortEnum.Stars:
                    query = query.OrderBy(x => x.Stars);
                    break;

                case HotelSortEnum.Name:
                    query = query.OrderBy(x => x.Name);
                    break;
                }
            }
            else
            {
                switch (request.Sort)
                {
                case HotelSortEnum.Price:
                    query = query.OrderByDescending(x => x.PriceFrom);
                    query = query.OrderByDescending(x => x.PriceFrom == 0 ? 1 : 0);
                    break;

                case HotelSortEnum.Raiting:
                    query = query.OrderByDescending(x => x.Raiting);
                    break;

                case HotelSortEnum.Stars:
                    query = query.OrderByDescending(x => x.Stars);
                    break;

                case HotelSortEnum.Name:
                    query = query.OrderByDescending(x => x.Name);
                    break;
                }
            }

            request.PageCount = (int)Math.Ceiling((double)dbContext.Set <Hotel>().Count() / PAGE_ITEMS);

            return(await query
                   .Skip((request.Page - 1) *PAGE_ITEMS)
                   .Take(PAGE_ITEMS)
                   .ToListAsync());
        }
Esempio n. 7
0
        public async Task <HotelDetailItem> GetDetails(HotelReservationRequest request)
        {
            var roomId = (
                from rooms in dbContext.Set <HotelRoom>()
                from hotelBookins in dbContext.Set <HotelBooking>()
                .Where(b => b.HotelRoom.Id == rooms.Id &&
                       ((b.StartDate < request.EndDate && request.EndDate <= b.EndDate) ||
                        (request.StartDate < b.EndDate && request.StartDate >= b.StartDate) ||
                        (request.StartDate <= b.StartDate && b.EndDate <= request.EndDate)))
                .DefaultIfEmpty()
                from pricing in dbContext.Set <SeasonRoomPricing>()
                .Where(b => b.HotelRoom.Id == rooms.Id &&
                       ((b.StartDate < request.EndDate && request.EndDate <= b.EndDate) ||
                        (request.StartDate < b.EndDate && request.StartDate >= b.StartDate) ||
                        (request.StartDate <= b.StartDate && b.EndDate <= request.EndDate)))
                .DefaultIfEmpty()
                where
                rooms.Hotel.Id == request.HotelId &&
                rooms.Adults >= request.Adults &&
                rooms.Children >= request.Children &&
                (request.RoomTypeId == 0 || rooms.RoomType.Id == request.RoomTypeId)
                group hotelBookins.Id by new { rooms.Id, rooms.RoomsCount } into grouped
                where grouped.Count() < grouped.Key.RoomsCount
                select grouped.Key.Id)
                         .FirstOrDefault();

            decimal price = 0;

            if (roomId != 0)
            {
                price = dbContext.Set <SeasonRoomPricing>()
                        .Where(p => p.HotelRoom.Id == roomId &&
                               ((p.StartDate < request.EndDate && request.EndDate <= p.EndDate) ||
                                (request.StartDate < p.EndDate && request.StartDate >= p.StartDate) ||
                                (request.StartDate <= p.StartDate && p.EndDate <= request.EndDate))
                               ).Min(x => x.Price);
            }


            return(await dbContext.Set <HotelRoom>()
                   .Where(x =>
                          x.Hotel.Id == request.HotelId &&
                          (roomId == 0 || x.Id == roomId) &&
                          (request.RoomTypeId == 0 || x.RoomType.Id == request.RoomTypeId))
                   .OrderBy(x => x.RoomType.Id)
                   .Select(x => new HotelDetailItem()
            {
                Id = x.Hotel.Id,
                Name = x.Hotel.Name,
                PhotoPath = x.Hotel.Photo.Path,
                Stars = x.Hotel.Stars,
                Raiting = x.Hotel.Raiting,
                Description = x.Hotel.Description,
                Location = x.Hotel.Location,
                RoomTypes = x.Hotel.Rooms
                            .Select(r => r.RoomType)
                            .ToList(),
                Room = new RoomDetailItem()
                {
                    Id = x.Id,
                    Adults = x.Adults,
                    Children = x.Children,
                    Description = x.Description,
                    RoomType = x.RoomType,
                    IsAvailable = roomId != 0,
                    Price = price,
                    Amenities = x.Amenities
                                .Select(a => a.RoomAmenity)
                                .Select(am => am.Title)
                                .ToList(),
                    Photos = x.Photos
                             .Select(p => p.Photo)
                             .Select(ph => ph.Path)
                             .ToList(),
                    Reservations = x.Bookings
                                   .Where(b => b.UserId == request.UserId && b.EndDate > request.StartDate)
                                   .OrderBy(b => b.BookDate)
                                   .Select(b => new HotelReservationRequest()
                    {
                        Id = b.Id,
                        BookingDate = b.BookDate,
                        StartDate = b.StartDate,
                        EndDate = b.EndDate,
                        Adults = b.Adults,
                        Children = b.Children,
                        Price = b.Payments.Sum(p => p.Price)
                    })
                                   .ToList()
                },
                ReservationRequest = request
            })
                   .FirstAsync());
        }
Esempio n. 8
0
 public void CreateBooking(HotelReservationRequest reservation)
 {
     throw new NotImplementedException();
 }