/// <summary>
        /// Logouts this instance.
        /// </summary>
        /// <param name="bookingId">The Booking ID.</param>
        /// <returns>Logout User Async</returns>
        public async Task <IActionResult> MyBookings(int?bookingId)
        {
            if (bookingId.HasValue)
            {
                MyBookingDescriptionViewModel model = await this.userDetailService.GetMyBookingDescriptionByBookingId(bookingId.Value);

                if (model.bookingFlightViewModel != null && model.bookingFlightViewModel.Count > 0)
                {
                    model.ticketsViewModel = new List <TicketLCCResponse>();
                    foreach (var item in model.bookingFlightViewModel)
                    {
                        Ticket ticketRequest = new Ticket
                        {
                            EndUserIp = this.configuration.GetValue <string>("TBOCredentials:EndUserIp"),
                            BookingId = Convert.ToInt64(item.TBOBookingId),
                            PNR       = item.PNR,
                            TraceId   = item.TraceId,
                            TokenId   = await this.tboController.GetTBOLoginToken()
                        };
                        ApiResponse response = this.tboController.PostCustom(
                            this.tboController.GetTboUrl(TboMethods.BookingDetails),
                            JsonConvert.SerializeObject(ticketRequest, this.tboController.JsonIgnoreNullable),
                            TboMethods.BookingDetails);
                        if (response.IsSuccess)
                        {
                            TicketLCCResponse ticketLCCResponse = JsonConvert.DeserializeObject <TicketLCCResponse>(response.Response);
                            model.ticketsViewModel.Add(ticketLCCResponse);
                        }
                    }

                    model.ticketsViewModel = model.ticketsViewModel.OrderBy(x => DateTime.ParseExact(x.Response.FlightItinerary.Segments.FirstOrDefault().Origin.DepTime, "yyyy-MM-ddTHH:mm:ss", null)).ToList();
                }

                return(this.View("MyBookingDetail", model));
            }
            else
            {
                var claimInformation = this.HttpContext.User.Claims.FirstOrDefault();
                if (claimInformation != null)
                {
                    var userId = Convert.ToInt32(claimInformation.Value);
                    List <MyBookingsListViewModel> myBookings = await this.userDetailService.GetDealBookingsByUserId(userId);

                    return(this.View(myBookings));
                }

                return(this.View(new List <MyBookingsListViewModel>()));
            }
        }
        /// <summary>
        /// Gets the password.
        /// </summary>
        /// <param name="bookingId">The Booking identifier.</param>
        /// <returns>Password</returns>
        public async Task <MyBookingDescriptionViewModel> GetMyBookingDescriptionByBookingId(int bookingId)
        {
            MyBookingDescriptionViewModel model = new MyBookingDescriptionViewModel();

            model.bookingInformationViewModel = await this.bookingInfomationRepository.Table.Where(x => x.Id == bookingId).Select(x => new BookingInformationViewModel
            {
                Id = x.Id,
                ReferenceNumber       = x.ReferenceNumber,
                BookedDate            = x.BookedDate,
                Checkin               = x.Checkin,
                Checkout              = x.Checkout,
                Currency              = x.Currency,
                DealId                = x.DealId,
                CustomerId            = x.CustomerId,
                Discount              = x.Discount,
                DiscountAmount        = x.DiscountAmount,
                DiscountApplied       = x.DiscountAmount > 0 && string.IsNullOrEmpty(x.DiscountCoupon) && x.Discount > 0 ? true : false,
                DiscountType          = x.DiscountType,
                DiscountCoupon        = x.DiscountCoupon,
                Email                 = x.Email,
                FlightOptionAvailable = x.FlightOptionAvailable,
                FlightRequired        = x.FlightRequired,
                FlightSuccessful      = x.FlightSuccessful,
                FlightTraceId         = x.FlightTraceId,
                GST                      = x.GST,
                HoldFromDate             = x.HoldFromDate,
                HoldToDate               = x.HoldToDate,
                IsCompleted              = x.IsCompleted,
                IsConfirmed              = x.IsConfirmed,
                IsHold                   = x.IsHold,
                LeadFullName             = x.LeadFullName,
                MobileNumber             = x.PhoneNumber,
                NightId                  = x.NightId,
                PackagePrice             = x.PackagePrice,
                TaxAmount                = x.TaxAmount,
                TotalAmount              = x.TotalAmount,
                VisaOptionAvailable      = x.VisaOptionAvailable,
                BookingSummarySerialized = x.BookingSummarySerialized
            }).FirstOrDefaultAsync();

            model.dealPackageViewModel = this.dealPackageRepository.Table.Where(x => x.Id == model.bookingInformationViewModel.DealId).Select(x => new DealsPackageViewModel
            {
                Code = x.Code,
                Name = x.Name,
                Id   = x.Id,
                Type = x.Type,
                DealsHighlightViewModels = x.DealsHighlightModels.OrderBy(y => y.SortOrder).Select(y => new DealsHighlightViewModel {
                    Title = y.Title, Description = y.Description, SortOrder = y.SortOrder, StarRating = y.StarRating
                }).ToList()
            }).FirstOrDefault();
            model.LocationNames = new List <string>();
            if (model.dealPackageViewModel.Type == 1)
            {
                int hotelId = this.dealPackageRepository.Table.Where(x => x.Id == model.dealPackageViewModel.Id).Select(x => x.DealsNightModels.Select(y => y.DealsItineraryModels.Select(z => z.DealsInclusionModels.Select(a => a.VendorInfoId.Value).FirstOrDefault()).FirstOrDefault()).FirstOrDefault()).FirstOrDefault();
                model.LocationNames.Add(this.hotelierRepository.Table.Where(x => x.Id == hotelId).Select(x => x.Name).FirstOrDefault());
                model.LocationNames.Add(this.dealPackageRepository.Table.Where(x => x.Id == model.dealPackageViewModel.Id).SelectMany(x => x.DealsDestinationModels.Join(this.packageCityRepository.Table, y => y.City, ci => ci.Id, (y, ci) => new { y, ci }).Select(k => k.ci.Name)).FirstOrDefault());
                model.LocationNames.Add(this.dealPackageRepository.Table.Where(x => x.Id == model.dealPackageViewModel.Id).SelectMany(x => x.DealsDestinationModels.Join(this.packageCountryRepository.Table, y => y.Country, co => co.Id, (y, co) => new { y, co }).Select(k => k.co.Name)).FirstOrDefault());
            }
            else
            {
                model.LocationNames.AddRange(this.dealPackageRepository.Table.Where(x => x.Id == model.dealPackageViewModel.Id).SelectMany(x => x.DealsDestinationModels.Join(this.packageCountryRepository.Table, y => y.Country, co => co.Id, (y, co) => new { y, co }).Select(k => k.co.Name)).ToList());
            }

            model.dealContentViewModel = this.dealContentRepository.Table.Where(x => x.PackageId == model.dealPackageViewModel.Id).Select(x => new DealsContentViewModel
            {
                LogoImg        = x.LogoImg,
                BannerImg2x2_1 = x.BannerImg2x2_1,
                BannerImg2x2_2 = x.BannerImg2x2_2,
                BannerImg2x2_3 = x.BannerImg2x2_3,
                BannerImg2x2_4 = x.BannerImg2x2_4,
                BannerImg2x4   = x.BannerImg2x4,
                BannerImg4x4   = x.BannerImg4x4,
                CardImg        = x.CardImg
            }).FirstOrDefault();
            model.dealsImageViewModels = this.dealImageRepository.Table.Where(x => x.PackageId == model.dealPackageViewModel.Id).OrderBy(x => x.SortOrder).Select(x => new DealsImageViewModel
            {
                Id        = x.Id,
                Image     = x.Image,
                SortOrder = x.SortOrder,
                Caption   = x.Caption
            }).ToList();
            model.flightAvailable      = model.bookingInformationViewModel.FlightOptionAvailable;
            model.flightRequired       = model.bookingInformationViewModel.FlightRequired;
            model.bookingVisaViewModel = await this.bookingVisaRepository.Table.Where(x => x.BookingId == bookingId).Select(x => new BookingVisaViewModel
            {
                Id          = x.Id,
                CountryName = this.dealVisaRepository.Table.Where(y => y.Id == x.VisaId).Join(this.packageCountryRepository.Table, v => v.CountryId, c => c.Id, (v, c) => new { v, c }).Select(y => y.c.Name).FirstOrDefault(),
                Count       = x.Count,
                BookingId   = x.BookingId,
                Markup      = x.MarkUp,
                Price       = x.Price,
                TotalAmount = x.TotalAmount,
                VisaId      = x.VisaId
            }).ToListAsync();

            List <BookingHotelRoomModel> roomModels = this.bookingHotelRoomRepository.Table.Where(x => x.BookingId == bookingId).ToList();

            model.bookingHotelViewModel = new List <BookingHotelRoomViewModel>();
            if (model.dealPackageViewModel.Type == 1)
            {
                foreach (var item in roomModels)
                {
                    BookingHotelRoomViewModel hotelSubModel = new BookingHotelRoomViewModel
                    {
                        Id                       = item.Id,
                        RatePlanId               = item.RatePlanId,
                        Adult                    = item.Adult,
                        BookingId                = item.BookingId,
                        CheckinDate              = item.CheckinDate,
                        CheckoutDate             = item.CheckoutDate,
                        Child                    = item.Child,
                        hotelRoomConfigViewModel = JsonConvert.DeserializeObject <DealRoomConfigViewModel>(item.RoomConfigSerialized)
                    };
                    model.bookingHotelViewModel.Add(hotelSubModel);
                }
            }
            else
            {
                foreach (var item in roomModels)
                {
                    BookingHotelRoomViewModel hotelSubModel = new BookingHotelRoomViewModel
                    {
                        Id                      = item.Id,
                        RatePlanId              = item.RatePlanId,
                        Adult                   = item.Adult,
                        BookingId               = item.BookingId,
                        CheckinDate             = item.CheckinDate,
                        CheckoutDate            = item.CheckoutDate,
                        Child                   = item.Child,
                        tourRoomConfigViewModel = JsonConvert.DeserializeObject <DealTourHotelInfoViewModel>(item.RoomConfigSerialized)
                    };
                    model.bookingHotelViewModel.Add(hotelSubModel);
                }
            }

            if (model.bookingInformationViewModel.FlightOptionAvailable && model.bookingInformationViewModel.FlightRequired && model.bookingInformationViewModel.FlightSuccessful)
            {
                model.bookingFlightViewModel = this.bookingFlightRepository.Table.Where(x => x.BookingId == model.bookingInformationViewModel.Id).Select(x => new BookingFlightViewModel
                {
                    Id               = x.Id,
                    BookingId        = x.BookingId,
                    BookingDate      = x.BookingDate,
                    DayOfItinerary   = x.DayOfItinerary,
                    Destination      = x.Destination,
                    ItineraryId      = x.ItineraryId,
                    PNR              = x.PNR,
                    FlightCabinClass = x.FlightCabinClass,
                    TBOBookingId     = x.TBOBookingId,
                    TokenId          = x.TokenId,
                    TraceId          = x.TraceId
                }).ToList();
            }

            return(model);
        }