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); }
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); }
/// <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); }
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); } } }
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"); }
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); * } * }*/ }
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 } })); }
public void MergeWith(HotelAvailability otherAvailabililty) { foreach (KeyValuePair <string, RoomAvailability> roomAvailabilityInfo in otherAvailabililty.RoomAvailabilities) { RoomAvailability correspondingRoomAvailability = RoomAvailabilities[roomAvailabilityInfo.Key]; roomAvailabilityInfo.Value.MergeWith(correspondingRoomAvailability); } }
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 } })); }
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 } })); }
//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 } })); }
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); }
//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); }
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"); }
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); }
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 }); }
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++; } }
// 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); }
public static void Run() { string response = GetAvailabilityResponse(START_DATE, END_DATE); HotelAvailability hotelAvailability = BanffBoundaryParser.ParseHotelAvailability(response); }
public static void Run() { string response = GetAvailabilityResponse(START_DATE, END_DATE); HotelAvailability hotelAvailability = SummitPenthousesParser.ParseHotelAvailability(response); }
public static void Run() { string response = GetAvailabilityResponse(START_DATE, END_DATE); HotelAvailability hotelAvailability = FireMountainParser.ParseHotelAvailability(response); }
public static async void Run(DateTime startDate, DateTime endDate) { HotelAvailability hotelAvailability = await GetAvailabilityForHotel(HotelName.BIG_WHITE_BULLET_CREEK, startDate, endDate); Console.WriteLine("Success"); }