Promocje

Przegląd

Ten interfejs API umożliwia określanie możliwych rabatów. Spośród określonych promocji Google stosuje kwalifikującą się promocję lub zestaw promocji, które prowadzą do najniższej ceny. Jeśli szukasz interfejsu API, który obsługuje dowolne korekty stawek, które mogą zwiększać lub zmniejszać cenę po spełnieniu określonych warunków, rozważ użycie naszego interfejsu Rate Modifications API. Pamiętaj, że jeśli oba interfejsy API są obecne, modyfikacje stawek są stosowane przed promocjami.

Żądania

Składnia

Wiadomość Promotions ma tę 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, 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>

Elementy i atrybuty

Wiadomość o promocjach zawiera te elementy i atrybuty:

Element / @Atrybut Wystąpienia Typ Opis
Promotions 1 Complex element Element główny wiadomości o promocjach.
Promotions / @partner 1 string Konto partnera, do którego należy ta wiadomość. Ta wartość ciągu znaków to wartość „Klucz partnera” podana 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> wiadomości <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 znaki to a–z, A–Z, 0–9, _ (podkreślenie) i - (łącznik).
Promotions / @timestamp 1 DateTime Data i godzina utworzenia tej wiadomości.
Promotions / HotelPromotions 0..n HotelPromotions

Promocje dotyczące obiektu. Każda promocja dotyczy tylko jednej usługi.

Jeśli nie użyjesz <Stacking>, do rezerwacji zostanie zastosowana promocja z największą zniżką, gdy kwalifikuje się do niej kilka promocji.

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

Jeśli została określona, wartość musi wynosić "overlay". Gdy wartość wynosi "overlay", wszystkie zapisane promocje są usuwane przed zapisaniem promocji określonych w bieżącej wiadomości.

Jeśli nie określisz tu żadnej wartości, każda promocja określona w bieżącej wiadomości będzie:

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

Jedna promocja dotycząca usługi. Pamiętaj, że jeśli nie określisz action="overlay" ani <Promotion>, wszystkie promocje dotyczące usługi zostaną usunięte.

Jeśli chcesz użyć 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), - (łącznik) i . (kropka).
Promotions /HotelPromotions / Promotion / @action 0..1 enum

Jeśli została określona, wartość musi wynosić delete. Jeśli nie zostanie podany i nie jest przechowywana promocja z tym samym id, ta promocja zostanie zapisana. W przeciwnym razie, jeśli nie zostanie określona i jest przechowywana promocja z tym samym identyfikatorem id, istniejąca promocja zostanie zaktualizowana.

Jeśli podasz wartość delete, zapisana promocja z tym samym identyfikatorem id zostanie usunięta. Jeśli używasz elementu delete, nie umieszczaj w nim żadnych elementów podrzędnych.<Promotion> Ponadto nie można używać delete w połączeniu z <HotelPromotions action="overlay"/>.

Promotions / HotelPromotions / Promotion / BookingDates 0..1 BookingDates Kontener zawierający co najmniej jeden zakres, który określa, kiedy musi nastąpić rezerwacja, aby można było zastosować promocję.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange 1..99 DateRange Zakres określający, kiedy musi nastąpić rezerwacja, aby można było zastosować promocję.
Promotions / HotelPromotions / Promotion / BookingDates / DateRange / @start 0..1 Date lub DateTime

Data lub data i godzina rozpoczęcia zakresu (w strefie czasowej usługi) włącznie z wartościami granicznymi.

  • Data lub data i godzina określone przez start muszą być wcześniejsze niż data lub data i godzina określone przez end (lub takie same).
  • Jeśli nie podasz wartości start, zakres będzie w zasadzie nieograniczony pod względem czasu rozpoczęcia.
  • Jeśli pole start zawiera datę w formacie „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 data i godzina zakończenia zakresu (według strefy czasowej usługi) włącznie.

  • Data lub data i godzina określone przez end muszą być późniejsze niż (lub takie same jak) data lub data i godzina określone przez start.
  • Jeśli nie podasz wartości end, zakres będzie w zasadzie nieograniczony pod względem czasu zakończenia.
  • Jeśli end jest podana jako data „RRRR-MM-DD”, jest interpretowana 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 dni, wszystkie dni w zakresie dat będą dozwolone. Każdy znak w ciągu określa dzień. Na przykład „MTWHF” oznacza, że w zakresie dat dozwolone są dni powszednie.

Prawidłowe znaki to:

  • M w przypadku poniedziałku
  • T – wtorek
  • W na środę
  • H w przypadku czwartku
  • F w piątek
  • S w sobotę
  • U w niedzielę

Dowolna kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / BookingWindow 0..1 BookingWindow Określa okres, w którym musi nastąpić rezerwacja w stosunku do daty zameldowania (na podstawie strefy czasowej obiektu). Na przykład okno rezerwacji może być ustawione na co najmniej 7 dni, ale nie więcej niż 180 dni przed zameldowaniem.
Promotions / HotelPromotions / Promotion / BookingWindow / @min 0..1 integer or duration Minimalny czas przed zameldowaniem, w którym musi nastąpić rezerwacja, aby można było zastosować promocję. Jeśli nie podasz żadnej opcji lub jej wartość to 0, nie będzie minimalnej wartości.

Prawidłowe typy wartości to:

  • Liczba całkowita: liczba dni przed datą zameldowania. Na przykład wartość 30 oznacza, że promocja dotyczy tylko rezerwacji dokonanych co najmniej 30 dni przed datą zameldowania.
  • Czas trwania w formacie ISO 8601 (dni, godziny i minuty): liczba dni (opcjonalnie godzin i minut) przed datą zameldowania. Na przykład wartość P30D oznacza, że promocja dotyczy tylko rezerwacji dokonanych co najmniej 30 dni przed datą zameldowania. Wartość P30DT6H wymaga rezerwacji najpóźniej do godziny 18:00 w 30 dniu przed przyjazdem.
