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 / @Attribute | Wystąpienia | Typ | Opis |
|---|---|---|---|
| Promotions | 1 | Complex element | Element główny wiadomości o promocjach. |
| Promotions / @partner | 1 | string | Konto partnera dla tej wiadomości. 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 |
| 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 – (myślnik). |
| Promotions / @timestamp | 1 | DateTime | Data i godzina utworzenia tej wiadomości. |
| Promotions / HotelPromotions | 0..n | HotelPromotions | Promocje dotyczące usługi. Każda promocja dotyczy tylko jednej usługi. Jeśli nie użyjesz |
| 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ć Jeśli nie określisz tu żadnej wartości, każda promocja określona w bieżącej wiadomości będzie:
|
| Promotions / HotelPromotions / Promotion | 0..99 | Promotion | Jedna promocja dotycząca obiektu. Pamiętaj, że jeśli nie określisz 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), - (myślnik) i . (kropka). |
| Promotions /HotelPromotions / Promotion / @action | 0..1 | enum | Jeśli została określona, wartość musi wynosić Jeśli podasz wartość |
| Promotions / HotelPromotions / Promotion / BookingDates | 0..1 | BookingDates | Kontener na 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.
|
| 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.
|
| 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:
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 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:
|
| 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:
|
| 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ć Jeśli kumulowanie jest skonfigurowane, do jednego pobytu może mieć zastosowanie kilka promocji z Przykład: Cena za 1-dniowy pobyt, w przypadku którego
Kolejność obliczeń jest następująca:
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
|
| 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 określać Logika Jeśli kumulowanie jest skonfigurowane, do jednego pobytu może mieć zastosowanie kilka promocji z Przykład: Cena za 1-dniowy pobyt, w przypadku którego
Kolejność obliczeń jest następująca:
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
|
| 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.
|
| 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 strefie czasowej usługi), włącznie z wartościami granicznymi. Musi to być data start lub późniejsza. Jeśli nie podasz wartości end, zakres dat będzie w praktyce 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:
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ć płatność, 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.
|
| 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 strefie czasowej usługi), włącznie z wartościami granicznymi. Musi to być data start lub późniejsza. Jeśli nie podasz wartości end, zakres dat będzie w praktyce 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:
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, obniżona cena jest oferowana 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: Określa rabat, który ma zostać zastosowany w ramach tej promocji. |
| Promotions / HotelPromotions / Promotion / Discount / @percentage | 0..1 | float | Wymagane jest podanie dokładnie jednej z tych wartości: Wartość dziesiętna z zakresu 0–100 określająca rabat procentowy.
Jest on stosowany do elementu Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @percentage_of_base | 0..1 | float | Wymagane jest podanie dokładnie jednej z tych wartości: Wartość dziesiętna z zakresu 0–100 określająca procent rabatu podstawowego. Podobnie jak w przypadku W przeciwieństwie do Przykład:
|
| Promotions / HotelPromotions / Promotion / Discount / @fixed_amount | 0..1 | float | Wymagane jest podanie dokładnie jednej z tych wartości: Stała kwota do odjęcia od sumy Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @fixed_amount_per_night | 0..1 | float | Wymagane jest podanie dokładnie jednej z tych wartości: Stały rabat stosowany do każdej z Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @fixed_price | 0..1 | float | Wymagane jest podanie dokładnie jednej z tych wartości: Jeśli określono Jeśli Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @fixed_price_per_night | 0..1 | float | Wymagane jest podanie dokładnie jednej z tych wartości: Jeśli określono Jeśli Jeśli określono parametr Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @applied_nights | 0..1 | integer | Ten atrybut powinien być używany tylko z atrybutami 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 ten element jest używany, atrybuty elementu nadrzędnego 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 |
| 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 stosowany 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 | Informacja o tym, czy rabat można zastosować do wielu segmentów nocy pobytu. Jeśli Jeśli np. |
| 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 zakresie 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: Określa dzienny rabat, który można zastosować do nocy pobytu. Różni się to od 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ść W przypadku tego typu rabatu można określić wartość |
| Promotions / HotelPromotions / Promotion / BestDailyDiscount / @percentage | 0..1 | float | Wymagany jest dokładnie jeden z tych atrybutów: Wartość dziesiętna z zakresu 0–100 określająca rabat procentowy.
Jest on stosowany do elementu Przykłady:
|
| Promotions / HotelPromotions / Promotion/ BestDailyDiscount / @fixed_amount | 0..1 | float | Wymagany jest dokładnie jeden z tych atrybutów: Stała kwota do odjęcia od pojedynczej Przykłady:
|
| Promotions / HotelPromotions / Promotion/ BestDailyDiscount / @fixed_price | 0..1 | float | Wymagany jest dokładnie jeden z tych atrybutów: Jeśli określono Przykłady:
|
| 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 noclegów w ramach pobytu, 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 podany jest też element |
| 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 wartości 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órą należy przekroczyć, aby zastosować promocję. |
| Promotions / HotelPromotions / Promotion / Occupancy | 0..1 | Occupancy | Określa ograniczenia dotyczące zajętości, do których ma zastosowanie ta promocja. 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 o obiekcie) oraz na atrybut RatePlanCode w elemencie <StatusApplicationControl> w komunikatach <OTA_HotelRateAmountNotifRQ> i <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>. (Jego wartość <RoomID> jest też przywoływana przez atrybut 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:
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, jak należy zastosować promocję. Prawidłowe wartości to:
Ten atrybut musi być zawsze określony.
|
| Promotions / HotelPromotions / Promotion / StayDates / DateRange | 1..99 | DateRange | Zakres dat, w których ma obowiązywać promocja. Obsługiwany jest też format YearlessDate.
Jeśli chcesz ustawić |
| 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 |
| Promotions / HotelPromotions / Promotion / StayDates / DateRange / @end | 0..1 | Date or YearlessDate | Data zakończenia zakresu dat (w strefie czasowej usługi), włącznie z wartościami granicznymi. 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 |
| 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:
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 tak, tylko kwalifikujący się użytkownicy z wymienionych krajów będą mogli skorzystać z obniżonej ceny. 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 Jeśli parametr UserCountries Jeśli UserCountries Jeśli parametr UserCountries |
| 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 dwuliterowy 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”.
Wiadomość podstawowa
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ć zniżkę 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 wartość parametru action="overlay" wynosi 1, 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
Poniższy przykład pokazuje 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>
Booking Dates DateTime Bounds
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 dotyczy dat zameldowania między 29 grudnia a 2 stycznia, niezależnie od roku. Zakresy dat bez roku, które przekraczają granicę nowego roku, są nieprawidłowe, więc DateRange jest wyrażany 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 4-nocnego pobytu 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 kwalifikują 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. Aby obliczyć rabat, najpierw znajdź kombinację 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 ustawisz wartość base, zastosowana zostanie 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 / @Attribute | 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 dla tej wiadomości. |
| 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 |
| 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 |
| 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 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 |
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ść dotyczącą 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>