Реклама

Обзор

Этот API позволяет указывать возможные скидки. Из указанных промоакций Google применяет ту, которая позволяет получить самую низкую цену. Если вам нужен API, который поддерживает произвольные корректировки цен, позволяющие увеличивать или уменьшать цену при выполнении условий, используйте Rate Modifications API. Если используются оба API, то сначала применяются изменения тарифов, а затем – промоакции.

Запросы

Синтаксис

Сообщение Promotions использует следующий синтаксис:

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner= "partner_key"
            id="message_ID"
            timestamp="timestamp">
  <HotelPromotions hotel_id="HotelID" action="[overlay]">
    <Promotion id="PromotionID" action="[delete]">
      <BookingDates>
        <DateRange start="YYYY-MM-DD[THH:mm:ss]" end="YYYY-MM-DD[THH:mm:ss]"
          days_of_week="MTWHFSU_or_subset"/>
        <DateRange start="YYYY-MM-DD[THH:mm:ss]" end="YYYY-MM-DD[THH:mm:ss]"
          days_of_week="MTWHFSU_or_subset"/>
      </BookingDates>
      <BookingWindow min="integer_or_duration" max="integer_or_duration"/>
      <Ceiling amount_per_night="float"/>
      <Floor amount_per_night="float"/>
      <CheckinDates>
        <DateRange start="[YYYY-]MM-DD" end="[YYYY-]MM-DD" days_of_week="MTWHFSU_or_subset"/>
      </CheckinDates>
      <CheckoutDates>
        <DateRange start="[YYYY-]MM-DD" end="[YYYY-]MM-DD" days_of_week="MTWHFSU_or_subset"/>
      </CheckoutDates>
      <!-- Specify only one of percentage, percentage_of_base, fixed_amount,
           fixed_amount_per_night, fixed_price, or fixed_price_per_night;
           applied_nights is only used with percentage, fixed_amount_per_night,
           and fixed_price_per_night. -->
      <Discount percentage="float" percentage_of_base="float"
                fixed_amount="float" fixed_amount_per_night="float"
                fixed_price="float" fixed_price_per_night="float"
                applied_nights="integer_1_to_99" rank="integer_1_to_99">
        <!-- FreeNights may not be used in conjunction with attributes on Discount -->
        <FreeNights stay_nights="integer" discount_nights="integer"
                    discount_percentage="float" night_selection="[cheapest|last]"
                    repeats="boolean"/>
      </Discount>
      <!-- Exactly one of Discount or BestDailyDiscount must be specified.
           Specify only one of percentage, fixed_amount, or fixed_price. -->
      <BestDailyDiscount percentage="float" fixed_amount="float" fixed_price="float"/>
      <Devices>
        <Device type="[desktop|tablet|mobile]"/>
      </Devices>
      <InventoryCount min="integer" max="integer"/>
      <LengthOfStay min="integer" max="integer"/>
      <MembershipRateRule id="RateRuleID"/>
      <MinimumAmount before_discount="integer"/>
      <Occupancy min="integer" max="integer"/>
      <RatePlans>
        <RatePlan id="PackageID_1"/>
        <RatePlan id="PackageID_2"/>
      </RatePlans>
      <RoomTypes>
        <RoomType id="RoomID_1"/>
        <RoomType id="RoomID_2"/>
      </RoomTypes>
      <Stacking type="[any|base|none|second]"/>
      <StayDates application="[all|any|overlap]">
        <DateRange start="[YYYY-]MM-DD" end="[YYYY-]MM-DD" days_of_week="MTWHFSU_or_subset"/>
      </StayDates>
      <UserCountries type="[include|exclude]">
        <Country code="country_code"/>
      </UserCountries>
    </Promotion>
  </HotelPromotions>
</Promotions>

Элементы и атрибуты

Сообщение Promotions содержит следующие элементы и атрибуты:

Элемент / @атрибут Количество Тип Описание
Promotions 1 Complex element Корневой элемент сообщения о промоакциях.
Promotions / @partner 1 string Аккаунт партнера для этого сообщения. Это строковое значение, которое соответствует значению "Ключ партнера" на странице настроек аккаунта в Hotel Center.

Если у вас есть серверная часть, которая предоставляет фиды для нескольких аккаунтов, это значение должно совпадать со значением атрибута ID, указанным в элементе <RequestorID> ваших сообщений <OTA_HotelRateAmountNotifRQ> и <OTA_HotelAvailNotifRQ> для того же аккаунта.

Promotions / @id 1 string Уникальный идентификатор этого сообщения запроса. Это значение возвращается в ответном сообщении. Допустимые символы: a–z, A–Z, 0–9, _ (подчеркивание) и - (дефис).
Promotions / @timestamp 1 DateTime Дата и время создания этого сообщения.
Promotions / HotelPromotions 0..n HotelPromotions

Промоакции для объекта. Каждая промоакция применяется к одному объекту.

Если не используется <Stacking>, то при наличии нескольких промоакций к бронированию применяется та, которая предлагает наибольшую скидку.

Promotions / HotelPromotions / @hotel_id 1 string Уникальный идентификатор ресурса. Это значение должно совпадать с идентификатором гостиницы, указанным с помощью <id> в элементе <listing> в фиде со списком отелей. Идентификатор гостиницы также указан в Hotel Center.
Promotions / HotelPromotions / @action 0..1 enum

Если значение указано, оно должно быть равно "overlay". Если задано значение "overlay", то все сохраненные промоакции удаляются перед сохранением промоакций, указанных в текущем сообщении.

Если значение не указано, то для каждой промоакции, указанной в текущем сообщении, выполняется одно из следующих действий:

  • Added (если ни у одной из сохраненных промоакций нет такого же значения id)
  • Updated (если у сохраненной промоакции такой же атрибут id)
  • Deleted (если у сохраненной промоакции такой же атрибут id, а значение атрибута action для промоакции, указанной в текущем сообщении, – "delete")
Promotions / HotelPromotions / Promotion 0..99 Promotion

Одна промоакция для объекта. Обратите внимание, что если не указать action="overlay" и <Promotion>, будут удалены все промоакции для объекта.

Если вам нужно использовать больше 99 промоакций, обратитесь к техническому менеджеру аккаунта.

Promotions / HotelPromotions / Promotion / @id 1 string Уникальный идентификатор промоакции. Максимальное количество символов – 40. Допустимые символы: a–z, A–Z, 0–9, _ (подчеркивание), - (дефис) и . (точка).
Promotions /HotelPromotions / Promotion / @action 0..1 enum

Если значение указано, оно должно быть равно delete. Если значение не указано и промоакция с таким же идентификатором id не сохранена, то сохраняется эта промоакция. Если же значение не указано, а промоакция с таким же идентификатором id уже есть, то она будет обновлена.

Если указан атрибут delete, сохраненная промоакция с тем же значением атрибута id удаляется. Если вы используете delete, не добавляйте дочерние элементы в <Promotion>. Кроме того, delete нельзя использовать вместе с <HotelPromotions action="overlay"/>.