Promotions / HotelPromotions / Promotion / BookingWindow / @max 0..1 integer or duration Maksymalna liczba dni przed zameldowaniem, w których musi nastąpić rezerwacja, aby można było zastosować promocję. Jeśli nie podasz żadnej opcji lub jej wartość to 0, nie ma maksymalnej wartości.

Prawidłowe typy wartości to:

  • Liczba całkowita: liczba dni przed datą zameldowania. Na przykład wartość 30 oznacza, że promocja dotyczy tylko rezerwacji dokonanych najpóźniej 30 dni przed datą zameldowania.
  • Czas trwania w formacie ISO 8601 (dni, godziny i minuty): liczba dni (opcjonalnie godzin i minut) przed datą zameldowania. Na przykład wartość P30D oznacza, że promocja dotyczy tylko rezerwacji dokonanych najpóźniej 30 dni przed datą zameldowania. Wartość P30DT6H wymaga rezerwacji w dniu przyjazdu lub po nim, ale nie później niż 30 dni przed przyjazdem.
Promotions / HotelPromotions / Promotion / Ceiling 0..1 Ceiling

Określa ograniczenia dotyczące maksymalnej wartości, jaką może osiągnąć stawka po zastosowaniu promocji.

Promocje muszą zawsze określać <Discount> lub <BestDailyDiscount>, więc aby utworzyć promocję, która stosuje tylko <Ceiling>, można ustawić <Discount> z wartością percentage równą 0.

Jeśli kumulowanie jest skonfigurowane, do jednego pobytu może mieć zastosowanie kilka promocji z <Ceiling>. Każda promocja zastosuje rabat, a następnie limit. Poniższy przykład pokazuje, jak każdy limit przyczynia się do obliczenia kolejnej promocji w stosie.

Przykład:

Cena za 1-dniowy pobyt, w przypadku którego AmountBeforeTax wynosi 100, a dostępne są 2 promocje:

  1. Promocja z typem łączenia base, wartością fixed_amount 25 i limitem amount_per_night 60
  2. Promocja z typem łączenia second,fixed_amount o wartości 25 i limitem amount_per_night o wartości 90

Kolejność obliczeń jest następująca:

  1. Promocja base jest stosowana w pierwszej kolejności i obniża cenę AmountBeforeTax do 75, ale potem limit obniża ją do 60.
  2. Promocja second obniża cenę AmountBeforeTax z 60 zł do 35 zł. Jest to poniżej limitu 90, więc drugi limit nie jest stosowany. Stawka końcowa to 35.

Fakt, że 60 zł to bardziej rygorystyczny ogólny limit, nie ma znaczenia, ponieważ obowiązuje on tylko w przypadku danej promocji, a nie może istnieć jeden limit obejmujący cały stos promocji.

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

Maksymalna kwota, na jaką można ustawić cenę za noc po zastosowaniu zniżki.

Jeśli określony jest też element <Floor>, ta wartość musi być większa lub równa wartości atrybutu amount_per_night w <Floor>.

amount_per_night jest stosowany do podatków i opłat, gdy są one uwzględnione w cenie za noc przy użyciu AmountAfterTax, ale nie do tych określonych przy użyciu TaxFeeInfo.

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

Określa ograniczenia dotyczące minimalnej wartości, jaką może osiągnąć cena po zastosowaniu promocji.

Promocje muszą zawsze określać <Discount> lub <BestDailyDiscount>, więc aby utworzyć promocję, która stosuje tylko <Floor>, można ustawić <Discount> z wartością percentage równą 0.

Logika <Floor> nadal obowiązuje w przypadku rabatów <FreeNights>, nawet jeśli do bezpłatnej nocy zastosowano rabat 100%.

Jeśli kumulowanie jest skonfigurowane, do jednego pobytu może mieć zastosowanie kilka promocji z <Floor>. Każda promocja zastosuje rabat, a następnie cenę minimalną. Poniższy przykład pokazuje, jak każda wartość minimalna wpływa na obliczanie kolejnej promocji w stosie.

Przykład:

Cena za 1-dniowy pobyt, w przypadku którego AmountBeforeTax wynosi 100, a dostępne są 2 promocje:

  1. Promocja z typem łączenia base, wartością fixed_amount 25 i wartością minimalną amount_per_night 90
  2. Promocja z typem łączenia second,fixed_amount o wartości 25 i wartością minimalną amount_per_night wynoszącą 60

Kolejność obliczeń jest następująca:

  1. Promocja base jest stosowana w pierwszej kolejności i obniża cenę AmountBeforeTax do 75, ale potem dolna granica podnosi ją do 90.
  2. Promocja second obniża cenę AmountBeforeTax z 90 zł do 65 zł. Jest to powyżej progu 60, więc drugi próg nie jest stosowany. Stawka końcowa to 65.

Fakt, że wartość 90 jest bardziej rygorystycznym progiem minimalnym, nie ma znaczenia, ponieważ obowiązuje tylko w przypadku danej promocji i nie może istnieć jeden próg minimalny obejmujący cały stos promocji.

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

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

Jeśli określony jest też element <Ceiling>, ta wartość musi być mniejsza lub równa wartości atrybutu amount_per_night w elemencie <Ceiling>.

amount_per_night jest stosowany do podatków i opłat, gdy są one uwzględnione w cenie za noc przy użyciu AmountAfterTax, ale nie do tych określonych przy użyciu TaxFeeInfo.

Promotions / HotelPromotions / Promotion / CheckinDates 0..1 CheckinDates Kontener zawierający co najmniej jeden zakres dat określający, kiedy musi nastąpić zameldowanie, aby można było zastosować promocję.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange 1..20 DateRange

Zakres dat określający, kiedy musi nastąpić zameldowanie, aby można było zastosować promocję. Ten element nie jest wymagany, jeśli usuwasz co najmniej jedną promocję.

Obsługiwany jest też format YearlessDate.

  • Jeśli jedna z wartości start lub end jest datą bez roku, obie muszą być datami bez roku.
  • Zakresy dat bez roku nie mogą obejmować nowego roku. Zamiast tego przedstaw zakres jako 2 sąsiadujące ze sobą zakresy dat. Na przykład {"12-29", "01-05"} można przedstawić jako {"12-29", "12-31"}{"01-01", "01-05"}.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @start 0..1 Date or YearlessDate Data rozpoczęcia zakresu dat (włącznie) w strefie czasowej usługi. Ta data musi być wcześniejsza niż data end lub taka sama jak ona. Jeśli zasada start nie jest określona, zakres dat jest w zasadzie nieograniczony pod względem daty rozpoczęcia.
Promotions / HotelPromotions / Promotion / CheckinDates / DateRange / @end 0..1 Date or YearlessDate Data zakończenia zakresu dat (włącznie) na podstawie strefy czasowej usługi. Musi to być data start lub późniejsza. Jeśli nie podasz wartości end, zakres dat będzie 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 dni, wszystkie dni w zakresie dat będą dozwolone. Każdy znak w ciągu określa dzień. Na przykład „MTWHF” oznacza, że w zakresie dat dozwolone są dni powszednie.

Prawidłowe znaki to:

  • M w przypadku poniedziałku
  • T – wtorek
  • W na środę
  • H w przypadku czwartku
  • F w piątek
  • S w sobotę
  • U w niedzielę

Dowolna kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / CheckoutDates 0..1 CheckoutDates Kontener zawierający co najmniej jeden zakres dat określający, kiedy musi nastąpić wymeldowanie, aby można było zastosować promocję.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange 1..20 DateRange

Zakres dat określający, kiedy musi nastąpić wymeldowanie, aby można było zastosować promocję. Ten element nie jest wymagany, jeśli usuwasz co najmniej jedną promocję.

Obsługiwany jest też format YearlessDate.

  • Jeśli jedna z wartości start lub end jest datą bez roku, obie muszą być datami bez roku.
  • Zakresy dat bez roku nie mogą obejmować nowego roku. Zamiast tego przedstaw zakres jako 2 sąsiadujące ze sobą zakresy dat. Na przykład {"12-29", "01-05"} można przedstawić jako {"12-29", "12-31"}{"01-01", "01-05"}.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @start 0..1 Date or YearlessDate Data rozpoczęcia zakresu dat (włącznie) w strefie czasowej usługi. Ta data musi być wcześniejsza niż data end lub taka sama jak ona. Jeśli zasada start nie jest określona, zakres dat jest w zasadzie nieograniczony pod względem daty rozpoczęcia.
Promotions / HotelPromotions / Promotion / CheckoutDates / DateRange / @end 0..1 Date or YearlessDate Data zakończenia zakresu dat (włącznie) na podstawie strefy czasowej usługi. Musi to być data start lub późniejsza. Jeśli nie podasz wartości end, zakres dat będzie 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 dni, wszystkie dni w zakresie dat będą dozwolone. Każdy znak w ciągu określa dzień. Na przykład „MTWHF” oznacza, że w zakresie dat dozwolone są dni powszednie.

Prawidłowe znaki to:

  • M w przypadku poniedziałku
  • T – wtorek
  • W na środę
  • H w przypadku czwartku
  • F w piątek
  • S w sobotę
  • U w niedzielę

Dowolna kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / Devices 0..1 Devices Kontener z listą urządzeń użytkowników, które kwalifikują się do promocji. Jeśli ta opcja jest włączona, rabat jest oferowany tylko uprawnionym użytkownikom na wymienionych urządzeniach. Jeśli nie zostanie określony, kwalifikujący się użytkownicy na dowolnym urządzeniu będą mogli skorzystać z obniżonej ceny.
Promotions / HotelPromotions / Promotion / Devices / Device 1..3 Device Określa jeden typ urządzenia użytkownika, który kwalifikuje się do promocji.
Promotions / HotelPromotions / Promotion / Devices / Device / @type 1 enum Typ urządzenia. Wartość musi wynosić desktop, tablet lub mobile.
Promotions / HotelPromotions / Promotion / Discount 1 Discount

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

Określa rabat, który ma zostać zastosowany w ramach tej promocji.

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

Wymagana jest dokładnie jedna z tych wartości: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Wartość dziesiętna z zakresu 0–100 określająca rabat procentowy. Jest on stosowany do elementu AmountAfterTax (lub AmountBeforeTax, jeśli element AmountAfterTax nie został określony).

Przykłady:

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

    cena promocyjna = AmountAfterTax * (1 – rabat procentowy)

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

  • Jeśli AmountBeforeTax wynosi 100, percentage wynosi 20, a w elemencie TaxFeeInfo określono podatek w wysokości 10,

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

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

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

Wymagana jest dokładnie jedna z tych wartości: percentage, percentage_of_base, 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 procent rabatu podstawowego. Podobnie jak w przypadku percentage, jest ona stosowana do AmountAfterTax (lub AmountBeforeTax, jeśli nie określono AmountAfterTax).

W przeciwieństwie do percentage ten rabat jest zawsze obliczany jako procent stawek podstawowych, niezależnie od wcześniejszych promocji, które zostały zastosowane kolejno.

