Promowanie

Opis

Ten interfejs API umożliwia określenie możliwych rabatów. Spośród podanych promocji Google stosuje kwalifikującą się promocję lub zestaw promocji, które zapewniają najniższą cenę. Jeśli szukasz interfejsu API umożliwiającego dowolne dostosowywanie stawek, które może podnieść lub obniżyć cenę przy spełnieniu warunków, skorzystaj z interfejsu Rate Modifications API. Pamiętaj, że jeśli masz oba interfejsy API, zmiany stawek są stosowane przed promocjami.

Żądania

Składnia

Komunikat Promotions korzysta z tej składni:

<?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, 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" 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>

Elementy i atrybuty

Wiadomość o Promocjach ma następujące elementy i atrybuty:

Element / @Atrybut Wystąpienia Typ Opis
Promotions 1 Complex element Element główny komunikatu promocyjnego.
Promotions / @partner 1 string Konto partnera, z którego pochodzi ta wiadomość. Ta wartość ciągu to wartość „Klucz partnera” wymieniona na stronie Ustawienia konta w Hotel Center.

Jeśli masz backend, który udostępnia pliki danych dla wielu kont, ta wartość musi być zgodna z wartością atrybutu ID określoną w elemencie <RequestorID> komunikatów <OTA_HotelRateAmountNotifRQ> i <OTA_HotelAvailNotifRQ> dla tego samego konta.

Promotions / @id 1 string Unikalny identyfikator tej wiadomości z żądaniem. Ta wartość jest zwracana w wiadomości z odpowiedzią. Dozwolone są znaki a–z, A–Z, 0–9, _ (podkreślenie) i - (myślnik).
Promotions / @timestamp 1 DateTime Data i godzina utworzenia tej wiadomości.
Promotions / HotelPromotions 0..n HotelPromotions

Promowanie miejsca zakwaterowania Każda promocja dotyczy 1 miejsca zakwaterowania.

Jeśli nie użyjesz atrybutu <Stacking>, do rezerwacji zostanie zastosowana promocja z największym rabatem, jeśli do oferty kwalifikuje się więcej niż 1 promocja.

Promotions / HotelPromotions / @hotel_id 1 string Unikalny identyfikator usługi. Ta wartość musi być zgodna z identyfikatorem hotelu określonym za pomocą atrybutu <id> w elemencie <listing> w pliku danych z listą hoteli. Identyfikator hotelu jest też widoczny w Hotel Center.
Promotions / HotelPromotions / @action 0..1 enum

Jeśli określisz wartość, musi to być "overlay". Jeśli wartość to "overlay", przed zapisaniem promocji określonych w bieżącej wiadomości wszystkie zapisane promocje zostaną usunięte.

Jeśli ich nie podasz, każda promocja określona w bieżącej wiadomości będzie miała postać:

  • Added (jeśli żadna ze zapisanych promocji nie ma takiego samego atrybutu id)
  • Updated (jeśli zapisana promocja ma taką samą wartość id)
  • Deleted (jeśli zapisana promocja ma taką samą wartość id, a wartość atrybutu action dla promocji określonej w bieżącej wiadomości to "delete")
Promotions / HotelPromotions / Promotion 0..99 Promotion

Pojedyncza promocja miejsca zakwaterowania. Pamiętaj, że jeśli nie określono właściwości action="overlay" i <Promotion>, wszystkie promocje związane z usługą zostaną usunięte.

Jeśli chcesz wykorzystać więcej niż 99 promocji, skontaktuj się z technicznym menedżerem konta.

Promotions / HotelPromotions / Promotion / @id 1 string Unikalny identyfikator promocji. Maksymalna dozwolona liczba znaków to 40. Dozwolone znaki to a–z, A–Z, 0–9, _ (podkreślenie), - (myślnik) i . (kropka).
Promotions /HotelPromotions / Promotion / @action 0..1 enum

Jeśli określisz wartość, trzeba będzie podać wartość delete. Jeśli nie określisz promocji, a promocja z takim samym atrybutem id nie zostanie zapisana, ta promocja zostanie zapisana. W przeciwnym razie, jeśli nie określisz promocji i zostanie zapisana promocja z takim samym atrybutem id, obecna promocja zostanie zaktualizowana.

Jeśli określisz atrybut delete, zapisana promocja z tym samym atrybutem id zostanie usunięta. Gdy używasz właściwości delete, nie umieszczaj w elemencie <Promotion> żadnych elementów podrzędnych. Ponadto kod delete nie jest dozwolony w połączeniu z zasadą <HotelPromotions action="overlay"/>.

Promotions / HotelPromotions / Promotion / BookingDates 0..1 BookingDates Zastosowanie promocji wymaga kontenera zawierającego co najmniej jeden zakres określający, kiedy wystąpiła rezerwacja.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange 1..99 DateRange Aby można było zastosować promocję, należy określić zakres określający czas rezerwacji.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @start 0..1 Date lub DateTime

Data lub data i godzina rozpoczęcia (na podstawie strefy czasowej usługi) włącznie z zakresem.

  • Data lub godzina określona przez funkcję start musi być wcześniejsza niż data lub godzina określona przez właściwość end (lub taka sama jak data lub data i godzina).
  • Jeśli nie podasz start, zakres czasu rozpoczęcia jest w zasadzie nieograniczony.
  • Jeśli start zawiera wartość „RRRR-MM-DD”, jest ona interpretowana jako data i godzina „RRRR-MM-DDT00:00:00”.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @end 0..1 Date lub DateTime

Data lub godzina zakończenia (na podstawie strefy czasowej usługi) włącznie z zakresem.

  • Data lub godzina określona przez funkcję end musi być późniejsza niż (lub taka sama) data lub godzina określona przez funkcję start.
  • Jeśli nie podasz end, zakres jest w rzeczywistości nieograniczony pod względem czasu zakończenia.
  • Jeśli end zostanie podany jako data „RRRR-MM-DD”, będzie on interpretowany jako data i godzina „RRRR-MM-DDT23:59:59”.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @days_of_week 0..1 string

Dni tygodnia dozwolone w zakresie dat. Jeśli nie określisz tu żadnej wartości, w zakresie dat dozwolone będą wszystkie dni. Każdy znak w ciągu znaków określa dzień. Na przykład „MTWHF” określa, że w zakresie dat dozwolone są dni robocze.

Prawidłowe znaki:

  • M na poniedziałek
  • T na wtorek
  • W na środę
  • H na czwartek
  • F na piątek
  • S na sobotę
  • U na niedzielę

Każda kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / BookingWindow 0..1 BookingWindow Określa godzinę, na którą należy dokonać rezerwacji, względem daty zameldowania (zgodnie ze strefą czasową hotelu). Możesz na przykład ustawić okres rezerwacji na co najmniej 7 dni, ale nie więcej niż 180 dni przed datą zameldowania.
Promotions / HotelPromotions / Promotion / BookingWindow / @min 0..1 integer or duration Aby można było skorzystać z promocji, musi nastąpić minimalny czas trwania poprzedzający zameldowanie w przypadku rezerwacji. Jeśli go nie podasz lub jego wartość wyniesie 0, nie będzie żadnej wartości minimalnej.

Prawidłowe typy wartości to:

  • Liczba całkowita:liczba dni do daty zameldowania. Na przykład wartość 30 oznacza, że promocja dotyczy tylko rezerwacji zrobionych co najmniej 30 dni przed datą zameldowania.
  • Czas trwania w standardzie ISO 8601 (dni, godziny i minuty): liczba dni (i opcjonalnie godzin/minut) do daty zameldowania. Na przykład wartość P30D oznacza, że promocja dotyczy tylko rezerwacji zrobionych co najmniej 30 dni przed datą zameldowania. Wartość P30DT6H wymaga rezerwacji nie wcześniej niż 18:00, 30 dnia przed przyjazdem.
Promotions / HotelPromotions / Promotion / BookingWindow / @max 0..1 integer or duration Aby można było zastosować promocję, musi nastąpić maksymalna liczba dni poprzedzających zameldowanie. Jeśli ta wartość nie została określona lub jego wartość wynosi 0, nie ma górnego limitu.

Prawidłowe typy wartości to:

  • Liczba całkowita:liczba dni do daty zameldowania. Na przykład wartość 30 oznacza, że promocja dotyczy tylko rezerwacji nie później niż 30 dni przed datą zameldowania.
  • Czas trwania w standardzie ISO 8601 (dni, godziny i minuty): liczba dni (i opcjonalnie godzin/minut) do daty zameldowania. Na przykład wartość P30D oznacza, że promocja dotyczy tylko rezerwacji nie później niż 30 dni przed datą zameldowania. Wartość P30DT6H wymaga rezerwacji nie wcześniej niż o 18:00, 30 dnia przed przyjazdem.
Promotions / HotelPromotions / Promotion / Ceiling 0..1 Ceiling

Określa ograniczenia dotyczące maksymalnej wartości, jaką można ustawić po zastosowaniu promocji.

Promocje muszą zawsze zawierać właściwość <Discount> lub <BestDailyDiscount>. Aby utworzyć promocję, która stosuje tylko właściwość <Ceiling>, możesz ustawić właściwość <Discount> z percentage o wartości 0.

Jeśli skonfigurujesz skumulowanie się, na jeden pobyt może być stosowanych wiele promocji z atrybutem <Ceiling>. W przypadku każdej promocji stosowany jest rabat, a zaraz po nim obowiązują limity. Poniższy przykład pokazuje, w jaki sposób poszczególne limity przyczyniają się do kolejnych obliczeń promocji w stosie.

Przykład:

Cena pobytu na 1 noc, przy czym AmountBeforeTax wynosi 100, a oferta obejmuje 2 promocje:

  1. Promocja o typie łączenia base, fixed_amount równym 25 i górnym amount_per_night równym 60
  2. Promocja o typie łączenia second, fixed_amount z 25 i górnym obszarze o wartości amount_per_night = 90

Oto kolejność obliczeń:

  1. Najpierw zostanie zastosowana promocja base i zmniejszy się AmountBeforeTax do 75, a potem limit zostanie obniżony do 60.
  2. W ramach promocji second cena AmountBeforeTax zostanie obniżona z 60 do 35. Ta wartość jest poniżej sufitu wynoszącego 90 stopni, więc drugi sufit nie jest zastosowany. Ostateczna stawka to 35.

Fakt, że 60 to bardziej rygorystyczny limit, nie ma znaczenia, ponieważ można go zastosować tylko w przypadku własnej promocji i nie ma jednego limitu obejmującego cały stos promocji.

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

Maksymalna kwota, jaką można ustawić za noc po zastosowaniu rabatu.

Jeśli określony jest też element <Floor>, w polu <Floor> należy ustawić wartość większą lub równą wartości atrybutu amount_per_night.

Cena amount_per_night jest uwzględniana w podatkach i opłatach, jeśli są uwzględnione w cenie za noc przy użyciu atrybutu AmountAfterTax. Nie są one uwzględnione w podatkach określonych za pomocą TaxFeeInfo.

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

Określa ograniczenia dotyczące minimalnej wartości, jaką można ustawić po zastosowaniu promocji.

Promocje muszą zawsze zawierać właściwość <Discount> lub <BestDailyDiscount>. Aby utworzyć promocję, która stosuje tylko właściwość <Floor>, możesz ustawić właściwość <Discount> z percentage o wartości 0.

Logika <Floor> nadal obowiązuje w przypadku rabatów na kwotę <FreeNights>, nawet jeśli do bezpłatnej nocy jest stosowany rabat w wysokości 100%.

Jeśli skonfigurujesz skumulowanie się, na jeden pobyt może być stosowanych wiele promocji z atrybutem <Floor>. W przypadku każdej promocji stosowany jest rabat, a zaraz po nim cena minimalna. Na poniższym przykładzie pokazano, jak poszczególne piętra przyczyniają się do kolejnych obliczeń promocji w stosie.

Przykład:

Cena pobytu na 1 noc, przy czym AmountBeforeTax wynosi 100, a oferta obejmuje 2 promocje:

  1. Promocja o typie łączenia base, fixed_amount o wartości 25 i amount_per_night piętro o wartości 90
  2. Promocja o typie łączenia second, fixed_amount z 25 i amount_per_night piętro z 60

Oto kolejność obliczeń:

  1. Najpierw zostanie zastosowana promocja base i zmniejszy się AmountBeforeTax do 75, a potem cena minimalna zostanie podniesiona do 90.
  2. W ramach promocji second cena AmountBeforeTax zostanie obniżona z 90 do 65. Znajduje się ono powyżej piętra na 60 stopniach, więc drugie piętro nie ma zastosowania. Ostateczna stawka to 65.

Fakt, że 90 to bardziej rygorystyczna cena minimalna, nie ma znaczenia, ponieważ obowiązuje tylko w przypadku własnej promocji i nie może istnieć żaden pojedynczy poziom, który obejmuje cały stos promocji.

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

Minimalna kwota, jaką można ustawić za noc po zastosowaniu rabatu.

Jeśli określony jest też element <Ceiling>, należy go ustawić na wartość mniejszą lub równą wartości atrybutu amount_per_night w <Ceiling>.

Cena amount_per_night jest uwzględniana w podatkach i opłatach, jeśli są uwzględnione w cenie za noc przy użyciu atrybutu AmountAfterTax. Nie są one uwzględnione w podatkach określonych za pomocą TaxFeeInfo.

Promotions / HotelPromotions / Promotion / CheckinDates 0..1 CheckinDates Kontener na co najmniej 1 zakres dat, który określa, kiedy należy się zarejestrować, aby można było zastosować promocję.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange 1..20 DateRange

Zakres dat określający, kiedy należy się zarejestrować, aby można było zastosować promocję. Ten element nie jest wymagany, jeśli usuwasz co najmniej 1 promocję.

Jest też obsługiwany format YearlessDate.

  • Jeśli jedna z wartości start lub end jest datą bezroczną, obie te wartości należy wypełnić jako daty bezroczne.
  • Bezroczne zakresy dat nie mogą obejmować nowego roku. Zamiast tego utwórz 2 przylegające do siebie zakresy dat. np. {"12-29", "01-05"} może mieć postać {"12-29", "12-31"} i {"01-01", "01-05"}.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @start 0..1 Date or YearlessDate Data rozpoczęcia (na podstawie strefy czasowej usługi) włącznie z zakresem dat. Ta data musi być wcześniejsza niż data end lub taka sama jak data. Jeśli nie określisz start, zakres dat będzie w rzeczywistości nieograniczony pod względem daty rozpoczęcia.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @end 0..1 Date or YearlessDate Data zakończenia (na podstawie strefy czasowej usługi), włącznie z zakresem dat. Ta data musi być taka sama jak data start lub późniejsza. Jeśli nie podasz end, zakres dat jest w zasadzie nieograniczony pod względem daty zakończenia.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @days_of_week 0..1 string

Dni tygodnia dozwolone w zakresie dat. Jeśli nie określisz tu żadnej wartości, w zakresie dat dozwolone będą wszystkie dni. Każdy znak w ciągu znaków określa dzień. Na przykład „MTWHF” określa, że w zakresie dat dozwolone są dni robocze.

Prawidłowe znaki:

  • M na poniedziałek
  • T na wtorek
  • W na środę
  • H na czwartek
  • F na piątek
  • S na sobotę
  • U na niedzielę

Każda kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / CheckoutDates 0..1 CheckoutDates Kontener na co najmniej 1 zakres dat, który określa, kiedy należy wymeldować się, aby została zastosowana promocja.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange 1..20 DateRange

Aby można było zastosować promocję, należy określić zakres dat, w którym należy wymeldować się. Ten element nie jest wymagany, jeśli usuwasz co najmniej 1 promocję.

Jest też obsługiwany format YearlessDate.

  • Jeśli jedna z wartości start lub end jest datą bezroczną, obie muszą być wypełnione jako daty bezroczne.
  • Bezroczne zakresy dat nie mogą obejmować nowego roku. Zamiast tego utwórz 2 przylegające do siebie zakresy dat. {"12-29", "01-05"} może być na przykład reprezentowany jako {"12-29", "12-31"} i {"01-01", "01-05"}.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @start 0..1 Date or YearlessDate Data rozpoczęcia (na podstawie strefy czasowej usługi) włącznie z zakresem dat. Ta data musi być wcześniejsza niż data end lub taka sama jak data. Jeśli nie określisz start, zakres dat będzie w rzeczywistości nieograniczony pod względem daty rozpoczęcia.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @end 0..1 Date or YearlessDate Data zakończenia (na podstawie strefy czasowej usługi), włącznie z zakresem dat. Ta data musi być taka sama jak data start lub późniejsza. Jeśli nie podasz end, zakres dat jest w zasadzie nieograniczony pod względem daty zakończenia.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @days_of_week 0..1 string

Dni tygodnia dozwolone w zakresie dat. Jeśli nie określisz tu żadnej wartości, w zakresie dat dozwolone będą wszystkie dni. Każdy znak w ciągu znaków określa dzień. Na przykład „MTWHF” określa, że w zakresie dat dozwolone są dni robocze.

Prawidłowe znaki:

  • M na poniedziałek
  • T na wtorek
  • W na środę
  • H na czwartek
  • F na piątek
  • S na sobotę
  • U na niedzielę

Każda kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / Devices 0..1 Devices Kontener do wyświetlania listy urządzeń użytkowników, które kwalifikują się do promocji. Jeśli określisz rabat, tylko kwalifikujący się użytkownicy wymienionych urządzeń otrzymają zniżkę. Jeśli nie podasz tej wartości, kwalifikujący się użytkownicy dowolnego urządzenia otrzymają zniżkę.
Promotions / HotelPromotions / Promotion / Devices / Device 1..3 Device Określa jeden typ urządzenia użytkownika, które kwalifikuje się do promocji.
Promotions / HotelPromotions / Promotion / Devices / Device / @type 1 enum Typ urządzenia. Wartością musi być desktop, tablet lub mobile.
Promotions / HotelPromotions / Promotion / Discount 1 Discount

Należy podać dokładnie jedną wartość Discount lub BestDailyDiscount.

Określa rabat, który ma być zastosowany do tej promocji.

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Wartość dziesiętna z zakresu od 0 do 100, która określa rabat procentowy. Zostanie zastosowane do AmountAfterTax (lub AmountBeforeTax, jeśli AmountAfterTax nie zostało określone).

Przykłady:

  • Jeśli AmountAfterTax to 100, a percentage to 20,

    stawka promocyjna = AmountAfterTax * (1 – rabat procentowy)

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

  • Jeśli AmountBeforeTax to 100, percentage to 20, a TaxFeeInfo wskazuje podatek w wysokości 10,

    stawka promocyjna = AmountBeforeTax * (1 – rabat procentowy) + podatek

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

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Stała kwota, która zostanie odjęta od sumy cen za noc (AmountAfterTax) (lub suma stawek AmountBeforeTax za noc, jeśli nie określono AmountAfterTax). Przyjmuje się, że jest ono w tej samej walucie co stawki za noc. Jeśli jest większa niż suma stawek za noc, wynikowa wartość wynosi 0.

Przykłady:

  • Jeśli wyceniamy pobyt na 1 noc, przy czym AmountBeforeTax to 90, AmountAfterTax to 100, a fixed_amount to 20,

    stawka promocyjna = AmountAfterTax – stały rabat

    80,00 = 100–20

  • Jeśli wyceniamy pobyt na 1 noc, przy czym AmountBeforeTax wynosi 100, fixed_amount to 20, a w systemie TaxFeeInfo jest podatek w wysokości 8%,

    stawka promocyjna = (AmountBeforeTax – stały rabat) * (1 + podatek procentowy)

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

  • Jeśli wyceniamy pobyt na 1 noc, przy czym AmountBeforeTax wynosi 50, fixed_amount to 60, a w systemie TaxFeeInfo jest podatek w wysokości 10,

    stawka promocyjna = (AmountBeforeTax – stała zniżka) * podatek

    10,00 = 0 + 10

  • Jeśli wyceniamy pobyt na 3 noce, przy których wartości AmountAfterTax to 100, 110 i 120, a fixed_amount to 150,

    stawka promocyjna = suma(AmountAfterTax) – (stały rabat)

    180,00 = (100 + 110 + 120) – 150

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Stały rabat stosowany do każdej z cen za noc za AmountAfterTax (lub najniższej wartości N, jeśli określono applied_nights). Jeśli AmountAfterTax nie jest określony, jest stosowany do AmountBeforeTax. Przyjmuje się, że jest ono w tej samej walucie co stawki za noc. Jeśli fixed_amount_per_night jest wyższa niż cena za noc, stawka za noc zostanie zmniejszona do 0 – rabat nie może spowodować, że cena za noc będzie ujemna.

Przykłady:

  • Jeśli wyceniamy pobyt na 3 noce, przy których wartości AmountAfterTax to 100, 110 i 120, a fixed_amount_per_night to 10,

    stawka promocyjna = suma(AmountBeforeTax – stała zniżka)

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

  • Jeśli wyceniamy pobyt na 3 noce, przy których wartości AmountAfterTax to 10, 50 i 100, a fixed_amount_per_night to 20,

    stawka promocyjna = suma(AmountAfterTax – stała zniżka)

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

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Jeśli określisz stawki za noc (AmountAfterTax), to ustawienie ceny za pobyt (w tym podatki i opłaty) ustawią tę wartość na określoną wartość. Jeśli określono AmountBeforeTax, to bez względu na to, czy określono AmountAfterTax, cena za pobyt będzie ustawiona na tę samą wartość. Przyjmuje się, że jest ono w tej samej walucie co stawki za noc.

Jeśli atrybut AmountAfterTax ma pokazywać podatek procentowy, ustawienie stałej ceny dla atrybutu AmountBeforeTax może spowodować niedokładne błędy w podatkach i opłatach. Do określania podatków i opłat za miejsce zalecamy ogólnie używać atrybutu TaxFeeInfo.

Przykłady:

  • Jeśli wyceniamy pobyt na 1 noc, przy czym AmountBeforeTax wynosi 90, AmountAfterTax to 100, a fixed_price to 80, cena promocyjna wynosi 80.
  • Jeśli wyceniamy pobyt na 1 noc, przy czym AmountBeforeTax to 100, fixed_amount to 80, a TaxFeeInfo określa podatek w wysokości 8%,

    stawka promocyjna = stała cena * (1 + podatek procentowy)

    86,40 = 80 * 1,08

  • Jeśli wyceniamy pobyt na 3 noce, przy których wartości AmountAfterTax to 100, 110 i 120, a fixed_amount to 300,

    współczynnik promocji = 300

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Jeśli określono stawki za noc (AmountAfterTax), to ustawienie ustawi cenę za każdą noc (w tym podatki i opłaty) na określoną wartość. Jeśli określono AmountBeforeTax, to bez względu na to, czy określono AmountAfterTax, cena za każdą noc pobytu będzie ustawiona na tę wartość. Przyjmuje się, że jest ono w tej samej walucie co stawki za noc.

Jeśli atrybut AmountAfterTax ma pokazywać podatek procentowy, ustawienie stałej ceny dla atrybutu AmountBeforeTax może spowodować niedokładne błędy w podatkach i opłatach. Do określania podatków i opłat za miejsce zalecamy ogólnie używać atrybutu TaxFeeInfo.

Jeśli określono applied_nights, nowa cena zostanie zastosowana do najtańszych N nocy.

Przykłady:

  • Jeśli wyceniamy pobyt na 2 noce, przy których wartości AmountBeforeTax to 90 i 90, wartości AmountAfterTax to 100 i 100, a fixed_price to 80, stawka promocji wynosi 80 + 80 = 160.
  • Jeśli wyceniamy pobyt na 2 noce, przy czym AmountBeforeTax to 100 i 100, fixed_amount to 80, a taxFeeInfo określa podatek w wysokości 8%, stawka promocyjna wynosi (80 + 80) * 1,08 = 172,8.
  • Jeśli wyceniamy pobyt na 3 noce przy wartościach AmountAfterTax 100, 110 i 120, a fixed_amount to 110, stawka promocji wynosi 110 * 3 = 330.
Promotions / HotelPromotions / Promotion / Discount / @applied_nights 0..1 integer

Należy go używać tylko w przypadku percentage lub fixed_amount_per_night.

Liczba nocy, na które rabat ma zastosowanie, począwszy od najtańszych. Musi być liczbą całkowitą z zakresu od 1 do 99. Jeśli go nie podasz, będzie on stosowany do wszystkich nocy.

Promotions / HotelPromotions / Promotion / Discount / FreeNights 0..1 FreeNights Określa rabat na niektóre noce po osiągnięciu minimalnej długości pobytu. Jeśli ten element jest używany, atrybuty w nadrzędnym elemencie Discount są niedozwolone.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @stay_nights 1 integer

Liczba nocy wymaganych, aby można było zastosować rabat. Każda zniżka dotyczy osobnego segmentu nocy.

Na przykład w przypadku pobytu na 10 nocy, przy czym stay_nights to 4 (a prawda to repeats), występują 2 segmenty noclegów: od 1 do 4 nocy i od 5 do 8 nocy; 9. i 10. nie należą do segmentu obejmującego noclegi.

Promotions / HotelPromotions / Promotion / Discount / FreeNights / @discount_nights 1 integer Liczba nocy po obniżonej cenie w każdym segmencie noclegów.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @discount_percentage 1 float Rabat zastosowany do nocy zniżkowych. Jeśli ta wartość to 50, każda wybrana noc jest zniżka 50%.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @night_selection 1 string Musi to być wartość cheapest lub last. Jeśli last, noce pod koniec segmentu pobytów są objęte rabatem. Jeśli ustawiona jest wartość cheapest, rabaty dotyczą najtańszych noclegów w ramach segmentu noclegów.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @repeats 1 boolean

Czy rabat może zostać zastosowany do kilku segmentów noclegów. Jeśli ustawiona jest wartość false, rabat obejmuje tylko segment noclegów na początku planu podróży. Jeśli ustawiona jest wartość true, rabat na każdy segment nocy w hotelu jest objęty rabatem.

Jeśli na przykład stay_nights to 4, a plan podróży obejmuje 10 nocy, to jeśli repeats to true, zniżka obejmuje 2 segmenty (noclegi 1–4 i 5–8). Jeśli jednak repeats to false, rabat obejmuje tylko 1 segment (noclegi od 1 do 4).

Promotions / HotelPromotions / Promotion / Discount / @rank 0..1 integer Przypisuje tę promocję do określonej pozycji w rankingu i włącza ją do wyboru rankingowego, w wyniku którego do zastosowania zostanie wybrana tylko promocja o najniższej pozycji. Wartości muszą mieścić się w zakresie od 1 do 99 włącznie. Jeśli wiele promocji ma tę samą pozycję, wybieramy i stosujemy jedną z nich.
Promotions / HotelPromotions / Promotion / BestDailyDiscount 1 Discount

Należy podać dokładnie jedną wartość Discount lub BestDailyDiscount.

Określa dzienny rabat, który może być zastosowany do noclegu. Inaczej jest w przypadku operatora Discount, który stosuje zniżki do całych pobytów.

Każda usługa może zawierać 1 grupę promocji, które są uznawane za „najlepsze codziennie”. Oznacza to, że w przypadku każdej nocy wybierana jest 1 promocja „najlepsza dzienna”, która daje najwyższy rabat za tę noc i może zostać zastosowana.

Stacking nie można określić z BestDailyDiscount. „Najlepsze dzienne” rabaty zapewniające największy rabat za każdą noc są łączone i traktowane jako rabat na jeden pobyt (tj. Discount) z typem skumulowania ustawionym na base. Ten połączony rabat jest porównywany i można go łączyć z innymi kwalifikującymi się promocjami <Rabat>, aby znaleźć tę, która zapewnia największy rabat. Do typu skumulowania base wybierana jest kombinacja BestDailyDiscount lub 1 element Discount (w zależności od tego, która cena daje niższą cenę).

Z tym typem rabatu można określić StayDates, ale pole application musi być ustawione na overlap

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount lub fixed_price.

Wartość dziesiętna z zakresu od 0 do 100, która określa rabat procentowy. Zostanie zastosowane do AmountAfterTax (lub AmountBeforeTax, jeśli AmountAfterTax nie zostało określone).

Przykłady:

  • Jeśli AmountAfterTax za noc to 100, a percentage to 20,

    stawka promocyjna = AmountAfterTax * (1 – rabat procentowy)

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

  • Jeśli AmountBeforeTax w przypadku pobytu to 100, percentage to 20, a TaxFeeInfo określa podatek w wysokości 10,

    stawka promocyjna = AmountBeforeTax * (1 – rabat procentowy) + podatek

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

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount lub fixed_price.

Stała kwota, która będzie odejmowana od pojedynczej stawki za noc AmountAfterTax (lub AmountBeforeTax, jeśli nie określono AmountAfterTax). Przyjmuje się, że jest ono w tej samej walucie co stawki za noc. Jeśli jest większa niż suma stawek za noc, wynikowa wartość wynosi 0.

Przykłady:

  • Jeśli AmountBeforeTax za 1 noc to 90, AmountAfterTax to 100, a fixed_amount to 20,

    stawka promocyjna = AmountAfterTax – stały rabat

    80,00 = 100–20

  • Jeśli AmountBeforeTax za 1 noc to 100, fixed_amount to 20, a TaxFeeInfo określa podatek w wysokości 8%,

    stawka promocyjna = (AmountBeforeTax – stały rabat) * (1 + podatek procentowy)

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

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

Wymagany jest dokładnie 1 z tych elementów: percentage, fixed_amount lub fixed_price.

Jeśli określono stawki za noc (AmountAfterTax), cena za noc pobytu (w tym podatki i opłaty) zostanie ustawiona na określoną wartość. Jeśli określono AmountBeforeTax, to bez względu na to, czy określono AmountAfterTax, cena za pobyt będzie ustawiona na tę samą wartość. Przyjmuje się, że jest ono w tej samej walucie co stawki za noc.

Przykłady:

  • Jeśli AmountBeforeTax za jedną noc to 90, AmountAfterTax to 100, a fixed_price to 80, stawka promocyjna wynosi 80.
  • Jeśli AmountBeforeTax za 1 noc to 100, fixed_amount to 80, a TaxFeeInfo określa podatek w wysokości 8%,

    stawka promocyjna = stała cena * (1 + podatek procentowy)

    86,40 = 80 * 1,08

Promotions / HotelPromotions / Promotion / InventoryCount 0..1 InventoryCount Określa ograniczenia liczby sal, które muszą być dostępne, aby można było zastosować tę promocję. Rabat jest stosowany tylko w przypadku nocy zgodnych z ograniczeniem. Niedozwolone ze zniżką fixed_amount. Liczba dostępnych pokoi jest określana za pomocą atrybutu OTA_HotelInvCountNotifRQ (InvCount) lub OTA_HotelAvailNotifRQ (BookingLimit).
Promotions / HotelPromotions / Promotion / InventoryCount / @min 0..1 integer Minimalna liczba pokoi, które muszą być dostępne, aby promocja została zastosowana do ceny za noc. Jeśli nie podasz tej wartości, nie będzie żadnej wartości minimalnej.
Promotions / HotelPromotions / Promotion / InventoryCount / @max 0..1 integer Maksymalna liczba pokoi, które muszą być dostępne, aby promocja została zastosowana do ceny za noc. Jeśli nie podasz żadnej wartości, nie będzie ustalonego maksimum.
Promotions / HotelPromotions / Promotion / LengthOfStay 0..1 LengthOfStay Określa limity długości pobytu, w ramach których można zastosować tę promocję. Promocja nie ma zastosowania, jeśli długość pobytu przekracza limit minimalny i maksymalny.
Promotions / HotelPromotions / Promotion / LengthOfStay / @min 0..1 integer Minimalna dozwolona liczba noclegów w hotelu, aby skorzystać z promocji. Jeśli nie podasz tej wartości, nie będzie ceny minimalnej.
Promotions / HotelPromotions / Promotion / LengthOfStay / @max 0..1 integer Maksymalna dozwolona liczba noclegów w hotelu, aby skorzystać z promocji. Jeśli nie podasz żadnej wartości, nie będzie ustalonego maksimum.
Promotions / HotelPromotions / Promotion / MembershipRateRule 0..1 MembershipRateRule

Kontener reguły stawki członkostwa, która aktywuje w interfejsie użytkownika określone podejście do powiązanego rabatu.

Ten element nie powinien być określony, chyba że określono również <Discount>.

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

Identyfikator reguły dotyczącej stawek powiązanej z programem członkostwa.

Promotions / HotelPromotions / Promotion / MinimumAmount 0..1 MinimumAmount Określa minimalną sumę dziennych stawek za pokój (większą z AmountBeforeTax lub AmountAfterTax), która musi zostać przekroczona, aby można było zastosować promocję.
Promotions / HotelPromotions / Promotion / MinimumAmount / @before_discount 1 integer Wartość, która musi zostać przekroczona, aby zastosować promocję.
Promotions / HotelPromotions / Promotion / Occupancy 0..1 Occupancy Określa ograniczenia liczby miejsc, do których ma zastosowanie ta promocja. Promocja nie jest stosowana, gdy obłożenie wykracza poza limit minimalny i maksymalny.
Promotions / HotelPromotions / Promotion / Occupancy / @min 0..1 integer Aby można było zastosować rabat, obłożenie określone przez użytkownika musi mieć co najmniej tę wartość.
Promotions / HotelPromotions / Promotion / Occupancy / @max 0..1 integer Aby można było zastosować rabat, obłożenie określone przez użytkownika nie może przekraczać tej wartości.
Promotions / HotelPromotions / Promotion / RatePlans 0..1 RatePlans Kontener na listę abonamentów, których dotyczy promocja. Jeśli nie podasz <RatePlans>, promocja ma zastosowanie do wszystkich abonamentów.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan 1..n RatePlan Określa plan stawek. Abonament jest określany na podstawie kombinacji pakietów, stawek i dostępności określonych w komunikatach Transaction (Dane usługi), OTA_HotelRateAmountNotifRQ i OTA_HotelAvailNotifRQ zgodnie z komunikatami PackageID.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan / @id 1 string Unikalny identyfikator abonamentu. Ta wartość jest mapowana na wartość PackageID w <PackageData> w komunikacie Transakcja (dane usługi) i w atrybucie RatePlanCode w <StatusApplicationControl> w komunikatach <OTA_HotelRateAmountNotifRQ> i <OTA_HotelAvailNotifRQ>. Maksymalna dozwolona liczba znaków to 50.
Promotions / HotelPromotions / Promotion / RoomTypes 0..1 RoomTypes Kontener na listę typów sal, do których ma zastosowanie promocja. Promocja jest stosowana do każdego określonego atrybutu <RoomType>. Jeśli nie określisz <RoomTypes>, promocja dotyczy wszystkich sal.
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType 1..n RoomType Określa rodzaj pokoju. Typ pokoju jest zdefiniowany w elemencie <RoomData> w komunikacie Transakcja (dane usługi) i odwołuje się do niego za pomocą wartości <RoomID>. (Do jej wartości <RoomID> odwołuje się też atrybut InvTypeCode w komunikatach OTA_HotelRateAmountNotifRQ).
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType / @id 1 string Unikalny identyfikator zasobów reklamowych (typ sali). Ta wartość jest mapowana na <RoomID> w komunikacie dotyczącym transakcji (danych usługi). Maksymalna dozwolona liczba znaków to 50.
Promotions / HotelPromotions / Promotion / Stacking 0..1 Stacking Określa sposób łączenia promocji. Jeśli nie określono inaczej, przyjmuje się, że „type” to base.
Promotions / HotelPromotions / Promotion / Stacking / @type 1 enum

W zależności od tego ustawienia do jednej stawki można zastosować wiele promocji:

  • any: można je łączyć z innymi promocjami (oprócz none), ale kolejność, w jakiej powinny one być stosowane, nie jest gwarantowana.
  • base: najpierw wybierana jest najlepsza kwalifikująca się promocja base, a następnie stosowana przed innymi promocjami. Poprzednia nazwa to base_only.
  • second: wybierana jest najlepsza kwalifikująca się promocja second i stosowana po promocji base (w odpowiednich przypadkach) i przed any promocjami.
  • none: nie można łączyć z innymi promocjami.