Promotions / HotelPromotions / Promotion / BookingDates 0..1 BookingDates Контейнер для одного или нескольких диапазонов, определяющих, когда должно быть выполнено бронирование, чтобы можно было применить промоакцию.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange 1..99 DateRange Диапазон дат, в течение которого должно быть выполнено бронирование, чтобы можно было применить промоакцию.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @start 0..1 Date или DateTime

Дата или дата и время начала диапазона (в часовом поясе ресурса).

  • Дата или дата и время, указанные в поле start, должны быть раньше или совпадать с датой или датой и временем, указанными в поле end.
  • Если параметр start не указан, диапазон времени начала не ограничен.
  • Если значение start указано в формате даты "ГГГГ-ММ-ДД", оно интерпретируется как дата и время "ГГГГ-ММ-ДДT00:00:00".
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @end 0..1 Date или DateTime

Дата или дата и время окончания диапазона (включительно) по часовому поясу ресурса.

  • Дата или время, указанные в поле end, должны быть позже или совпадать с датой или временем, указанными в поле start.
  • Если значение end не указано, то диапазон не ограничен по времени окончания.
  • Если значение end указано в формате даты "ГГГГ-ММ-ДД", оно интерпретируется как дата и время "ГГГГ-ММ-ДДT23:59:59".
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @days_of_week 0..1 string

Дни недели, которые разрешены в диапазоне дат. Если не указано, разрешены все дни в диапазоне дат. Каждый символ в строке обозначает день. Например, MTWHF означает, что в диапазоне дат разрешены будние дни.

Допустимые символы:

  • M для понедельника;
  • T во вторник
  • W для среды
  • H – четверг;
  • F для пятницы;
  • S – суббота.
  • U – воскресенье.

Допустимы любые комбинации символов.

Promotions / HotelPromotions / Promotion / BookingWindow 0..1 BookingWindow Указывает период времени, в течение которого должно быть выполнено бронирование, относительно даты заезда (на основе часового пояса объекта). Например, можно указать, что бронирование должно быть выполнено не менее чем за 7 дней и не более чем за 180 дней до даты заезда.
Promotions / HotelPromotions / Promotion / BookingWindow / @min 0..1 integer or duration Минимальный срок до заезда, в течение которого должно быть оформлено бронирование, чтобы к нему была применена промоакция. Если значение не указано или равно 0, минимального уровня нет.

Допустимые типы значений:

  • Целое число. Количество дней до даты заезда. Например, значение 30 указывает, что промоакция применяется только к бронированиям, сделанным не менее чем за 30 дней до даты заезда.
  • Продолжительность в формате ISO 8601 (дни, часы и минуты). Количество дней (и, при необходимости, часов и минут) до даты заезда. Например, значение P30D указывает, что промоакция применяется только к бронированиям, сделанным не менее чем за 30 дней до даты заезда. Значение P30DT6H означает, что бронирование должно быть оформлено не позднее 18:00 за 30 дней до прибытия.
Promotions / HotelPromotions / Promotion / BookingWindow / @max 0..1 integer or duration Максимальное количество дней до даты заезда, за которое нужно забронировать номер, чтобы получить скидку. Если значение не указано или равно 0, максимальное значение не задано.

Допустимые типы значений:

  • Целое число. Количество дней до даты заезда. Например, значение 30 указывает, что промоакция применяется только к бронированиям, сделанным не ранее чем за 30 дней до даты заезда.
  • Продолжительность в формате ISO 8601 (дни, часы и минуты). Количество дней (и, при необходимости, часов и минут) до даты заезда. Например, значение P30D указывает, что промоакция применяется только к бронированиям, сделанным не ранее чем за 30 дней до даты заезда. Значение P30DT6H означает, что бронирование должно быть оформлено не ранее 18:00 за 30 дней до прибытия.
Promotions / HotelPromotions / Promotion / Ceiling 0..1 Ceiling

Определяет ограничения на максимальное значение, которое может быть установлено для тарифа после применения промоакций.

В промоакциях всегда должны быть указаны атрибуты <Discount> или <BestDailyDiscount>. Чтобы создать промоакцию, в которой применяется только атрибут <Ceiling>, можно задать атрибут <Discount> со значением 0 атрибута percentage.

Если настроено суммирование, то к одному бронированию может применяться несколько промоакций с атрибутом <Ceiling>. Сначала применяется скидка, а затем – ограничение. В примере ниже показано, как каждый предел влияет на расчет следующего промокупона в наборе.

Пример:

Расчет цены за одну ночь, если AmountBeforeTax составляет 100 и действуют две промоакции:

  1. Промоакция с типом суммирования base, значением fixed_amount, равным 25, и максимальным значением amount_per_night, равным 60.
  2. Промоакция с типом суммирования second, fixed_amount 25 и максимальной скидкой amount_per_night 90

Вот порядок расчета:

  1. Сначала применяется промоакция base, которая снижает цену с AmountBeforeTax до 75, а затем применяется ограничение, которое снижает цену до 60.
  2. Промоакция second снижает цену AmountBeforeTax с 60 до 35. Это значение ниже верхнего предела в 90, поэтому второй верхний предел не применяется. Итоговая ставка – 35.

Тот факт, что 60 – это более строгое общее ограничение, не имеет значения, поскольку оно действительно только для собственной промоакции, и не может быть единого ограничения, охватывающего весь стек промоакций.

Promotions / HotelPromotions / Promotion / Ceiling / @amount_per_night 1 float

Максимальная цена за ночь, которая может быть установлена после применения скидки.

Если также указан элемент <Floor>, значение должно быть больше или равно атрибуту amount_per_night в <Floor>.

amount_per_night применяется к налогам и сборам, когда они включены в стоимость за ночь с помощью AmountAfterTax, но не к тем, которые указаны с помощью TaxFeeInfo.

Promotions / HotelPromotions / Promotion / Floor 0..1 Floor

Определяет ограничения на минимальное значение, которое может быть установлено для тарифа после применения промоакций.

В промоакциях всегда должны быть указаны атрибуты <Discount> или <BestDailyDiscount>. Чтобы создать промоакцию, в которой применяется только атрибут <Floor>, можно задать атрибут <Discount> со значением 0 атрибута percentage.

Логика <Floor> по-прежнему применяется к скидкам <FreeNights>, даже если к бесплатной ночи применяется скидка 100%.

Если настроено суммирование, то к одному бронированию может применяться несколько промоакций с атрибутом <Floor>. Для каждого промокупона будет применяться скидка, а затем минимальная цена. В примере ниже показано, как каждая минимальная цена влияет на расчет следующего промоакции в пакете.

Пример:

Расчет цены за одну ночь, если AmountBeforeTax составляет 100 и действуют две промоакции:

  1. Промоакция с типом суммирования base, fixed_amount 25 и минимальной amount_per_night 90
  2. Промоакция с типом суммирования second, значением fixed_amount, равным 25, и минимальной суммой покупки amount_per_night, равной 60.

