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 |
| 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 |
| 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 usługi. 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), - (łącznik) 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 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.
|
| 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 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:
|
| 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że osiągnąć cena 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łą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:
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.
|
| 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:
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: 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: 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 | Wymagana jest dokładnie jedna z tych wartości: Wartość dziesiętna z zakresu od 0 do 100, która określa procent rabatu podstawowego. Podobnie jak w przypadku W przeciwieństwie do Przykład:
|
| Promotions / HotelPromotions / Promotion / Discount / @fixed_amount | 0..1 | float | Wymagana jest dokładnie jedna 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 | Wymagana jest dokładnie jedna z tych wartości: Stały rabat stosowany do każdej z Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @fixed_price | 0..1 | float | Wymagana jest dokładnie jedna z tych wartości: Jeśli określono Jeśli Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @fixed_price_per_night | 0..1 | float | Wymagana jest dokładnie jedna z tych wartości: Jeśli podasz Jeśli Jeśli podasz wartość Przykłady:
|
| Promotions / HotelPromotions / Promotion / Discount / @applied_nights | 0..1 | integer | Należy go używać 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 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 |
| 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 Jeśli np. wartość |
| 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: Określa dzienny rabat, który można zastosować do nocy pobytu. Jest to przeciwieństwo 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 podasz 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 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 |
| 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> 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>. (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:
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:
Ten atrybut musi być zawsze określony.
|
| 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 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łą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 |
| 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 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 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 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 |
| 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 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 |
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>