Ejemplo n.º 1
0
        public static HotelAvailability GetHotelAvailability(DateTime startDate, DateTime endDate)
        {
            DateTime          currentDate       = startDate;
            HotelAvailability hotelAvailability = new HotelAvailability(HotelName.MYSTIC_SPRINGS);

            hotelAvailability.RoomAvailabilities.Add(MysticSpringsParser.TWO_BEDROOM_CHALET, new RoomAvailability(MysticSpringsParser.TWO_BEDROOM_CHALET));
            SetHttpHeaders();

            //make randomized list of dates:
            TimeSpan      totalNumOfDays = endDate.Subtract(startDate);
            int           days           = totalNumOfDays.Days;
            Random        random         = new Random();
            HashSet <int> daysToAdd      = new HashSet <int>();

            //while currentDate has not yet been generated:
            while (daysToAdd.Count <= days)
            {
                currentDate = startDate;
                //generate random numbers until all dates have been randomly generated

                //return a random number within the specified range; inclusive lower bound, exclusive upper bound
                int randomCounter = random.Next(0, days + 1);  //+ because want to include the last day, and the upper bound is exclusive.
                //ensure that randomCounter is not a duplicate by adding it to the HashSet:
                if (daysToAdd.Add(randomCounter))
                {
                    currentDate = currentDate.AddDays(randomCounter);
                    Console.WriteLine("Getting availability for " + currentDate);
                    string response = GetAvailabilityResponse(currentDate, currentDate.AddDays(1));
                    MysticSpringsParser.ParseHotelAvailability(hotelAvailability, response, currentDate);
                    Thread.Sleep(1500);
                }
            }

            return(hotelAvailability);
        }