Вот порядок расчета:

  1. Сначала применяется промоакция base, которая снижает цену AmountBeforeTax до 75, но затем минимальная цена повышает ее до 90.
  2. Промоакция second снижает цену AmountBeforeTax с 90 до 65. Это выше минимальной цены, равной 60, поэтому вторая минимальная цена не применяется. Итоговый показатель – 65.

Тот факт, что 90 – это более строгая минимальная цена, не имеет значения, поскольку она действительна только для своего промоакции, и не может быть единой минимальной цены, которая охватывает весь стек промоакций.

Promotions / HotelPromotions / Promotion / Floor / @amount_per_night 1 float

Минимальная цена за ночь, которая может быть установлена после применения скидки.

Если также указан элемент <Ceiling>, значение должно быть меньше или равно значению атрибута amount_per_night в <Ceiling>.

amount_per_night применяется к налогам и сборам, когда они включены в стоимость за ночь с помощью AmountAfterTax, но не к тем, которые указаны с помощью TaxFeeInfo.

Promotions / HotelPromotions / Promotion / CheckinDates 0..1 CheckinDates Контейнер для одного или нескольких диапазонов дат, определяющих, когда должна произойти регистрация, чтобы промоакция была применена.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange 1..20 DateRange

Диапазон дат, в который должен произойти заезд, чтобы применилось специальное предложение. Если вы удаляете одну или несколько промоакций, этот элемент не требуется.

Также поддерживается формат YearlessDate.

  • Если в одном из полей (start или end) указана дата без года, то и во втором поле должна быть указана дата без года.
  • Диапазоны дат без указания года не должны переходить на следующий год. Вместо этого разделите его на два смежных диапазона. Например, {"12-29", "01-05"} можно представить как {"12-29", "12-31"} и {"01-01", "01-05"}.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @start 0..1 Date or YearlessDate Дата начала диапазона дат (включая ее) в часовом поясе ресурса. Эта дата должна быть не позже даты end. Если параметр start не указан, то диапазон дат не ограничен датой начала.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @end 0..1 Date or YearlessDate Дата окончания диапазона дат (включительно) по часовому поясу ресурса. Эта дата должна совпадать с датой start или быть позже нее. Если параметр end не указан, диапазон дат не ограничен датой окончания.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @days_of_week 0..1 string

Дни недели, которые разрешены в диапазоне дат. Если не указано, разрешены все дни в диапазоне дат. Каждый символ в строке обозначает день. Например, MTWHF означает, что в диапазоне дат разрешены будние дни.

Допустимые символы:

  • M для понедельника;
  • T во вторник
  • W для среды
  • H – четверг;
  • F для пятницы;
  • S – суббота.
  • U – воскресенье.

Допустимы любые комбинации символов.

Promotions / HotelPromotions / Promotion / CheckoutDates 0..1 CheckoutDates Контейнер для одного или нескольких диапазонов дат, определяющих, когда должен произойти выезд, чтобы можно было применить промоакцию.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange 1..20 DateRange

Диапазон дат, в который должен произойти выезд, чтобы промоакция была применена. Этот элемент не является обязательным, если вы удаляете одну или несколько промоакций.

Также поддерживается формат YearlessDate.

  • Если в одном из полей (start или end) указана дата без года, то и во втором поле год указывать не нужно.
  • Диапазоны дат без указания года не должны переходить на следующий год. Вместо этого разделите его на два смежных диапазона. Например, {"12-29", "01-05"} можно представить как {"12-29", "12-31"} и {"01-01", "01-05"}.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @start 0..1 Date or YearlessDate Дата начала диапазона дат (включая ее) в часовом поясе ресурса. Эта дата должна быть не позже даты end. Если параметр start не указан, то диапазон дат не ограничен датой начала.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @end 0..1 Date or YearlessDate Дата окончания диапазона дат (включительно) по часовому поясу ресурса. Эта дата должна совпадать с датой start или быть позже нее. Если параметр end не указан, диапазон дат не ограничен датой окончания.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @days_of_week 0..1 string

Дни недели, которые разрешены в диапазоне дат. Если не указано, разрешены все дни в диапазоне дат. Каждый символ в строке обозначает день. Например, MTWHF означает, что в диапазоне дат разрешены будние дни.

Допустимые символы:

  • M для понедельника;
  • T во вторник
  • W для среды
  • H – четверг;
  • F для пятницы;
  • S – суббота.
  • U – воскресенье.

Допустимы любые комбинации символов.

Promotions / HotelPromotions / Promotion / Devices 0..1 Devices Контейнер для списка устройств пользователя, которые соответствуют условиям промоакции. Если указано, то только пользователи, соответствующие требованиям, на перечисленных устройствах получат цену со скидкой. Если не указать, то цена со скидкой будет предлагаться соответствующим требованиям пользователям на любых устройствах.
Promotions / HotelPromotions / Promotion / Devices / Device 1..3 Device Определяет один тип пользовательского устройства, которое подходит для промоакции.
Promotions / HotelPromotions / Promotion / Devices / Device / @type 1 enum Тип устройства. Возможное значение: desktop, tablet или mobile.
Promotions / HotelPromotions / Promotion / Discount 1 Discount

Необходимо указать только одно значение: Discount или BestDailyDiscount.

Указывает скидку, которая будет применяться в рамках этой промоакции.

Promotions / HotelPromotions / Promotion / Discount / @percentage 0..1 float

Необходимо указать только одно из следующих значений: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price или fixed_price_per_night.

Десятичное значение от 0 до 100, которое указывает процент скидки. Оно применяется к свойству AmountAfterTax (или AmountBeforeTax, если свойство AmountAfterTax не указано).

Примеры:

  • Если AmountAfterTax равно 100, а percentage – 20, то

    promotion rate = AmountAfterTax * (1 - процентная скидка)

    80,00 = 100 * (1 - 0,2)

  • Если AmountBeforeTax равно 100, percentage равно 20, а в TaxFeeInfo указан налог 10, то:

    цена со скидкой = AmountBeforeTax * (1 - скидка в процентах) + налог

    90,00 = 100 * (1 - 0,2) + 10

Promotions / HotelPromotions / Promotion / Discount / @percentage_of_base 0..1 float

Необходимо указать только одно из следующих значений: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price или fixed_price_per_night.

Десятичное значение от 0 до 100, которое указывает процент базовой скидки. Как и percentage, оно применяется к AmountAfterTax (или к AmountBeforeTax, если AmountAfterTax не указано).

В отличие от percentage, эта скидка всегда рассчитывается как процент от базовых цен, независимо от того, какие специальные предложения применялись ранее.

Пример:

  • Предположим, что у нас есть две промоакции, которые применяются последовательно к одной ночи проживания стоимостью 100. Первая – обычная скидка 10 %, а вторая – скидка 10% от базовой цены. Тогда цена со скидкой будет равна 80, поскольку обе промоакции дают скидку 10. Обратите внимание, что если бы вторая промоакция также была обычной процентной скидкой, то цена со скидкой была бы равна 81, поскольку вторая промоакция дает скидку 10% от 90.
Promotions / HotelPromotions / Promotion / Discount / @fixed_amount 0..1 float

Необходимо указать только одно из следующих значений: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price или fixed_price_per_night.

Фиксированная сумма, которая вычитается из суммы цен за AmountAfterTax ночей (или из суммы цен за AmountBeforeTax ночей, если значение AmountAfterTax не указано). Валюта должна совпадать с указанной в тарифе за ночь. Если это значение больше суммы цен за ночь, итоговое значение будет равно нулю.

Примеры:

  • Если мы рассчитываем цену за одну ночь, где AmountBeforeTax – 90, AmountAfterTax – 100, а fixed_amount – 20, то:

    цена со скидкой = AmountAfterTax - фиксированная скидка

    80,00 = 100 - 20

  • Если мы рассчитываем цену за одну ночь, где AmountBeforeTax – 100, fixed_amount – 20, а TaxFeeInfo указывает налог в размере 8%, то:

    цена со скидкой = (AmountBeforeTax - фиксированная скидка) * (1 + процент налога)

    86,40 = (100 - 20) * 1,08

  • Если мы рассчитываем цену за одну ночь, где AmountBeforeTax – 50, fixed_amount – 60, а TaxFeeInfo указывает налог 10, то:

    цена со скидкой = (AmountBeforeTax - фиксированная скидка) * налог

    10,00 = 0 + 10

  • Если мы рассчитываем цену за три ночи, где значения AmountAfterTax равны 100, 110 и 120, а значение fixed_amount равно 150, то:

    promotion rate = sum(AmountAfterTax) - (fixed discount)

    180 = (100 + 110 + 120) - 150

Promotions / HotelPromotions / Promotion / Discount / @fixed_amount_per_night 0..1 float

Необходимо указать только одно из следующих значений: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price или fixed_price_per_night.

Фиксированная скидка, которая применяется к каждой из AmountAfterTax цен за ночь (или к N самых низких цен, если указан параметр applied_nights). Если AmountAfterTax не указано, оно применяется к AmountBeforeTax. Валюта должна совпадать с указанной в цене за ночь. Если значение fixed_amount_per_night больше, чем цена за ночь, то цена за ночь снижается до нуля. Скидка не может привести к отрицательной цене за ночь.

Примеры:

  • Если мы рассчитываем цену за проживание в течение трех ночей, где значения AmountAfterTax равны 100, 110 и 120, а fixed_amount_per_night – 10, то:

    promotion rate = sum(AmountBeforeTax - fixed amount discount)

    300,00 = ((100 - 10) + (110 - 10) + (120 - 10))

  • Если мы рассчитываем цену за проживание в течение трех ночей, где значения AmountAfterTax равны 10, 50 и 100, а значение fixed_amount_per_night равно 20, то:

    promotion rate = sum(AmountAfterTax - fixed amount discount)

    110,00 = (0 + (50 - 20) + (100 - 20))

Promotions / HotelPromotions / Promotion / Discount / @fixed_price 0..1 float

Необходимо указать только одно из следующих значений: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price или fixed_price_per_night.

Если указано AmountAfterTax цен за ночь, то цена за проживание, включая налоги и сборы, будет равна указанному значению. Если указано значение AmountBeforeTax, то независимо от того, указано ли значение AmountAfterTax, цена проживания до уплаты налогов будет равна указанному значению. Валюта должна совпадать с валютой цены за ночь.

Если AmountAfterTax – это процентный налог, то фиксированная цена для AmountBeforeTax может привести к неточному расчету налогов и сборов. В общем случае настоятельно рекомендуется использовать элемент TaxFeeInfo, чтобы указать налоги и сборы для объекта.

Примеры:

  • Если мы рассчитываем цену за одну ночь, где AmountBeforeTax – 90, AmountAfterTax – 100, а fixed_price – 80, то цена по промоакции составит 80.
  • Если мы рассчитываем цену за одну ночь, где AmountBeforeTax – 100, fixed_amount – 80, а TaxFeeInfo указывает налог в размере 8%, то:

    цена в рамках промоакции = фиксированная цена * (1 + процент налога)

    86,40 = 80 * 1,08

  • Если мы рассчитываем цену за три ночи, где значения AmountAfterTax равны 100, 110 и 120, а fixed_amount – 300, то:

    promotion rate = 300

Promotions / HotelPromotions / Promotion / Discount / @fixed_price_per_night 0..1 float

Необходимо указать только одно из следующих значений: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price или fixed_price_per_night.

Если указано AmountAfterTax цен за ночь, то цена за каждую ночь проживания, включая налоги и сборы, устанавливается равной указанному значению. Если указано значение AmountBeforeTax, то независимо от того, указано ли значение AmountAfterTax, цена за ночь без учета налогов будет равна указанному значению. Валюта должна совпадать с валютой цены за ночь.

Если AmountAfterTax должен отражать процентный налог, то установка фиксированной цены для AmountBeforeTax может привести к неточным налогам и сборам. В общем случае настоятельно рекомендуется использовать элемент TaxFeeInfo, чтобы указать налоги и сборы для объекта.

Если указан атрибут applied_nights, то новая цена применяется к N самым дешевым ночам.

Примеры:

  • Если мы рассчитываем цену за проживание в течение двух ночей, где значения AmountBeforeTax равны 90 и 90, значения AmountAfterTax равны 100 и 100, а значение fixed_price равно 80, то цена по промоакции составит 80 + 80 = 160.
  • Если мы рассчитываем цену за две ночи, где AmountBeforeTax – 100, 100; fixed_amount – 80, а TaxFeeInfo указывает налог в размере 8%, то цена со скидкой составит (80 + 80) * 1,08 = 172,8.
  • Если мы рассчитываем цену за три ночи, где значения AmountAfterTax равны 100, 110 и 120, а значение fixed_amount равно 110, то цена со скидкой составит 110 * 3 = 330.
Promotions / HotelPromotions / Promotion / Discount / @applied_nights 0..1 integer

Этот атрибут следует использовать только с атрибутами percentage или fixed_amount_per_night.

Количество ночей, к которым применяется скидка, начиная с самой дешевой. Укажите целое число от 1 до 99. Если не указано, скидка применяется ко всем ночам.

Promotions / HotelPromotions / Promotion / Discount / FreeNights 0..1 FreeNights Скидка на определенные ночи при условии, что длительность пребывания не меньше минимального срока пребывания. Если используется этот элемент, атрибуты в родительском элементе Discount не допускаются.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @stay_nights 1 integer

Количество ночей, необходимое для применения скидки. Каждая скидка применяется к отдельному сегменту ночей проживания.

Например, если гость бронирует номер на 10 ночей, а значение stay_nights равно 4 (и repeats – true), то будет два сегмента: с первой по четвертую ночь и с пятой по восьмую. Девятая и десятая ночи не будут входить в сегмент.

Promotions / HotelPromotions / Promotion / Discount / FreeNights / @discount_nights 1 integer Количество ночей со скидкой в каждом сегменте.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @discount_percentage 1 float Скидка, которая применяется к ночам со скидкой. Если значение равно 50, то каждая выбранная ночь будет стоить на 50% дешевле.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @night_selection 1 string Допустимые значения: cheapest или last. Если last, то скидка применяется к ночам в конце сегмента. Если указано значение cheapest, то скидка применяется к самым дешевым ночам в рамках сегмента.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @repeats 1 boolean

Можно ли применить скидку к нескольким сегментам ночей. Если указано значение false, то скидка будет действовать только на сегмент ночей проживания в начале маршрута. Если задано значение true, то скидка применяется к любому сегменту ночей.

Например, если значение stay_nights равно 4, а продолжительность проживания составляет 10 ночей, то при значении repeats, равном true, скидка будет применена к двум сегментам (ночи 1–4 и 5–8). Если же значение repeats равно false, то скидка будет применена только к одному сегменту (ночи 1–4).

Promotions / HotelPromotions / Promotion / Discount / @rank 0..1 integer Присваивает промоакции ранг и включает ее в ранжированный выбор, в котором применяется только промоакция с самым низким рангом. Значения должны быть в диапазоне от 1 до 99 (включительно). Если у нескольких промоакций одинаковый ранг, то одна из них выбирается и применяется случайным образом.
Promotions / HotelPromotions / Promotion / BestDailyDiscount 1 Discount

Необходимо указать только одно значение: Discount или BestDailyDiscount.

Указывает ежедневную скидку, которая может быть применена к ночи проживания. В отличие от Discount, скидки применяются ко всему периоду проживания.

Для каждого объекта можно указать одну группу специальных предложений, которые считаются лучшими за день. Это значит, что для каждой ночи проживания выбирается и применяется одна "лучшая ежедневная" промоакция, которая соответствует условиям и дает самую большую скидку.

Stacking можно указать вместе с BestDailyDiscount. Допустимые значения: base или none. "Лучшие ежедневные" скидки, дающие максимальную скидку за каждую ночь, объединяются и рассматриваются как единая скидка на проживание (т.е. Discount) с учетом настроенного типа суммирования. Эта комбинированная скидка сравнивается с другими подходящими промоакциями типа <Discount> и может суммироваться с ними, чтобы найти ту, которая обеспечивает наибольшую скидку. Выбирается и применяется комбинация BestDailyDiscount или отдельная Discount (в зависимости от того, что дает более низкую цену) для типа суммирования base.

Для этого типа скидки можно указать StayDates, но для application нужно задать значение overlap.

.
Promotions / HotelPromotions / Promotion / BestDailyDiscount / @percentage 0..1 float

Необходимо указать только одно из следующих значений: percentage, fixed_amount или fixed_price.

Десятичное значение от 0 до 100, которое указывает процент скидки. Оно применяется к свойству AmountAfterTax (или AmountBeforeTax, если свойство AmountAfterTax не указано).

Примеры:

  • Если AmountAfterTax за ночь составляет 100, а percentage – 20, то:

    promotion rate = AmountAfterTax * (1 - процентная скидка)

    80,00 = 100 * (1 - 0,2)

  • Если AmountBeforeTax за ночь составляет 100, percentage – 20, а TaxFeeInfo указывает налог 10, то:

    цена со скидкой = AmountBeforeTax * (1 - скидка в процентах) + налог

    90,00 = 100 * (1 - 0,2) + 10

Promotions / HotelPromotions / Promotion/ BestDailyDiscount / @fixed_amount 0..1 float

Необходимо указать только одно из следующих значений: percentage, fixed_amount или fixed_price.

Фиксированная сумма, которая вычитается из цены за ночь для одного человека (AmountAfterTax) или для двух человек (AmountBeforeTax), если цена AmountAfterTax не указана. Валюта должна совпадать с указанной в тарифе за ночь. Если это значение больше суммы цен за ночь, итоговое значение будет равно нулю.

Примеры:

  • Если AmountBeforeTax за одну ночь составляет 90, AmountAfterTax – 100, а fixed_amount – 20, то:

    цена по акции = AmountAfterTax - фиксированная скидка

    80,00 = 100 - 20

  • Если AmountBeforeTax за одну ночь составляет 100, fixed_amount – 20, а в TaxFeeInfo указан налог 8%, то:

    цена со скидкой = (AmountBeforeTax - фиксированная скидка) * (1 + процент налога)

    86,40 = (100 - 20) * 1,08

Promotions / HotelPromotions / Promotion/ BestDailyDiscount / @fixed_price 0..1 float

Необходимо указать только одно из следующих значений: percentage, fixed_amount или fixed_price.

Если указано AmountAfterTax цен за ночь, то цена за ночь проживания, включая налоги и сборы, устанавливается равной указанному значению. Если указано значение AmountBeforeTax, то независимо от того, указано ли значение AmountAfterTax, цена проживания до уплаты налогов будет равна указанному значению. Валюта должна совпадать с валютой цены за ночь.

Примеры:

  • Если AmountBeforeTax за одну ночь составляет 90, AmountAfterTax – 100, а fixed_price – 80, то промоцена будет равна 80.
  • Если AmountBeforeTax за одну ночь составляет 100, fixed_amount – 80, а TaxFeeInfo указывает налог в размере 8%, то:

    цена в рамках промоакции = фиксированная цена * (1 + процент налога)

    86,40 = 80 * 1,08

Promotions / HotelPromotions / Promotion / InventoryCount 0..1 InventoryCount Ограничения на количество номеров, которые должны быть доступны, чтобы можно было применить промоакцию. Скидка применяется только к тем ночам, которые соответствуют ограничению. Нельзя использовать со скидкой fixed_amount. Обратите внимание, что количество доступных номеров указывается в элементе OTA_HotelInvCountNotifRQ (InvCount) или OTA_HotelAvailNotifRQ (BookingLimit).
Promotions / HotelPromotions / Promotion / InventoryCount / @min 0..1 integer Минимальное количество номеров, которое должно быть доступно, чтобы промоакция применялась к цене за ночь. Если это значение не указано, минимального ограничения нет.
Promotions / HotelPromotions / Promotion / InventoryCount / @max 0..1 integer Максимальное количество номеров, которые должны быть доступны, чтобы промоакция применялась к цене за ночь. Если этот параметр не задан, ограничения нет.
Promotions / HotelPromotions / Promotion / LengthOfStay 0..1 LengthOfStay Определяет ограничения по длительности пребывания, в рамках которых может применяться промоакция. Промоакция не применяется, если длительность пребывания не соответствует минимальному и максимальному ограничениям.
Promotions / HotelPromotions / Promotion / LengthOfStay / @min 0..1 integer Минимальное количество ночей, которое нужно забронировать, чтобы воспользоваться промоакцией. Если это значение не указано, минимального ограничения нет.
Promotions / HotelPromotions / Promotion / LengthOfStay / @max 0..1 integer Максимальное количество ночей, на которое распространяется промоакция. Если этот параметр не задан, ограничения нет.
Promotions / HotelPromotions / Promotion / MembershipRateRule 0..1 MembershipRateRule

