public async Task <IActionResult> Update(string reservationId)
        {
            if (!await this.IsValidReservation(reservationId))
            {
                return(this.NotFound());
            }

            var reservation = await this.reservationsService.GetByIdAsync <ReservationUpdateViewModel>(reservationId);

            var viewModel = new ReservationUpdateInputModel()
            {
                Id              = reservation.Id,
                Room            = reservation.Room,
                ReservedByGuest = new ReservedByGuestInputModel()
                {
                    FirstName   = reservation.ReservedByGuest.FirstName,
                    LastName    = reservation.ReservedByGuest.LastName,
                    PhoneNumber = reservation.ReservedByGuest.PhoneNumber,
                },
                ArrivalDate  = reservation.ArrivalDate,
                ReturnDate   = reservation.ReturnDate,
                AdultCount   = reservation.AdultCount,
                ChildCount   = reservation.ChildCount,
                HasBreakfast = reservation.HasBreakfast,
                HasLunch     = reservation.HasLunch,
                HasDinner    = reservation.HasDinner,
                AllPrice     = reservation.Price,
                CustomPrice  = this.CalculateCustomPrice(reservation.Room.Price, reservation.Nights, reservation.Price),
            };

            return(this.View(viewModel));
        }
        public async Task <IActionResult> Update(ReservationUpdateInputModel input)
        {
            if (!await this.IsValidReservation(input.Id))
            {
                return(this.NotFound());
            }

            if (!this.ModelState.IsValid)
            {
                return(this.View(input));
            }

            var userId = this.userManager.GetUserId(this.User);
            var user   = await this.userManager
                         .Users
                         .Include(u => u.Hotel)
                         .ThenInclude(h => h.Rooms)
                         .FirstOrDefaultAsync(x => x.Id == userId);

            if (!user.Hotel.Rooms.Any(x => x.Id == input.Room.Id))
            {
                return(this.RedirectToAction("Manager"));
            }

            if (input.Room.MaxAdultCount < input.AdultCount || input.AdultCount < 1)
            {
                input.AdultCount = null;
                return(this.View(input));
            }

            if (input.Room.MaxChildCount < input.ChildCount || input.ChildCount < 0)
            {
                input.ChildCount = null;
                return(this.View(input));
            }

            await this.reservationsService.UpdateAsync(
                user.Id,
                input.Id,
                input.Room.Id,
                input.ArrivalDate,
                input.ReturnDate,
                (int)input.AdultCount,
                (int)input.ChildCount,
                input.ReservedByGuest.FirstName,
                input.ReservedByGuest.LastName,
                input.ReservedByGuest.PhoneNumber,
                input.Description,
                input.AllPrice,
                input.HasBreakfast,
                input.HasLunch,
                input.HasDinner);

            return(this.RedirectToAction("Manager"));
        }