Ejemplo n.º 2
0
        private static HotelAvailability GetHotelAvailability(DateTime startDate, DateTime endDate, String fullCookie)
        {
            string iqHomePageUrl       = REQUESTS_ROOT_URL + "asp/IQHome.asp";
            string availabilityPageUrl = REQUESTS_ROOT_URL + "asp/CheckAvailability.asp";

            HotelAvailability hotelAvailability = new HotelAvailability(HotelName.SILVER_CREEK);

            List <DateTime> datesToRequest = GetDatesToRequest(startDate, endDate);

            foreach (DateTime requestDate in datesToRequest)
            {
                Console.WriteLine("Getting availabilities for dates around " + DateUtils.GetReadableDateFormat(requestDate));
                GetPage(iqHomePageUrl, fullCookie);
                DateTime oneMoreThanRequestDate    = requestDate.AddDays(1);
                string   agentLoginPageQueryString = string.Format("?CheckInMonth={0}&CheckInDay={1}&CheckInYear={2}&CheckOutMonth={3}&CheckOutDay={4}&CheckOutYear={5}&txtAdults=2&txtChildren=0&txtNumRooms=1&txtPromoCode=&txtRateSelected=&ForcedUser1=&ForcedUser2=",
                                                                   requestDate.Month,
                                                                   requestDate.ToString("dd"),
                                                                   requestDate.Year,
                                                                   oneMoreThanRequestDate.Month,
                                                                   oneMoreThanRequestDate.ToString("dd"),
                                                                   oneMoreThanRequestDate.Year);
                string agentLoginPageUrl = REQUESTS_ROOT_URL + "asp/AgentLogin.asp" + agentLoginPageQueryString;
                GetPage(agentLoginPageUrl, fullCookie);
                string pageForCurrentDate = GetPage(availabilityPageUrl, fullCookie);

                SilverCreekParser.Parse(pageForCurrentDate, hotelAvailability, requestDate);
            }

            return(hotelAvailability);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Look for all the free rooms during a period of a hotel to know the number of free room, free space and the occupation rate
        /// </summary>
        public static HotelAvailability GetAvailability(int idHotel, DateTime arrival, DateTime departure)
        {
            HotelAvailability hotelAvailability = new HotelAvailability();
            int     availablePlace = 0;
            decimal minPrice       = decimal.MaxValue;

            List <Room> rooms = RoomDB.GetRoomsWithNoReservationByHotel(idHotel, arrival, departure);

            foreach (Room room in rooms)
            {
                availablePlace += room.Type;

                if (room.Price < minPrice)
                {
                    minPrice = room.Price;
                }
            }

            double totalRoom = GetCapacity(idHotel).TotalNumberRoom;

            double occupancyRate = 1.0 - (rooms.Count() / totalRoom);

            hotelAvailability.NumberOfAvailableRoom         = rooms.Count();
            hotelAvailability.NumberOfAvailablePerson       = availablePlace;
            hotelAvailability.OcucupancyRate                = occupancyRate;
            hotelAvailability.HasAvailableRoomWithTv        = rooms.Any(room => room.HasTV == true);
            hotelAvailability.HasAvailableRoomWithHairDryer = rooms.Any(room => room.HasHairDryer == true);
            hotelAvailability.MinPrice = minPrice;

            return(hotelAvailability);
        }
Ejemplo n.º 4
0
        public static void Parse(String page, HotelAvailability hotelAvailability, DateTime requestDate)
        {
            HtmlDocument htmlDocument = new HtmlDocument();

            htmlDocument.LoadHtml(page);

            HtmlNode rootDiv = htmlDocument.GetElementbyId("availTbl");
            HtmlNode table   = rootDiv.ChildNodes.ElementAt(1);
            HtmlNode tHead   = table.ChildNodes.ElementAt(1);
            HtmlNode datesTr = tHead.ChildNodes.ElementAt(1);

            List <DateTime> dates = GetDateRange(datesTr, requestDate);

            HtmlNode tBody = table.ChildNodes.ElementAt(3);

            for (int i = 1; i < tBody.ChildNodes.Count; i += 2)
            {
                HtmlNode roomInfoTr = tBody.ChildNodes.ElementAt(i);

                RoomAvailability roomAvailability = GetRoomAvailability(roomInfoTr, dates);

                if (!hotelAvailability.RoomAvailabilities.ContainsKey(roomAvailability.RoomNumber))
                {
                    hotelAvailability.RoomAvailabilities.Add(roomAvailability.RoomNumber, roomAvailability);
                }
                else
                {
                    RoomAvailability existingRoomAvailability = hotelAvailability.RoomAvailabilities[roomAvailability.RoomNumber];
                    existingRoomAvailability.MergeWith(roomAvailability);
                }
            }
        }
Ejemplo n.º 5
0
            public void WriteHotelAvailability(HotelAvailability hotelAvailability)
            {
                Application application = new Application();

                if (application == null)
                {
                    throw new Exception("Excel is not properly installed");
                }
                application.DisplayAlerts = false;
                DateTime startDate = hotelAvailability.GetEarliestKnownDate();
                DateTime endDate   = hotelAvailability.GetLatestKnownDate();

                Workbook  workbook  = application.Workbooks.Add();
                Worksheet worksheet = (Worksheet)workbook.Worksheets.get_Item(1);

                worksheet.Name = hotelAvailability.Name.GetDisplayName();

                worksheet.Cells[1, 1] = hotelAvailability.Name.GetDisplayName();

                Console.WriteLine("About to add date labels");
                AddAllDateLabels(worksheet, startDate, endDate);

                Console.WriteLine("About to add availabilities");
                AddAllAvailabilities(worksheet, hotelAvailability, startDate, endDate);

                Directory.CreateDirectory(fileOutputPath);
                workbook.SaveAs(fileOutputPath + hotelAvailability.Name.GetDisplayName() + ".xls", XlFileFormat.xlWorkbookNormal, null, null, null, null, XlSaveAsAccessMode.xlShared);
                workbook.Close(true);
                application.Quit();

                Console.WriteLine("Excel file created");
            }
Ejemplo n.º 6
0
        public static async Task AddAvailabilityAroundDate(HotelAvailability hotelAvailability, DateTime requestDate, Dictionary <string, Object> roomsData)
        {
            Dictionary <string, RoomAvailability> roomAvailabilities = hotelAvailability.RoomAvailabilities;
            List <string> fullRoomNumbers = (List <string>)roomsData[ROOM_NUMBERS_KEY];

            string requestDateString = DateUtils.GetMonthDayShortYearFormat(requestDate);

            // Dictionary<string, Task<string>> pageRequests = new Dictionary<string, Task<string>>();
            // TODO: Randomize request order for rooms
            foreach (string fullRoomNumber in fullRoomNumbers)
            {
                Console.WriteLine("Getting data for room: " + fullRoomNumber + " - " + hotelAvailability.Name.Name);

                string roomNumber     = fullRoomNumber.Split(new [] { '-' })[1].Trim();
                string resortCode     = (string)roomsData[RESORT_CODE_KEY];
                string roomNumberCode = (string)roomsData[ROOM_NUMBER_CODE_KEY];
                string url;

                if (roomsData.ContainsKey(PROPERTY_CODE_KEY))
                {
                    url = String.Format("http://irmestore.bigwhite.com/irmnet/res/RoomDetailsPage.aspx?Resort={0}&PropertyCode={1}&RoomNum={2}{3}&Arrival={4}",
                                        resortCode, roomsData[PROPERTY_CODE_KEY], roomNumberCode, roomNumber, requestDateString);
                }
                else
                {
                    url = String.Format("http://irmestore.bigwhite.com/irmnet/res/RoomDetailsPage.aspx?Resort={0}&RoomNum={1}{2}&Arrival={3}",
                                        resortCode, roomNumberCode, roomNumber, requestDateString);
                }

                Task <string> page = GetPage(url);
                // pageRequests.Add(fullRoomNumber, page);
                string           pageText         = await page;
                RoomAvailability roomAvailability = BigWhiteParser.ParseSingleRoomAvailability(pageText, roomNumber);
                if (!roomAvailabilities.ContainsKey(fullRoomNumber))
                {
                    roomAvailabilities.Add(fullRoomNumber, roomAvailability);
                }
                else
                {
                    roomAvailabilities[fullRoomNumber].MergeWith(roomAvailability);
                }
            }

            /*foreach (KeyValuePair<string, Task<string>> pageRequest in pageRequests)
             * {
             *      string fullRoomNumber = pageRequest.Key;
             *      string roomNumber = fullRoomNumber.Split(new[] { '-' })[1].Trim();
             *      string pageText = await pageRequest.Value;
             *      Console.WriteLine("Page received");
             *      RoomAvailability roomAvailability = BigWhiteParser.ParseSingleRoomAvailability(pageText, roomNumber);
             *      if (!roomAvailabilities.ContainsKey(fullRoomNumber))
             *      {
             *              roomAvailabilities.Add(fullRoomNumber, roomAvailability);
             *      }
             *      else
             *      {
             *              roomAvailabilities[fullRoomNumber].MergeWith(roomAvailability);
             *      }
             * }*/
        }
Ejemplo n.º 7
0
        public static ResortAvailability GetResortAvailability(DateTime startDate, DateTime endDate)
        {
            SetUpHttpClient();

            // TODO: Look at following location headers instead of hardcoding URLs?
            string cookieRequestsQueryString = string.Format("?CIM={0}&CID={1}&CIY={2}&COM={3}&COD={4}&COY={5}&checkInDate={1}-{6}-{2}&checkOutDate={4}-{7}-{5}&AD=2&CH=0&RMS=1&promoCode=&submit=Check+Availability",
                                                             startDate.Month,
                                                             startDate.ToString("dd"),
                                                             startDate.Year,
                                                             endDate.Month,
                                                             endDate.ToString("dd"),
                                                             endDate.Year,
                                                             startDate.ToString("MMM"),
                                                             endDate.ToString("MMM"));

            string initialCookieRequestUrl = REQUESTS_ROOT_URL + "default.asp" + cookieRequestsQueryString;
            string initialAspCookie        = GetAspCookie(UTM_COOKIES, initialCookieRequestUrl);

            string mainCookieRequestUrl = REQUESTS_ROOT_URL + "asp/home.asp" + cookieRequestsQueryString;
            string mainAspCookie        = GetAspCookie(UTM_COOKIES + "; " + initialAspCookie, mainCookieRequestUrl);

            string fullCookie = UTM_COOKIES + "; " + mainAspCookie;

            HotelAvailability hotelAvailability = GetHotelAvailability(startDate, endDate, fullCookie);

            hotelAvailability.TrimDateRange(startDate, endDate);

            return(new ResortAvailability(ResortName.SILVER_CREEK, new Dictionary <HotelName, HotelAvailability> {
                { HotelName.SILVER_CREEK, hotelAvailability }
            }));
        }
Ejemplo n.º 8
0
 public void MergeWith(HotelAvailability otherAvailabililty)
 {
     foreach (KeyValuePair <string, RoomAvailability> roomAvailabilityInfo in otherAvailabililty.RoomAvailabilities)
     {
         RoomAvailability correspondingRoomAvailability = RoomAvailabilities[roomAvailabilityInfo.Key];
         roomAvailabilityInfo.Value.MergeWith(correspondingRoomAvailability);
     }
 }
Ejemplo n.º 9
0
        public static ResortAvailability GetResortAvailability(DateTime startDate, DateTime endDate)
        {
            HotelAvailability hotelAvailability = GetHotelAvailability(startDate, endDate);

            return(new ResortAvailability(ResortName.SUMMIT_PENTHOUSES, new Dictionary <HotelName, HotelAvailability> {
                { HotelName.SUMMIT_PENTHOUSES, hotelAvailability }
            }));
        }
Ejemplo n.º 10
0
        public static ResortAvailability GetResortAvailability(DateTime startDate, DateTime endDate)
        {
            HotelAvailability hotelAvailability = GetHotelAvailability(startDate, endDate);

            return(new ResortAvailability(ResortName.BANFF_BOUNDARY, new Dictionary <HotelName, HotelAvailability> {
                { HotelName.BANFF_BOUNDARY, hotelAvailability }
            }));
        }
Ejemplo n.º 11
0
        //public static void Run()  //just for testing
        //{
        //    SetHttpHeaders();
        //    DateTime currentDate = new DateTime(2018, 10, 16);
        //    HotelAvailability hotelAvailability = new HotelAvailability(HotelName.MYSTIC_SPRINGS);
        //    hotelAvailability.RoomAvailabilities.Add(MysticSpringsParser.TWO_BEDROOM_CHALET, new RoomAvailability(MysticSpringsParser.TWO_BEDROOM_CHALET));

        //    string response = GetAvailabilityResponse(currentDate, currentDate.AddDays(1));
        //    MysticSpringsParser.ParseHotelAvailability(hotelAvailability, response, currentDate);
        //    //    currentDate = currentDate.AddDays(1);

        //    bool test = hotelAvailability.RoomAvailabilities[MysticSpringsParser.TWO_BEDROOM_CHALET].IsAvailableOnDate(currentDate);
        //    Console.WriteLine(response);
        //    Console.WriteLine(test);
        //    Console.ReadLine();
        //    //HotelAvailability hotelAvailability = MysticSpringsParser.ParseHotelAvailability(response);
        //}

        public static ResortAvailability GetResortAvailability(DateTime startDate, DateTime endDate)
        {
            HotelAvailability hotelAvailability = GetHotelAvailability(startDate, endDate);

            return(new ResortAvailability(ResortName.MYSTIC_SPRINGS, new Dictionary <HotelName, HotelAvailability> {
                { HotelName.MYSTIC_SPRINGS, hotelAvailability }
            }));
        }
Ejemplo n.º 12
0
		private static async void RunBigWhite()
		{
			ExcelWriter excelWriter = new ExcelWriter(EXCEL_OUTPUT_PATH + ResortName.BIG_WHITE.Name + @"\");
			foreach (HotelName hotelName in BigWhite.HOTEL_NAMES)
			{
				HotelAvailability hotelAvailability = await BigWhite.GetAvailabilityForHotel(hotelName, BigWhite.START_DATE, BigWhite.END_DATE);
				if (AGGREGATE_ROOM_TYPES)
				{
					Dictionary<string, RoomAvailability> aggregatedAvailabilities = BigWhite.GetAggregatedAvailabilitiesForRoomType(hotelAvailability.RoomAvailabilities, BigWhite.START_DATE, BigWhite.END_DATE);
					hotelAvailability.RoomAvailabilities = aggregatedAvailabilities;
				}
				excelWriter.WriteHotelAvailability(hotelAvailability);
			}
            EmailSender.SendEmail(EXCEL_OUTPUT_PATH, BigWhite.HOTEL_NAMES);
		}
Ejemplo n.º 13
0
        //if the webpage, under table class="orrs_search_table1" Contains "2 Bedroom Chalet", then it's avail.
        public static void ParseHotelAvailability(HotelAvailability hotelAvailability, string response, DateTime date)
        {
            //System.IO.File.WriteAllText(@"C:\Users\Chloe\source\repos\TESTFORJSON\MysticSpringsJson.txt", response);

            Dictionary <DateTime, AvailabilityType> totalAvailability = hotelAvailability.RoomAvailabilities[TWO_BEDROOM_CHALET].TotalAvailability;    //the string is the key of the key-value pair of the only dictionary entry

            if (response.Contains(TWO_BEDROOM_CHALET))
            {
                totalAvailability.Add(date, AvailabilityType.AVAILABLE);
            }
            else
            {
                totalAvailability.Add(date, AvailabilityType.UNAVAILABLE);
            }
        }
        public static HotelAvailability Map(AvailabilityDto dto, int nights)
        {
            var result = new HotelAvailability
            {
                Hotel = new HotelInfo
                {
                    Name   = dto?.Hotel?.Name,
                    Rating = dto?.Hotel?.Rating ?? 0
                }
            };

            result.Rates = new List <HotelRate>();

            if (dto.Rates != null)
            {
                foreach (var rateDto in dto.Rates)
                {
                    var rate = new HotelRate();

                    switch (rateDto.BoardType)
                    {
                    case "No Meals":
                        rate.BoardType = Core.Common.Enum.BoardType.NoMeals;
                        break;

                    case "Half Board":
                        rate.BoardType = Core.Common.Enum.BoardType.HalfBoard;
                        break;

                    case "Full Board":
                        rate.BoardType = Core.Common.Enum.BoardType.FullBoard;
                        break;
                    }

                    rate.RateType = rateDto.RateType == "PerNight" ? Core.Common.Enum.HotelRateType.PerNight : Core.Common.Enum.HotelRateType.Stay;

                    rate.FinalPrice = rate.RateType == Core.Common.Enum.HotelRateType.PerNight
                                        ? rateDto.Value * nights
                                        : rateDto.Value;

                    result.Rates.Add(rate);
                }
            }

            return(result);
        }
Ejemplo n.º 15
0
        public void Hotels_must_have_rooms_else_they_are_not_hotels()
        {
            var id           = Guid.NewGuid();
            var availability = new HotelAvailability(null, null, null);

            try
            {
                var rooms = new HotelRoomSummary(0, 0, 0);
                new Hotel(id, availability, rooms);
            }
            catch (HotelsMustHaveRooms hmr)
            {
                // if exception is thrown test passes
                return;
            }

            Assert.Fail("Hotels must have rooms invariant not enforced");
        }
Ejemplo n.º 16
0
        public static async Task <HotelAvailability> GetAvailabilityForHotel(HotelName hotelName, DateTime startDate, DateTime endDate)
        {
            Dictionary <string, Object> roomsData = ReadRoomDataFromFile(hotelName);

            HotelAvailability hotelAvailability = new HotelAvailability(hotelName);
            List <DateTime>   requestDates      = CalculateRequestDates(startDate, endDate);

            foreach (DateTime requestDate in requestDates)
            {
                await AddAvailabilityAroundDate(hotelAvailability, requestDate, roomsData);
            }
            hotelAvailability.TrimDateRange(startDate, endDate);

            Console.WriteLine("\nEarliest available date for " + hotelName.Name + ": " + hotelAvailability.GetEarliestKnownDate().ToLongDateString());
            Console.WriteLine("Latest available date for " + hotelName.Name + ": " + hotelAvailability.GetLatestKnownDate().ToLongDateString() + "\n");
            Console.WriteLine("Total number of rooms gathered for " + hotelName.Name + ": " + hotelAvailability.RoomAvailabilities.Count);
            return(hotelAvailability);
        }
Ejemplo n.º 17
0
 public HotelAvailabilityResponse Map(HotelAvailability hotelAvailability)
 {
     return(new HotelAvailabilityResponse
     {
         Id = hotelAvailability.Id,
         HotelId = hotelAvailability.HotelId,
         Infants = hotelAvailability.Infants,
         Children = hotelAvailability.Children,
         Adults = hotelAvailability.Adults,
         HotelName = hotelAvailability.HotelName,
         Meal = hotelAvailability.Meal,
         Room = hotelAvailability.Room,
         CurrencyCode = hotelAvailability.CurrencyCode,
         NetPrice = hotelAvailability.NetPrice,
         StayDate = hotelAvailability.StayDate,
         EndDate = hotelAvailability.EndDate,
         AirportCode = hotelAvailability.AirportCode,
         Region = hotelAvailability.Region,
         Country = hotelAvailability.Country
     });
 }
Ejemplo n.º 18
0
            private void AddAllAvailabilities(Worksheet worksheet, HotelAvailability hotelAvailability, DateTime startDate, DateTime endDate)
            {
                int currentRow = 3;

                foreach (KeyValuePair <string, RoomAvailability> entry in hotelAvailability.RoomAvailabilities)
                {
                    worksheet.Cells[currentRow, 2] = entry.Key;
                    int currentColumn = DATE_STARTING_COLUMN;
                    Console.WriteLine("Writing excel availability for room " + entry.Key);
                    foreach (DateTime date in DateUtils.GetOrderedDateRange(startDate, endDate))
                    {
                        string symbol = Symbols.GetSymbolForAvailability(entry.Value.TotalAvailability[date]);
                        // Console.WriteLine("About to write cell for date " + DateUtils.GetReadableDateFormat(date));
                        worksheet.Cells[currentRow, currentColumn] = symbol;
                        // Console.WriteLine("About to format cell");
                        worksheet.Cells[currentRow, currentColumn].HorizontalAlignment = XlHAlign.xlHAlignCenter;
                        //Console.WriteLine("Done room");
                        currentColumn++;
                    }
                    currentRow++;
                }
            }
Ejemplo n.º 19
0
        // TODO: Use API
        /// <summary>
        /// Look for all the free rooms during a period of a hotel to know the number of free room, free space and the occupation rate
        /// </summary>
        public static HotelAvailability GetAvailability(int idHotel, DateTime arrival, DateTime departure)
        {
            HotelAvailability hotelAvailability = new HotelAvailability();
            int         availablePlace          = 0;
            decimal     minPrice = decimal.MaxValue;
            List <Room> rooms;
            string      uri = baseUri + "hotels/" + idHotel + "/rooms?withReservation=0&arrival=" + arrival.ToString() + "&departure=" + departure.ToString();

            using (HttpClient httpClient = new HttpClient())
            {
                Task <String> response = httpClient.GetStringAsync(uri);
                rooms = JsonConvert.DeserializeObject <List <Room> >(response.Result);
            }

            foreach (Room room in rooms)
            {
                availablePlace += room.Type;

                if (room.Price < minPrice)
                {
                    minPrice = room.Price;
                }
            }

            double totalRoom = GetCapacity(idHotel).TotalNumberRoom;

            double occupancyRate = 1.0 - (rooms.Count() / totalRoom);

            hotelAvailability.NumberOfAvailableRoom         = rooms.Count();
            hotelAvailability.NumberOfAvailablePerson       = availablePlace;
            hotelAvailability.OcucupancyRate                = occupancyRate;
            hotelAvailability.HasAvailableRoomWithTv        = rooms.Any(room => room.HasTV == true);
            hotelAvailability.HasAvailableRoomWithHairDryer = rooms.Any(room => room.HasHairDryer == true);
            hotelAvailability.MinPrice = minPrice;

            return(hotelAvailability);
        }
Ejemplo n.º 20
0
 public static void Run()
 {
     string            response          = GetAvailabilityResponse(START_DATE, END_DATE);
     HotelAvailability hotelAvailability = BanffBoundaryParser.ParseHotelAvailability(response);
 }
Ejemplo n.º 21
0
 public static void Run()
 {
     string            response          = GetAvailabilityResponse(START_DATE, END_DATE);
     HotelAvailability hotelAvailability = SummitPenthousesParser.ParseHotelAvailability(response);
 }
Ejemplo n.º 22
0
 public static void Run()
 {
     string            response          = GetAvailabilityResponse(START_DATE, END_DATE);
     HotelAvailability hotelAvailability = FireMountainParser.ParseHotelAvailability(response);
 }
Ejemplo n.º 23
0
        public static async void Run(DateTime startDate, DateTime endDate)
        {
            HotelAvailability hotelAvailability = await GetAvailabilityForHotel(HotelName.BIG_WHITE_BULLET_CREEK, startDate, endDate);

            Console.WriteLine("Success");
        }