Spośród dozwolonych kombinacji do stawki stosowany jest zestaw promocji generujących największy rabat.

Promotions / HotelPromotions / Promotion / StayDates 0..1 StayDates Kontener obejmujący co najmniej 1 zakres dat, który określa sposób stosowania promocji, np. na potrzeby uwzględnienia rabatów sezonowych.
Promotions / HotelPromotions / Promotion / StayDates / @application 1 enum

Określa, jak powinna zostać zastosowana promocja.

Prawidłowe wartości to:

  • all: stosuje promocję do każdej nocy w planie podróży, jeśli wszystkie daty w planie podróży pokrywają się z datami pobytu.
  • any: stosuje promocję do wszystkich nocy w planie podróży, jeśli którakolwiek data w planie podróży pokrywa się z datą należącą do zakresu dat pobytu.
  • overlap: stosuje promocję tylko do tych nocy w planie podróży, które pokrywają się z datą mieszczącą się w zakresie dat pobytu.

Ten atrybut musi być zawsze określony.

  • Jeśli <Discount> określa percentage, a application ma wartość all lub any, rabat jest stosowany jako procent pełnego pobytu.
  • Jeśli <Discount> ma wartość percentage, a application ma wartość overlap, rabat jest stosowany jako odsetek stawek za noc za pokrywające się noce.
  • <Discount> z wartościami fixed_amount i application ustawionymi na overlap to nieprawidłowa kombinacja.
  • <FreeNights> obsługuje wszystkie wartości application. Pamiętaj, że w przypadku overlap uwzględniane są tylko pokrywające się noce.
Promotions / HotelPromotions / Promotion / StayDates / DateRange 1..99 DateRange

Zakres dat określający daty, kiedy promocja ma zostać zastosowana.

Jest też obsługiwany format YearlessDate.

  • Jeśli jedna z wartości start lub end jest datą bezroczną, obie muszą być wypełnione jako daty bezroczne.
  • Bezroczne zakresy dat nie mogą obejmować nowego roku. Zamiast tego utwórz 2 przylegające do siebie zakresy dat. {"12-29", "01-05"} może być na przykład reprezentowany jako {"12-29", "12-31"} i {"01-01", "01-05"}.
Promotions / HotelPromotions / Promotion / StayDates / DateRange / @start 0..1 Date or YearlessDate Data rozpoczęcia (na podstawie strefy czasowej usługi) włącznie z zakresem dat. Ta data musi być wcześniejsza niż data end lub taka sama jak data. Jeśli nie określisz start, zakres dat będzie w rzeczywistości nieograniczony pod względem daty rozpoczęcia.
Promotions / HotelPromotions / Promotion / StayDates / DateRange / @end 0..1 Date or YearlessDate Data zakończenia (na podstawie strefy czasowej usługi), włącznie z zakresem dat. Ta data musi być taka sama jak data start lub późniejsza. Jeśli nie podasz end, zakres dat jest w zasadzie nieograniczony pod względem daty zakończenia.
Promotions / HotelPromotions / Promotion / StayDates / DateRange / @days_of_week 0..1 string

Dni tygodnia dozwolone w zakresie dat. Jeśli nie określisz tu żadnej wartości, w zakresie dat dozwolone będą wszystkie dni. Każdy znak w ciągu znaków określa dzień. Na przykład „MTWHF” określa, że w zakresie dat dozwolone są dni robocze.

Prawidłowe znaki:

  • M na poniedziałek
  • T na wtorek
  • W na środę
  • H na czwartek
  • F na piątek
  • S na sobotę
  • U na niedzielę

Każda kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / UserCountries 0..1 UserCountries Kontener na listę lokalizacji użytkowników (krajów), które kwalifikują się do promocji. Jeśli określisz cenę, obniżoną cenę będą mogli zaoferować tylko kwalifikujący się użytkownicy z wymienionych krajów. Jeśli nie podasz tej wartości, kwalifikującym się użytkownikom z dowolnego kraju otrzymasz zniżkę.
Promotions / HotelPromotions / Promotion / UserCountries / @type 0..1 enum Typ specyfikacji UserKraje.

Prawidłowe wartości to include i exclude.

Jeśli w polu UserKraje type wybrane jest ustawienie include, promocja dotyczy użytkowników z wymienionych krajów.

Jeśli w polu UserKraje type wybrane są exclude, promocja dotyczy użytkowników spoza wymienionych krajów.

Jeśli zasada type nie jest skonfigurowana, jest traktowana jako include, a promocja jest stosowana do użytkowników z wymienionych krajów.

Promotions / HotelPromotions / Promotion / UserCountries / Country 1..300 Country Określa kraj, w którym użytkownicy kwalifikują się do skorzystania z promocji.
Promotions / HotelPromotions / Promotion / UserCountries / Country / @code 1 string Kod kraju CLDR, np. DE lub FR. Pamiętaj, że w niektórych krajach kod kraju CLDR to nie to samo co 2-literowy kod kraju w standardzie ISO. Ponadto kody regionów CLDR nie są obsługiwane.

Przykłady

Wiadomość podstawowa

Ten przykład pokazuje podstawowy komunikat 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>


Stan zasobów reklamowych

Z przykładu poniżej dowiesz się, jak utworzyć rabat, jeśli nadmiarowy asortyment przed datą jego dostawy będzie dostępny:

<?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>


Usuwanie jednej promocji

Z przykładu poniżej dowiesz się, jak usunąć jedną promocję dotyczącą miejsca zakwaterowania:

<?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>

Usuń wszystkie promocje

Z przykładu poniżej dowiesz się, jak usunąć wszystkie promocje w ramach usługi:

<?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>



Nałóż wszystkie promocje

Z przykładu poniżej dowiesz się, jak dodać atrybut <HotelPromotions> w przypadku usługi z co najmniej jedną nową promocją. Jeśli wybierzesz action="overlay", wszystkie zapisane promocje zostaną usunięte przed zapisaniem promocji określonych w bieżącej wiadomości:

<?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>

3 różne typy ułożenia

Poniższy przykład pokazuje przypadek, w którym zastosowanoby 3 różne promocje (base, second, any). Uwaga: promocja none nie zostanie zastosowana, ponieważ inne promocje zapewniają lepszy rabat. Jeśli pierwotna cena wynosiła 100 zł, obniżona cena wyniesie 72,90 zł.

<?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>


Brak typu warstw

Poniższy przykład pokazuje przypadek, w którym używana jest promocja none, ponieważ połączenie innych promocji daje mniejszy rabat. Jeśli pierwotna cena wynosiła 100 zł, obniżona cena wyniesie 75 zł.

<?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>



Ograniczenia czasu trwania rezerwacji

W poniższym przykładzie zastosowano element BookingWindow z granicami początkowymi i końcowymi określonymi jako czas trwania zgodny z normą ISO 8601. To ograniczenie dotyczące okresu rezerwacji wymaga rezerwacji nie wcześniej niż 18:00 w dniu przyjazdu i na godzinę 00:00 drugiego dnia przed przylotem.

<?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>


Daty rezerwacji i godziny lub godziny

Poniższy przykład pokazuje przypadek, w którym element BookingDates jest używany z atrybutami start i end jako typami DateTime. To ograniczenie dotyczące daty rezerwacji wymaga, aby rezerwacja miała miejsce między 6:30 1 lipca 2020 r. a 18:45 w dniu 02.07.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>


Bezroczne zakresy dat

Poniższy przykład pokazuje przypadek, w którym element CheckInDates zawiera DateRanges z polami start i end bez lat. W tym przykładzie promocja dotyczy zameldowania się między 29 grudnia a 2 stycznia, niezależnie od roku. Bezroczne zakresy dat, które przekraczają granicę nowego roku, są nieprawidłowe, dlatego zakres dat jest wyrażany jako dwa sąsiednie zakresy dat.

<?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>



Rabat na FreeNights

W poniższym przykładzie zniżki na dwie noce w cenie 50% za każde 4 noce w określonym zakresie dat rezerwacji. W przypadku planu podróży na 10 nocy cena za 4 noce wynosi 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>

W następnym przykładzie rabat 50% na jedną noc za każdą 3 noclegi w poszczególnych zakresach dat pobytu. Do zniżki wliczają się tylko pokrywające się noce. W przypadku tego planu podróży z zameldowaniem 1 stycznia 2022 r. i wymeldowaniem 7 listopada 2022 r. kwalifikujące się noce i rabaty są stosowane w podany niżej sposób.

  • 1.01.2022 (zostań)
  • 02.01.2022 (zostań)
  • 2022-01-03
  • 4.01.2022 r. (z rabatem)
  • 5.01.2022 r. (zostań w hotelu)
  • 6.01.2022 r. (zostań)
<?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>


Wybór pozycjonowany

W przykładzie poniżej znajdują się 2 rabaty: jeden ze zniżką 20%, a drugi 15%. Podczas oceny stosowany jest tylko rabat 15%, ponieważ ma niższą pozycję.

<?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>

NajlepszyCodziennyRabat

W tym przykładzie rabat na pobyt na 2 noce jest stosowany w przypadku właściwości BestDailyDiscount połączonych ze znakiem 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>

Rozważ pobyt na 2 noce od 30 kwietnia 2023 roku do 2 maja 2023 r. W obliczeniach najpierw podajemy połączenie najlepszych dziennych zniżek, które przynoszą największy rabat.

W przypadku pierwszej nocy promocja „ogólna” to jedyna kwalifikująca się kwota ze stałym rabatem w wysokości 20 USD.

W przypadku drugiej nocy promocja „być może” zapewnia większy rabat niż rabat „ogólny”. Jeśli wybierzesz „może”, wysokość rabatu wynosi 50.

Pobyt w promocji „fiesta” wynosi 5 za noc lub łącznie 10. Można ją łączyć z kombinacją najlepszych dziennych zniżek, ponieważ „fiesta” ma typ nakładania ustawiony na any. Jeśli ustawiona była wartość base, stosowana jest tylko kombinacja najlepszych zniżek dziennych lub rabatu „fiesta”. Więcej informacji znajdziesz w opisie właściwości Stacking.

Ogólnie cena za pobyt jest równa 20 + 50 + 10 = 80 zniżki na stałą kwotę.

Odpowiedzi

Składnia

Komunikat PromotionsResponse korzysta z tej składni:

<?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>

Elementy i atrybuty

Komunikat PromotionsResponse ma te elementy i atrybuty:

Element / @Atrybut Wystąpienia Typ Opis
PromotionsResponse 1 Complex element Element główny wskazujący powodzenie lub problemy dotyczące otrzymanej wiadomości z prośbą o promocję.
PromotionsResponse / @timestamp 1 DateTime Data i godzina utworzenia tej wiadomości.
PromotionsResponse / @id 1 string Unikalny identyfikator z powiązanej wiadomości o promocjach.
PromotionsResponse / @partner 1 string Konto partnera, z którego pochodzi ta wiadomość.
PromotionsResponse / Success 0..1 Success Oznacza, że wiadomość o promocjach została przetworzona bez ostrzeżeń i błędów.

W każdej wiadomości występuje właściwość <Success> lub <Issues>.

PromotionsResponse / Issues 0..1 Issues Kontener na co najmniej 1 problem, który wystąpił podczas przetwarzania wiadomości o promocjach.

W każdej wiadomości występuje właściwość <Success> lub <Issues>.

PromotionsResponse / Issues / Issue 1..n Issue Opis ostrzeżenia, błędu lub niepowodzenia podczas przetwarzania wiadomości o promocjach. Szczegółowe informacje o tych problemach znajdziesz w sekcji Komunikaty o błędach stanu pliku danych.
PromotionsResponse / Issues / Issue / @code 1 integer Identyfikator problemu.
PromotionsResponse / Issues / Issue / @status 1 enum

Typ napotkanego problemu.

Prawidłowe wartości to warning, error i failure.

Przykłady

Ukończono

To jest odpowiedź na wiadomość dotyczącą promocji, która została przetworzona.

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

Problemy

Poniżej znajdziesz odpowiedź na wiadomość o promocji, która nie została przetworzona z powodu błędów.

<?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>