Beispiel #1
0
        public IHttpActionResult Get(string sid, string hotel, string Pid, string rooms)
        {
            // call bll
            try
            {
                LoggingHelper.WriteToFile("HotelRoomsController/GetRoomsNumber/", "SearchController" + "INController" + sid, "Rooms", "Sid" + sid);


                var Rooms = GetRoom.GetRoomsData(sid, hotel, Pid, rooms);
                if (Rooms != null && Rooms.rooms.Count > 0)
                {
                    #region tbo  disable to not calling pricing api
                    if (Pid == "5")
                    {
                        // var ActionUrlData = ConfigurationSettings.AppSettings["ActionUrl"];
                        // var BaseCur = ConfigurationSettings.AppSettings["BaseCur"];
                        //payLinkData.ActionsUrl.ValidationUrl = ActionUrlData + "/api/HotelCheckAvailability?sid=" + Sid + "&bookingnum=" + BN;

                        SearchDBEntities searchDB = new SearchDBEntities();

                        RequiredBookingData requiredBooking = new RequiredBookingData();
                        //var data = searchDB.SearchCriterias.FirstOrDefault(a => a.sID == sid);
                        var HRooms = searchDB.SearchRoomResults.Where(a => a.sID == sid && a.HotelCode == hotel && a.ProviderId.ToString() == Pid).ToList();
                        //requiredBooking.Currency = data?.currency;
                        //requiredBooking.City = data?.cityName;
                        var RoomsCode = rooms.Split('-');
                        foreach (var item in RoomsCode)
                        {
                            var roomdata = HRooms.FirstOrDefault(a => a.RoomCode == item);

                            requiredBooking.rooms.Add(roomdata);
                        }
                        //TBO
                        //call check availability tbo to get hotel norms and cancel policy
                        //get room indexes to send in pricing req
                        List <int> indexs = new List <int>();

                        foreach (var indx in requiredBooking.rooms)
                        {
                            indexs.Add(int.Parse(indx.RoomCode));
                        }
                        string TBOSession = searchDB.ProviderSessions.FirstOrDefault(ps => ps.SearchId == sid).PSession;                                                   //Select(s => s.PSession).ToString();
                        int    ResIndex   = int.Parse(searchDB.SearchHotelResults.FirstOrDefault(hotl => hotl.sID == sid && hotl.HotelCode == hotel).ResIndex.ToString()); //Select(indx => indx.ResIndex).ToString();
                        AvailabilityAndPricingRequest req = new AvailabilityAndPricingRequest
                        {
                            SessionId         = TBOSession,
                            ResultIndex       = ResIndex,
                            OptionsForBooking = new TBO.WSDL.hotelServiceRef.BookingOptions
                            {
                                RoomCombination = new TBO.WSDL.hotelServiceRef.RoomCombination[]
                                {
                                    new TBO.WSDL.hotelServiceRef.RoomCombination {
                                        RoomIndex = indexs.ToArray()
                                    }
                                }
                            }
                        };
                        var        availRes   = AvailablityPricingService.PricingService(req, sid);
                        RoomResult roomResult = new RoomResult();
                        if (availRes != null)
                        {
                            if (availRes?.PriceVerification?.Status == PriceVerificationStatus.Failed ||
                                availRes?.PriceVerification?.Status == PriceVerificationStatus.NotAvailable)
                            {
                                return(Ok("No Result Found"));
                            }
                            if (availRes.HotelCancellationPolicies != null)
                            {
                                roomResult.HotelNorms = availRes.HotelCancellationPolicies?.HotelNorms;
                                //handel cancel policy
                                var             BaseCur              = ConfigurationSettings.AppSettings["BaseCur"];
                                CurrencyManager currencyManager      = new CurrencyManager();
                                double          ProviderExcahngeRate = currencyManager.GetCurrencyConversion("USD", BaseCur, sid);

                                foreach (var cancel in availRes.HotelCancellationPolicies?.CancelPolicies?.CancelPolicy)
                                {
                                    double costToSave = 0;
                                    string Cur        = "";
                                    //Enum.TryParse(cancel.ChargeType.ToString(), out CancellationChargeTypeForHotel Type);
                                    if (cancel.ChargeType == CancellationChargeTypeForHotel.Percentage)
                                    {
                                        costToSave = (double)cancel.CancellationCharge;
                                        Cur        = "%";
                                    }
                                    else
                                    {
                                        Cur        = "KWD";
                                        costToSave = (double)cancel.CancellationCharge * ProviderExcahngeRate; //Math.Round((double)cancel.CancellationCharge * ProviderExcahngeRate, 3);
                                    }
                                    CancellationRule cancellation = new CancellationRule();
                                    cancellation.FromDate   = cancel.FromDate;
                                    cancellation.ToDate     = cancel.ToDate;
                                    cancellation.Cost       = (double)cancel.CancellationCharge;
                                    cancellation.ChargeType = cancel.ChargeType.ToString();
                                    cancellation.Curency    = Cur;
                                    cancellation.Price      = costToSave; //
                                    roomResult.cancellationRules.Add(cancellation);
                                }


                                if (availRes?.PriceVerification?.PriceChanged == true)
                                {
                                    //var roomsTbo = searchDB.SearchRoomResults.Where(a => a.sID == sid && a.HotelCode == hotel && a.ProviderId.ToString() == Pid).ToList();
                                    Rooms.Status  = 1;
                                    Rooms.Message = "Price Change";
                                    //results.Status = 1;
                                    foreach (var item in availRes?.PriceVerification.HotelRooms)
                                    {
                                        roomResult.TotalSellPrice = Math.Round((double)item.RoomRate.TotalFare * ProviderExcahngeRate, 3);
                                        roomResult.CostPrice      = (double)item.RoomRate.TotalFare;
                                        //results.TotalCost += roomResult.TotalSellPrice; //Math.Round((double)item.RoomRate.TotalFare * ProviderExcahngeRate, 3);
                                        roomResult.RoomIndex = item.RoomIndex;
                                        //results.Result.Add(roomResult);

                                        //update Rooms obj with new price
                                        Rooms.rooms.FirstOrDefault(r => r.RoomCode == item.RoomIndex.ToString()).costPrice = (double)item.RoomRate.TotalFare;
                                        Rooms.rooms.FirstOrDefault(r => r.RoomCode == item.RoomIndex.ToString()).SellPrice = Math.Round((double)item.RoomRate.TotalFare * ProviderExcahngeRate, 3);

                                        // update price in search db
                                        // update tbo new rooms prices
                                        SearchRoomResult Newroom = new SearchRoomResult();
                                        Newroom           = searchDB.SearchRoomResults.FirstOrDefault(room => room.sID == sid && room.RoomCode == item.RoomIndex.ToString());
                                        Newroom.costPrice = (double)item.RoomRate.TotalFare;
                                        Newroom.rateClass = item.RoomRate.RoomFare.ToString();
                                        Newroom.rateType  = item.RoomRate.RoomTax.ToString();
                                        Newroom.SellPrice = roomResult.TotalSellPrice;

                                        searchDB.SaveChanges();
                                    }
                                }
                                else
                                {
                                    Rooms.Status  = 0;
                                    Rooms.Message = "No Price Change";
                                }

                                Rooms.TBoRooms.Add(roomResult);
                            }
                        }
                        #endregion
                        LoggingHelper.WriteToFile("HotelRoomsController/GetRoomsOFHotel/", "SearchController" + "OutController" + sid, "RoomsResult", JsonConvert.SerializeObject(Rooms));

                        return(Ok(Rooms));
                    }
                }
                return(Ok("No Result Found"));
            }
            catch (Exception ex)
            {
                LoggingHelper.WriteToFile("HotelRoomsController/Errors/", "SearchController" + "INController" + sid, "Exception", ex.InnerException?.Message + ex.Message + ex.StackTrace);

                return(BadRequest(ex.Message));
            }
        }
        public static RequiredBookingData GetRoomsData(string sid, string hotel, string Pid, string rooms)
        {
            try
            {
                SearchDBEntities searchDB = new SearchDBEntities();

                RequiredBookingData requiredBooking = new RequiredBookingData();
                var data   = searchDB.SearchCriterias.FirstOrDefault(a => a.sID == sid);
                var HRooms = searchDB.SearchRoomResults.Where(a => a.sID == sid && a.HotelCode == hotel && a.ProviderId.ToString() == Pid).ToList();
                requiredBooking.Currency = data?.currency;
                requiredBooking.City     = data?.cityName;
                var RoomsCode = rooms.Split('-');
                foreach (var item in RoomsCode)
                {
                    var roomdata = HRooms.FirstOrDefault(a => a.RoomCode == item);

                    requiredBooking.rooms.Add(roomdata);
                }
                if (Pid == "4")
                {
                    hotelsDBEntities hotelsDB = new hotelsDBEntities();
                    var HData   = hotelsDB.hotels.FirstOrDefault(d => d.hotelID == hotel);
                    var HDesc   = hotelsDB.HotelsDescriptions.FirstOrDefault(x => x.hotelID == hotel);
                    var Hsearch = searchDB.SearchHotelResults.FirstOrDefault(x => x.HotelCode == hotel && x.sID == sid && x.ProviderID.ToString() == Pid);
                    var Himage  = hotelsDB.HotelsImages.FirstOrDefault(v => v.HotelID == hotel);
                    requiredBooking.HotelName       = HData?.hotelName;
                    requiredBooking.Hotelstar       = int.Parse(HData?.rating);
                    requiredBooking.address         = HData?.address;
                    requiredBooking.CheckIn         = data?.dateFrom.Value.ToString();
                    requiredBooking.Checkout        = data?.dateTo.Value.ToString();
                    requiredBooking.City            = HData?.cityName;
                    requiredBooking.location        = HData?.location;
                    requiredBooking.HotelDesc       = HDesc?.Description1;
                    requiredBooking.providerHotelID = Hsearch?.ProviderHotelId;
                    requiredBooking.providerID      = Pid;
                    //MG
                    requiredBooking.Lat = HData?.Lat;
                    requiredBooking.Lng = HData?.Lng;
                    if (Himage != null)
                    {
                        requiredBooking.hotelThumb = Himage.Thum;
                    }
                }
                else if (Pid == "5")
                {
                    TBOContext hotelsDB = new TBOContext();
                    var        HData    = hotelsDB.HotelDetails.FirstOrDefault(d => d.HotelCode == hotel);
                    var        Hsearch  = searchDB.SearchHotelResults.FirstOrDefault(x => x.HotelCode == hotel && x.sID == sid && x.ProviderID.ToString() == Pid);
                    var        Himage   = hotelsDB.HotelImages.FirstOrDefault(v => v.HotelCode == hotel);
                    Enum.TryParse(HData.HotelRating, out HotelStars stars);
                    requiredBooking.HotelName       = HData?.HotelName;
                    requiredBooking.Hotelstar       = (int)stars + 1;
                    requiredBooking.address         = HData?.Address;
                    requiredBooking.CheckIn         = data?.dateFrom.Value.ToString();
                    requiredBooking.Checkout        = data?.dateTo.Value.ToString();
                    requiredBooking.City            = HData?.CityName;
                    requiredBooking.location        = HData?.HotelLocation;
                    requiredBooking.HotelDesc       = HData.Description;
                    requiredBooking.providerHotelID = HData?.HotelCode;
                    requiredBooking.providerID      = Pid;
                    //MG
                    requiredBooking.Lat = HData?.HotelLocation;
                    requiredBooking.Lng = HData?.Map;
                    if (Himage != null)
                    {
                        requiredBooking.hotelThumb = Himage.URL;
                    }

                    //instead of call pricing api
                    //RoomResult roomResult = new RoomResult();
                    //using (HotelBookingDBEntities hotelBookingDB = new HotelBookingDBEntities())
                    //{
                    //    foreach (var item in requiredBooking.rooms)
                    //    {
                    //        var cancellations = hotelBookingDB.CancelPolicies.Where(x => x.HotelCode == hotel && x.Sid == sid && x.ProviderID.ToString() == Pid /*&& x.RoomCode ==int.Parse(item.RoomCode)*/).ToList();

                    //        //roomResult.HotelNorms = availRes.HotelCancellationPolicies?.HotelNorms;
                    //        //handel cancel policy
                    //        foreach (var cancel in cancellations)
                    //        {
                    //            CancellationRule cancellation = new CancellationRule();
                    //            //DateTime dateFrom = Convert.ToDateTime(cancel.FromDate);
                    //            cancellation.FromDate = cancel.FromDate.ToString();// dateFrom.ToString("MMMM dd, yyyy");
                    //            cancellation.ToDate = cancel.ToDate.ToString();
                    //            cancellation.Cost = (double)cancel.Cost;
                    //            cancellation.ChargeType = cancel.ChargeType.ToString();
                    //            cancellation.Curency = cancel.Currency;
                    //            roomResult.cancellationRules.Add(cancellation);
                    //        }
                    //    }
                    //    requiredBooking.TBoRooms.Add(roomResult);
                    //}
                }

                return(requiredBooking);


                //   requiredBooking.rooms = searchDB.SearchRoomResults.Where(a => RoomsCode.Contains(a.RoomCode) && a.sID == sid && a.HotelCode == hotel && a.ProviderId.ToString() == Pid).ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }