/// <summary> /// Extract and Create Inventory Availability for a room /// </summary> /// <param name="roomTypeId">Room type id</param> /// <param name="startDate">Start date</param> /// <param name="endDate">End date</param> /// <returns>List of AvailStatusMessageType</returns> private IEnumerable<AvailStatusMessageType> GetInventoryAvailability(int roomTypeId, DateTime startDate, DateTime endDate) { var extractedRoomTypeAvailability = rateCacheManager.GetInventoryByRoomTypeIdAndDateRange(roomTypeId, startDate, endDate); if (extractedRoomTypeAvailability == null || extractedRoomTypeAvailability.Count == default(int)) { Logger.LogInfo("No availability found for room type {1}", null, roomTypeId); return null; } var inventoryAvailabilityDiaryEntryList = new List<AvailStatusMessageType>(); int inventoryCount = -1; foreach (var roomAvailability in extractedRoomTypeAvailability) { //if inventory is different from the previous day we create //a new entry if (inventoryCount != roomAvailability.AvailableOnline) { var availStatusMessageType = new AvailStatusMessageType(); availStatusMessageType.BookingLimit = roomAvailability.AvailableOnline.ToString(); availStatusMessageType.StatusApplicationControl = new StatusApplicationControlType(); availStatusMessageType.StatusApplicationControl.Start = roomAvailability.Date.ToString(Formats.UNIVERSAL_SHORT_DATE); availStatusMessageType.StatusApplicationControl.End = roomAvailability.Date.ToString(Formats.UNIVERSAL_SHORT_DATE); availStatusMessageType.StatusApplicationControl.InvTypeCode = roomTypeId.ToString(); inventoryAvailabilityDiaryEntryList.Add(availStatusMessageType); } else { var availStatusMessageType = inventoryAvailabilityDiaryEntryList.Last(); availStatusMessageType.StatusApplicationControl.End = roomAvailability.Date.ToString(Formats.UNIVERSAL_SHORT_DATE); } inventoryCount = roomAvailability.AvailableOnline; } return inventoryAvailabilityDiaryEntryList; }
/// <summary> /// Remove Minimum Stay Through restriction /// </summary> /// <param name="roomType">Room type</param> /// <param name="ratePlanId">Rate plan</param> /// <returns>AvailStatusMessageType</returns> private AvailStatusMessageType ResetRestrictionThroughRates(int roomType, int ratePlanId, AvailabilityStatusType status = AvailabilityStatusType.Open) { var availStatusMessageType = new AvailStatusMessageType(); DateTime startDate = DateTime.Now.Date; DateTime endDate = startDate.AddYears(inventoryYearsCount); availStatusMessageType.StatusApplicationControl = new StatusApplicationControlType { InvTypeCode = roomType.ToString(), RatePlanCode = ratePlanId.ToString(), Start = startDate.Date.ToString(Formats.UNIVERSAL_SHORT_DATE), End = endDate.ToString(Formats.UNIVERSAL_SHORT_DATE), }; availStatusMessageType.LengthsOfStay = new LengthsOfStayType() { ArrivalDateBased = false, ArrivalDateBasedSpecified = true }; availStatusMessageType.LengthsOfStay.LengthOfStay = new LengthsOfStayTypeLengthOfStay[1]; availStatusMessageType.LengthsOfStay.LengthOfStay[0] = new LengthsOfStayTypeLengthOfStay { MinMaxMessageType = LengthsOfStayTypeLengthOfStayMinMaxMessageType .SetMinLOS, MinMaxMessageTypeSpecified = true, Time = "1", }; availStatusMessageType.RestrictionStatus = new AvailStatusMessageTypeRestrictionStatus { Status = status, StatusSpecified = true }; return availStatusMessageType; }
/// <summary> /// This method will push an inventory message on the queue /// </summary> /// <param name="businessShortname">Business Short Name</param> /// <param name="roomTypeIds">room type Ids</param> /// <param name="startDate">Start Date</param> /// <param name="endDate">End Date</param> public void SendInventoryClose(string businessShortname, int[] roomTypeIds, DateTime startDate, DateTime endDate) { var hotelAvailNotifRq = new OTA_HotelAvailNotifRQ(); var hotelAvailNotifRqAvailStatusMessages = new OTA_HotelAvailNotifRQAvailStatusMessages(); hotelAvailNotifRq.AvailStatusMessages = hotelAvailNotifRqAvailStatusMessages; hotelAvailNotifRqAvailStatusMessages.HotelCode = businessShortname; var availStatusMessages = new List<AvailStatusMessageType>(); foreach (var roomTypeId in roomTypeIds) { var availStatusMessageType = new AvailStatusMessageType(); availStatusMessageType.BookingLimit = "0"; availStatusMessageType.StatusApplicationControl = new StatusApplicationControlType(); availStatusMessageType.StatusApplicationControl.Start = startDate.ToString(Formats.UNIVERSAL_SHORT_DATE); availStatusMessageType.StatusApplicationControl.End = endDate.ToString(Formats.UNIVERSAL_SHORT_DATE); availStatusMessageType.StatusApplicationControl.InvTypeCode = roomTypeId.ToString(); availStatusMessages.Add(availStatusMessageType); } hotelAvailNotifRqAvailStatusMessages.AvailStatusMessage = availStatusMessages.ToArray(); SetLocatorId(hotelAvailNotifRq); PPCGateway.Publish(hotelAvailNotifRq); }
/// <summary> /// Get close rate AvailStatusMessage /// </summary> /// <param name="roomType">Room type</param> /// <param name="ratePlanId">Rate plan id</param> /// <param name="startDate">Start date</param> /// <param name="endDate">End date</param> /// <returns>AvailStatusMessageType</returns> private AvailStatusMessageType GetCloseRestrictionRates(int roomType, int ratePlanId, DateTime? startDate, DateTime? endDate) { var availStatusMessageType = new AvailStatusMessageType(); var start = startDate.HasValue? startDate.Value : DateTime.Now.Date; var end = endDate.HasValue? endDate.Value : startDate.Value.AddYears(inventoryYearsCount); availStatusMessageType.StatusApplicationControl = new StatusApplicationControlType { InvTypeCode = roomType.ToString(), RatePlanCode = ratePlanId.ToString(), Start = start.Date.ToString(Formats.UNIVERSAL_SHORT_DATE), End = end.ToString(Formats.UNIVERSAL_SHORT_DATE), }; availStatusMessageType.RestrictionStatus = new AvailStatusMessageTypeRestrictionStatus { Status = AvailabilityStatusType.Close, StatusSpecified = true }; return availStatusMessageType; }
/// <summary> /// Assign and return rates for a Daily Rate /// </summary> /// <param name="dailyRate">End Date</param> /// <returns>RatesRestrictionsDateRangeEntry object</returns> private AvailStatusMessageType GetRestrictionRates(RateCache dailyRate, AvailabilityStatusType status = AvailabilityStatusType.Open) { if (dailyRate.MinStay == 0) { Logger.LogError("Minimum booking duration is invalid. It is set as 0 for room type id {0}, date {1} ", null, null, dailyRate.ProductId, dailyRate.Date); } var availStatusMessageType = new AvailStatusMessageType(); availStatusMessageType.StatusApplicationControl = new StatusApplicationControlType { InvTypeCode = dailyRate.RoomTypeId.ToString(), RatePlanCode = dailyRate.RatePlanId.ToString(), Start = dailyRate.Date.ToString(Formats.UNIVERSAL_SHORT_DATE), End = dailyRate.Date.ToString(Formats.UNIVERSAL_SHORT_DATE), }; availStatusMessageType.RestrictionStatus = new AvailStatusMessageTypeRestrictionStatus { Status = status, StatusSpecified = true }; availStatusMessageType.LengthsOfStay = new LengthsOfStayType() { ArrivalDateBased = true, ArrivalDateBasedSpecified = true }; availStatusMessageType.LengthsOfStay.LengthOfStay = new LengthsOfStayTypeLengthOfStay[1]; availStatusMessageType.LengthsOfStay.LengthOfStay[0] = new LengthsOfStayTypeLengthOfStay { MinMaxMessageType = LengthsOfStayTypeLengthOfStayMinMaxMessageType .SetMinLOS, MinMaxMessageTypeSpecified = true, Time = dailyRate.MinStay.ToString(), }; return availStatusMessageType; }
private bool CompareAvailStatus(AvailStatusMessageType restrictionRate, AvailStatusMessageType lastRestrictionRate) { if (lastRestrictionRate == null) { return false; } return restrictionRate.LengthsOfStay.LengthOfStay[0].Time == lastRestrictionRate.LengthsOfStay.LengthOfStay[0].Time && restrictionRate.LengthsOfStay.LengthOfStay[0].MinMaxMessageType == lastRestrictionRate.LengthsOfStay.LengthOfStay[0].MinMaxMessageType && restrictionRate.RestrictionStatus.Status == lastRestrictionRate.RestrictionStatus.Status && restrictionRate.StatusApplicationControl.InvTypeCode == lastRestrictionRate.StatusApplicationControl.InvTypeCode && restrictionRate.StatusApplicationControl.RatePlanCode == lastRestrictionRate.StatusApplicationControl.RatePlanCode; }
private static AvailStatusMessageType CloneAvailStatusMessageType(AvailStatusMessageType availStatusMessageType) { var newavailStatusMessageType = new AvailStatusMessageType(); newavailStatusMessageType.StatusApplicationControl = new StatusApplicationControlType { InvTypeCode = availStatusMessageType.StatusApplicationControl.InvTypeCode, RatePlanCode = availStatusMessageType.StatusApplicationControl.RatePlanCode, Start = availStatusMessageType.StatusApplicationControl.Start, End = availStatusMessageType.StatusApplicationControl.End, }; newavailStatusMessageType.RestrictionStatus = new AvailStatusMessageTypeRestrictionStatus { Status = availStatusMessageType.RestrictionStatus.Status, StatusSpecified = true }; newavailStatusMessageType.RestrictionStatus.Restriction = availStatusMessageType.RestrictionStatus.Restriction; newavailStatusMessageType.RestrictionStatus.RestrictionSpecified = availStatusMessageType.RestrictionStatus.RestrictionSpecified; newavailStatusMessageType.RestrictionStatus.Status = availStatusMessageType.RestrictionStatus.Status; newavailStatusMessageType.LengthsOfStay = new LengthsOfStayType(); newavailStatusMessageType.LengthsOfStay.ArrivalDateBased = availStatusMessageType.LengthsOfStay.ArrivalDateBased; newavailStatusMessageType.LengthsOfStay.ArrivalDateBasedSpecified = availStatusMessageType.LengthsOfStay.ArrivalDateBasedSpecified; newavailStatusMessageType.LengthsOfStay.LengthOfStay = availStatusMessageType.LengthsOfStay.LengthOfStay; newavailStatusMessageType.LengthsOfStay.LengthOfStay[0] = availStatusMessageType.LengthsOfStay.LengthOfStay[0]; return newavailStatusMessageType; }
static public async Task <HotelAvailNotifRQResponse> OTA_HotelAvailNotifRQ(string pmsID, string usernameAuthenticate, string passwordAuthenticate, AvailStatusMessages availStatusMessages) { HotelAvailNotifRQResponse response = null; try { PmsXchangeServiceClient service = new AsyncServiceConnection().service; OTA_HotelAvailNotifRQ body = new OTA_HotelAvailNotifRQ() { Version = 1.0M, EchoToken = Guid.NewGuid().ToString() /* Echo token must be unique.*/, TimeStamp = DateTime.Now, TimeStampSpecified = true, POS = CreatePOS(pmsID), AvailStatusMessages = new OTA_HotelAvailNotifRQAvailStatusMessages() }; body.AvailStatusMessages.HotelCode = availStatusMessages.HotelCode; body.AvailStatusMessages.AvailStatusMessage = new AvailStatusMessageType[availStatusMessages.AvailStatusMessageNodeList.Count]; int index = 0; foreach (AvailStatusMessages.AvailStatusMessage aSM in availStatusMessages.AvailStatusMessageNodeList) { AvailStatusMessageType bSM = new AvailStatusMessageType() { StatusApplicationControl = new StatusApplicationControlType() }; bSM.StatusApplicationControl.Start = aSM.StatusApplicationControlNode.Start; bSM.StatusApplicationControl.End = aSM.StatusApplicationControlNode.End; bSM.StatusApplicationControl.RatePlanCode = aSM.StatusApplicationControlNode.RatePlanCode; bSM.StatusApplicationControl.InvTypeCode = aSM.StatusApplicationControlNode.InvTypeCode; bSM.StatusApplicationControl.Mon = aSM.StatusApplicationControlNode.Mon; bSM.StatusApplicationControl.Tue = aSM.StatusApplicationControlNode.Tue; bSM.StatusApplicationControl.Weds = aSM.StatusApplicationControlNode.Weds; bSM.StatusApplicationControl.Thur = aSM.StatusApplicationControlNode.Thur; bSM.StatusApplicationControl.Fri = aSM.StatusApplicationControlNode.Fri; bSM.StatusApplicationControl.Sat = aSM.StatusApplicationControlNode.Sat; bSM.StatusApplicationControl.Sun = aSM.StatusApplicationControlNode.Sun; bSM.StatusApplicationControl.MonSpecified = true; bSM.StatusApplicationControl.TueSpecified = true; bSM.StatusApplicationControl.WedsSpecified = true; bSM.StatusApplicationControl.ThurSpecified = true; bSM.StatusApplicationControl.FriSpecified = true; bSM.StatusApplicationControl.SatSpecified = true; bSM.StatusApplicationControl.SunSpecified = true; bSM.BookingLimit = aSM.BookingLimit; if (aSM.LengthsOfStayNode != null) { bSM.LengthsOfStay = new LengthsOfStayType(); bSM.LengthsOfStay.LengthOfStay = new LengthsOfStayTypeLengthOfStay[aSM.LengthsOfStayNode.LengthOfStayNodeList.Count]; int indexLS = 0; foreach (var lOS in aSM.LengthsOfStayNode.LengthOfStayNodeList) { bSM.LengthsOfStay.LengthOfStay[indexLS] = new LengthsOfStayTypeLengthOfStay(); bSM.LengthsOfStay.LengthOfStay[indexLS].MinMaxMessageTypeSpecified = true; if (lOS.MinMaxMessageType == "SetMinLOS") { bSM.LengthsOfStay.LengthOfStay[indexLS].MinMaxMessageType = LengthsOfStayTypeLengthOfStayMinMaxMessageType.SetMinLOS; } else { bSM.LengthsOfStay.LengthOfStay[indexLS].MinMaxMessageType = LengthsOfStayTypeLengthOfStayMinMaxMessageType.SetMaxLOS; } bSM.LengthsOfStay.LengthOfStay[indexLS++].Time = lOS.Time; } } if (aSM.StatusApplicationControlNode.DestinationSystemCodesNode != null) { bSM.StatusApplicationControl.DestinationSystemCodes = new DestinationSystemCodesTypeDestinationSystemCode[aSM.StatusApplicationControlNode.DestinationSystemCodesNode.DestinationSystemCodeNodeList.Count]; int indexDC = 0; foreach (var dC in aSM.StatusApplicationControlNode.DestinationSystemCodesNode.DestinationSystemCodeNodeList) { bSM.StatusApplicationControl.DestinationSystemCodes[indexDC] = new DestinationSystemCodesTypeDestinationSystemCode(); bSM.StatusApplicationControl.DestinationSystemCodes[indexDC++].Value = dC.InnerText; } } if (aSM.RestricitionStatusNode != null) { bSM.RestrictionStatus = new AvailStatusMessageTypeRestrictionStatus(); if (aSM.RestricitionStatusNode.Status == "Open") { bSM.RestrictionStatus.Status = AvailabilityStatusType.Open; bSM.RestrictionStatus.StatusSpecified = true; } if (aSM.RestricitionStatusNode.Status == "Close") { bSM.RestrictionStatus.Status = AvailabilityStatusType.Close; bSM.RestrictionStatus.StatusSpecified = true; } if (aSM.RestricitionStatusNode.Restriction == "Arrival") { bSM.RestrictionStatus.Restriction = RatePlanTypeRestrictionStatusRestriction.Arrival; bSM.RestrictionStatus.RestrictionSpecified = true; } if (aSM.RestricitionStatusNode.Restriction == "Departure") { bSM.RestrictionStatus.Restriction = RatePlanTypeRestrictionStatusRestriction.Departure; bSM.RestrictionStatus.RestrictionSpecified = true; } } body.AvailStatusMessages.AvailStatusMessage[index++] = bSM; } // // Send availability update. // response = await service.HotelAvailNotifRQAsync(CreateSecurityHeader(usernameAuthenticate, passwordAuthenticate), body).ConfigureAwait(false); } catch (NullReferenceException) { Exception exSetup = new Exception("OTA_HotelAvailNotifRQ arguments were not set up properly causing a null reference exception."); response = new HotelAvailNotifRQResponse(); response.OTA_HotelAvailNotifRS = new MessageAcknowledgementType(); response.OTA_HotelAvailNotifRS.Items = new object[] { ProcessingException(exSetup) }; } catch (Exception ex) { response = new HotelAvailNotifRQResponse(); response.OTA_HotelAvailNotifRS = new MessageAcknowledgementType(); response.OTA_HotelAvailNotifRS.Items = new object[] { ProcessingException(ex) }; } return(response); }