Пример #1
0
        /// <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;
        }
Пример #2
0
        /// <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;
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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;
        }
Пример #5
0
        /// <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;
        }
Пример #6
0
        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;
        }
Пример #7
0
        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;
        }
Пример #8
0
        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);
        }