Контейнер для правила, которое активирует определенный элемент интерфейса для связанной скидки.

Этот элемент не должен быть указан, если не указан элемент <Discount>.

Promotions / HotelPromotions / Promotion / MembershipRateRule / @id 1 string

Идентификатор правила назначения цен, связанного с программой лояльности.

Promotions / HotelPromotions / Promotion / MinimumAmount 0..1 MinimumAmount Минимальная сумма суточных цен за номер (используется большее из значений AmountBeforeTax или AmountAfterTax), которая должна быть превышена, чтобы промоакция была применена.
Promotions / HotelPromotions / Promotion / MinimumAmount / @before_discount 1 integer Значение, которое должно быть превышено, чтобы промоакция была применена.
Promotions / HotelPromotions / Promotion / Occupancy 0..1 Occupancy Определяет ограничения на количество гостей, для которых применяется промоакция. Промоакция не применяется, если количество гостей не соответствует минимальному и максимальному ограничениям.

Промоакции применяются к цене за маршрут. Установить максимальную скидку на одного гостя нельзя.

Promotions / HotelPromotions / Promotion / Occupancy / @min 0..1 integer Чтобы скидка была применена, указанное пользователем количество гостей должно быть не меньше этого значения.
Promotions / HotelPromotions / Promotion / Occupancy / @max 0..1 integer Чтобы скидка была применена, указанное пользователем количество гостей должно быть не больше этого значения.
Promotions / HotelPromotions / Promotion / RatePlans 0..1 RatePlans Контейнер для списка тарифных планов, к которым применяется промоакция. Если атрибут <RatePlans> не указан, промоакция применяется ко всем тарифным планам.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan 1..n RatePlan Указывает тарифный план. Тарифный план определяется сочетанием пакета, тарифов и доступности, как указано в сообщениях Transaction (Property Data), OTA_HotelRateAmountNotifRQ и OTA_HotelAvailNotifRQ, а также идентифицируется по PackageID.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan / @id 1 string Уникальный идентификатор тарифного плана. Это значение сопоставляется со значением PackageID в <PackageData> в сообщении Transaction (Property Data) и атрибутом RatePlanCode в <StatusApplicationControl> в сообщениях <OTA_HotelRateAmountNotifRQ> и <OTA_HotelAvailNotifRQ>. Максимальное количество символов: 50.
Promotions / HotelPromotions / Promotion / RoomTypes 0..1 RoomTypes Контейнер для списка типов номеров, к которым применяется промоакция. Промоакция применяется к каждому указанному <RoomType>. Если атрибут <RoomTypes> не указан, промоакция применяется ко всем номерам.
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType 1..n RoomType Указывает тип номера. Тип номера определяется в элементе <RoomData> сообщения Transaction (Property Data) и указывается с помощью значения <RoomID>. (На значение <RoomID> также ссылается атрибут InvTypeCode в сообщениях OTA_HotelRateAmountNotifRQ.)
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType / @id 1 string Уникальный идентификатор инвентаря (типа номера). Это значение сопоставляется с элементом <RoomID> в сообщении Transaction (Property Data). Максимальное количество символов: 50.
Promotions / HotelPromotions / Promotion / Stacking 0..1 Stacking Указывает, как можно комбинировать промоакции. Если тип не указан, по умолчанию используется base.
Promotions / HotelPromotions / Promotion / Stacking / @type 1 enum

К одному тарифу можно применить несколько промоакций в зависимости от значения этого параметра:

  • any – промоакцию можно комбинировать с любой другой (кроме none), но порядок их применения не гарантируется.
  • base – сначала выбирается и применяется лучшая из доступных промоакций base, а затем все остальные. Ранее этот параметр назывался base_only.
  • second – выбирается и применяется лучшая подходящая промоакция типа second. Она применяется после промоакции типа base (если применимо) и до промоакций типа any.
  • none: нельзя сочетать с другими промоакциями.

Из разрешенных комбинаций к цене применяется набор промоакций, который дает наибольшую скидку.

Promotions / HotelPromotions / Promotion / StayDates 0..1 StayDates Контейнер для одного или нескольких диапазонов дат, определяющих, как применяется промоакция, например для сезонных скидок.
Promotions / HotelPromotions / Promotion / StayDates / @application 1 enum

Описывает, как должна применяться промоакция.

Допустимые значения:

  • all – промоакция применяется к каждой ночи в маршруте, если все даты в маршруте совпадают с датами пребывания.
  • any – промоакция применяется ко всем ночам в программе пребывания, если любая дата в программе пребывания совпадает с датой в диапазоне дат пребывания.
  • overlap: промоакция применяется только к тем ночам в маршруте, которые совпадают с датами в диапазоне дат пребывания.

Этот атрибут должен быть указан всегда.

  • Если в элементе <Discount> указано значение percentage, а в элементе application – all или any, скидка применяется как процент от стоимости всего проживания.
  • Если в атрибуте <Discount> указано значение percentage, а в атрибуте application – значение overlap, то скидка применяется в виде процента от стоимости проживания за ночь для пересекающихся ночей.
  • Недопустимое сочетание: <Discount> со значением fixed_amount и application со значением overlap.
  • <FreeNights> поддерживает все значения application. Обратите внимание, что для overlap учитываются только пересекающиеся ночи проживания.
Promotions / HotelPromotions / Promotion / StayDates / DateRange 1..99 DateRange

Диапазон дат, в течение которого действует промоакция.

Также поддерживается формат YearlessDate.

  • Если в одном из полей (start или end) указана дата без года, то и во втором поле должна быть указана дата без года.
  • Диапазоны дат без указания года не должны переходить на следующий год. Вместо этого разделите его на два смежных диапазона. Например, {"12-29", "01-05"} можно представить как {"12-29", "12-31"} и {"01-01", "01-05"}.

Если вы хотите задать диапазон StayDates, чтобы промоакция действовала в определенные дни недели, укажите в качестве даты start текущую дату и не задавайте дату end, чтобы срок действия промоакции не истек.

Promotions / HotelPromotions / Promotion / StayDates / DateRange / @start 0..1 Date or YearlessDate Дата начала диапазона дат (включая ее) в часовом поясе ресурса. Эта дата должна быть не позже даты end. Если параметр start не указан, то диапазон дат не ограничен датой начала.

Если значение end не указано, необходимо указать значение start.

Promotions / HotelPromotions / Promotion / StayDates / DateRange / @end 0..1 Date or YearlessDate Дата окончания диапазона дат (включительно) по часовому поясу ресурса. Эта дата должна совпадать с датой start или быть позже нее. Если параметр end не задан, диапазон дат не ограничен, начиная с даты start.

Если значение start не указано, необходимо указать значение end.

