Esempio n. 1
0
        private async Task AddReservationDetails(AddBookingVM vm)
        {
            var reservationDetails = new ReservationDetail
            {
                RoomReservationId = vm.RoomReservationId,
                RoomId            = vm.RoomId,
                CheckInDate       = vm.CheckInDate,
                CheckOutDate      = vm.CheckOutDate,
                Rate = _db.Rooms.Single(r => r.Id == vm.RoomId).Rate
            };

            _db.ReservationDetails.Add(reservationDetails);
            await _db.SaveChangesAsync();
        }
Esempio n. 2
0
        private async Task <Guest> RegisterGuest(AddBookingVM vm)
        {
            var guest = new Guest
            {
                TitleId       = vm.TitleId,
                FirstName     = vm.FirstName,
                LastName      = vm.LastName,
                Address       = vm.Address,
                ContactNumber = vm.ContactNumber
            };

            _db.Guests.Add(guest);
            await _db.SaveChangesAsync();

            return(guest);
        }
Esempio n. 3
0
        public async Task <ActionResult> AddBooking(AddBookingVM vm)
        {
            if (vm == null)
            {
                return(RedirectToAction("Index"));
            }

            if (vm.NumOfDays == 0)
            {
                ModelState.AddModelError("", "Failed to add booking. CheckOut Date should be greater than CheckIn Date.");
                TempData["Message"] = "Failed to add booking. CheckOut Date should be greater than CheckIn Date.";

                if (vm.RoomReservationId == 0)
                {
                    return(RedirectToAction("Index"));
                }

                return(RedirectToAction("RetrieveBooking", new { reservationId = vm.RoomReservationId, lastName = vm.LastName }));
            }

            var roomsAlreadyBooked = _db.ReservationDetails.Where(r => r.RoomId == vm.RoomId).ToList();

            if (roomsAlreadyBooked != null && roomsAlreadyBooked.Count() > 0)
            {
                var validRooms = roomsAlreadyBooked.Where(r => (vm.CheckInDate < r.CheckInDate && vm.CheckOutDate <= r.CheckInDate) ||
                                                          (vm.CheckInDate > r.CheckOutDate)).ToList();

                if (validRooms != null && validRooms.Count != roomsAlreadyBooked.Count())
                {
                    string msg = string.Format(@"Sorry, selected room already booked or there is an overlap with other bookings 
                                for the period {0: dd-MMM-yyyy} - {1: dd-MMM-yyyy}. Please revice your booking dates and try again.",
                                               vm.CheckInDate, vm.CheckOutDate);
                    TempData["Message"] = msg;
                    ModelState.AddModelError("", msg);

                    if (vm.RoomReservationId == 0)
                    {
                        return(RedirectToAction("Index"));
                    }

                    return(RedirectToAction("RetrieveBooking", new
                    {
                        reservationId = vm.RoomReservationId,
                        lastName = vm.LastName
                    }));
                }
            }

            if (ModelState.IsValid)
            {
                if (vm.RoomReservationId == 0)              // First time registration. No reservation yet.
                {
                    var newGuest = await RegisterGuest(vm); // Register Guest.

                    vm.GuestId = newGuest.Id;

                    var reservation = await CreateReservationForTheRegisteredGuest(newGuest.Id); // Create Reservation.

                    vm.RoomReservationId = reservation.Id;
                }

                await AddReservationDetails(vm);      // Add room reservation details.
                await UpdateGuestDetails(vm.GuestId); // Update guest details if changed.

                PopulateTitlesDropDownList(vm.TitleId);

                int guestId           = vm.GuestId;
                int roomReservationId = vm.RoomReservationId;

                var reservationsVM = await PopulateReservationsVM(guestId, roomReservationId);

                await UpdateReservationTotalAmount(roomReservationId, reservationsVM.TotalAmount);

                ViewBag.TotalAmount = reservationsVM.TotalAmount;

                TempData["Message"] = "Booking details saved successfully.";
                return(View("Index", reservationsVM));
            }

            TempData["Message"] = string.Format("Failed to save the booking. Check booking details validity. Try again.");
            return(RedirectToAction("Index"));
        }