> ## Documentation Index
> Fetch the complete documentation index at: https://www.twicecommerce.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Cenová tabulka

> Cenová struktura, která určuje, jak je inzerát oceněn: sazby za pronájem podle doby trvání, prodejní ceny a plány předplatného, s volitelnými časovými okny a přepsáním podle varianty.

![Cenové tabulky v administraci](https://mintcdn.com/twicecommerce/Ab7tx7ih94KQsi0k/images/catalog-price-tables.webp?fit=max\&auto=format\&n=Ab7tx7ih94KQsi0k\&q=85\&s=7318ed02c5760ce47bbcfb6342cd995b)

Katalog > Cenové tabulky

## Definice

<Snippet file="definitions/cs/price-table-definition.mdx" />

> [!NOTE]
>
> **Analogie:** Cenová tabulka je sazebník. Sdružuje všechny ceny pro jeden režim prodeje (rezervace, prodej nebo předplatné) do jednoho editovatelného objektu, který lze připojit k jednomu inzerátu nebo sdílet napříč mnoha.

> [!TIP]
>
> **Zvláštnost v TWICE:** Inzerát nikdy neukládá pole ceny přímo. Veškeré ceny žijí na cenových tabulkách. Inzerát může mít jednu výchozí cenovou tabulku plus libovolný počet časově omezených tabulek pro akce, sezónní okna nebo kampaňové ceny.
>
> `availabilityRange` tabulky řídí, kdy jsou její řádky kandidáty, nedává tabulce prioritu. V okamžiku výpočtu se posuzují společně řádky ze všech tabulek aktivních pro danou rezervaci (viz [Určení ceny](#určení-ceny)).

## Kde to použiji?

* **Sazebníky pronájmu** – Definujte `1 den @ 40 €`, `3 dny @ 100 €`, `1 týden @ 180 €` atd.
* **Prodejní ceny** – Nastavte přímou prodejní cenu inzerátu, volitelně s porovnávací (přeškrtnutou) cenou
* **Plány předplatného** – Nastavte období příslibu, platební cyklus a interval automatického obnovení
* **Akční / sezónní ceny** – Připojte navíc datovanou cenovou tabulku, jejíž řádky se posuzují uvnitř jejího okna (**levnější** akční řádek se vybere před výchozím, viz [Určení ceny](#určení-ceny))
* **Přepsání podle varianty** – Upravte každý cenový řádek pomocí `rateMultiplier` pro konkrétní hodnoty variant
* **Hromadné přeceňování** – Udržujte jednu sdílenou tabulku a propojte ji s mnoha inzeráty v kategorii

## Model cenové tabulky

Sdílená výchozí cenová tabulka vrácená API vypadá takto:

```json theme={null}
{
  "id": "a1b2c3d4-e5f6-4789-a012-3456789abcde",
  "catalogItemId": null,
  "label": "Standard bike rates",
  "availabilityRange": null,
  "isDefault": true,
  "bookingsEnabled": true,
  "salesEnabled": true,
  "subscriptionsEnabled": false,
  "bookingPricingRows": [],
  "salesPricingRows": [],
  "subscriptionPricingRows": [],
  "variants": [],
  "isShared": true,
  "linkedCatalogItemsCount": 12,
  "createdAt": "2026-01-15T09:30:00Z"
}
```

`catalogItemId` je `null` u sdílených tabulek, které nejsou vázány na jeden inzerát, a `availabilityRange` je `null` u výchozí tabulky, která je platná vždy.

Jedna cenová tabulka nese tři na sobě nezávislé sady řádků (rezervace, prodej a předplatné), řízené přepínači `bookingsEnabled`, `salesEnabled` a `subscriptionsEnabled`. Vypněte režimy, které neprodáváte, aby editační plocha zůstala přehledná.

## Sdílená vs. samostatná

| Pole | Význam |
| - | - |
| `isShared = true` | Tabulka žije v **Katalog → Cenové tabulky** a lze ji propojit s mnoha inzeráty. `catalogItemId` je null |
| `isShared = false` | Samostatná tabulka, která existuje jen na jednom inzerátu. `catalogItemId` je nastaveno |
| `isDefault = true` | Označuje vždy platnou tabulku (bez `availabilityRange`), takže její řádky jsou vždy v kandidátském poolu. `isDefault` také řídí, která tabulka je předvybraná v editoru, **nezajišťuje** ale tabulce vítězství v okamžiku výpočtu. Výchozí může být jen sdílená tabulka bez `availabilityRange` |
| `availabilityRange` | Okno, během kterého jsou řádky této tabulky **kandidáty**. `null` znamená vždy kandidát (povoleno jen u výchozí tabulky). Řídí kandidaturu, ne prioritu |

Propojování se spravuje přes vyhrazené koncové body (`link-catalog-item`, `unlink-catalog-items`), aby si inzerát udržel čistý záznam o tom, které sdílené tabulky se uplatňují.

## Typy cenových řádků

Cenová tabulka obsahuje tři prodejní typy řádků, každý řídí jiný režim nákupu, a čtvrtý, který odkazuje jinam.

### Rezervační cenové řádky

Používá se, když je objednávka rezervací pronájmu.

| Pole | Typ | Popis |
| - | - | - |
| `label` | String | Štítek zobrazovaný zákazníkovi (`Day`, `Weekend`, `Week`) |
| `timeUnit` | Enum | `seconds`, `minutes`, `hours`, `days`, `weeks`, `months`, `years` |
| `timeUnitAmount` | Int > 0 | Počet jednotek, které tento řádek oceňuje |
| `timeUnitPrice` | Int | Cena za celý blok, v nejmenších jednotkách měny |
| `timeCalculation` | `standard` \| `cap_to_closing` | Jak se řádek uplatňuje napříč rozsahem dat. `cap_to_closing` zastaví účtování na konci provozní doby |
| `timeBasis` | `rolling` \| `capped` | Jak se počítá doba trvání. `rolling` (výchozí): „den" je 24 uplynulých hodin od vyzvednutí. `capped`: každé kalendářní období, kterého se rezervace dotkne, je jedna účtovatelná jednotka, viz [Cenotvorba od](#cenotvorba-od) |
| `counterTimeUnitPrice` | Int \| null | Záložní cena za blok tohoto řádku, použitá pro úseky rezervace, které nepokrývá žádné omezení řádku na den v týdnu / denní dobu / datum. Když záložní cenu nabízí více řádků, vyhrává nejlevnější použitelná. `null` znamená, že řádek žádnou záložní cenu nenabízí |
| `additionalTimeUnitPrice` | Int \| null | Cena za čas nad rámec nastaveného bloku |
| `additionalTimeUnitCalculationType` | `add` \| `multiply` | Jak se dodatečná cena sčítá |
| `weekdays` | Int\[] (1–7) \| null | Omezí řádek na konkrétní dny v týdnu |
| `timeOfDayRange` | `{ start, end }` \| null | Omezí na okno uvnitř dne |
| `availabilityRange` | `{ start, end }` \| null | Omezí na rozsah dat |
| `isDynamicPricing` | Boolean | Označuje, že řádek je řízen dynamickou cenou místo pevné ceny |
| `isHidden` | Boolean | Ponechá řádek v tabulce, ale skryje ho na stránce produktu |
| `isEnabled` | Boolean | Měkké zapnutí/vypnutí řádku |

Pro cenu podle sazby vybírá engine řádky, které nejlépe pokrývají dobu trvání rezervace (viz [Určení ceny](#určení-ceny)). Hodinové, denní a týdenní řádky umožňují jedné cenové tabulce pokrýt jakoukoli dobu trvání rozumnou sazbou.

### Prodejní cenové řádky

Používá se pro objednávky přímého prodeje.

| Pole | Typ | Popis |
| - | - | - |
| `price` | Int ≥ 0 | Prodejní cena v nejmenších jednotkách měny |
| `compareAtPrice` | Int \| null | Přeškrtnutá „původní" cena používaná pro akce |
| `availabilityRange` | `{ start, end }` \| null | Časové okno, ve kterém řádek platí |
| `isEnabled` | Boolean | Měkké zapnutí/vypnutí |

### Cenové řádky předplatného

Používá se pro objednávky v režimu předplatného. Celý fakturační životní cyklus najdete v [Předplatná](https://www.twicecommerce.com/docs/cs/concepts/catalog/subscriptions.md).

| Pole | Typ | Popis |
| - | - | - |
| `label` | String | Název plánu zobrazovaný zákazníkovi (např. „Měsíční", „Roční") |
| `price` | Int > 0 | Cena za cyklus v nejmenších jednotkách měny |
| `paymentCycleUnit` / `paymentCycleAmount` | Enum / Int | Interval fakturace. Jednotka je `days`, `weeks`, `months` nebo `years` |
| `commitmentCycles` | Int > 0 | Počet platebních cyklů, ke kterým se zákazník zavazuje (max. 24) |
| `initialChargeType` | `order_creation` \| `subscription_start` | Kdy je splatná první faktura |
| `renewalType` | `none` \| `auto_renew` | Chování po skončení období příslibu |
| `renewalPrice` | Int \| null | Cena za cyklus po skončení příslibu (jen u automatického obnovení). Null znamená obnovení za původní `price` |
| `collectionMethod` | `charge_automatically` \| `send_invoice` | Jak se platba vybírá. Výchozí: `charge_automatically` |
| `cancellationLeadTimeUnit` / `cancellationLeadTimeAmount` | Enum / Int | Jak dlouho předem musí být zrušení požadováno |
| `availabilityRange` | `{ start, end }` \| null | Časové okno |
| `isEnabled` | Boolean | Měkké zapnutí/vypnutí |

### Externí možnosti nákupu

Čtvrtý typ řádku pošle zákazníka jinam, místo aby mu prodal. Zapněte v cenové tabulce **Externí možnosti nákupu** a přidejte odkazy v sekci **Externí odkazy**.

| Pole | Typ | Popis |
| - | - | - |
| `label` | String | Text na tlačítku. Povinné |
| `url` | String | Kam tlačítko vede. Musí začínat `https://` nebo `http://` |

Každý odkaz vykreslí na stránce nabídky tlačítko, které otevře URL v novém panelu, vedle obvyklých nákupních tlačítek. Nevznikne objednávka ani se nestrhne platba, takže externí odkaz nemá vlastní okno dostupnosti ani vlastní přepínač zapnutí.

Popisky tlačítek jsou přeložitelné jako zbytek obsahu obchodu, v rozsahu **Externí možnosti nákupu**.

Nabídka připojená ke sdílené tabulce zobrazí odkazy té tabulky a u nabídky je uvedeno **"Řízeno propojenou cenovou tabulkou"**.

## Ceny podle varianty

Pokud má inzerát varianty, cenová tabulka může nést volitelné pole `variants` se záznamy `CatalogItemVariantPricingTable`. Každý záznam váže `variantName` plus jednu nebo více `values` na `rateMultiplier` a násobitele podle řádku pro rezervaci, prodej a předplatné.

`CatalogItemVariantPricingTable` má následující pole:

| Pole | Typ | Popis |
| - | - | - |
| `id` | UUID | Identifikátor generovaný serverem |
| `variantName` | String | Osa varianty, na kterou toto přepsání cílí |
| `values` | `CatalogItemVariantValue[]` | Hodnoty variant, na které se přepsání vztahuje |
| `booking` | Array | Násobitele podle rezervačního řádku |
| `sales` | Array | Násobitele podle prodejního řádku |
| `subscription` | Array | Násobitele podle řádku předplatného |
| `rateMultiplier` | Number | Násobitel na úrovni tabulky uplatněný na kombinaci |
| `pricingTableId` | UUID | Cenová tabulka, ke které toto přepsání patří |

Každé přepsání podle řádku odkazuje na základní cenový řádek, který upravuje (`basePricingRowId`), a uplatňuje `rateMultiplier` (a volitelně `additionalRateMultiplier`) nad cenou tohoto základního řádku. Násobitel `1.0` odpovídá základu, `1.2` přidá 20 %, `0.8` odečte 20 %.

Administrace označí každou kombinaci se záznamem `CatalogItemVariantPricingTable` jako „Cena varianty" místo „Základ".

## Cenotvorba od

Každý rezervační cenový řádek má pole `timeBasis`, které řídí, jak se počítá doba trvání pro účtování. Existují dva režimy:

| `timeBasis` | Štítek | Chování |
| - | - | - |
| `rolling` (výchozí) | Uplynulá doba | Sazba „1 den" pokrývá 24 uplynulých hodin od vyzvednutí. Rezervace od 23:00 do 01:00 trvá 2 hodiny, bezpečně v rámci jedné denní jednotky |
| `capped` | Cenotvorba od | Sazba „1 den" pokrývá každý **kalendářní den**, kterého se rezervace dotkne. Rezervace od 23:00 do 01:00 zasahuje do dvou kalendářních dnů a účtují se **dvě denní jednotky** |

### Jak funguje účtování „Cenotvorba od"

Cenový engine určí každé kalendářní období, kterého se rezervace dotkne, na vlastní mřížce řádku. Denní jednotka je vždy od půlnoci do půlnoci, hodinová jednotka od celé hodiny do celé hodiny a týdenní jednotka začíná na dni v týdnu nastaveném jako první u daného tenanta.

Každé dotčené období se účtuje jako jedna jednotka, pokud jemnější sazba nepokrývá rezervovanou část tohoto období levněji. Engine rekurzivně vybírá nejlevnější platnou skladbu.

**Příklad, denní a týdenní sazby:**

Desetidenní rezervace začínající ve čtvrtek, s denní sazbou 50 € a týdenní sazbou 250 €:

* Čtvrtek až neděle: 4 zahájené dny = 200 €
* Pondělí až následující neděle: 1 zahájený týden = 250 €
* Celkem: **450 €**

Týden je zarovnaný na kalendář (pondělí až neděle při týdnu začínajícím v pondělí), ne ukotvený na vyzvednutí.

**Příklad, denní a hodinové sazby:**

Denní sazba 100 €, hodinová sazba 20 €. Rezervace od pondělí 09:00 do úterý 09:00:

* Pondělí: 1 zahájený den = 100 €
* Úterý: 1 zahájený den = 100 €
* Celkem: **200 €** (2 kalendářní dny)

Pokud by hodinová sazba byla místo toho 5 €, engine by naúčtoval 24 zahájených hodin = 120 €, protože jemnější skladba je levnější.

### „Cenotvorba od" u balíčků s pevnou dobou trvání

Rezervační řádky s pevnou dobou trvání také podporují `timeBasis`. Balíček s pevnou dobou v režimu `capped` ukotví datum vrácení ke kalendářnímu období, ne k přesnému času vyzvednutí.

Pevný balíček „2 dny" vyzvednutý v pondělí ve 14:00:

* **Uplynulé** (`rolling`): vrácení ve středu ve 14:00, přesně o 48 hodin později
* **Zahájené** (`capped`): vrácení v **úterý** do posledního dostupného času vrácení, rezervace zasahuje do pondělí a úterý, takže jsou pokryty dva kalendářní dny

Pokud den vrácení připadne na den, kdy je místo zavřené, tato možnost se pro dané datum vyzvednutí nenabízí.

### Omezení

* **Jednotky pod hodinu se vždy účtují jako uplynulé.** Řádky používající `seconds` nebo `minutes` nastavení `timeBasis` neovlivňuje. V tabulce s režimem „Cenotvorba od" volně koexistují.
* **Všechny řádky podle sazby v jedné tabulce sdílejí jedno `timeBasis`.** Administrace to vynucuje jedním zaškrtávacím polem **Cenotvorba od**, které se uplatní na všechny způsobilé řádky podle sazby. Řádky s pevnou dobou trvání mají každý své nezávislé nastavení `timeBasis`.
* **Týdenní sazby používají den začátku týdne nastavený u tenanta.** Rezervace sobota-neděle se počítá jako jeden týden při týdnu začínajícím v pondělí (oba dny jsou ve stejném týdnu pondělí-neděle), ale jako dva týdny při týdnu začínajícím v neděli.

![Sekce rezervačních cen se zaškrtávacím polem Cenotvorba od](https://mintcdn.com/twicecommerce/5ARkyCTk5wMAizBn/images/catalog-listing-pricing.webp?fit=max\&auto=format\&n=5ARkyCTk5wMAizBn\&q=85\&s=667528b54b992ad9f1997518ed63ec6e)

Rezervační ceny podle sazby se zaškrtávacím polem Cenotvorba od

![Možnosti doby trvání pevného řádku s variantami Zahájeno a Uplynulé](https://mintcdn.com/twicecommerce/5ARkyCTk5wMAizBn/images/catalog-listing-pricing-duration-options.webp?fit=max\&auto=format\&n=5ARkyCTk5wMAizBn\&q=85\&s=8dbcb61d0428165a1ddad0fcb6c67e02)

Možnosti doby trvání na řádku s pevnou cenou

## Určení ceny

`availabilityRange` řídí, **které tabulky jsou kandidáty** pro danou rezervaci, **nedává** tabulce prioritu. Neexistuje pole priority nebo přepsání na úrovni tabulky. Při výpočtu ceny:

Všechny cenové výpočty běží v **časovém pásmu místa**. Hranice dne, hranice týdne, omezení `weekdays` a okna `timeOfDayRange` se vyhodnocují podle místního času daného místa, ne podle UTC nebo časového pásma zákazníka. Rezervace blízko místní půlnoci se přiřadí ke správnému místnímu dni a přechody letního času řeší kalendářní aritmetika v časovém pásmu daného místa.

1. **Shromážděte aktivní tabulky.** Tabulka je aktivní, když nemá `availabilityRange`, nebo se její rozsah překrývá s daty rezervace. Výchozí tabulka (bez rozsahu) je proto vždy aktivní *společně* s jakoukoli datovanou tabulkou, do jejíhož okna rezervace spadá.
2. **Spojte řádky do poolu.** Každý povolený řádek z každé aktivní tabulky se shromáždí do jednoho kandidátského poolu. Engine **nejprve nevybírá** jednu „vítěznou" tabulku, řádky z různých tabulek soutěží přímo.
3. **Vyberte řádek/řádky.**
   * **Rezervace podle sazby (dynamické)** – jak se pool vyhodnotí, závisí na [časovém základu](#cenotvorba-od) řádků v něm. Celý postup najdete v [Cenách podle sazby](https://www.twicecommerce.com/docs/cs/concepts/catalog/rate-based-pricing.md) a níže v [Nejdelší vyhovující řádek vs. nejlevnější skladba](#nejdelší-vyhovující-řádek-vs-nejlevnější-skladba): oba základy používají skutečně odlišné algoritmy a tento rozdíl rozhoduje, zda se lze vyhnout předraženému dlouhému řádku. V obou případech musí omezení řádku `weekdays`, `timeOfDayRange` a `availabilityRange` projít, než je řádek způsobilý pro daný úsek, a jakýkoli zbytek připadne kratším řádkům a pravidlům dodatečného času.
   * **Rezervace s pevnou cenou** – zákazník vybere konkrétní cenový řádek (například `1 den @ 40 €`) a cena tohoto řádku se použije přímo.
4. **Uplatněte násobitele variant.** Pokud záznam `CatalogItemVariantPricingTable` odpovídá vybrané kombinaci hodnot variant, vynásobte příspěvek řádku násobitelem na úrovni řádku (a `rateMultiplier` na úrovni tabulky).
5. **Vraťte součty.** Koncové body `…/rate-based-price` a `…/fixed-price` vrací `priceBreakdown` plus `totalPrice`, s jednotlivými příspěvky rozepsanými pro výkladní skříň i souhrn objednávky.

> [!WARNING]
>
> Datovaná tabulka nepřebíjí výchozí podle data, soutěží ve stejném poolu. U ceny podle sazby se datovaný řádek použije jen tehdy, když ho engine vybere.
>
> Řádky se **stejnou dobou trvání** odděluje jen cena, takže **levnější** akční řádek vyhrává uvnitř svého okna, a **vyšší** datovaná cena (například sváteční příplatek) se **neuplatní**, dokud výchozí tabulka nese řádek stejné doby trvání za nižší cenu.
>
> **Příklad.** Výchozí tabulka: `1 den @ 100 €` (bez časového rozsahu). Sváteční tabulka: `1 den @ 150 €` (24.–31. 12.). 24hodinový pronájem 25. 12. se ocení na **100 €**, oba řádky pokrývají den stejně, takže vyhrává levnější. Chcete-li účtovat sváteční sazbu 150 €, odeberte nebo vypněte konkurující řádek za 100 € pro dané okno (nebo nastavte jeho `availabilityRange` tak, aby sváteční data vyloučil), aby ho pokrýval jen řádek za 150 €.

V modelu cenové tabulky dnes neexistují ceny podle štítku zákazníka, ceny podle segmentu zákazníka na cenové tabulce nastavit nelze. Akce pro konkrétní zákazníky se řeší přes [slevové kódy](https://www.twicecommerce.com/docs/cs/concepts/catalog/discount-codes.md), ne přes cenové tabulky.

### Nejdelší vyhovující řádek vs. nejlevnější skladba

Vyhodnocení podle sazby není jeden algoritmus. Který se spustí, rozhoduje [časový základ](#cenotvorba-od) řádků podle sazby v poolu.

**Uplynulá doba (`rolling`, výchozí): nejdelší vyhovující řádek jako první.** Engine prochází rezervaci od jejího začátku. V každém kroku vezme nejdelší řádek, který se ještě vejde do zbývajícího času, posune se o dobu trvání tohoto řádku a opakuje. Cena rozhoduje jen mezi řádky se stejnou dobou trvání. Engine nikdy neporovnává dlouhý řádek proti skladbě kratších, takže:

* Týdenní řádek vyhraje sedmidenní rezervaci **bez ohledu na cenu**, i když stojí víc než sedm denních sazeb.
* Dva jednodenní řádky za 100 € a 150 € se vyhodnotí na 100 €, protože mají stejnou dobu trvání.
* Jednodenní řádek za 150 € a dvanáctihodinový řádek za 10 € se vyhodnotí na **denní řádek**, protože je delší.

**Cenotvorba od (`capped`): nejlevnější skladba.** Engine místo toho pracuje s kalendářními obdobími. Za každé období, kterého se rezervace dotkne, naúčtuje buď jednu jednotku tohoto období, nebo **levnější jemnější skladbu** rezervované části, podle toho, co stojí méně, a tyto možnosti porovnává rekurzivně napříč každou úrovní granularity na tabulce.

Zde cena rozhoduje i napříč dobami trvání: týdenní řádek dražší než sedm zahájených dnů prohrává s denními řádky.

> [!NOTE]
>
> Řádky podle sazby v jedné tabulce sdílejí jeden časový základ, ale řádky z různých tabulek se spojují do poolu. Pokud kterýkoli řádek v poolu používá Cenotvorbu od, celá rezervace se vyhodnotí enginem pro kalendářní období, přičemž uplynulé řádky proti němu soutěží na nezarovnaném rozsahu.

Praktický důsledek: při výchozím uplynulém základu se předražený dlouhý řádek „neprocenuje pryč", naopak se upřednostní. Odstupňování přináší slevu jen proto, že delší blok naceníte níž, ne proto, že by engine hledal nejlevnější celkovou cenu.

## Uplatnění tabulek na inzeráty a kolekce

Sdílená cenová tabulka se propojuje s inzerátem přes vyhrazené koncové body:

* `POST /pricing-tables/pricing-table/:pricingTableId/link-catalog-item` – propojí jeden inzerát
* `DELETE /pricing-tables/pricing-table/:pricingTableId/unlink-catalog-items` – hromadné odpojení
* `POST /pricing-tables/add-pricing-table-to-catalog-item` – diskriminované sjednocení pro čtyři režimy propojení:
  * `mode = 'link'` – propojí s existující sdílenou tabulkou
  * `mode = 'create'` – vytvoří novou samostatnou tabulku přímo na místě
  * `mode = 'sharedToShared'` – nahradí jedno sdílené propojení jiným
  * `mode = 'sharedToStandalone'` – rozvětví sdílenou tabulku do samostatné na inzerátu
  * `mode = 'standaloneToShared'` / `'standaloneUpdate'` – přepne vlastnictví nebo přejmenuje přímo na místě

Kolekce nelze s cenovou tabulkou propojit přímo. Pro přecenění kolekce projděte její `listCatalogItems` a propojte tabulku s každým inzerátem.

## Klíčové vlastnosti (cenová tabulka)

| Vlastnost | Typ | Popis |
| - | - | - |
| `id` | UUID | Generováno serverem |
| `label` | String | Čitelný název zobrazený na kartách a ve výběrech v administraci |
| `catalogItemId` | UUID \| null | Nastaveno pro samostatné tabulky, null pro sdílené |
| `isShared` | Boolean | Rozlišuje sdílenou od samostatné |
| `isDefault` | Boolean | Označuje vždy platnou tabulku (bez `availabilityRange`) a řídí, která tabulka je předvybraná v editoru. Nehraje žádnou roli při výběru řádku v okamžiku výpočtu |
| `availabilityRange` | `{ start, end }` \| null | Okno platnosti tabulky |
| `bookingsEnabled` | Boolean | Zda se vyhodnocují rezervační řádky |
| `salesEnabled` | Boolean | Zda se vyhodnocují prodejní řádky |
| `subscriptionsEnabled` | Boolean | Zda se vyhodnocují řádky předplatného |
| `bookingPricingRows` | `BookingPricingRow[]` | Řádky sazby za pronájem |
| `salesPricingRows` | `SalesPricingRow[]` | Řádky přímého prodeje |
| `subscriptionPricingRows` | `SubscriptionPricingRow[]` | Řádky předplatného |
| `variants` | `CatalogItemVariantPricingTable[]` | Přepsání podle varianty |
| `linkedCatalogItemsCount` | Number | Kolik inzerátů na tuto tabulku odkazuje |

## Vztahy

> **Propojena s jedním nebo více inzeráty**
>
> Sdílenou cenovou tabulku lze propojit z mnoha inzerátů. Samostatná cenová tabulka existuje na jednom inzerátu.

> **Nese rezervační, prodejní řádky a řádky předplatného**
>
> Každá tabulka je kontejner pro tři na sobě nezávislé cenové režimy. Režimy zapínejte a vypínejte bez přestavby tabulky.

> **Překrývá ceny variant nad variantami inzerátu**
>
> Záznamy cen podle varianty odkazují na hodnoty variant na inzerátu, viz [koncept Varianta](https://www.twicecommerce.com/docs/cs/concepts/catalog/variants.md).

> **Vyhodnocena vůči režimu nákupu inzerátu u pokladny**
>
> Výkladní skříň i tvůrce objednávek vybere správný řádek podle režimu nákupu (rezervace / prodej / předplatné) a zavolá koncový bod `…/rate-based-price` nebo `…/fixed-price` pro výpočet celkové ceny.

## Životní cyklus

**1. Vytvoření**

`POST /pricing-tables/` s `label` a (u sdílených tabulek) `isDefault: true`. Nové tabulky začínají s prázdnými poli řádků.

> **Samostatná, nebo sdílená?**
>
> Samostatnou použijte, když jsou ceny jedinečné pro jeden inzerát. Sdílenou použijte, když chcete stejný sazebník znovu použít napříč kategorií inzerátů.

> **Mohu udělat datovanou tabulku výchozí?**
>
> Ne. Jen tabulky s `availabilityRange = null` mohou mít `isDefault = true` (vynucuje administrace; model příznak povoluje, ale logika propojení datované tabulky při určování výchozí přeskočí).

**2. Přidání řádků**

Přidejte rezervační / prodejní řádky nebo řádky předplatného přes koncové body pro jednotlivé řádky (`/pricing-table/:id/row`, `…/sales-row`, `…/subscription-row`). Přepsání podle varianty přidejte přes `/pricing-table/:id/variant-pricing-table`.

**3. Propojení s inzerátem**

Použijte `add-pricing-table-to-catalog-item` se správným `mode`. Karta Ceny na inzerátu zobrazuje propojené tabulky v postranním panelu a umožňuje vytvářet nové přímo na místě.

**4. Přepsání podle varianty**

Přidejte blok `CatalogItemVariantPricingTable` pro hodnoty variant, které potřebují jinou cenu.

**5. Povýšení nebo nahrazení**

Chcete-li zavést změnu ceny bez narušení aktivních objednávek, přidejte pro dané okno novou datovanou tabulku. Uvnitř tohoto okna její řádky soutěží s výchozí tabulkou ve stejném poolu: **levnější** řádek se vybere automaticky, pro uplatnění **vyšší** sazby ještě odeberte konkurující výchozí řádek nebo mu časově omezte platnost (viz [Určení ceny](#určení-ceny)).

Existující objednávky si ponechávají cenu, kterou zachytily u pokladny.

**6. Smazání**

`DELETE /pricing-tables/delete-table/:pricingTableId`. Odstranění sdílené tabulky ji odpojí od každého inzerátu.

## Časté dotazy

> **Může mít jeden inzerát více cenových tabulek?**
>
> Ano. Můžete připojit výchozí tabulku plus libovolný počet datovaných tabulek pro akce nebo sezónní okna. V okamžiku objednávky se řádky ze všech tabulek aktivních pro danou rezervaci spojí do poolu a engine z něj vybírá, viz [Určení ceny](#určení-ceny). `availabilityRange` rozhoduje, které tabulky jsou kandidáty, ne která vyhraje.

> **Odkud pochází cena za dobu pronájmu?**
>
> Z rezervačních cenových řádků, které pokrývají požadovanou dobu trvání. Na výchozím základu **Uplynulá doba** engine vezme nejdelší řádek, který se vejde do zbývajícího času, a na zbytek uplatní pravidla dodatečného času. Na základu **Cenotvorba od** účtuje kalendářní období, kterých se rezervace dotkne. Viz [Nejdelší vyhovující řádek vs. nejlevnější skladba](#nejdelší-vyhovující-řádek-vs-nejlevnější-skladba).

> **Jak spustím víkendovou akci 20 %?**
>
> Vytvořte datovanou cenovou tabulku s `availabilityRange` pokrývajícím víkend, s řádky nacenenými o 20 % **níž** než výchozí, a propojte ji s dotčenými inzeráty. Protože jsou akční řádky levnější a pokrývají stejné doby trvání, engine je uvnitř okna vybere a poté se vrátí k výchozí tabulce.
>
> Funguje to právě proto, že je akce **levnější**, na vyšší ceny a příplatky se ptá další otázka.

> **Proč se neuplatní moje vyšší sezónní / sváteční cena?**
>
> Protože engine spojuje do poolu všechny aktivní tabulky a datované nezvýhodňuje. Tam, kde mají dva řádky **stejnou dobu trvání**, je odděluje jen cena, takže vyhrává levnější výchozí řádek a příplatek se nikdy nevybere.
>
> Chcete-li uplatnit příplatek, odeberte nebo vypněte konkurující výchozí řádek pro dané okno, nebo nastavte `availabilityRange` výchozího řádku tak, aby daná data vyloučil, aby je pokrýval jen vyšší řádek.

> **Jaký je rozdíl mezi uplynulým základem a Cenotvorbou od?**
>
> **Uplynulý základ** (`rolling`, výchozí) počítá uplynulý čas od vyzvednutí. „Den" je 24 hodin. Rezervace od pondělí 14:00 do středy 14:00 se účtuje přesně na 2 dny.
>
> **Cenotvorba od** (`capped`) počítá každé kalendářní období, kterého se rezervace dotkne. „Den" je od půlnoci do půlnoci. Stejná rezervace od pondělí 14:00 do středy 14:00 zasahuje do pondělí, úterý a středy, tedy 3 zahájené dny.
>
> Cenotvorbu od používejte, když účtujete za kalendářní den (jako parkovací domy nebo noci v hotelu). Uplynulý základ používejte, když účtujete za přesný uplynulý čas (jako hodinový pronájem vybavení).

> **Mohou se ceny lišit podle segmentu zákazníka?**
>
> Ne přes cenové tabulky. Model cenové tabulky dnes nemá rozměr segmentu zákazníka. Pro ceny podle konkrétního zákazníka použijte [slevové kódy](https://www.twicecommerce.com/docs/cs/concepts/catalog/discount-codes.md).

> **Které časové pásmo cenový engine používá?**
>
> Časové pásmo místa. Hranice dne a týdne, omezení podle dne v týdnu a okna denní doby se vyhodnocují podle místního času daného místa. Pokud není nastaveno časové pásmo místa, použije se časové pásmo na úrovni tenanta, jako poslední možnost UTC.
>
> Časové pásmo se určuje podle vybraného místa vyzvednutí (nebo, když není vybráno jediné místo, podle hlavního propojeného místa inzerátu).

> **Přeceňují se existující objednávky, když upravím tabulku?**
>
> Ne. Objednávky zachycují cenové příspěvky u pokladny. Úprava cenové tabulky ovlivňuje jen budoucí součty objednávek.

> **Jaký je rozdíl mezi `priceContribution` a `totalPrice` v odpovědi?**
>
> `priceContribution` je to, co jeden řádek přidal k celku, `totalPrice` je součet napříč všemi řádky, které engine vybral (základní řádek + řádky dodatečného času + násobitele variant).

## Reference pro vývojáře

Cenové tabulky jsou v API vystaveny jako `pricing-tables`.

> **[API: Pricing Tables](https://www.twicecommerce.com/docs/api-reference/pricingtables)**
>
> Otevřít koncový bod v referenci API.

## Související články

> **[Inzeráty](https://www.twicecommerce.com/docs/cs/concepts/catalog/listings.md)**
>
> Co je cenová tabulka připojena k

> **[Varianty](https://www.twicecommerce.com/docs/cs/concepts/catalog/variants.md)**
>
> Přepsání cen podle varianty

> **[Kolekce](https://www.twicecommerce.com/docs/cs/concepts/catalog/collections.md)**
>
> Seskupte inzeráty před hromadným uplatněním sdílené tabulky

> **[Životní cyklus objednávky](https://www.twicecommerce.com/docs/cs/concepts/orders/order-lifecycle.md)**
>
> Kde se součty cenové tabulky zachycují u pokladny


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.