Promotions / HotelPromotions / Promotion / StayDates / DateRange / @days_of_week 0..1 string

Дни недели, которые разрешены в диапазоне дат. Если не указано, разрешены все дни в диапазоне дат. Каждый символ в строке обозначает день. Например, MTWHF означает, что в диапазоне дат разрешены будние дни.

Допустимые символы:

  • M для понедельника;
  • T во вторник
  • W для среды
  • H – четверг;
  • F для пятницы;
  • S – суббота.
  • U – воскресенье.

Допустимы любые комбинации символов.

Promotions / HotelPromotions / Promotion / UserCountries 0..1 UserCountries Контейнер для списка местоположений пользователей (стран), в которых действует промоакция. Если указать страны, то цена со скидкой будет предлагаться только соответствующим требованиям пользователям из этих стран. Если не указать страны, то скидка будет доступна пользователям из всех стран.
Promotions / HotelPromotions / Promotion / UserCountries / @type 0..1 enum Тип спецификации UserCountries.

Допустимые значения: include и exclude.

Если для параметра UserCountries type задано значение include, промоакция будет доступна пользователям из указанных стран.

Если для UserCountries type задано значение exclude, промоакция применяется к пользователям из стран, не указанных в списке.

Если значение UserCountries type не задано, оно обрабатывается как include, и промоакция применяется к пользователям из перечисленных стран.

Promotions / HotelPromotions / Promotion / UserCountries / Country 1..300 Country Определяет одну страну, в которой пользователи могут воспользоваться промоакцией.
Promotions / HotelPromotions / Promotion / UserCountries / Country / @code 1 string Код страны по стандарту CLDR, например DE или FR. Обратите внимание, что для некоторых стран код CLDR не совпадает с двухбуквенным кодом ISO. Коды регионов CLDR не поддерживаются.

Примеры

Для одного ресурса можно создать не более 500 промоакций. Чтобы удалить промоакции из ресурса, воспользуйтесь примером "Удаление одной промоакции".

Базовое сообщение

Ниже приведен пример простого сообщения Promotions.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <BookingDates>
         <DateRange start="2020-07-01" end="2020-07-31" days_of_week="MTWHF"/>
         <DateRange start="2020-09-01" end="2020-09-30"/>
      </BookingDates>
      <BookingWindow min="7" max="330"/>
      <CheckinDates>
         <DateRange start="2020-10-01" end="2020-10-31" days_of_week="FSU"/>
      </CheckinDates>
      <CheckoutDates>
         <DateRange start="2020-10-08" end="2020-11-07" days_of_week="FSU"/>
      </CheckoutDates>
      <Devices>
        <Device type="mobile"/>
        <Device type="tablet"/>
      </Devices>
      <Discount percentage="20" applied_nights="2"/>
      <LengthOfStay min="2" max="14"/>
      <RatePlans>
         <RatePlan id="234"/>
         <RatePlan id="567"/>
      </RatePlans>
      <RoomTypes>
         <RoomType id="123"/>
         <RoomType id="456"/>
      </RoomTypes>
      <Stacking type="base"/>
      <UserCountries>
        <Country code="US"/>
        <Country code="GB"/>
      </UserCountries>
    </Promotion>
  </HotelPromotions>
</Promotions>


Состояние инвентаря

В примере ниже показано, как создать скидку, если у вас есть лишние номера, а дата заезда уже близко.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <BookingWindow max="7"/>
      <Discount percentage="10"/>
      <InventoryCount min="3"/>
    </Promotion>
  </HotelPromotions>
</Promotions>


Как удалить одну промоакцию

В примере ниже показано, как удалить одно промоакцию для объекта недвижимости.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1" action="delete"/>
  </HotelPromotions>
</Promotions>

Удалить все промоакции

В примере ниже показано, как удалить все промоакции для ресурса.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1" action="overlay"/>
</Promotions>



Показать все промоакции

В примере ниже показано, как наложить <HotelPromotions> для объекта с одной или несколькими новыми промоакциями. Если action="overlay", все сохраненные промоакции удаляются перед сохранением промоакций, указанных в текущем сообщении:

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1" action="overlay">
    <Promotion id="1">
      <BookingDates>
         <DateRange start="2020-09-01" end="2020-09-30"/>
      </BookingDates>
      <Discount percentage="10"/>
      <RoomTypes>
         <RoomType id="123"/>
         <RoomType id="456"/>
      </RoomTypes>
      <RatePlans>
         <RatePlan id="234"/>
         <RatePlan id="567"/>
      </RatePlans>
      <Stacking type="base"/>
    </Promotion>
  </HotelPromotions>
</Promotions>

Три типа укладки

В примере ниже показан случай, когда применяются три разные промоакции (base, second, any). Обратите внимание, что промоакция none не применяется, поскольку другие промоакции обеспечивают более высокую скидку. Если исходная цена составляла 100 долларов США, то цена со скидкой будет равна 72,90 доллара США.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <Discount percentage="10"/>
      <Stacking type="base"/>
    </Promotion>
    <Promotion id="2">
      <Discount percentage="10"/>
      <Stacking type="second"/>
    </Promotion>
    <Promotion id="3">
      <Discount percentage="10"/>
      <Stacking type="any"/>
    </Promotion>
    <Promotion id="4">
      <Discount percentage="25"/>
      <Stacking type="none"/>
    </Promotion>
  </HotelPromotions>
</Promotions>


Тип стека: нет

В примере ниже используется промоакция none, потому что комбинация других промоакций дает меньшую скидку. Если исходная цена составляла 100 долларов США, то цена со скидкой будет равна 75 долларам США.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <Discount percentage="10"/>
      <Stacking type="base"/>
    </Promotion>
    <Promotion id="2">
      <Discount percentage="10"/>
      <Stacking type="any"/>
    </Promotion>
    <Promotion id="3">
      <Discount percentage="25"/>
      <Stacking type="none"/>
    </Promotion>
  </HotelPromotions>
</Promotions>



Границы продолжительности окна бронирования

В примере ниже показано, как использовать элемент BookingWindow с начальной и конечной границами, заданными в формате ISO 8601. Это ограничение требует, чтобы бронирование было сделано не позднее 18:00 за день до прибытия и не ранее 12:00 за два дня до прибытия.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <BookingWindow min="P1DT6H" max="P2DT12H"/>
      <Discount percentage="20"/>
    </Promotion>
  </HotelPromotions>
</Promotions>


Границы дат и времени бронирования

В примере ниже показано, как элемент BookingDates используется с атрибутами start и end типа DateTime. Это ограничение требует, чтобы бронирование было выполнено в период с 06:30 1 июля 2020 г. до 18:45 2 июля 2020 г.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <BookingDates>
         <DateRange start="2020-07-01T06:30:00" end="2020-07-02T18:45:00"/>
      </BookingDates>
      <Discount percentage="20"/>
    </Promotion>
  </HotelPromotions>
</Promotions>


Диапазоны дат без указания года

