/// <summary> /// This method will handle updates for a provider /// </summary> /// <param name="subscriberByOptinList">List of providers opted into AIG</param> /// <param name="providerChangeMessage">Provider change message</param> /// <returns>True is successful otherwise False</returns> private bool HandleProviderUpdate(SubscriberByOptinList subscriberByOptinList, ProviderChangeMessage providerChangeMessage) { object providerDistributionMessage; switch (providerChangeMessage.ChangeType) { case ChangeType.Insert: if (providerChangeMessage.SubscriberId == Guid.Empty) { foreach (var subscriberId in subscriberByOptinList.GetSubscribers()) { providerDistributionMessage = CreateProviderDistributionChangeMessage(subscriberId, providerChangeMessage.ProviderId, ChangeType.Insert); return providerDistributionMessage != null && QueueMessage(providerDistributionMessage); } } else { if (providerChangeMessage.IsAvailabilityReset) { providerDistributionMessage = CreateProviderAvailabilityResetMessage(providerChangeMessage.SubscriberId, providerChangeMessage.ProviderId); } else if (providerChangeMessage.IsProviderReset) { providerDistributionMessage = CreateProviderResetMessage(providerChangeMessage.SubscriberId, providerChangeMessage.ProviderId); } else { providerDistributionMessage = CreateProviderDistributionChangeMessage(providerChangeMessage.SubscriberId, providerChangeMessage.ProviderId, ChangeType.Insert); } return providerDistributionMessage != null && QueueMessage(providerDistributionMessage); } break; case ChangeType.Update: // The providerChangeMessage.SubscriberId will always be empty so send a message for all subscribers foreach (var subscriberId in subscriberByOptinList.GetSubscribers()) { providerDistributionMessage = CreateProviderDistributionChangeMessage(subscriberId, providerChangeMessage.ProviderId, ChangeType.Update); return providerDistributionMessage != null && QueueMessage(providerDistributionMessage); } break; case ChangeType.Delete: providerDistributionMessage = CreateProviderDistributionChangeMessage(providerChangeMessage.SubscriberId, providerChangeMessage.ProviderId, ChangeType.Delete); return providerDistributionMessage != null && QueueMessage(providerDistributionMessage); } return true; }
/// <summary> /// This method will handle updates for a room type /// </summary> /// <param name="subscriberByOptinList">List of providers opted into AIG</param> /// <param name="roomTypeChangeMessage">RoomType change message</param> /// <returns>True is successful otherwise False</returns> private bool HandleRoomTypeUpdate(SubscriberByOptinList subscriberByOptinList, RoomTypeChangeMessage roomTypeChangeMessage) { var businessId = roomTypeChangeMessage.ProviderId.ToLong(); var roomTypeId = roomTypeChangeMessage.ProductTypeId.ToInt(); var provider = businessManager.GetBusinessInformationForIntegration(businessId); var roomTypesByRatePlan = roomTypeManager.GetAllActiveWithRatePlansForBusinessByRoomTypeId(businessId, roomTypeId, RatePlanTypeEnum.Base); //Room Types not found if (roomTypesByRatePlan == null || roomTypesByRatePlan.Count == 0) { return true; } //Always handle a delete first if (roomTypeChangeMessage.ChangeType == ChangeType.Delete) { //remove the room type and rate plans from all subscribers foreach (var subscriberId in subscriberByOptinList.GetSubscribers()) { if (roomTypesByRatePlan.Select(roomType => CreateRemoveProductMessage(subscriberId, roomTypeChangeMessage.ProviderId, roomType.ProductId)).Any(removeProductMessage => !QueueMessage(removeProductMessage))) { return false; } } return true; } //Insert or full update if (roomTypeChangeMessage.ChangeType == ChangeType.Insert || roomTypeChangeMessage.IsFullUpdate) { foreach (var roomType in roomTypesByRatePlan) { var interfaceProduct = ConvertRoomTypeToAigProduct(roomType, provider.CheckinTime, provider.CheckoutTime); interfaceProduct.RatesRestrictionsDateRange = ExtractRateRestrictions(provider.Id, new Guid(roomType.ProductId)); CheckPriceRatesExists(interfaceProduct, roomTypeChangeMessage.ProviderId); //create a product add message against all subscribers for room type and rate plans foreach (var subscriberId in subscriberByOptinList.GetSubscribers()) { if (!QueueMessage(CreateProductAddRemoveMessage(interfaceProduct, subscriberId, roomTypeChangeMessage.ProviderId))) { return false; } } } return true; } //Update if (roomTypeChangeMessage.ChangeType == ChangeType.Update) { if (roomTypeChangeMessage.IsAttributeUpdate) { foreach (var roomType in roomTypesByRatePlan) { var interfaceProduct = SetAigProductAttributes(roomType, provider.CheckinTime, provider.CheckoutTime); //create a attribute update against all subscribers for room type and rate plans if (subscriberByOptinList.GetSubscribers().Any(subscriberId => !QueueMessage(CreateProductAttributeChangeMessage(interfaceProduct, subscriberId, roomTypeChangeMessage.ProviderId)))) { return false; } } } else if (roomTypeChangeMessage.IsConfigurationUpdate) { foreach (var roomType in roomTypesByRatePlan) { AIGProduct interfaceProduct = null; SetAigProductConfiguration(roomType, ref interfaceProduct); //create a configuration update against all subscribers for room type and rate plans if (subscriberByOptinList.GetSubscribers().Any(subscriberId => !QueueMessage(CreateProductConfigurationChangeMessage(interfaceProduct, subscriberId, roomTypeChangeMessage.ProviderId)))) { return false; } } } return true; } return true; }
/// <summary> /// This method will handle updates for a rate plan /// </summary> /// <param name="subscriberByOptinList">List of providers opted into AIG</param> /// <param name="rateChangeMessage">RatePlan change message</param> /// <returns>True is successful otherwise False</returns> private bool HandleRatePlanUpdate(SubscriberByOptinList subscriberByOptinList, RatePlanChangeMessage rateChangeMessage) { switch (rateChangeMessage.ChangeType) { //for an insert of a new rate plan we need to generate a new room type message with the associated room type / rate plan information case ChangeType.Insert: { var provider = businessManager.GetBusinessInformationForIntegration(rateChangeMessage.ProviderId.ToLong()); var roomTypeRatePlan = roomTypeManager.GetByRoomTypeIdAndRatePlanId(Helper.GetRoomTypeIdFromProductGuid(rateChangeMessage.ProductTypeId), Helper.GetRatePlanIdFromProductGuid(rateChangeMessage.ProductTypeId)); //only handle base rate plans for now if (roomTypeRatePlan.RatePlanTypeCode != RatePlanTypeEnum.Base.GetCode()) { return true; } var interfaceProduct = ConvertRoomTypeToAigProduct(roomTypeRatePlan, provider.CheckinTime, provider.CheckoutTime); interfaceProduct.RatesRestrictionsDateRange = ExtractRateRestrictions(provider.Id, rateChangeMessage.ProductTypeId); CheckPriceRatesExists(interfaceProduct, rateChangeMessage.ProviderId); //create message for each subscriber if (subscriberByOptinList.GetSubscribers().Any(subscriberId => !QueueMessage(CreateProductAddRemoveMessage(interfaceProduct, subscriberId, rateChangeMessage.ProviderId)))) { return false; } break; } case ChangeType.Update: case ChangeType.Delete: { var rateRestrictions = ExtractRateRestrictions(rateChangeMessage.ProviderId.ToLong(), rateChangeMessage.ProductTypeId); if (rateRestrictions == null) { Logger.Info(String.Format("RoomType setup incomplete: No rate restrictions found for business {0} with room type {1}", rateChangeMessage.ProviderId, rateChangeMessage.ProductTypeId)); } else { foreach (var subscriberId in subscriberByOptinList.GetSubscribers()) { if (rateRestrictions.EndDate > DateTime.Now.Date) { var rateRestrictionChange = CreateProductRestrictionChangeMessage(subscriberId, rateChangeMessage.ProviderId, rateChangeMessage.ProductTypeId, rateRestrictions); if (!QueueMessage(rateRestrictionChange)) { return false; } } else { Logger.Info(string.Format("The daily rates with id {0} changed was for a prior time period", Helper.GetRatePlanIdFromProductGuid(rateChangeMessage.ProductTypeId))); } } } } break; } return true; }
/// <summary> /// This method will call the queue handler /// </summary> /// <param name="subscriberByOptinList">Subscriber by optin price type list</param> /// <param name="inventoryChangeMessage">Booking update item to process</param> /// <returns>True is successful otherwise False</returns> private bool HandleInventoryUpdate(SubscriberByOptinList subscriberByOptinList, InventoryChangeMessage inventoryChangeMessage) { foreach (var subscriberId in subscriberByOptinList.GetSubscribers()) { return QueueMessage(CreateProductAvailabilityChangeMessage(subscriberId, inventoryChangeMessage, inventoryChangeMessage.ChangeType)); } return true; }