Przykład:

  • Załóżmy, że mamy 2 promocje, które są stosowane kolejno do 1-dniowego pobytu w cenie 100. Pierwszy to zwykły rabat procentowy w wysokości 10%, a drugi to rabat procentowy w wysokości 10% ceny podstawowej. Wtedy cena po rabacie wyniesie 80, ponieważ obie promocje obniżają cenę o 10. Jeśli druga promocja również byłaby zwykłą zniżką procentową, cena po rabacie wyniosłaby 81, ponieważ druga promocja obniża cenę o 10% z 90.
Promotions / HotelPromotions / Promotion / Discount / @fixed_amount 0..1 float

Wymagana jest dokładnie jedna z tych wartości: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Stała kwota do odjęcia od sumy AmountAfterTax stawek za noc (lub sumy AmountBeforeTax stawek za noc, jeśli nie określono AmountAfterTax). Zakłada się, że jest ona podana w tej samej walucie co ceny za noc. Jeśli jest ona większa niż suma cen za noc, wynikowa wartość wynosi zero.

Przykłady:

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

    cena promocyjna = AmountAfterTax – stały rabat

    80,00 = 100 – 20

  • Jeśli wyceniamy pobyt na 1 noc, a AmountBeforeTax wynosi 100, fixed_amount wynosi 20, a w elemencie TaxFeeInfo określono podatek w wysokości 8%, to

    cena promocyjna = (AmountBeforeTax – stała zniżka) * (1 + podatek procentowy)

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

  • Jeśli wyceniamy pobyt na 1 noc, a wartość AmountBeforeTax wynosi 50, fixed_amount wynosi 60, a w elemencie TaxFeeInfo określono podatek w wysokości 10, to

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

    10,00 = 0 + 10

  • Jeśli wyceniamy 3-dniowy pobyt, a wartości AmountAfterTax wynoszą 100, 110 i 120, a wartość fixed_amount wynosi 150, to

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

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

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

Wymagana jest dokładnie jedna z tych wartości: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Stały rabat stosowany do każdej z AmountAfterTax cen za noc (lub do najtańszych N, jeśli określono applied_nights). Jeśli AmountAfterTax nie został określony, jest stosowany do AmountBeforeTax. Zakłada się, że jest ona podana w tej samej walucie co ceny za noc. Jeśli fixed_amount_per_night jest większa niż cena za noc, cena za noc zostanie obniżona do zera. Rabat nie może spowodować, że cena za noc będzie ujemna.

Przykłady:

  • Jeśli obliczamy cenę za 3-dniowy pobyt, a wartości AmountAfterTax wynoszą 100, 110 i 120, a wartość fixed_amount_per_night wynosi 10, to

    stawka promocji = suma(AmountBeforeTax – stała kwota rabatu)

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

  • Jeśli wyceniamy 3-dniowy pobyt, a wartości AmountAfterTax wynoszą 10, 50 i 100, a wartość fixed_amount_per_night to 20, to

    stawka promocji = suma(AmountAfterTax – stała kwota rabatu)

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

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

Wymagana jest dokładnie jedna z tych wartości: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Jeśli określono AmountAfterTax ceny za noc, ta wartość ustawia cenę pobytu, w tym podatki i opłaty, na podaną wartość. Jeśli podasz wartość AmountBeforeTax, cena pobytu przed opodatkowaniem zostanie ustawiona na podaną wartość, niezależnie od tego, czy podasz wartość AmountAfterTax. Zakłada się, że jest ona podana w tej samej walucie co ceny za noc.

Jeśli AmountAfterTax ma odzwierciedlać podatek procentowy, ustawienie stałej ceny dla AmountBeforeTax może spowodować nieprawidłowe obliczenie podatków i opłat. Zdecydowanie zalecamy używanie elementu TaxFeeInfo do określania podatków i opłat za obiekt.

Przykłady:

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

    stawka promocyjna = cena stała * (1 + procent podatku)

    86,40 = 80 * 1,08

  • Jeśli wyceniamy 3-dniowy pobyt, a wartości AmountAfterTax wynoszą 100, 110 i 120, a wartość fixed_amount to 300, to

    promotion rate = 300

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

Wymagana jest dokładnie jedna z tych wartości: percentage, percentage_of_base, fixed_amount, fixed_amount_per_night, fixed_price lub fixed_price_per_night.

Jeśli podasz AmountAfterTax stawek za noc, cena za każdą noc pobytu, w tym podatki i opłaty, zostanie ustawiona na podaną wartość. Jeśli podasz wartość AmountBeforeTax, cena przed opodatkowaniem za każdą noc pobytu zostanie ustawiona na podaną wartość, niezależnie od tego, czy podasz wartość AmountAfterTax. Zakłada się, że jest ona podana w tej samej walucie co ceny za noc.

Jeśli AmountAfterTax ma odzwierciedlać podatek procentowy, ustawienie stałej ceny dla AmountBeforeTax może spowodować nieprawidłowe obliczenie podatków i opłat. Zdecydowanie zalecamy używanie elementu TaxFeeInfo do określania podatków i opłat za obiekt.

Jeśli podasz wartość applied_nights, nowa cena zostanie zastosowana do najtańszych N nocy.

Przykłady:

  • Jeśli ustalamy cenę za 2-nocny pobyt, a wartości AmountBeforeTax to 90, 90; wartości AmountAfterTax to 100, 100; a wartość fixed_price to 80, to cena promocyjna wynosi 80 + 80 = 160.
  • Jeśli wyceniamy 2-nocny pobyt, w którym AmountBeforeTax wynosi 100, 100, fixed_amount wynosi 80, a TaxFeeInfo określa podatek w wysokości 8%, to cena promocyjna wynosi (80 + 80) * 1,08 = 172,8.
  • Jeśli cena 3-dniowego pobytu, w którym wartości AmountAfterTax wynoszą 100, 110 i 120, a wartość fixed_amount wynosi 110, to cena promocyjna wynosi 110 * 3 = 330.
