/// <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> /// Send a rate restriction for a rate plan /// </summary> /// <param name="businessShortname">Business short name</param> /// <param name="roomTypeId">Room type id</param> /// <param name="ratePlanId">Rate plan id</param> /// <param name="status">Availability status</param> /// <param name="startDate">Start date</param> /// <param name="endDate">End date</param> /// <returns>True if it is a success</returns> public bool SendRatesRestrictionUpdate(string businessShortname, int roomTypeId, int ratePlanId, AvailabilityStatusType status = AvailabilityStatusType.Open, DateTime? startDate = null, DateTime? endDate = null) { var hotelAvailNotifRq = new OTA_HotelAvailNotifRQ(); var hotelAvailNotifRQAvailStatusMessages = new OTA_HotelAvailNotifRQAvailStatusMessages(); hotelAvailNotifRq.AvailStatusMessages = hotelAvailNotifRQAvailStatusMessages; hotelAvailNotifRQAvailStatusMessages.HotelCode = businessShortname; List<AvailStatusMessageType> availStatusMessages = null; if (status != AvailabilityStatusType.Close) { availStatusMessages = GetRateRestrictions(businessShortname, roomTypeId, ratePlanId, status, startDate, endDate); } else { availStatusMessages = new List<AvailStatusMessageType> { GetCloseRestrictionRates(roomTypeId, ratePlanId, startDate, endDate) }; } if (availStatusMessages != null) { hotelAvailNotifRQAvailStatusMessages.AvailStatusMessage = availStatusMessages.ToArray(); SetLocatorId(hotelAvailNotifRq); PPCGateway.Publish(hotelAvailNotifRq); } return true; }
/// <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; }
/// <summary> /// Get rates restriction from RateCacheList /// </summary> /// <param name="dailyRateCacheList">Daily Rate List</param> /// <returns>AvailStatusMessageType list</returns> private IEnumerable<AvailStatusMessageType> GetRateRestrictionsFromRateCacheList(ICollection<RateCache> dailyRateCacheList, AvailabilityStatusType status = AvailabilityStatusType.Open) { if (dailyRateCacheList == null || dailyRateCacheList.Count == 0) { return null; } var startDate = DateTime.UtcNow.Date; var availStatusMessages = new List<AvailStatusMessageType>(); foreach (var dailyRate in dailyRateCacheList) { if (dailyRate.Date >= startDate.Date) { var restrictionRate = GetRestrictionRates(dailyRate, status); var lastRestrictionRate = availStatusMessages.LastOrDefault(); if (CompareAvailStatus(restrictionRate, lastRestrictionRate)) { lastRestrictionRate.StatusApplicationControl.End = restrictionRate.StatusApplicationControl.End; } else { availStatusMessages.Add(restrictionRate); } } } //Add restriction on arrival Message var restrictionOnArrivalStatusMessages = GetRestrictionOnArrivalStatusMessages(availStatusMessages); availStatusMessages.AddRange(restrictionOnArrivalStatusMessages); return availStatusMessages; }
/// <summary> /// Get Rate restrictions for a business /// </summary> /// <param name="businessId">Business Id</param> /// <param name="status">AvailabilityStatusType</param> /// <returns>List of Avail Status</returns> private List<AvailStatusMessageType> GetRateRestrictions(long businessId, AvailabilityStatusType status = AvailabilityStatusType.Open) { var roomsType = roomTypeManager.GetAllActiveWithRatePlansForBusiness(businessId, RatePlanTypeEnum.Unknown); var availStatusMessages = new List<AvailStatusMessageType>(); foreach (var roomType in roomsType) { var ratesByRoomType = rateCacheManager.GetAllByRoomTypeAndRatePlanId(businessId, roomType.Id, int.Parse(roomType.Code), RatePlanTypeEnum.Unknown); var restrictionMinimumStayThrough = ResetRestrictionThroughRates(roomType.Id, int.Parse(roomType.Code), status); availStatusMessages.Add(restrictionMinimumStayThrough); availStatusMessages.AddRange(GetRateRestrictionsFromRateCacheList(ratesByRoomType, status)); } return availStatusMessages; }
/// <summary> /// Get rate restrictions for a rate plan /// </summary> /// <param name="businessShortName">business short name</param> /// <param name="roomTypeId">Room Type Id</param> /// <param name="ratePlanId">Rate Plan Id</param> /// <returns>List of Avail Status</returns> private List<AvailStatusMessageType> GetRateRestrictions(string businessShortName, int roomTypeId, int ratePlanId, AvailabilityStatusType status = AvailabilityStatusType.Open, DateTime? startDate = null, DateTime? endDate = null) { var ratesByRoomType = new List<RateCache>(); if (startDate.HasValue && endDate.HasValue) { ratesByRoomType = rateCacheManager.GetRatesByRoomTypeIdRatePlanIdAndDateRange(businessShortName, roomTypeId, ratePlanId, startDate.Value, endDate.Value); } else { ratesByRoomType = rateCacheManager.GetAllByRoomTypeAndRatePlanId(businessShortName, roomTypeId, ratePlanId, RatePlanTypeEnum.Unknown); } var list = GetRateRestrictionsFromRateCacheList(ratesByRoomType, status); if (list == null) { return null; } return list.ToList(); }
/// <summary> /// Send rates restriction update for a business /// </summary> /// <param name="businessId">Busisness Id</param> /// <param name="businessShortname">Business short name</param> /// <param name="status">AvailabilityStatusType</param> /// <returns>True if it is a success</returns> public bool SendRatesRestrictionUpdate(string businessShortname, long businessId, AvailabilityStatusType status) { var hotelAvailNotifRq = new OTA_HotelAvailNotifRQ(); var hotelAvailNotifRQAvailStatusMessages = new OTA_HotelAvailNotifRQAvailStatusMessages(); hotelAvailNotifRq.AvailStatusMessages = hotelAvailNotifRQAvailStatusMessages; hotelAvailNotifRQAvailStatusMessages.HotelCode = businessShortname; var availStatusMessages = GetRateRestrictions(businessId, status); if (availStatusMessages != null) { hotelAvailNotifRQAvailStatusMessages.AvailStatusMessage = availStatusMessages.ToArray(); SetLocatorId(hotelAvailNotifRq); PPCGateway.Publish(hotelAvailNotifRq); } return true; }