В примере ниже элемент CheckInDates содержит элементы DateRanges с полями start и end без указания года. В этом примере промоакция применяется к датам заезда с 29 декабря по 2 января независимо от года. Диапазоны дат без указания года, которые пересекают границу нового года, являются недействительными, поэтому DateRange выражается как два смежных диапазона дат.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <CheckInDates>
         <DateRange start="12-29" end="12-31"/>
         <DateRange start="01-01" end="01-02"/>
      </CheckInDates>
      <Discount percentage="20"/>
    </Promotion>
  </HotelPromotions>
</Promotions>



Скидка FreeNights

В примере ниже показано, как настроить скидку 50% на две ночи за каждые четыре ночи проживания в указанный диапазон дат бронирования. Если вы бронируете номер на 10 ночей, то скидка 50 % будет действовать на четыре ночи.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <BookingDates>
        <DateRange start="2022-01-01" end="2022-05-31"/>
      </BookingDates>
      <Discount>
        <FreeNights stay_nights="4" discount_nights="2" discount_percentage="50" night_selection="cheapest" repeats="true"/>
      </Discount>
    </Promotion>
  </HotelPromotions>
</Promotions>

В следующем примере скидка 50% на одну ночь предоставляется за каждые три ночи проживания в указанные диапазоны дат. Скидка будет действовать только на те ночи, которые входят в период действия акции. Для следующего маршрута с регистрацией заезда 1 января 2022 г. и регистрацией отъезда 7 января 2022 г. соответствующие ночи проживания и скидки применяются следующим образом.

  • 2022-01-01 (проживание)
  • 2022-01-02 (проживание)
  • 2022-01-03
  • 04.01.2022 (со скидкой)
  • 2022-01-05 (проживание)
  • 2022-01-06 (проживание)
<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <StayDates application="overlap">
        <DateRange start="2022-01-01" end="2022-01-02"/>
        <DateRange start="2022-01-04" end="2022-01-06"/>
      </StayDates>
      <Discount>
        <FreeNights stay_nights="3" discount_nights="1" discount_percentage="50" night_selection="last" repeats="true"/>
      </Discount>
    </Promotion>
  </HotelPromotions>
</Promotions>


Выбор с ранжированием

В примере ниже предлагается две скидки: 20% и 15 %. При оценке применяется только скидка 15 %, так как у нее более низкий ранг.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
  <HotelPromotions hotel_id="Property_1">
    <Promotion id="1">
      <Discount percentage="15" rank="25"/>
    </Promotion>
    <Promotion id="2">
      <Discount percentage="20" rank="50"/>
    </Promotion>
  </HotelPromotions>
</Promotions>

BestDailyDiscount

В примере ниже скидка на проживание в течение двух ночей рассчитывается путем применения BestDailyDiscount в сочетании с Discount.

<?xml version="1.0" encoding="UTF-8"?>
<Promotions partner="account_xyz"
            id="123_abc"
            timestamp="2020-05-18T16:20:00-04:00">
 <HotelPromotions hotel_id="HotelID" action="overlay">
   <Promotion id="general">
     <BestDailyDiscount fixed_amount="20"/>
   </Promotion>
   <Promotion id="may">
     <BestDailyDiscount fixed_amount="50"/>
     <StayDates application="overlap">
        <DateRange start="2023-05-01" end="2023-05-31"/>
     </StayDates>
   </Promotion>
   <Promotion id="fiesta">
     <Discount fixed_amount_per_night="5"/>
     <Stacking type="any"/>
   </Promotion>
 </HotelPromotions>
</Promotions>

Рассмотрим проживание в течение двух ночей с 30 апреля по 2 мая 2023 г. Для расчета сначала определяется комбинация лучших ежедневных скидок, которая дает наибольшую скидку.

Для первой ночи подходит только общая промоакция с фиксированной скидкой 20.

Для второй ночи промоакция "may" предлагает большую скидку, чем промоакция "general". Таким образом, если выбран май, фиксированная скидка составит 50.

Затем для проживания промоакция "fiesta" снижает цену до 5 за ночь, или 10 в общей сложности. Ее можно использовать вместе с лучшими ежедневными скидками, потому что для акции fiesta задан тип сочетания any. Если бы значение было равно base, то применялась бы только комбинация лучших ежедневных скидок или скидка "Фиеста". Подробную информацию можно найти в описании Stacking.

`Общая скидка на проживание составит 20 + 50 + 10 = 80.

Ответы

Синтаксис

Сообщение PromotionsResponse использует следующий синтаксис:

<?xml version="1.0" encoding="UTF-8"?>
<PromotionsResponse timestamp="timestamp"
                    id="message_ID"
                    partner="partner_key">
  <!-- Either Success or Issues are populated. -->
  <Success/>
  <Issues>
    <Issue code="issue_code"
           status="issue_type">
      issue_description
    </Issue>
  </Issues>
</PromotionsResponse>

Элементы и атрибуты

Сообщение PromotionsResponse содержит следующие элементы и атрибуты:

Элемент / @атрибут Количество Тип Описание
PromotionsResponse 1 Complex element Корневой элемент, указывающий на успешную обработку или проблемы с полученным сообщением с запросом на промоакции.
PromotionsResponse / @timestamp 1 DateTime Дата и время создания этого сообщения.
PromotionsResponse / @id 1 string Уникальный идентификатор из связанного сообщения о промоакции.
PromotionsResponse / @partner 1 string Аккаунт партнера для этого сообщения.
PromotionsResponse / Success 0..1 Success Указывает, что сообщение о промоакции было успешно обработано без предупреждений, ошибок или сбоев.

В каждом сообщении присутствует <Success> или <Issues>.

PromotionsResponse / Issues 0..1 Issues Контейнер для одной или нескольких проблем, возникших при обработке сообщения о промоакциях.

В каждом сообщении присутствует <Success> или <Issues>.

PromotionsResponse / Issues / Issue 1..n Issue Описание предупреждения, ошибки или сбоя, возникших при обработке сообщения о промоакциях. Подробную информацию об этих проблемах можно найти в статье Сообщения об ошибках в статусе фида.
PromotionsResponse / Issues / Issue / @code 1 integer Идентификатор проблемы.
PromotionsResponse / Issues / Issue / @status 1 enum

Тип проблемы.

Допустимые значения: warning, error и failure.

Примеры

Выполнено

Ниже приведен ответ на успешно обработанное сообщение Promotions.

<?xml version="1.0" encoding="UTF-8"?>
<PromotionsResponse timestamp="2020-05-18T16:20:00-04:00"
                    id="12345678"
                    partner="partner_key">
  <Success/>
</PromotionsResponse>

Проблемы

Ниже приведен ответ на сообщение Promotions, которое не было обработано из-за ошибок.

<?xml version="1.0" encoding="UTF-8"?>
<PromotionsResponse timestamp="2020-05-18T16:20:00-04:00"
                    id="12345678"
                    partner="partner_key">
  <Issues>
    <Issue code="1001" status="error">Example</Issue>
  </Issues>
</PromotionsResponse>