Promotions / HotelPromotions / Promotion / Discount / @applied_nights 0..1 integer

Należy go używać tylko z atrybutami percentage lub fixed_amount_per_night.

Liczba nocy, do których stosowany jest rabat, począwszy od najtańszej. Musi być liczbą całkowitą z zakresu od 1 do 99. Jeśli nie zostanie określony, rabat zostanie zastosowany do wszystkich nocy.

Promotions / HotelPromotions / Promotion / Discount / FreeNights 0..1 FreeNights Określa rabat na wybrane noce pobytu, gdy zostanie osiągnięta minimalna długość pobytu. Jeśli używasz tego elementu, atrybuty w elemencie nadrzędnym Discount są niedozwolone.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @stay_nights 1 integer

Liczba wymaganych nocy, aby zastosować zniżkę. Każda zniżka jest stosowana do oddzielnego segmentu nocy pobytu.

Jeśli np. pobyt trwa 10 nocy, a wartość parametru stay_nights wynosi 4 (i repeats ma wartość „true”), to istnieją 2 segmenty nocy pobytu: od 1 do 4 nocy i od 5 do 8 nocy. 9 i 10 noc nie należą do segmentu nocy pobytu.

Promotions / HotelPromotions / Promotion / Discount / FreeNights / @discount_nights 1 integer Liczba nocy objętych zniżką w każdym segmencie nocy pobytu.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @discount_percentage 1 float Rabat zastosowany do nocy objętych zniżką. Jeśli ta wartość to 50, każda wybrana noc jest o 50% tańsza.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @night_selection 1 string Musi to być cheapest lub last. Jeśli jest ustawione na last, noce na końcu segmentu pobytu są objęte zniżką. Jeśli cheapest, rabat obejmuje najtańsze noce w segmencie nocy pobytu.
Promotions / HotelPromotions / Promotion / Discount / FreeNights / @repeats 1 boolean

Określa, czy rabat można zastosować do wielu segmentów nocy pobytu. Jeśli false, rabat obejmuje tylko segment nocy pobytu na początku planu podróży. Jeśli true, rabat obejmuje każdy segment nocy pobytu.

Jeśli np. wartość stay_nights wynosi 4, a plan podróży obejmuje 10 nocy, to jeśli wartość repeats to true, rabat obejmuje 2 segmenty (noce 1–4 i 5–8), ale jeśli wartość repeats to false, rabat obejmuje tylko 1 segment (noce 1–4).

Promotions / HotelPromotions / Promotion / Discount / @rank 0..1 integer Przypisuje tej promocji rangę i włącza ją do wyboru na podstawie rangi, w którym wybierana jest tylko promocja o najniższej randze. Wartości muszą mieścić się w przedziale od 1 do 99 włącznie. Jeśli kilka promocji ma ten sam ranking, jedna z nich zostanie wybrana i zastosowana w sposób losowy.
Promotions / HotelPromotions / Promotion / BestDailyDiscount 1 Discount

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

Określa dzienny rabat, który można zastosować do nocy pobytu. Jest to przeciwieństwo Discount, która stosuje zniżki do całych pobytów.

Każda usługa może mieć jedną grupę promocji, które są uznawane za „najlepsze codzienne”. Oznacza to, że w przypadku każdej nocy pobytu wybierana jest jedna „najlepsza dzienna” promocja, która kwalifikuje się do zastosowania i zapewnia największy rabat na tę noc.

Wartość Stacking można określić za pomocą parametru BestDailyDiscount. Musi mieć wartość base lub none. „Najlepsze dzienne” zniżki, które zapewniają największą zniżkę na każdą noc, są łączone i traktowane jako pojedyncza zniżka na pobyt (czyli Discount) z uwzględnieniem skonfigurowanego typu łączenia. Ten łączny rabat jest porównywany z innymi kwalifikującymi się promocjami <Discount> i można go z nimi łączyć, aby znaleźć jedną promocję lub kombinację promocji, która zapewnia największy rabat. Wybierana i stosowana jest kombinacja BestDailyDiscount lub pojedyncza Discount, w zależności od tego, która z nich daje niższą cenę, w przypadku typu łączenia base.

W przypadku tego typu rabatu można określić wartość StayDates, ale wartość application musi być ustawiona na overlap

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

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

Wartość dziesiętna z zakresu 0–100 określająca rabat procentowy. Jest on stosowany do elementu AmountAfterTax (lub AmountBeforeTax, jeśli element AmountAfterTax nie został określony).

Przykłady:

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

    cena promocyjna = AmountAfterTax * (1 – rabat procentowy)

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

  • Jeśli wartość AmountBeforeTax za nocleg wynosi 100, wartość percentage wynosi 20, a TaxFeeInfo określa podatek w wysokości 10, to

    cena 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 jeden z tych atrybutów: percentage, fixed_amount lub fixed_price.

Stała kwota do odjęcia od pojedynczej AmountAfterTax stawki za noc (lub AmountBeforeTax stawki za noc, jeśli AmountAfterTax nie jest określona). Zakłada się, że jest ona podana w tej samej walucie co ceny za noc. Jeśli jest ona większa niż suma cen za noc, wynikowa wartość wynosi zero.

Przykłady:

  • Jeśli AmountBeforeTax za jedną noc wynosi 90, AmountAfterTax wynosi 100, a fixed_amount wynosi 20, to

    cena promocyjna = AmountAfterTax – stały rabat

    80,00 = 100 – 20

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

    cena promocyjna = (AmountBeforeTax – stała zniżka) * (1 + podatek procentowy)

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

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

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

Jeśli podasz AmountAfterTax stawek za noc, cena za nocleg (wraz z podatkami i opłatami) zostanie ustawiona na podaną wartość. Jeśli podasz wartość AmountBeforeTax, cena pobytu przed opodatkowaniem zostanie ustawiona na podaną wartość, niezależnie od tego, czy podasz wartość AmountAfterTax. Zakłada się, że jest ona podana w tej samej walucie co ceny za noc.

Przykłady:

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

    stawka promocyjna = cena stała * (1 + procent podatku)

    86,40 = 80 * 1,08

Promotions / HotelPromotions / Promotion / InventoryCount 0..1 InventoryCount Określa ograniczenia dotyczące liczby pokoi, które muszą być dostępne, aby można było zastosować tę promocję. Rabat jest stosowany tylko do nocy, które spełniają ograniczenie. Niedozwolone w przypadku zniżki fixed_amount. Pamiętaj, że liczba dostępnych pokoi jest określana za pomocą elementu 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 mogła zostać zastosowana do stawki za noc. Jeśli nie określisz tu żadnej wartości, nie będzie limitów.
Promotions / HotelPromotions / Promotion / InventoryCount / @max 0..1 integer Maksymalna liczba pokoi, które muszą być dostępne, aby promocja mogła zostać zastosowana do ceny za noc. Jeśli nie podasz żadnej opcji, nie będzie obowiązywał limit.
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 jest stosowana, gdy długość pobytu wykracza poza minimalny i maksymalny limit.
Promotions / HotelPromotions / Promotion / LengthOfStay / @min 0..1 integer Minimalna liczba nocy, jaką musi obejmować pobyt, aby można było zastosować promocję. Jeśli nie określisz tego parametru, nie będzie wartości minimalnej.
Promotions / HotelPromotions / Promotion / LengthOfStay / @max 0..1 integer Maksymalna liczba noclegów, w przypadku których można zastosować promocję. Jeśli nie podasz żadnej opcji, nie będzie limitu.
Promotions / HotelPromotions / Promotion / MembershipRateRule 0..1 MembershipRateRule

Kontener reguły stawki członkostwa, która wywołuje określony sposób wyświetlania interfejsu w przypadku powiązanej zniżki.

Tego elementu nie należy określać, chyba że podasz też element <Discount>.

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

Identyfikator zasady cenowej powiązanej z programem członkostwa.

Promotions / HotelPromotions / Promotion / MinimumAmount 0..1 MinimumAmount Określa minimalną sumę dziennych stawek za pokój (przy użyciu większej z wartości 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órą należy przekroczyć, aby zastosować promocję.
Promotions / HotelPromotions / Promotion / Occupancy 0..1 Occupancy Określa ograniczenia dotyczące liczby osób, dla których ta promocja jest stosowana. Promocja nie jest stosowana, gdy liczba osób jest poza zakresem wartości minimalnej i maksymalnej.

Promocje dotyczą ceny za plan podróży. Nie można ustawić maksymalnego rabatu na osobę.

Promotions / HotelPromotions / Promotion / Occupancy / @min 0..1 integer Aby zastosować rabat, liczba osób określona przez użytkownika musi być co najmniej równa tej wartości.
Promotions / HotelPromotions / Promotion / Occupancy / @max 0..1 integer Aby zastosować rabat, liczba osób określona przez użytkownika musi być mniejsza lub równa tej wartości.
Promotions / HotelPromotions / Promotion / RatePlans 0..1 RatePlans Kontener z listą planów taryfowych, do których ma zastosowanie promocja. Jeśli nie podasz wartości <RatePlans>, promocja będzie dotyczyć wszystkich planów cenowych.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan 1..n RatePlan Określa abonament. Plan cenowy jest określany przez kombinację pakietu, stawek i dostępności zdefiniowanych w wiadomościach Transaction (Property Data), OTA_HotelRateAmountNotifRQ i OTA_HotelAvailNotifRQ oraz identyfikowanych przez PackageID.
Promotions / HotelPromotions / Promotion / RatePlans / RatePlan / @id 1 string Unikalny identyfikator planu cenowego. Ta wartość jest mapowana na wartość PackageID w elemencie <PackageData> w komunikacie Transakcja (dane obiektu) oraz na atrybut RatePlanCode w elemencie <StatusApplicationControl> w komunikatach <OTA_HotelRateAmountNotifRQ><OTA_HotelAvailNotifRQ>. Maksymalna dozwolona liczba znaków to 50.
Promotions / HotelPromotions / Promotion / RoomTypes 0..1 RoomTypes Kontener z listą typów pokoi, do których ma zastosowanie promocja. Promocja jest stosowana do każdego <RoomType> określonego. Jeśli nie określisz wartości <RoomTypes>, promocja będzie dotyczyć wszystkich pokoi.
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType 1..n RoomType Określa typ pomieszczenia. Typ pokoju jest zdefiniowany w elemencie <RoomData> w wiadomości Transaction (Property Data) i jest do niego odwoływany za pomocą wartości <RoomID>. (Jej wartość <RoomID> jest też używana w atrybucie InvTypeCode w wiadomościach OTA_HotelRateAmountNotifRQ).
Promotions / HotelPromotions / Promotion / RoomTypes / RoomType / @id 1 string Unikalny identyfikator asortymentu (rodzaju pokoju). Ta wartość jest mapowana na <RoomID> w wiadomości Transaction (Property Data). Maksymalna dozwolona liczba znaków to 50.
Promotions / HotelPromotions / Promotion / Stacking 0..1 Stacking Określa, w jaki sposób można łączyć promocje. Jeśli nie zostanie określony, przyjmuje się, że „type” to base.
Promotions / HotelPromotions / Promotion / Stacking / @type 1 enum

Do jednej stawki można zastosować kilka promocji w zależności od tego ustawienia:

  • any: Można łączyć z innymi promocjami (z wyjątkiem none), ale nie gwarantujemy kolejności stosowania promocji.
  • base: Najlepsza kwalifikująca się base promocja jest wybierana i stosowana jako pierwsza, przed innymi promocjami. Wcześniej ta funkcja nosiła nazwę base_only.
  • second: Najlepsza kwalifikująca się second promocja jest wybierana i stosowana po base promocji (jeśli ma zastosowanie) i przed any promocjami.
  • none: Nie można łączyć z innymi promocjami.

Z dozwolonych kombinacji do stawki stosowany jest zestaw promocji, który zapewnia największy rabat.

Promotions / HotelPromotions / Promotion / StayDates 0..1 StayDates Kontener na co najmniej 1 zakres dat, który określa, jak ma być stosowana promocja, np. w celu uwzględnienia rabatów sezonowych.
Promotions / HotelPromotions / Promotion / StayDates / @application 1 enum

Opisuje sposób zastosowania promocji.

Prawidłowe wartości to:

  • all: stosuje promocję do każdej nocy w harmonogramie, jeśli wszystkie daty w harmonogramie pokrywają się z datami pobytu.
  • any: stosuje promocję do wszystkich nocy w planie podróży, jeśli jakakolwiek data w planie podróży pokrywa się z datą w zakresie dat pobytu.
  • overlap: stosuje promocję tylko do tych nocy w planie podróży, które pokrywają się z datą z zakresu 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 procent stawek za noc w przypadku nakładających się nocy.
  • <Discount> z wartościami fixed_amountapplication ustawionymi na overlap to nieprawidłowa kombinacja.
  • <FreeNights> obsługuje wszystkie wartości application. Pamiętaj, że w przypadku overlap do wymagań dotyczących zniżki brane są pod uwagę tylko noce pobytu, które się pokrywają.
Promotions / HotelPromotions / Promotion / StayDates / DateRange 1..99 DateRange

Zakres dat określający, kiedy ma być stosowana promocja.

Obsługiwany jest też format YearlessDate.

  • Jeśli jedna z wartości start lub end jest datą bez roku, obie muszą być datami bez roku.
  • Zakresy dat bez roku nie mogą obejmować nowego roku. Zamiast tego przedstaw zakres jako 2 sąsiadujące ze sobą zakresy dat. Na przykład {"12-29", "01-05"} można przedstawić jako {"12-29", "12-31"}{"01-01", "01-05"}.

Jeśli chcesz ustawić StayDates zakres, aby zezwolić na promocję w określone dni tygodnia, ustaw start datę jako bieżącą datę bez end, aby promocja nie wygasła.

Promotions / HotelPromotions / Promotion / StayDates / DateRange / @start 0..1 Date or YearlessDate Data rozpoczęcia zakresu dat (włącznie) w strefie czasowej usługi. Ta data musi być wcześniejsza niż data end lub taka sama jak ona. Jeśli zasada start nie jest określona, zakres dat jest w zasadzie nieograniczony pod względem daty rozpoczęcia.

Jeśli nie podasz wartości end, musisz określić wartość start.

Promotions / HotelPromotions / Promotion / StayDates / DateRange / @end 0..1 Date or YearlessDate Data zakończenia zakresu dat (włącznie) na podstawie strefy czasowej usługi. Ta data musi być taka sama jak data start lub późniejsza. Jeśli zasada end nie jest określona, zakres dat jest w zasadzie nieograniczony od daty start.

Jeśli nie podasz wartości start, musisz określić wartość end.

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

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

Prawidłowe znaki to:

  • M w przypadku poniedziałku
  • T – wtorek
  • W na środę
  • H w przypadku czwartku
  • F w piątek
  • S w sobotę
  • U w niedzielę

Dowolna kombinacja znaków jest prawidłowa.

Promotions / HotelPromotions / Promotion / UserCountries 0..1 UserCountries Kontener z listą lokalizacji użytkowników (krajów), które kwalifikują się do promocji. Jeśli to określisz, zniżka będzie oferowana tylko kwalifikującym się użytkownikom w wymienionych krajach. Jeśli nie zostanie określony, obniżona cena będzie oferowana kwalifikującym się użytkownikom w dowolnym kraju.
Promotions / HotelPromotions / Promotion / UserCountries / @type 0..1 enum Typ specyfikacji UserCountries.

Prawidłowe wartości to include i exclude.

Jeśli parametr UserCountries type ma wartość include, promocja dotyczy użytkowników z wymienionych krajów.

Jeśli UserCountries type ma wartość exclude, promocja dotyczy użytkowników spoza wymienionych krajów.

Jeśli parametr UserCountries type nie jest ustawiony, jest traktowany jako include, a promocja jest stosowana do użytkowników z wymienionych krajów.

Promotions / HotelPromotions / Promotion / UserCountries / Country 1..300 Country Określa jeden kraj, w którym użytkownicy kwalifikują się do promocji.
Promotions / HotelPromotions / Promotion / UserCountries / Country / @code 1 string Kod kraju CLDR, np. DE lub FR. Pamiętaj, że w przypadku niektórych krajów kod kraju CLDR nie jest taki sam jak 2-literowy kod kraju ISO. Kody regionów CLDR nie są też obsługiwane.

Przykłady

Obowiązuje limit 500 promocji na usługę. Aby usunąć promocje z usługi, zapoznaj się z przykładem „Usuwanie jednej promocji”.

Podstawowa wiadomość

Poniższy przykład przedstawia 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

Poniższy przykład pokazuje, jak utworzyć rabat w przypadku nadmiaru zapasów w pobliżu daty przyjazdu:

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

Poniższy przykład pokazuje, jak usunąć jedną promocję dla 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">
    <Promotion id="1" action="delete"/>
  </HotelPromotions>
</Promotions>

Usuwanie wszystkich promocji

Poniższy przykład pokazuje, jak usunąć wszystkie promocje 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>



Nakładanie wszystkich promocji

Poniższy przykład pokazuje, jak nałożyć <HotelPromotions> na usługę za pomocą co najmniej jednej nowej promocji. Gdy action="overlay", wszystkie zapisane promocje są usuwane 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 łączenia

Poniższy przykład pokazuje sytuację, w której zastosowane zostaną 3 różne promocje (base, second, any). Zwróć uwagę, że promocja none nie zostanie zastosowana, ponieważ inne promocje zapewniają większy rabat. Jeśli pierwotna cena wynosiła 100 zł, cena po rabacie 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 układania w stos

W przykładzie poniżej pokazano sytuację, w której zastosowano promocję none, ponieważ połączenie innych promocji zapewnia mniejszy rabat. Jeśli pierwotna cena wynosiła 100 zł, cena promocyjna 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 okresu rezerwacji

W przykładzie poniżej pokazano przypadek, w którym element BookingWindow jest używany z określonymi granicami początku i końca jako typem czasu trwania w formacie ISO 8601. To ograniczenie dotyczące okresu rezerwacji wymaga dokonania rezerwacji najpóźniej do godziny 18:00 w dniu poprzedzającym przyjazd i najwcześniej o godzinie 12:00 w 2 dniu przed przyjazdem.

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


Zakres dat rezerwacji

Poniższy przykład pokazuje, jak element BookingDates jest używany z atrybutami start i end jako typy DateTime. To ograniczenie daty rezerwacji wymaga, aby rezerwacja została dokonana w okresie od 1 lipca 2020 r. o godzinie 6:30 do 2 lipca 2020 r. o godzinie 18:45.

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


Zakresy dat bez roku

Poniższy przykład pokazuje przypadek, w którym element CheckInDates zawiera elementy DateRanges z polami start i end bez lat. W tym przykładzie promocja obowiązuje w przypadku dat zameldowania od 29 grudnia do 2 stycznia, niezależnie od roku. Zakresy dat bez roku, które przekraczają granicę nowego roku, są nieprawidłowe, więc DateRange jest wyrażony jako 2 sąsiadujące ze sobą 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 FreeNights

W tym przykładzie rabat w wysokości 50% jest przyznawany za 2 noce w przypadku każdego pobytu trwającego 4 noce w określonym zakresie dat rezerwacji. W przypadku 10-dniowego planu podróży 50% rabatu będzie obowiązywać przez 4 noce.

<?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 kolejnym przykładzie rabat na jedną noc wynosi 50% za każde 3 noce w określonych zakresach dat pobytu. Do uzyskania rabatu liczą się tylko noce pobytu, które się pokrywają. W przypadku poniższego planu podróży z datą zameldowania 2022-01-01 i datą wymeldowania 2022-01-07 kwalifikujące się noce pobytu i rabaty są stosowane w ten sposób:

  • 2022-01-01 (pobyt)
  • 2022-01-02 (pobyt)
  • 2022-01-03
  • 2022-01-04 (po obniżonej cenie)
  • 2022-01-05 (pobyt)
  • 2022-01-06 (pobyt)
<?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 rankingowy

W poniższym przykładzie są 2 rabaty: jeden na 20% i drugi na 15%. Podczas oceny zostanie zastosowany tylko rabat 15%, ponieważ ma niższą rangę.

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

W tym przykładzie rabat na 2-dniowy pobyt jest obliczany przez zastosowanie BestDailyDiscount w połączeniu z 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 r. do 2 maja 2023 r. W celu obliczenia najpierw znajduje się kombinacja najlepszych rabatów dziennych, która daje największy rabat.

W przypadku pierwszej nocy jedyną kwalifikującą się kwotą jest promocja „ogólna” ze stałą zniżką w wysokości 20.

W przypadku drugiej nocy promocja „may” oferuje większy rabat niż rabat „general”. Jeśli wybrano „may”, stała kwota rabatu wynosi 50.

W przypadku pobytu promocja „fiesta” obniża cenę do 5 PLN za noc, czyli łącznie 10 PLN. Można go łączyć z kombinacją najlepszych rabatów dziennych, ponieważ typ łączenia dla „fiesta” to any. Jeśli jest ustawiona na base, stosowana jest tylko kombinacja najlepszych rabatów dziennych lub rabat „fiesta”. Więcej informacji znajdziesz w opisie Stacking.

`Ogólnie cena pobytu jest obniżana o stałą kwotę 20 + 50 + 10 = 80.

Odpowiedzi

Składnia

Wiadomość PromotionsResponse ma tę 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

Wiadomość PromotionsResponse ma te elementy i atrybuty:

Element / @Atrybut Wystąpienia Typ Opis
PromotionsResponse 1 Complex element Element główny wskazujący, czy otrzymana wiadomość z żądaniem promocji została przetworzona prawidłowo, czy wystąpiły problemy.
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, do którego należy ta wiadomość.
PromotionsResponse / Success 0..1 Success Wskazuje, że wiadomość o promocjach została przetworzona bez ostrzeżeń, błędów lub awarii.

W każdej wiadomości występuje element <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 element <Success> lub <Issues>.

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

Rodzaj napotkanego problemu.

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

Przykłady

Sukces

Oto odpowiedź na prawidłowo przetworzoną wiadomość o promocjach.

<?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 znajduje się odpowiedź na wiadomość z promocjami, 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>