# Profirest API v2 – celá reference (smlouva 26.11.28) > Veřejné REST API restauračního systému Profirest. Vygenerováno ze smlouvy https://api.mujprofirest.cz/v2/openapi.json (česky); stejný obsah s příklady a ukázkami kódu je na https://api.mujprofirest.cz/v2/docs. Adresa API: https://api.mujprofirest.cz/v2. Rozcestník: https://api.mujprofirest.cz/llms.txt ## Obsah - Co API umí – přehled - API: 4 operace - OAuth: 5 operací - Restaurants: 18 operací - Catalog: 5 operací - Orders: 7 operací - Customers: 8 operací - Vouchers: 1 operace - Reservations: 23 operací - Lodging: 7 operací - Reception: 27 operací - Housekeeping: 6 operací - Guest passes: 2 operace - External references: 4 operace - Events: 2 operace - Staff: 4 operace - Attendance: 8 operací - Kitchen: 20 operací - Deliveries: 13 operací - Receipts: 17 operací - Stock: 3 operace - Backups: 4 operace - Diagnostics: 8 operací - Device settings: 1 operace - Customer directory: 3 operace - Table ordering: 17 operací - Schémata (pole objektů) ## Co API umí – přehled Celá stránka: https://api.mujprofirest.cz/v2/docs/capabilities (česky i anglicky, odkazy na referenci). Vygenerováno ze smlouvy 26.11.28. | Funkce | Profirest API v2 | Co přesně | |---|---|---| | REST API | Ano – REST + JSON | REST nad HTTPS s JSON na `https://api.mujprofirest.cz/v2`, smlouva OpenAPI 3.1.0 ([openapi.json](https://api.mujprofirest.cz/v2/openapi.json)), 217 operací v 25 oblastech. Chyby jako `application/problem+json` (RFC 9457) se 118 stálými kódy. | | OAuth / tokeny | Ano – OAuth 2.0 | OAuth 2.0 authorization code s PKCE (S256): majitel restaurace aplikaci připojí, vybere provozovny a potvrdí oprávnění. Access token platí 30 minut, refresh token 90 dní od posledního použití. Granty `POST /oauth/token`: `authorization_code` (authorization code s PKCE, e-shopy a partnerské aplikace), `refresh_token` (obnova tokenů), `urn:ietf:params:oauth:grant-type:device_code` (device authorization grant, RFC 8628, jen párování vlastních zařízení Profirestu), `urn:profirest:params:oauth:grant-type:v1-device` (výměna identity API v1, jen vlastní zařízení Profirestu při přechodu z API v1). Grant client credentials ani API klíče API nemá. 41 oprávnění (scopes), z toho 19 pro partnerské aplikace – [seznam](https://api.mujprofirest.cz/v2/docs/capabilities#opravneni). | | Produkty – zápis | Ne – jen dostupnost | Produkty, kategorie a ceny se přes API nezakládají ani nemění – sortiment API jen čte ([`getCatalog`](https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/getCatalog), změnu hlásí událost `catalog.changed`). Zapisovat jde jen dostupnost: zbývající porce a vyprodáno ([`setProductAvailability`](https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/setProductAvailability), oprávnění `availability:write`). K produktům si navíc můžete uložit vlastní ID a metadata ([`putExternalRef`](https://api.mujprofirest.cz/v2/docs#tag/External-references/operation/putExternalRef)); otevírací dobu mění [`setOpeningHours`](https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/setOpeningHours). | | Objednávky – zápis | Ano | Kalkulace košíku ([`createQuote`](https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/createQuote) – ceny, dopravu i DPH spočítá server), vytvoření objednávky rovnou do kuchyně ([`createOrder`](https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/createOrder)), potvrzení online platby ([`confirmOrderPayment`](https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/confirmOrderPayment)) a zrušení ([`cancelOrder`](https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/cancelOrder), dokud ji kuchyně nezačala připravovat). Stav hlásí webhooky a proud změn. Aplikace vidí objednávky, které sama vytvořila; změnu položek už vytvořené objednávky API nenabízí. | | Sklad – zápis | Jen inventura, jen vlastní zařízení | Jediný zápis do skladu je inventura ([`createStockTaking`](https://api.mujprofirest.cz/v2/docs#tag/Stock/operation/createStockTaking)), která nastaví stav skladu; položky k přepočítání čte [`listStockTakingItems`](https://api.mujprofirest.cz/v2/docs#tag/Stock/operation/listStockTakingItems). Oprávnění `stock:read` a `stock:write` jsou jen pro vlastní aplikace Profirestu – partnerská aplikace sklad nečte ani nezapisuje. Příjemky, výdejky ani jiné skladové pohyby API nemá; ze skladu odepisuje sama účtenka pokladny. | | Webhooky | Ano + SSE | Na HTTPS adresu registrovanou u klienta, podpis podle Standard Webhooks (HMAC-SHA256; hlavičky `webhook-id`, `webhook-timestamp`, `webhook-signature`), opakování po 1 min, 5 min, 30 min, 2 h a 12 h. Tytéž události jsou v proudu změn s kurzorem ([`listEvents`](https://api.mujprofirest.cz/v2/docs#tag/Events/operation/listEvents)) a živě přes Server-Sent Events ([`streamEvents`](https://api.mujprofirest.cz/v2/docs#tag/Events/operation/streamEvents)). 29 typů událostí, každé připojení dostane ty, které dovolují jeho oprávnění. | | Sandbox | Ne samostatný – testovací přístup ano | Samostatné pískoviště není: API běží jen na `https://api.mujprofirest.cz` nad skutečnými daty. Zkouší se **testovacím přístupem** ([/zadost/test](https://api.mujprofirest.cz/zadost/test) – `client_id` a tajemství hned po potvrzení e-mailu, jen k veřejnému ukázkovému účtu `profirestdemo`; SMS ani e-maily se neposílají, do EET 2.0 nic nejde, webhooky chodí jako obvykle a data se každou noc obnoví), na **testovacích provozovnách** (`Restaurant.is_test`, Profirest je přidá k vašemu připojení) a v **[playgroundu](https://api.mujprofirest.cz/v2/docs/playground)** nad příklady ze smlouvy bez přístupu. | | Veřejná dokumentace | Ano | Zdarma a bez přihlášení, česky i anglicky: [reference](https://api.mujprofirest.cz/v2/docs) s ukázkami v curl a v 10 jazycích u každé operace, [návody](https://api.mujprofirest.cz/v2/docs/guides), [katalog chyb](https://api.mujprofirest.cz/v2/docs/errors), [changelog](https://api.mujprofirest.cz/v2/docs/changelog), [playground](https://api.mujprofirest.cz/v2/docs/playground), OpenAPI 3.1.0 ([openapi.json](https://api.mujprofirest.cz/v2/openapi.json)) a pro jazykové modely [llms.txt](https://api.mujprofirest.cz/llms.txt) a [llms-full.txt](https://api.mujprofirest.cz/llms-full.txt). | | Oprávnění (scopes) | 41 oprávnění | Partnerské aplikace: `restaurants:read`, `catalog:read`, `availability:write`, `opening_hours:write`, `orders:write`, `orders:read`, `customers:read`, `customers:write`, `loyalty:read`, `vouchers:redeem`, `accounting:read`, `reports:read`, `reservations:read`, `reservations:write`, `lodging:read`, `lodging:write`, `housekeeping:read`, `housekeeping:write`, `guest_passes:check`. Jen vlastní aplikace Profirestu (`x-first-party-scopes`): `staff:read`, `staff:authenticate`, `attendance:read`, `attendance:punch`, `kitchen:read`, `kitchen:write`, `deliveries:read`, `deliveries:write`, `settings:read`, `queue:read`, `directory:read`, `calls:write`, `receipts:read`, `receipts:write`, `stock:read`, `stock:write`, `backups:read`, `backups:write`, `diagnostics:write`, `table:sync`, `lodging_desk:read`, `lodging_desk:write`. Co které dovoluje, je v [tabulce níže](https://api.mujprofirest.cz/v2/docs/capabilities#opravneni). | | Proud změn a SSE | Ano | [`listEvents`](https://api.mujprofirest.cz/v2/docs#tag/Events/operation/listEvents) vrací události po kurzoru (`next_cursor`), [`streamEvents`](https://api.mujprofirest.cz/v2/docs#tag/Events/operation/streamEvents) tytéž živě jako `text/event-stream` s obnovou přes `Last-Event-ID`. Typy událostí: `order.created`, `order.updated`, `order.status_changed`, `catalog.changed`, `availability.changed`, `promotions.changed`, `restaurant.changed`, `grant.changed`, `grant.revoked`, `attendance.updated`, `kitchen.ticket_created`, `kitchen.ticket_updated`, `kitchen.shift_closed`, `call.received`, `receipt.created`, `receipt.cancelled`, `receipt.updated`, `pos_shift.closed`, `tab.updated`, `tab.closed`, `sale.created`, `sale.cancelled`, `shift.closed`, `table.inbox_received`, `reservation.created`, `reservation.updated`, `reservation.status_changed`, `courier.position`, `courier.shift_changed`. | | Zákazníci a věrnost | Ano | Propojení zákazníka s databází klientů účtu podle telefonu – vytvoření, úprava, smazání ([`createCustomer`](https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/createCustomer), [`updateCustomer`](https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/updateCustomer), [`deleteCustomer`](https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/deleteCustomer)), ověření telefonu kódem, věrnostní body ověřených zákazníků ([`getCustomerLoyalty`](https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/getCustomerLoyalty)) a ověření dárkového voucheru ([`checkVoucher`](https://api.mujprofirest.cz/v2/docs#tag/Vouchers/operation/checkVoucher)). | | Zaměstnanci | Jen seznam a přihlášení PINem | Seznam zaměstnanců a jejich rolí bez PINů ([`listStaff`](https://api.mujprofirest.cz/v2/docs#tag/Staff/operation/listStaff)), přihlášení na zařízení PINem nebo čipem ([`createStaffSession`](https://api.mujprofirest.cz/v2/docs#tag/Staff/operation/createStaffSession)), odhlášení a změna vlastního PINu. Zakládání, úpravy a mazání zaměstnanců API nemá. Jen vlastní aplikace Profirestu. | | Pokladna a zařízení Profirestu | Jen vlastní aplikace | Stejné API používají pokladny, kuchyňské displeje, docházkové terminály a telefony kurýrů Profirestu. Oblasti [Reception](https://api.mujprofirest.cz/v2/docs#tag/Reception), [Staff](https://api.mujprofirest.cz/v2/docs#tag/Staff), [Attendance](https://api.mujprofirest.cz/v2/docs#tag/Attendance), [Kitchen](https://api.mujprofirest.cz/v2/docs#tag/Kitchen), [Deliveries](https://api.mujprofirest.cz/v2/docs#tag/Deliveries), [Receipts](https://api.mujprofirest.cz/v2/docs#tag/Receipts), [Stock](https://api.mujprofirest.cz/v2/docs#tag/Stock), [Backups](https://api.mujprofirest.cz/v2/docs#tag/Backups), [Diagnostics](https://api.mujprofirest.cz/v2/docs#tag/Diagnostics), [Device settings](https://api.mujprofirest.cz/v2/docs#tag/Device-settings), [Customer directory](https://api.mujprofirest.cz/v2/docs#tag/Customer-directory), [Table ordering](https://api.mujprofirest.cz/v2/docs#tag/Table-ordering) jsou celé jen pro vlastní aplikace Profirestu; partnerská aplikace má k dispozici 90 z 217 operací. | | Vlastní ID a metadata | Ano | `external_id` a až 20 dvojic `metadata` u provozoven, kategorií, produktů, objednávek a zákazníků ([`putExternalRef`](https://api.mujprofirest.cz/v2/docs#tag/External-references/operation/putExternalRef), hledání podle vašeho ID [`listExternalRefs`](https://api.mujprofirest.cz/v2/docs#tag/External-references/operation/listExternalRefs)); vidí je jen vaše připojení. | | Verzování a changelog | Smlouva 26.11.28 | Verze smlouvy RR.M.N (aktuální 26.11.28 z 13. 11. 2026), 37 vydání v [changelogu](https://api.mujprofirest.cz/v2/docs/changelog) s porovnáním dvou verzí. Slib stability: ve v2 se jen přidává – nic se neodebírá ani nepřejmenovává; ukončovanou funkci označí hlavička `Deprecation`, konec v2 ohlásí `Sunset` nejméně 12 měsíců předem. | | Knihovny (SDK) | 9 knihoven, 10 jazyků | Oficiální knihovny: [JavaScript](https://api.mujprofirest.cz/v2/docs/js), [PHP](https://api.mujprofirest.cz/v2/docs/php), [Java / Kotlin](https://api.mujprofirest.cz/v2/docs/java), [C# / .NET](https://api.mujprofirest.cz/v2/docs/csharp), [Python](https://api.mujprofirest.cz/v2/docs/python), [TypeScript](https://api.mujprofirest.cz/v2/docs/typescript), [Swift](https://api.mujprofirest.cz/v2/docs/swift), [Dart / Flutter](https://api.mujprofirest.cz/v2/docs/dart), [Go](https://api.mujprofirest.cz/v2/docs/go). Ukázky u každé operace v curl a v jazycích JavaScript, TypeScript, PHP, Java, Kotlin, C#, Python, Swift, Dart, Go. | | Limity požadavků | Ano – za minutu | Příděl požadavků za minutu má každé připojení a vlastní každé spárované zařízení; stav ukazují hlavičky `RateLimit-Limit`, `RateLimit-Remaining` a `RateLimit-Reset`, po překročení přijde `429 rate_limited` s `Retry-After`. Pevné číslo přídělu smlouva neuvádí – server ho posílá v `RateLimit-Limit`. | | Idempotence | Ano | `Idempotency-Key` u každého `POST`: opakování se stejným klíčem nikdy nevytvoří druhý záznam, konečné výsledky se drží 24 hodin. `PUT` a `DELETE` jsou idempotentní samy. Objednávka má navíc pojistky `quote_already_used` a `external_id_conflict`. | | ETag a souběh | Ano | Změny s `If-Match` a `ETag` (`updateCustomer`, `updateReservation`, `updateStay`, `moveStay`, `putExternalRef`, `putTab`, `closeTab`, `moveTabLines`), při souběžné změně `412 precondition_failed`. Podmíněné čtení `If-None-Match` s odpovědí `304` nabízí 21 operací, mimo jiné [`getCatalog`](https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/getCatalog) a [`getAvailability`](https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/getAvailability). | | Stránkování | Kurzor | Seznamy jako `{"data": […], "next_cursor": "…"}`; kurzor je neprůhledný, nikdy se neskládá ručně. | | Jazyky odpovědí | Čeština a angličtina | Názvy chyb (`title`) česky nebo anglicky podle `Accept-Language` (`cs` výchozí, `en`); dokumentace česky i anglicky. Názvy polí, hodnoty výčtů, typy událostí a kódy chyb jsou jen anglicky; texty restaurace (názvy produktů) přicházejí tak, jak byly zadány. | | Peníze a DPH | Server počítá | Ceny konečné včetně DPH, částky jako celé číslo v nejmenší jednotce s měnou ISO 4217; DPH, dopravu, slevy z akcí provozovny a zaokrouhlení spočítá server v kalkulaci. | | EET 2.0 | Eviduje server | Tržby z objednávek a účtenek eviduje do EET 2.0 (od 1. 1. 2027) server Profirestu certifikátem provozovny; aplikace finanční správě nic neposílá a certifikát nepotřebuje. Platby online se neevidují. | | Volání z prohlížeče | Ano – CORS | CORS jen pro adresy registrované u klienta, API nikdy nepoužívá cookies; tajemství klienta do prohlížeče nepatří (veřejný klient s PKCE). | | Cena přístupu | Bez dohody zdarma | Případné poplatky za přístup sjednáváme zvlášť; bez takové dohody je přístup bezplatný. (Podmínky použití API, bod Přístup.) Ke zkoušení slouží playground s ukázkovými daty, který přístup nepotřebuje. Dokumentace je zdarma a bez přihlášení. | | Jak získat přístup | Žádost + souhlas restaurace | Ostrý přístup ke skutečným restauracím po schválení [žádosti](https://api.mujprofirest.cz/zadost) (posuzuje se ručně); restaurace pak aplikaci připojí tlačítkem „Připojit přes Profirest“ a připojení může kdykoli zrušit. Testovací přístup hned na [/zadost/test](https://api.mujprofirest.cz/zadost/test). Kontakt: info@profirest.cz. | Co API nemá: - Zakládání a změny produktů, kategorií a cen – jen dostupnost (porce, vyprodáno). - Zakládání, úpravy a mazání zaměstnanců – jen jejich seznam, přihlášení PINem a změna vlastního PINu, a to pro vlastní aplikace Profirestu. - Skladové pohyby (příjemky, výdejky, převody) – jen inventura, a to jen pro vlastní aplikace Profirestu. - Změna položek objednávky po jejím vytvoření – jen zrušení, dokud ji kuchyně nezačala připravovat. - Grant client credentials a API klíče – partnerská aplikace se přihlašuje vždy přes OAuth 2.0 se souhlasem majitele restaurace, vlastní zařízení Profirestu párováním, které potvrdí vedoucí. - Registrace webhooku přes API – adresu registruje Profirest u klienta (v žádosti o přístup). - Samostatné pískoviště – testuje se testovacím přístupem k ukázkovému účtu, na testovacích provozovnách a v playgroundu. Zápis a akce po oblastech (POST, PUT, PATCH, DELETE): - API: `createLegacyIdentity` (jen Profirest) - OAuth: `oauthDeviceAuthorization` (jen Profirest), `oauthToken`, `oauthRevoke` - Restaurants: `setOpeningHours` - Catalog: `setProductAvailability` - Orders: `createQuote`, `createOrder`, `confirmOrderPayment`, `cancelOrder` - Customers: `createCustomer`, `updateCustomer`, `deleteCustomer`, `startPhoneVerification`, `confirmPhoneVerification` - Vouchers: `checkVoucher` - Reservations: `createReservation`, `updateReservation`, `confirmReservation`, `rejectReservation`, `cancelReservation`, `seatReservation`, `completeReservation`, `markReservationNoShow`, `sendReservationPaymentLink`, `waiveReservationDeposit`, `addToWaitlist`, `notifyWaitlistEntry`, `closeWaitlistEntry` - Lodging: `chargeToStay`, `replyToLodgingReview` - Reception (jen vlastní aplikace Profirestu): `createStay`, `updateStay`, `moveStay`, `confirmStay`, `checkInStay`, `checkOutStay`, `cancelStay`, `markStayNoShow`, `addStayGuest`, `updateStayGuest`, `deleteStayGuest`, `addStayService`, `addStayCharge`, `removeStayFolioLine`, `addStayPayment`, `deleteStayPayment`, `issueStayReceipt`, `cancelStayReceipt`, `sendUbyport` - Housekeeping: `completeHousekeepingTask`, `undoHousekeepingTask`, `reportRoomIssue`, `fixRoomIssue` - Guest passes: `checkGuestPass`, `undoGuestPassCheck` - External references: `putExternalRef`, `deleteExternalRef` - Staff (jen vlastní aplikace Profirestu): `createStaffSession`, `deleteStaffSession`, `changeStaffPin` - Attendance (jen vlastní aplikace Profirestu): `createAttendancePunch`, `createAttendancePunchBatch`, `createAbsenceRequest`, `cancelAbsenceRequest` - Kitchen (jen vlastní aplikace Profirestu): `createKitchenTicket`, `startStationWork`, `stopStationWork`, `completeStationSegment`, `undoStationAction`, `setKitchenTicketStatus`, `cancelKitchenTicket`, `markKitchenTicketPrinted`, `addKitchenTicketItems`, `handOverTicketSegment`, `takeBackTicketHandover`, `undoHandoverAction`, `closeKitchenShift` - Deliveries (jen vlastní aplikace Profirestu): `startCourierShift`, `endCourierShift`, `createDeliveryRoute`, `markTicketDelivered`, `handoverTicketPayment`, `markTicketNotDelivered`, `postCourierTelemetry` - Receipts (jen vlastní aplikace Profirestu): `previewReceipt`, `createReceipt`, `cancelReceipt`, `changeReceiptPayment`, `closePosShift`, `createCashMovement`, `putTab`, `closeTab`, `moveTabLines`, `createPosActivity` - Stock (jen vlastní aplikace Profirestu): `createStockTaking` - Backups (jen vlastní aplikace Profirestu): `createBackup` - Diagnostics (jen vlastní aplikace Profirestu): `createDeviceLogs`, `createBugReport`, `checkInDevice`, `reportDeviceError`, `putLogUploadPart`, `completeLogUpload`, `abortLogUpload` - Customer directory (jen vlastní aplikace Profirestu): `reportCall` - Table ordering (jen vlastní aplikace Profirestu): `startTableSession`, `joinTable`, `createTableOrder`, `cancelTableOrder`, `createTableCall`, `cancelTableCall`, `putTableHeartbeat`, `completeTableInboxItem`, `putTableState`, `applyTableOrder` ## Úvod > **Smlouva 26.11.28.** Finální verze API v2: napojení e-shopů a partnerských aplikací i vlastní zařízení Profirestu (párování, zaměstnanci, docházka, kuchyňský displej, rozvoz, pokladna s účtenkami spočítanými serverem a EET 2.0 ze serveru, inventura, zálohy, diagnostika a vzhled docházkových terminálů). Běží v ostrém provozu na https://api.mujprofirest.cz – viz [Prostředí](https://api.mujprofirest.cz/v2/docs#section/Prostredi). Ukázky v curl a v oficiálních knihovnách pro JavaScript, TypeScript, PHP, Javu, Kotlin, C#, Python, Swift, Dart a Go u každé operace; celé scénáře v [návodech](https://api.mujprofirest.cz/v2/docs/guides); klienti v nabídce Knihovny, JavaScript: [profirest-api.js](https://api.mujprofirest.cz/v2/docs/js). Co přinesla která verze, říká [changelog](https://api.mujprofirest.cz/v2/docs/changelog); přepínač verzí v liště nahoře ukáže referenci tak, jak vypadala ve starší verzi. > **Vyzkoušejte.** Každou operaci v [playgroundu](https://api.mujprofirest.cz/v2/docs/playground) – nad příklady ze smlouvy (nic se neodesílá), nebo naostro s vaším tokenem. Tlačítko ▶ Vyzkoušet je u každé operace, kroku návodu i ukázky kódu; ukázky v JavaScriptu běží přímo v prohlížeči. Profirest API v2 propojuje e-shopy, zařízení a partnerské systémy s restauracemi, které používají Profirest. > **EET 2.0 eviduje Profirest – vaše aplikace tržby neeviduje.** Každou tržbu, která jde přes Profirest (objednávku > vaší aplikace, účtenku pokladny), zaeviduje do EET 2.0 (elektronická evidence tržeb od 1. 1. 2027) server > Profirestu: podepíše ji certifikátem provozovny a odešle, když zákazník zaplatí na místě – hotově nebo kartou > kurýrovi či při odběru, v okamžiku předání. Platby přes internet (`online`) se neevidují. Vaše aplikace finanční > správě nic neposílá a certifikát nepotřebuje. Jen když tržbu už zaevidoval sám jiný systém provozovny (její vlastní > pokladna nebo kiosek), pošlete objednávku s `eet` a potvrzovacím kódem (POK) – Profirest ji pak nikdy neodešle > a potvrzení si uloží. Tržba se nesmí zaevidovat dvakrát. ### Rychlý start #### Partnerská aplikace (e-shop) 1. Požádejte Profirest (info@profirest.cz) o `client_id` – u aplikace s vlastním serverem i o `client_secret` – a zaregistrujte adresu pro přesměrování. 2. Pošlete majitele restaurace na souhlasovou stránku (PKCE: `code_challenge` = BASE64URL(SHA-256(`code_verifier`))): ``` https://api.mujprofirest.cz/oauth/authorize?response_type=code&client_id=VASE_ID &redirect_uri=https%3A%2F%2Fshop.example%2Fcallback&state=NAHODNE &scope=restaurants%3Aread+catalog%3Aread+orders%3Awrite+orders%3Aread &code_challenge=CHALLENGE&code_challenge_method=S256 ``` 3. Na adresu pro přesměrování přijde `code` a `state`. Kód vyměňte za tokeny: ``` curl https://api.mujprofirest.cz/oauth/token -u VASE_ID:VASE_TAJEMSTVI \ -d grant_type=authorization_code -d code=KOD \ -d redirect_uri=https://shop.example/callback -d code_verifier=VERIFIER ``` Odpověď nese `access_token` (30 minut) a `refresh_token`; obnovuje se přes `grant_type=refresh_token`. 4. Načtěte provozovny, které smíte vidět, a sortiment jedné z nich: ``` curl https://api.mujprofirest.cz/v2/restaurants -H "Authorization: Bearer ACCESS_TOKEN" curl https://api.mujprofirest.cz/v2/restaurants/123/catalog -H "Authorization: Bearer ACCESS_TOKEN" ``` 5. Spočítejte košík – ceny, dopravu i DPH počítá server – a z kalkulace založte objednávku. Každý `POST` nese nový `Idempotency-Key`; nepovedený požadavek opakujte se stejným klíčem. ``` curl https://api.mujprofirest.cz/v2/restaurants/123/quotes -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" -H "Idempotency-Key: 0f8b4e2c-6d1a-4c3e-9b7f-2a5d8c1e4f60" \ -d '{"fulfillment":{"type":"pickup"},"items":[{"product_id":"4567","quantity":2}]}' curl https://api.mujprofirest.cz/v2/restaurants/123/orders -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" -H "Idempotency-Key: 7c3e9a41-2b8d-4f6a-8e1c-5d9b0a7f3e12" \ -d '{"quote_id":"QUOTE_ID","customer":{"name":"Jana Nováková","phone":"+420777123456"}, "payments":[{"method":"cash","status":"unpaid","amount":{"amount":39800,"currency":"CZK"}}]}' ``` Platby musí dát dohromady `amount_due` z kalkulace (tady 398 Kč při vyzvednutí). Online platba jde jako `{"method":"online","status":"pending",…}` a potvrdí se přes `…/orders/{order_id}/confirm-payment`. 6. Sledujte, co se děje: `GET /v2/events` bez kurzoru vrátí `next_cursor` na aktuálním konci; ptejte se s ním znovu (po pár sekundách nebo po webhooku) a schovávejte si nejnovější `next_cursor`. #### Zařízení Profirestu (pokladna) 1. Zařízení si vyžádá kód (bez tajemství – zařízení je veřejný klient): ``` curl https://api.mujprofirest.cz/oauth/device_authorization -d client_id=profirest-pos \ -d device_name="Pokladna u baru" \ -d scope="restaurants:read catalog:read staff:read staff:authenticate receipts:read receipts:write" ``` Ukáže `user_code` (třeba `BCDF-GHJK`) nebo QR kód z `verification_uri_complete`. Vedoucí ho potvrdí v administraci (*Správa PC / zařízení → Připojit zařízení*) a vybere provozovnu. 2. Zařízení se mezitím každých `interval` sekund ptá na token; dokud kód nikdo nepotvrdí, dostává `authorization_pending`: ``` curl https://api.mujprofirest.cz/oauth/token -d client_id=profirest-pos -d device_code=DEVICE_CODE \ -d grant_type=urn:ietf:params:oauth:grant-type:device_code ``` 3. Zaměstnanec se přihlásí PINem; odpověď nese jeho `token`: ``` curl https://api.mujprofirest.cz/v2/restaurants/123/staff-sessions -H "Authorization: Bearer DEVICE_TOKEN" \ -H "Content-Type: application/json" -d '{"method":"pin","secret":"4321"}' ``` 4. Účtenku nechte spočítat (`…/receipts/preview` se stejnými `items` a `discounts`; vrátí částku k zaplacení) a vystavte. Proti dvojímu zápisu hlídá její vlastní `id` (UUID ze zařízení), opakování ji nikdy nevystaví dvakrát: ``` curl https://api.mujprofirest.cz/v2/restaurants/123/receipts -H "Authorization: Bearer DEVICE_TOKEN" \ -H "Profirest-Staff-Token: STAFF_TOKEN" -H "Content-Type: application/json" \ -d '{"id":"6f1c2a9e-8b7d-4c3e-9f10-2a3b4c5d6e7f","number":1001,"issued_at":"2027-01-15T12:03:00+01:00", "items":[{"product_id":"4567","quantity":1}], "payments":[{"method":"cash","amount":{"amount":19900,"currency":"CZK"}}]}' ``` Tržbu do EET 2.0 zaeviduje server sám; zařízení certifikát nepotřebuje. #### Příklady v curl, PHP, Kotlinu, Javě a JavaScriptu Každá operace níže má hotovou ukázku požadavku v pěti jazycích (záložky v pravém sloupci) a úplný příklad těla požadavku i odpovědi. Celé scénáře krok za krokem – objednávka z e-shopu, pokladna, kuchyňský displej, docházkový terminál, rozvoz, zákazníci – jsou v [návodech](https://api.mujprofirest.cz/v2/docs/guides). #### JavaScript `https://api.mujprofirest.cz/v2/profirest-api.js` je klient bez závislostí pro prohlížeč, WebView zařízení a Node 18+. Udělá párování kódem, PKCE, obnovu tokenů (jednou, i mezi panely prohlížeče), přihlášení zaměstnance, `Idempotency-Key`, opakování po `Retry-After` a čtení proudu událostí. Viz [klient pro JavaScript](https://api.mujprofirest.cz/v2/docs/js). #### Ověření webhooku ```php $key = base64_decode(substr($whsec, 6)); // tajemství bez „whsec_“ $signed = $_SERVER['HTTP_WEBHOOK_ID'] . '.' . $_SERVER['HTTP_WEBHOOK_TIMESTAMP'] . '.' . $body; $expected = base64_encode(hash_hmac('sha256', $signed, $key, true)); $valid = false; foreach (explode(' ', $_SERVER['HTTP_WEBHOOK_SIGNATURE']) as $candidate) { $valid = $valid || hash_equals('v1,' . $expected, $candidate); } // odmítněte i webhook-timestamp starší než 5 minut; pak rychle odpovězte 2xx a načtěte GET /v2/events ``` ### Pojmy - **Účet** – jeden majitel restaurace v Profirestu. Může mít víc provozoven. - **Provozovna** – jedno místo s vlastní kuchyní, cenami a otevírací dobou. - **Klient** – vaše aplikace registrovaná v Profirestu (`client_id`). - **Připojení** – přístup, který jeden účet dal vašemu klientovi: vybrané provozovny a oprávnění. Jeden klient může mít připojení k mnoha účtům. Viz `GET /connection`. ### Pravidla pro každého klienta - **Ignorujte neznámá pole.** Odpovědi časem dostávají nová pole. Není to nekompatibilní změna. - **Zvládněte neznámou hodnotu výčtu.** Hodnoty označené `x-extensible-enum` (stavy, typy, typy událostí) mohou dostat nové členy. Neznámou hodnotu berte jako „jiné“ a nikdy kvůli ní nepadejte. - **ID jsou neprůhledné řetězce.** Nerozkládejte je a neprovádějte s nimi výpočty. - **Peníze jsou celé číslo v nejmenší jednotce a měna podle ISO 4217.** `{"amount": 1229460, "currency": "CZK"}` je 12 294,60 Kč. - **Rozhodujte se podle `code` chyby, ne podle HTTP stavu.** Kódy se nikdy nemění. Viz *Chyby*. - **Posílejte `Idempotency-Key` u každého POST** a při opakování stejného požadavku použijte stejný klíč. - **Stránkujte přes `next_cursor`.** Kurzor nikdy neskládejte sami. - **Respektujte `Retry-After`** u odpovědí 429 a 503. - **Sledujte hlavičky `Deprecation` a `Sunset`.** ### Slib stability V rámci v2 jen přidáváme: nové endpointy, nová nepovinná vstupní pole, nová pole v odpovědích, nové hodnoty výčtů, nové typy událostí a nové kódy chyb. Nikdy nic neodebíráme ani nepřejmenováváme, neměníme typ ani význam a nepřidáváme povinné vstupní pole. Ukončovanou funkci označí hlavička `Deprecation` a funguje až do konce v2. Konec v2 oznámí hlavička `Sunset` nejméně 12 měsíců předem. Verze smlouvy (`info.version`, `version` v `GET /v2/`) má tvar RR.M.N – rok, měsíc a pořadí vydání v měsíci: `26.10.7` je sedmé vydání v říjnu 2026. Říká, kdy vydání vyšlo, ne jak je kompatibilní – to říká v2 v adrese. Verze porovnávejte číselně po částech (`26.10.1` je novější než `26.9.12`). Co které vydání přineslo: [changelog](https://api.mujprofirest.cz/v2/docs/changelog). ### Odpovědi - Každé zdokumentované pole je v odpovědi vždy. Když hodnota nedává smysl, je `null`. - Jeden záznam se vrací jako objekt. Seznam jako `{"data": [...], "next_cursor": "..."}`. - Okamžiky jsou RFC 3339 s posunem (`2026-10-05T18:30:00+02:00`) v časové zóně provozovny. Na vstupu přijímáme jakýkoli posun. - Provozní dny (směna, denní menu, docházka) jsou prostá data `YYYY-MM-DD` v časové zóně provozovny. - Každá operace může navíc odpovědět `429`, `500` nebo `503` a každá odpovídá stejně `400`, `406` a `422` (zveřejněný `openapi.json` je uvádí): server odmítne parametry adresy i pole těla, která nezná (`422` s `unknown_field` – i `?_=123` proti mezipaměti), tělo u operace, která žádné nebere (`400`), a `Accept`, který neumí (`406`); operace s tělem i `413` a `415`. ### Hlavičky v každé odpovědi - `X-Request-Id` – uveďte ho, když píšete podpoře. - `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` – váš aktuální příděl požadavků za minutu. Příděl má každé připojení a vlastní ho má i každé spárované zařízení. Přicházejí u operací s access tokenem, jakmile je token i jeho oprávnění v pořádku; `/oauth/*`, `GET /v2/` a `GET /v2/app-versions` je nemají, stejně jako `401` a `403 insufficient_scope` (takové požadavky se do přídělu nepočítají). `429 rate_limited` přichází s `Retry-After`. - `Content-Language` u chyb – jazyk pole `title`. - `Deprecation` (RFC 9745) a `Sunset` (RFC 8594), když se funkce ukončuje. - `Cache-Control` u odpovědí s tokenem: `private, no-store`, když tělo může nést osobní údaje (objednávky, zákazníci, personál, adresy rozvozu, účty stolů, události), `private, no-cache` u sortimentu, dostupnosti, denního menu, rozvozových zón, provozoven a nastavení zařízení. `If-None-Match` posílejte sami tam, kde ho operace nabízí. ### Opakování a souběh - `POST` vyžaduje `Idempotency-Key`. Opakování se stejným klíčem nikdy nevytvoří druhý záznam. Konečné výsledky (2xx a 4xx) se drží 24 hodin; 5xx se neukládá, takže opakování proběhne znovu. Klíče platí v rámci vašeho připojení, metody a cesty. - `PUT` a `DELETE` jsou idempotentní samy od sebe. - `PATCH` vyžaduje `If-Match` s načteným `ETag`. Když záznam mezitím změnil někdo jiný, dostanete `412 precondition_failed`; načtěte ho znovu a rozhodněte se. - Po chybě sítě, `500` nebo `503` opakujte s rostoucí prodlevou a se stejným `Idempotency-Key`. - Po pádu nebo restartu vaší aplikace klíč, který vám vytvořila knihovna, už nemáte – žije jen v paměti procesu. U zápisů, které se nesmí provést dvakrát (objednávka), klíč vytvořte sami, uložte ho k záznamu **dřív**, než požadavek odešlete, a po restartu pošlete stejný požadavek se stejným klíčem i tělem: dostanete původní odpověď. Objednávka má navíc dvě pojistky nezávislé na klíči: kalkulaci jde použít jen jednou (`409 quote_already_used`) a vaše `external_id` objednávky je trvalé (`409 external_id_conflict`); obě chyby nesou ID existující objednávky v `existing_id` – načtěte ji místo zakládání nové. Účtenky a píchnutí docházky nesou vlastní `id` v těle, které slouží jako klíč. ### Průběh objednávky 1. Načtěte sortiment (`GET /restaurants/{restaurant_id}/catalog`) a časy, které lze nabídnout (`/time-slots`). 2. Spočítejte košík: `POST /restaurants/{restaurant_id}/quotes`. Ceny v kalkulaci jsou zaručené do `expires_at`. 3. Vytvořte objednávku: `POST /restaurants/{restaurant_id}/orders`. Když online platba teprve proběhne, pošlete ji jako `pending`: objednávka čeká ve stavu `awaiting_payment`, porce a vouchery jsou rezervované a kuchyně ji ještě nevidí. 4. Vyberte platbu od zákazníka a potvrďte ji: `POST /restaurants/{restaurant_id}/orders/{order_id}/confirm-payment`. Teprve teď jde objednávka do kuchyně. Bez potvrzení se objednávka po `payment_deadline` zruší. 5. Stav sledujte přes webhooky nebo `GET /events`. Zákazník tak nikdy nezaplatí za objednávku, kterou nešlo vytvořit. ### Peníze a DPH - Ceny jsou konečné včetně DPH. - `total = items + charges + discounts + rounding` – `discounts` je záporné (nebo nula), viz `Totals`. - DPH jedné sazby se počítá z částky s daní: `vat = round(gross × sazba / (100 + sazba))`, zaokrouhleno matematicky na nejmenší jednotky; `base = gross − vat`. - Doprava a podobné poplatky jsou vedlejší výdaje podle § 36 odst. 3 zákona č. 235/2004 Sb.: daní se sazbou položek. Když mají položky více sazeb, poplatek se rozdělí v poměru jejich částek s DPH – přesně jako na účtence a v účetních exportech Profirestu; zbytek po zaokrouhlení dostane sazba s nejvyšší částkou. Nejdřív se rozdělí doplatek do minimální objednávky, expresní doručení podle položek i s doplatkem, doprava pak podle všeho. - Dárkové vouchery jsou platební prostředek, ne sleva: snižují částku k úhradě, ne cenu ani DPH. - Slevy dává jen provozovna akcemi, které nastaví v administraci (`GET …/promotions`); aplikace posílá nejvýš slevový kód (`promo_codes` v kalkulaci), nikdy částku. Sleva snižuje cenu i základ daně a do sazeb DPH se dělí jako na účtence. Sleva na položku (`applies_to: line`) zůstává v sazbě svého řádku; poplatky a slevy celé objednávky se pak dělí podle položek po slevách na položky. ### Vaše vlastní ID a metadata K provozovnám, kategoriím, produktům, objednávkám a zákazníkům, které vaše připojení vidí, si můžete uložit vlastní `external_id` (jedno na objekt, unikátní v rámci typu objektu a vašeho připojení, lze podle něj hledat) a `metadata` (až 20 dvojic klíč–hodnota). Vidí je jen vaše připojení. Jiné objekty (účtenky, účty stolů, kuchyňské bony, zaměstnanci, vouchery, rozvozové trasy) je zatím nést nemohou. ### Texty Texty jsou v UTF-8. Znaky mimo základní rovinu Unicode (například emoji) API odmítne s `422 validation_failed` a kódem pole `unsupported_characters`. ### Prostředí API v2 běží na `https://api.mujprofirest.cz` – výchozí adrese oficiálních knihoven – s cestami `/v2/…` a `/oauth/…`. Není to pískoviště: pracuje nad ostrými daty restaurací, zkoušejte proto na testovací provozovně (viz níže). Dokumentace je na `https://api.mujprofirest.cz/v2/docs` a OAuth vrací `iss` = `https://api.mujprofirest.cz`. ### Testovací provozovny Profirest může k vašemu připojení přidat testovací provozovny (`Restaurant.is_test`). Objednávky z nich se ukážou jen na testovacím kuchyňském displeji a nikdo je nepřipravuje. Používejte je pro vývoj a automatické testy. ### Veřejný ukázkový účet Profirest má veřejný ukázkový účet (`profirestdemo`) – provozovnu otevřenou nonstop se sortimentem, zaměstnanci s PINy, historií objednávek a e-shopem. Přihlášení, PINy zaměstnanců a párování zařízení jsou na https://www.mujprofirest.cz/demo. Slouží k vyzkoušení Profirestu: stránka ukázky spáruje s ukázkovou provozovnou bez vedoucího zařízení kterékoli aplikace párované kódem a aplikaci k němu jde připojit běžnou souhlasovou stránkou s veřejným přihlášením. Testovací přístup pro vlastní aplikaci – klienta, který se připojí jen k ukázkovému účtu – vydáme hned a bez posuzování na `/zadost/test` na adrese API. - Z požadavků za ukázkový účet nikdy neodejde SMS ani e-mail a žádná tržba účtu se nikdy neposílá do EET 2.0. API odpovídá jako obvykle, ale zprávy o objednávkách a ověřovací kódy telefonu se nedoručí (`POST …/phone-verification` přesto odpoví `201`, zákazníka tam tedy ověřit nejde) a účtenky mají `eet: null`. Webhooky se doručují jako obvykle. - Každou noc (kolem půlnoci) se data účtu smažou a vytvoří znovu; zůstane jen účet, jeho provozovna a licence. Objednávky, účtenky, zákazníci, účty stolů, spárovaná zařízení i připojení s tokeny zmizí a všechna ID kromě ID účtu a jeho provozovny se změní. Druhý den spárujte nebo připojte znovu a nic, co na něm závisí, si neuchovávejte. Pro vývoj a automatické testy své aplikace si místo toho řekněte o testovací provozovnu. ### Prohlížeče API lze volat z JavaScriptu v prohlížeči. CORS je povolený jen pro adresy registrované u vašeho klienta. JavaScript smí číst `ETag`, `Location`, `Retry-After`, `X-Request-Id`, `RateLimit-*`, `Deprecation` a `Sunset`. API nikdy nepoužívá cookies. Tajemství klienta (client secret) nikdy nedávejte do kódu v prohlížeči. ### Chyby Chyby jsou podle RFC 9457 (`application/problem+json`). Strojový `code` je anglicky a nikdy se nemění. `title` je česky nebo anglicky podle `Accept-Language` (výchozí čeština). Úplný seznam je v `x-error-catalog` a v kapitole *Katalog chyb* dokumentace. ### Přihlášení OAuth 2.0 authorization code s PKCE (S256). OAuth endpointy leží mimo `/v2`, takže připojení bude fungovat i v dalších verzích API. Majitel restaurace se přihlásí do Profirestu, vybere provozovny a potvrdí oprávnění, o která váš klient žádá. Access token posílejte jako `Authorization: Bearer ` a nikdy ho nedávejte do URL. - Access token platí 30 minut. - Refresh token platí 90 dní od posledního použití. Každé obnovení vrátí nový refresh token. U důvěrného klienta (s tajemstvím) předchozí refresh token funguje ještě 60 sekund a vrátí stejnou novou dvojici, takže nevadí souběžné obnovení ze dvou vašich procesů. Spárované zařízení smí obnovu s předchozím tokenem zopakovat, dokud nový refresh token nepoužije, nejdéle 24 hodin – zařízení, kterému se odpověď ztratila ve výpadku sítě, se prostě zeptá znovu. Opakování vrátí stejný nový refresh token; access token stejný s `expires_in` jen na zbývající dobu, nebo nový, když už vypršel. Opětovné použití starého refresh tokenu mimo tato okna skončí `invalid_grant`. U veřejného klienta – spárovaného zařízení po uplynutí jeho okna, nebo aplikace v prohlížeči kdykoli – navíc ukončí řadu tokenů (všechny tokeny ze stejného povolení nebo spárování; zařízení se odpáruje), protože token byl nejspíš ukraden. Důvěrnému klientovi ostatní tokeny zůstanou. ### Vlastní zařízení Profirestu Pokladny, kuchyňské displeje, docházkové terminály a telefony kurýrů Profirestu používají stejné API. Párují se přes device authorization grant (RFC 8628, `POST /oauth/device_authorization`): zařízení ukáže kód, vedoucí ho potvrdí v administraci Profirestu a zařízení si vyzvedne tokeny. Spárované zařízení pracuje jen pro jednu provozovnu a vedoucí ho může kdykoli odpojit; jeho tokeny pak hned přestanou platit. Zaměstnanci se na zařízení přihlašují PINem nebo čipem (`POST /restaurants/{restaurant_id}/staff-sessions`). Zařízení pak posílá token zaměstnance v hlavičce `Profirest-Staff-Token` vedle svého tokenu, takže u každého zápisu je vidět, kdo ho udělal, na kterém zařízení a přes kterou aplikaci. PINy a čísla čipů server nikdy nevydá. Záznamy pořízené bez sítě (třeba píchnutí na docházkovém terminálu) nesou ID vytvořené v zařízení a čas, kdy se staly; opakované odeslání je nikdy nezapíše dvakrát. Oprávnění `staff:read`, `staff:authenticate`, `attendance:read`, `attendance:punch`, `kitchen:read`, `kitchen:write`, `deliveries:read`, `deliveries:write`, `settings:read`, `queue:read`, `directory:read`, `calls:write`, `receipts:read`, `receipts:write`, `stock:read`, `stock:write`, `backups:read`, `backups:write`, `diagnostics:write`, `table:sync`, `lodging_desk:read` a `lodging_desk:write` jsou jen pro vlastní aplikace Profirestu (`x-first-party-scopes`). Partnerské aplikace je nikdy nedostanou. ### Výjimky z pravidel - OAuth endpointy se řídí RFC 6749: požadavky jsou formuláře, neznámé parametry se ignorují, chyby mají formát OAuth a `Idempotency-Key` není potřeba. - Sortiment je jeden objekt (snímek), ne stránkovaný seznam. - Zákazníci patří celému účtu, proto nejsou pod `/restaurants/{restaurant_id}`. - Přihlášení zaměstnance (`POST …/staff-sessions`) nebere `Idempotency-Key`: opakované přihlášení jen založí další relaci a odpověď nese tajemství, které se nikam neukládá. - Píchnutí v docházce se proti dvojímu zápisu hlídají vlastním `id` ze zařízení, ne `Idempotency-Key`. - Operace vlastních zařízení Profirestu, které nesou vlastní `id` v těle – účtenky a jejich storno, kuchyňské bony, uzávěrka, inventura, deník akcí pokladny a hlášení chyb –, se proti dvojímu zápisu hlídají tímto `id`; `Idempotency-Key` se u nich nečte. Při opakování požadavku pošlete stejné `id`, nové `id` je nový doklad. `reportCall`, `createDeviceLogs` a `previewReceipt` nepotřebují nic (opakování neškodí). - `Idempotency-Key` musí být náhodný (UUID): všechna zařízení jedné aplikace na účtu sdílejí jedno připojení, takže by se čítač mohl potkat s jiným zařízením. - Hosté objednávající od stolu (`/table/…`) nepoužívají OAuth: `startTableSession` dá token telefonu u stolu (`tableGuest`), který funguje jen pro tyto operace. Požadavky, o kterých rozhoduje hlavní kasa podniku, odpovídají `202` – objednávka nebo volání ve stavu `submitted`, nebo žádost, kterou si přečtete později. ### Přechod z API v1 API v1 (`/api/v1/{token}/…` a `/api1/kds/…` kuchyňského displeje) funguje dál, dokud nebude oznámen jeho konec. Kam jeho volání patří ve v2: | API v1 | API v2 | |---|---| | `POST api/v1` (klíč aplikace a login), `bartender/pair`, `bartender/check` | párování kódem (`POST /oauth/device_authorization`); token v `Authorization`, nikdy v adrese | | `ping`, `versions` | `GET /` vrací `server_time`, `GET /app-versions` nejnovější verze aplikací | | `categories`, `products`, `portions`, `daily-menu`, `alergens` | `GET /restaurants/{restaurant_id}/catalog` (kanál `pos`, `kitchen` nebo `web`), `…/availability` | | `users/{app}` | `GET …/staff` (bez PINů) a `POST …/staff-sessions` (PIN ověří server) | | `users/{app}/{id}` (změna PINu) | `POST …/staff-sessions/current/pin` – jen vlastní PIN zaměstnance | | `orders/{app}` – účtenka | `POST …/receipts` (ceny ze serveru, dělená platba, EET 2.0) | | `orders/{app}` – bon otevřeného stolu | `POST …/kitchen/tickets` | | `orders/{app}/status` | `GET …/kitchen/tickets/{ticket_id}` | | `orders/storno/{app}` | `POST …/receipts/{receipt_id}/storno` – jen účtenky vystavené přes toto API, vždy celá účtenka | | `storno/{app}` (položka odebraná ze stolu), `tables/{app}` | `GET`, `PUT` a `DELETE …/tabs/{tab_id}` | | `changePayment` | `POST …/receipts/{receipt_id}/payment-change` – platby hotově, stravenkami, na firemní účet a fakturou, do uzávěrky směny; platby kartou a dárkovým voucherem zůstávají | | `changeNote` | položky ani poznámka účtenky se nemění: stornujte ji a vystavte novou | | `deadline-shift/{app}` | `GET …/pos-shift`, `POST …/pos-shift/close` (součty spočítá server) – jen směna volajícího zařízení; uzavřené směny v `GET …/pos-shifts` | | `timeline/create` | `POST …/pos-activity` | | `warehouse`, `stockTaking` | `GET …/stock-taking/items`, `POST …/stock-takings` | | `warehouse/decrease-stock` | ze skladu odepíše sama účtenka | | `vouchers/{app}/{code}` a jeho `sell`, `redeem` | `POST …/vouchers/check` (prodané vouchery; spárovaná pokladna vidí i neprodané); prodej a platba voucherem jsou řádky a platby účtenky | | `vouchers/…/sell/cancel`, `…/redeem/cancel` | samostatná operace není: storno účtenky (`…/storno`) vezme zpět její prodeje a platby vouchery | | `eet/certificate/{hash}` | EET 2.0 podepisuje a odesílá server; zařízení certifikát nemají | | `mobile/delivery/…` (kurýři) | `…/couriers`, `…/delivery-routes`, `…/customer-directory`, `…/calls` | | `addr`, `regions`, `info` | `…/address-suggestions` (personál, jen spárované zařízení), `…/delivery-zones`, `GET /restaurants/{restaurant_id}` | | `clients/login`, `register`, `change-pass` | zákazníci s ověřeným telefonem (`POST /customers`), bez hesel | | `info/menu` (denní menu na týden) | `GET …/daily-menu?week=` | | `backup/{app}` (nahrání, seznam, stažení) | `POST …/backups` (ZIP jako tělo), `GET …/backups`, `GET …/backups/{backup_id}/content` | | `log`, `report` | `POST …/device-logs`, `POST …/bug-reports` (přihlášené tokenem zařízení, už ne otevřené komukoli) | | `sync` | obdoba není: změny sledujte přes `GET /events` a čtěte s `If-None-Match` | | `terminals`, `sms`, `external/sms`, `regions/unique` | obdoba není | | `api1/kds/pair`, `check`, `login_data`, `login_chef` | párování kódem (`POST /oauth/device_authorization`), `GET …/staff`, `GET …/device-settings`, `POST …/staff-sessions` | | `api1/kds/menu` | `GET …/catalog?channel=kitchen` | | `api1/kds/orders`, `history`, `preorders` | `GET …/kitchen/tickets` s `view=active`, `history` nebo `preorders` | | `api1/kds/status_change`, `printed` | `POST …/kitchen/tickets/{ticket_id}/status` (`STORNO`: `…/cancel`), `PUT …/printed` | | `api1/kds/create_order`, `update_order` | `POST …/quotes` a `…/orders`; `POST …/kitchen/tickets/{ticket_id}/items` – ceny ze sortimentu, nikdy ze zařízení | | `api1/kds/client_lookup`, `clients_search`, `check_call`, `address_suggest`, `delivery_zones` | `GET …/customer-directory`, `…/calls/latest`, `…/address-suggestions`, `…/delivery-zones` | | `api1/kds/couriers`, `courier_toggle`, `create_route` | `GET …/couriers`, `PUT` a `DELETE …/couriers/{employee_id}/shift`, `POST …/delivery-routes` | | `api1/kds/shift_close`, `shift_close_confirm` | `GET …/kitchen/shift`, `POST …/kitchen/shift/close` | | `api1/kds/production_orders`, `production_status`, `production_segment`, `production_history` | `…/kitchen/stations/{station_id}/tickets`, `…/working`, `…/complete`, `…/actions` a `…/undo` | **Přecházejte celou provozovnou najednou.** Když v jedné provozovně pracují vedle sebe pokladny na API v1 a na tomto API, ty na v1 překážejí: pokladna v1 při synchronizaci svých stolů odstraní kopie účtů stolů otevřených přes toto API v administraci, starší pokladna v1 (která neposílá ID svých objednávek) zahrne účtenky vystavené přes toto API do své uzávěrky a úklid záloh v1 může smazat nejstarší zálohy kteréhokoli zařízení provozovny. Přepněte všechny pokladny provozovny naráz, nejlépe hned po uzávěrce. ### Jazyky Názvy chyb a tato dokumentace jsou česky i anglicky. Názvy polí, hodnoty výčtů, typy událostí a kódy chyb jsou jen anglicky a nikdy se nepřekládají. Texty zadané restaurací (názvy a popisy produktů) vracíme tak, jak byly zadány. ### Podpora Registrace klienta, testovací provozovny a pomoc s napojením: info@profirest.cz, +420 777 983 213. Když se něco pokazí, uveďte `X-Request-Id`. ### Katalog chyb Rozhodujte se podle `code`. Kódy se nikdy nemění; nové mohou přibýt. Každý kód s vysvětlením: [katalog chyb](https://api.mujprofirest.cz/v2/docs/errors). | code | HTTP | název | |---|---|---| | [`malformed_request`](https://api.mujprofirest.cz/v2/docs/errors#malformed_request) | 400 | Chybný požadavek | | [`idempotency_key_missing`](https://api.mujprofirest.cz/v2/docs/errors#idempotency_key_missing) | 400 | Chybí hlavička Idempotency-Key | | [`invalid_token`](https://api.mujprofirest.cz/v2/docs/errors#invalid_token) | 401 | Access token chybí, je neplatný nebo vypršel | | [`insufficient_scope`](https://api.mujprofirest.cz/v2/docs/errors#insufficient_scope) | 403 | Token nemá potřebné oprávnění | | [`not_found`](https://api.mujprofirest.cz/v2/docs/errors#not_found) | 404 | Nenalezeno | | [`method_not_allowed`](https://api.mujprofirest.cz/v2/docs/errors#method_not_allowed) | 405 | Metoda není povolena | | [`not_acceptable`](https://api.mujprofirest.cz/v2/docs/errors#not_acceptable) | 406 | Požadovaný typ odpovědi není k dispozici | | [`conflict`](https://api.mujprofirest.cz/v2/docs/errors#conflict) | 409 | Konflikt s aktuálním stavem | | [`idempotency_in_progress`](https://api.mujprofirest.cz/v2/docs/errors#idempotency_in_progress) | 409 | Požadavek se stejným Idempotency-Key se ještě zpracovává | | [`external_id_conflict`](https://api.mujprofirest.cz/v2/docs/errors#external_id_conflict) | 409 | Toto external_id už má jiný objekt | | [`cursor_expired`](https://api.mujprofirest.cz/v2/docs/errors#cursor_expired) | 410 | Kurzor vypršel | | [`precondition_failed`](https://api.mujprofirest.cz/v2/docs/errors#precondition_failed) | 412 | Záznam se mezitím změnil | | [`payload_too_large`](https://api.mujprofirest.cz/v2/docs/errors#payload_too_large) | 413 | Požadavek je příliš velký | | [`unsupported_media_type`](https://api.mujprofirest.cz/v2/docs/errors#unsupported_media_type) | 415 | Nepodporovaný typ těla požadavku | | [`validation_failed`](https://api.mujprofirest.cz/v2/docs/errors#validation_failed) | 422 | Neplatná data | | [`idempotency_key_mismatch`](https://api.mujprofirest.cz/v2/docs/errors#idempotency_key_mismatch) | 422 | Idempotency-Key už byl použit pro jiný požadavek | | [`precondition_required`](https://api.mujprofirest.cz/v2/docs/errors#precondition_required) | 428 | Chybí hlavička If-Match | | [`rate_limited`](https://api.mujprofirest.cz/v2/docs/errors#rate_limited) | 429 | Příliš mnoho požadavků | | [`internal_error`](https://api.mujprofirest.cz/v2/docs/errors#internal_error) | 500 | Chyba serveru | | [`not_implemented`](https://api.mujprofirest.cz/v2/docs/errors#not_implemented) | 501 | Tato operace zatím není k dispozici | | [`service_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#service_unavailable) | 503 | Služba je dočasně nedostupná | | [`restaurant_closed`](https://api.mujprofirest.cz/v2/docs/errors#restaurant_closed) | 422 | Provozovna má zavřeno | | [`ordering_disabled`](https://api.mujprofirest.cz/v2/docs/errors#ordering_disabled) | 422 | Provozovna teď nepřijímá objednávky | | [`delivery_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#delivery_unavailable) | 422 | Rozvoz není k dispozici | | [`pickup_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#pickup_unavailable) | 422 | Osobní odběr není k dispozici | | [`outside_delivery_zone`](https://api.mujprofirest.cz/v2/docs/errors#outside_delivery_zone) | 422 | Adresa je mimo rozvozové zóny | | [`time_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#time_unavailable) | 422 | Požadovaný čas nelze splnit | | [`express_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#express_unavailable) | 422 | Expresní doručení není k dispozici (od 26.10.5) | | [`product_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#product_unavailable) | 422 | Produkt je vyprodaný nebo se nenabízí | | [`quote_expired`](https://api.mujprofirest.cz/v2/docs/errors#quote_expired) | 409 | Kalkulace vypršela | | [`quote_already_used`](https://api.mujprofirest.cz/v2/docs/errors#quote_already_used) | 409 | Kalkulace už byla použita pro objednávku | | [`payment_amount_mismatch`](https://api.mujprofirest.cz/v2/docs/errors#payment_amount_mismatch) | 422 | Platby neodpovídají částce k úhradě | | [`order_not_cancellable`](https://api.mujprofirest.cz/v2/docs/errors#order_not_cancellable) | 409 | Objednávku už nelze zrušit | | [`order_not_awaiting_payment`](https://api.mujprofirest.cz/v2/docs/errors#order_not_awaiting_payment) | 409 | Objednávka nečeká na platbu | | [`customer_not_verified`](https://api.mujprofirest.cz/v2/docs/errors#customer_not_verified) | 403 | Telefon zákazníka není ověřený | | [`verification_failed`](https://api.mujprofirest.cz/v2/docs/errors#verification_failed) | 422 | Ověřovací kód je špatný nebo vypršel | | [`verification_resend_too_early`](https://api.mujprofirest.cz/v2/docs/errors#verification_resend_too_early) | 429 | Nový kód lze poslat až později | | [`sms_quota_exceeded`](https://api.mujprofirest.cz/v2/docs/errors#sms_quota_exceeded) | 429 | Limit SMS je vyčerpaný | | [`sms_country_not_supported`](https://api.mujprofirest.cz/v2/docs/errors#sms_country_not_supported) | 422 | Do této země SMS neposíláme | | [`voucher_invalid`](https://api.mujprofirest.cz/v2/docs/errors#voucher_invalid) | 422 | Kód voucheru neplatí | | [`voucher_expired`](https://api.mujprofirest.cz/v2/docs/errors#voucher_expired) | 422 | Voucher vypršel | | [`voucher_used_up`](https://api.mujprofirest.cz/v2/docs/errors#voucher_used_up) | 422 | Voucher je vyčerpaný | | [`voucher_blocked`](https://api.mujprofirest.cz/v2/docs/errors#voucher_blocked) | 422 | Voucher je zablokovaný | | [`voucher_not_accepted_here`](https://api.mujprofirest.cz/v2/docs/errors#voucher_not_accepted_here) | 422 | Voucher na této provozovně neplatí | | [`voucher_attempts_exceeded`](https://api.mujprofirest.cz/v2/docs/errors#voucher_attempts_exceeded) | 429 | Příliš mnoho neplatných pokusů o voucher | | [`promo_code_invalid`](https://api.mujprofirest.cz/v2/docs/errors#promo_code_invalid) | 422 | Slevový kód neplatí (od 26.10.4) | | [`promo_code_expired`](https://api.mujprofirest.cz/v2/docs/errors#promo_code_expired) | 422 | Slevový kód už neplatí (od 26.10.4) | | [`promo_code_not_applicable`](https://api.mujprofirest.cz/v2/docs/errors#promo_code_not_applicable) | 422 | Slevový kód na tuto objednávku neplatí (od 26.10.4) | | [`promo_code_used_up`](https://api.mujprofirest.cz/v2/docs/errors#promo_code_used_up) | 422 | Slevový kód je vyčerpaný (od 26.10.4) | | [`promo_code_attempts_exceeded`](https://api.mujprofirest.cz/v2/docs/errors#promo_code_attempts_exceeded) | 429 | Příliš mnoho neplatných pokusů o slevový kód (od 26.10.4) | | [`promotion_changed`](https://api.mujprofirest.cz/v2/docs/errors#promotion_changed) | 409 | Akce z kalkulace se změnila (od 26.10.4) | | [`device_required`](https://api.mujprofirest.cz/v2/docs/errors#device_required) | 403 | Tohle smí jen spárované zařízení | | [`legacy_identity_unsupported`](https://api.mujprofirest.cz/v2/docs/errors#legacy_identity_unsupported) | 403 | Tato aplikace identitu API v1 nemá (od 26.11.6) | | [`no_legacy_identity`](https://api.mujprofirest.cz/v2/docs/errors#no_legacy_identity) | 404 | Provozovna pro tuto aplikaci identitu API v1 nemá (od 26.11.6) | | [`staff_session_required`](https://api.mujprofirest.cz/v2/docs/errors#staff_session_required) | 403 | Nejdřív se musí na zařízení přihlásit zaměstnanec | | [`staff_session_expired`](https://api.mujprofirest.cz/v2/docs/errors#staff_session_expired) | 403 | Přihlášení zaměstnance vypršelo | | [`license_expired`](https://api.mujprofirest.cz/v2/docs/errors#license_expired) | 403 | Licence provozovny vypršela (od 26.11.27) | | [`staff_credentials_invalid`](https://api.mujprofirest.cz/v2/docs/errors#staff_credentials_invalid) | 422 | Špatný PIN nebo neznámý čip | | [`staff_ambiguous`](https://api.mujprofirest.cz/v2/docs/errors#staff_ambiguous) | 409 | Tento PIN má víc zaměstnanců; vyberte jednoho | | [`staff_locked`](https://api.mujprofirest.cz/v2/docs/errors#staff_locked) | 429 | Příliš mnoho špatných PINů nebo čipů | | [`staff_role_missing`](https://api.mujprofirest.cz/v2/docs/errors#staff_role_missing) | 403 | Přihlášený zaměstnanec tohle nesmí | | [`module_not_licensed`](https://api.mujprofirest.cz/v2/docs/errors#module_not_licensed) | 403 | Licence provozovny tento modul nezahrnuje | | [`reservation_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#reservation_unavailable) | 409 | Termín není volný (od 26.11.9) | | [`reservation_not_allowed`](https://api.mujprofirest.cz/v2/docs/errors#reservation_not_allowed) | 422 | Pravidla provozovny tuto rezervaci nedovolí (od 26.11.9) | | [`reservation_state_conflict`](https://api.mujprofirest.cz/v2/docs/errors#reservation_state_conflict) | 409 | Rezervace je v jiném stavu (od 26.11.9) | | [`lodging_state_conflict`](https://api.mujprofirest.cz/v2/docs/errors#lodging_state_conflict) | 409 | Host teď není ubytovaný (od 26.11.13) | | [`stay_state_conflict`](https://api.mujprofirest.cz/v2/docs/errors#stay_state_conflict) | 409 | Pobyt tento krok teď nedovolí (od 26.11.21) | | [`lodging_room_unavailable`](https://api.mujprofirest.cz/v2/docs/errors#lodging_room_unavailable) | 409 | Pokoj v tomto termínu není volný (od 26.11.21) | | [`attendance_not_enabled`](https://api.mujprofirest.cz/v2/docs/errors#attendance_not_enabled) | 422 | Zaměstnanec se na této provozovně nevede v docházce | | [`attendance_state_conflict`](https://api.mujprofirest.cz/v2/docs/errors#attendance_state_conflict) | 409 | Záznam nesedí na aktuální stav docházky | | [`offline_records_disabled`](https://api.mujprofirest.cz/v2/docs/errors#offline_records_disabled) | 422 | Provozovna nepřijímá záznamy pořízené offline | | [`occurred_at_out_of_range`](https://api.mujprofirest.cz/v2/docs/errors#occurred_at_out_of_range) | 422 | Čas záznamu je moc starý nebo v budoucnosti | | [`punch_id_conflict`](https://api.mujprofirest.cz/v2/docs/errors#punch_id_conflict) | 409 | Toto id už má jiný záznam | | [`absence_requests_disabled`](https://api.mujprofirest.cz/v2/docs/errors#absence_requests_disabled) | 403 | Provozovna žádosti o volno nepřijímá (od 26.10.7) | | [`absence_request_not_allowed`](https://api.mujprofirest.cz/v2/docs/errors#absence_request_not_allowed) | 422 | Žádost porušuje pravidlo provozovny (od 26.10.7) | | [`absence_request_conflict`](https://api.mujprofirest.cz/v2/docs/errors#absence_request_conflict) | 409 | Zaměstnanec už v tu dobu volno má (od 26.10.7) | | [`absence_request_decided`](https://api.mujprofirest.cz/v2/docs/errors#absence_request_decided) | 409 | Žádost už je vyřízená (od 26.10.7) | | [`portion_tracking_disabled`](https://api.mujprofirest.cz/v2/docs/errors#portion_tracking_disabled) | 409 | Provozovna pro vás porce nehlídá (od 26.10.4) | | [`ticket_cancelled`](https://api.mujprofirest.cz/v2/docs/errors#ticket_cancelled) | 409 | Objednávka je v kuchyni zrušená | | [`ticket_already_delivered`](https://api.mujprofirest.cz/v2/docs/errors#ticket_already_delivered) | 409 | Objednávka je už doručená (od 26.11.2) | | [`already_paid`](https://api.mujprofirest.cz/v2/docs/errors#already_paid) | 409 | Objednávka je už zaplacená (od 26.11.2) | | [`payment_method_not_changeable`](https://api.mujprofirest.cz/v2/docs/errors#payment_method_not_changeable) | 409 | U této objednávky se u dveří nic nevybírá (od 26.11.2) | | [`amount_mismatch`](https://api.mujprofirest.cz/v2/docs/errors#amount_mismatch) | 422 | Částka nesedí s objednávkou (od 26.11.2) | | [`note_required`](https://api.mujprofirest.cz/v2/docs/errors#note_required) | 422 | K tomuto důvodu chybí poznámka (od 26.11.2) | | [`ticket_not_amendable`](https://api.mujprofirest.cz/v2/docs/errors#ticket_not_amendable) | 409 | K této objednávce nejde přidat položky | | [`nothing_to_complete`](https://api.mujprofirest.cz/v2/docs/errors#nothing_to_complete) | 409 | V tomto segmentu nic otevřeného není | | [`action_already_undone`](https://api.mujprofirest.cz/v2/docs/errors#action_already_undone) | 409 | Akce už byla vzata zpět | | [`price_changed`](https://api.mujprofirest.cz/v2/docs/errors#price_changed) | 409 | Cena se změnila; načtěte sortiment znovu | | [`manager_approval_required`](https://api.mujprofirest.cz/v2/docs/errors#manager_approval_required) | 403 | Tohle musí schválit vedoucí pokladny | | [`receipt_id_conflict`](https://api.mujprofirest.cz/v2/docs/errors#receipt_id_conflict) | 409 | Toto id už má jiná účtenka | | [`receipt_number_conflict`](https://api.mujprofirest.cz/v2/docs/errors#receipt_number_conflict) | 409 | Toto číslo účtenky zařízení už použilo | | [`receipt_already_cancelled`](https://api.mujprofirest.cz/v2/docs/errors#receipt_already_cancelled) | 409 | Účtenka už je stornovaná | | [`receipt_not_cancellable`](https://api.mujprofirest.cz/v2/docs/errors#receipt_not_cancellable) | 409 | Účtenku nejde stornovat | | [`receipt_payment_not_changeable`](https://api.mujprofirest.cz/v2/docs/errors#receipt_payment_not_changeable) | 409 | Platbu této účtenky změnit nejde (od 26.11.28) | | [`pos_shift_closed`](https://api.mujprofirest.cz/v2/docs/errors#pos_shift_closed) | 409 | Směna účtenky je už uzavřená (od 26.11.28) | | [`issued_at_out_of_range`](https://api.mujprofirest.cz/v2/docs/errors#issued_at_out_of_range) | 422 | Účtenka je moc stará nebo v budoucnosti | | [`pos_shift_empty`](https://api.mujprofirest.cz/v2/docs/errors#pos_shift_empty) | 409 | Ve směně není co uzavřít | | [`cash_book_not_started`](https://api.mujprofirest.cz/v2/docs/errors#cash_book_not_started) | 409 | Pokladní kniha ještě nezačala (od 26.10.4) | | [`cash_book_already_started`](https://api.mujprofirest.cz/v2/docs/errors#cash_book_already_started) | 409 | Pokladní kniha už má počáteční stav (od 26.10.4) | | [`voucher_not_for_sale`](https://api.mujprofirest.cz/v2/docs/errors#voucher_not_for_sale) | 422 | Voucher nejde prodat | | [`tab_closed`](https://api.mujprofirest.cz/v2/docs/errors#tab_closed) | 409 | Účet stolu je už uzavřený | | [`stock_taking_id_conflict`](https://api.mujprofirest.cz/v2/docs/errors#stock_taking_id_conflict) | 409 | Toto id už má jiná inventura | | [`table_not_found`](https://api.mujprofirest.cz/v2/docs/errors#table_not_found) | 404 | Žádný stůl nemá tento kód (od 26.10.4) | | [`visit_ended`](https://api.mujprofirest.cz/v2/docs/errors#visit_ended) | 410 | Návštěva stolu skončila (od 26.10.4) | | [`ordering_paused`](https://api.mujprofirest.cz/v2/docs/errors#ordering_paused) | 422 | Objednávky od stolu jsou pozastavené (od 26.10.4) | | [`table_not_open`](https://api.mujprofirest.cz/v2/docs/errors#table_not_open) | 422 | Stůl nemá otevřený účet (od 26.10.4) | | [`device_not_verified`](https://api.mujprofirest.cz/v2/docs/errors#device_not_verified) | 403 | Telefon u stolu není ověřený (od 26.10.4) | | [`join_code_invalid`](https://api.mujprofirest.cz/v2/docs/errors#join_code_invalid) | 422 | Špatný kód od kamaráda (od 26.10.4) | | [`join_locked`](https://api.mujprofirest.cz/v2/docs/errors#join_locked) | 423 | Příliš mnoho špatných kódů (od 26.10.4) | | [`join_not_available`](https://api.mujprofirest.cz/v2/docs/errors#join_not_available) | 409 | Přidání kódem není k dispozici (od 26.10.4) | | [`product_not_orderable`](https://api.mujprofirest.cz/v2/docs/errors#product_not_orderable) | 422 | Tento produkt nejde objednat od stolu (od 26.10.4) | | [`too_many_pending_orders`](https://api.mujprofirest.cz/v2/docs/errors#too_many_pending_orders) | 409 | Na obsluhu čeká příliš mnoho objednávek (od 26.10.4) | | [`order_not_pending`](https://api.mujprofirest.cz/v2/docs/errors#order_not_pending) | 409 | Objednávka už na obsluhu nečeká (od 26.10.4) | | [`restaurant_offline`](https://api.mujprofirest.cz/v2/docs/errors#restaurant_offline) | 503 | Hlavní kasa podniku není připojená (od 26.10.4) | | [`inbox_item_conflict`](https://api.mujprofirest.cz/v2/docs/errors#inbox_item_conflict) | 409 | Žádost už je rozhodnutá jinak (od 26.10.4) | | [`main_device_conflict`](https://api.mujprofirest.cz/v2/docs/errors#main_device_conflict) | 409 | Hlavní kasou je jiné zařízení (od 26.10.4) | | [`upload_closed`](https://api.mujprofirest.cz/v2/docs/errors#upload_closed) | 409 | Nahrávání logu je dokončené nebo prošlé (od 26.10.6) | | [`upload_incomplete`](https://api.mujprofirest.cz/v2/docs/errors#upload_incomplete) | 422 | Části nahrávání logu chybí (od 26.10.6) | ## Přihlášení a oprávnění - `oauth2` (oauth2): OAuth 2.0 authorization code s PKCE (S256). Endpointy leží mimo `/v2`. - `clientBasic` (http): `client_id` jako jméno a `client_secret` jako heslo. Jen pro OAuth endpointy. - `tableGuest` (http): Token telefonu hosta u stolu (`pfg_…`) ze `startTableSession`. Jen pro operace objednávání od stolu (`/table/…`); nejvýš 12 hodin a do konce návštěvy stolu. - `logUpload` (http): Token jednoho cíle příkazu `upload_logs` (`pfl_…`, `LogUploadTarget.token`) z `checkInDevice`. Jen pro operace toho nahrávání (`/log-uploads/{upload_id}/…`) a jen do jeho dokončení nebo vypršení žádosti (24 hodin). Token zařízení není potřeba, takže nahrává i telefon číšníka bez vlastního tokenu. Oprávnění (scope) tokenu OAuth: - `restaurants:read`: Vidět údaje o provozovnách, otevírací dobu, příjem objednávek, rozvozové zóny a časy, na které lze objednat. - `catalog:read`: Vidět kategorie, produkty, ceny a dostupnost. - `availability:write`: Měnit zbývající porce produktů a označovat produkty jako vyprodané. - `opening_hours:write`: Měnit běžnou týdenní otevírací dobu provozovny. - `orders:write`: Počítat košíky, posílat objednávky do kuchyně, potvrzovat platby a rušit objednávky. - `orders:read`: Vidět objednávky vytvořené tímto připojením. - `customers:read`: Vidět zákazníky propojené tímto připojením. - `customers:write`: Propojovat, měnit a odebírat zákazníky a ověřovat jejich telefony. - `loyalty:read`: Vidět věrnostní body ověřených zákazníků. - `vouchers:redeem`: Ověřovat a uplatňovat dárkové vouchery. - `accounting:read`: Stahovat účetní exporty tržeb a uzávěrek (Pohoda, Money) včetně odběratelů na fakturách. - `reports:read`: Vidět uzávěrky, doklady prodeje ze všech zdrojů, přehledy tržeb (po dnech, platbách, produktech, zaměstnancích, dýška) a pokladní knihu – se jmény zaměstnanců, bez kontaktů zákazníků. - `staff:read`: Vidět zaměstnance provozovny a jejich role, nikdy jejich PINy. *(jen vlastní aplikace Profirestu)* - `staff:authenticate`: Přihlašovat zaměstnance na zařízení PINem nebo čipem. *(jen vlastní aplikace Profirestu)* - `attendance:read`: Vidět, kdo je v práci a kdo má přestávku, a směny a žádosti o volno přihlášeného zaměstnance. *(jen vlastní aplikace Profirestu)* - `attendance:punch`: Zapisovat příchody, odchody a přestávky zaměstnanců a žádosti o volno přihlášeného zaměstnance. *(jen vlastní aplikace Profirestu)* - `kitchen:read`: Vidět všechny objednávky v kuchyni s položkami, poznámkami a údaji pro rozvoz. *(jen vlastní aplikace Profirestu)* - `kitchen:write`: Posouvat objednávky v kuchyni, potvrzovat vytištěné bony a rušit objednávky. *(jen vlastní aplikace Profirestu)* - `deliveries:read`: Vidět kurýry a rozvozové trasy s adresami a telefony zákazníků a vyhledávat doručovací adresy. *(jen vlastní aplikace Profirestu)* - `deliveries:write`: Plánovat rozvozové trasy, přihlašovat kurýry na směnu a označovat doručené objednávky. *(jen vlastní aplikace Profirestu)* - `settings:read`: Vidět nastavení provozovny pro zařízení – údaje firmy, tiskové šablony, tiskárny a stoly. *(jen vlastní aplikace Profirestu)* - `queue:read`: Vidět čísla objednávek pro obrazovku hostů – bez jmen a bez položek. *(jen vlastní aplikace Profirestu)* - `directory:read`: Hledat zákazníky účtu podle telefonu nebo jména s jejich adresami a vidět příchozí hovory. *(jen vlastní aplikace Profirestu)* - `calls:write`: Hlásit hovory na telefon provozovny. *(jen vlastní aplikace Profirestu)* - `receipts:read`: Vidět účtenky pokladen provozovny s platbami a stavem EET, otevřené účty stolů a směnu zařízení. *(jen vlastní aplikace Profirestu)* - `receipts:write`: Vystavovat a stornovat účtenky, otevírat a měnit účty stolů, posílat jejich bony do kuchyně, uzavírat směnu zařízení a zapisovat vklady, výběry a výdaje hotovosti do pokladní knihy. *(jen vlastní aplikace Profirestu)* - `stock:read`: Vidět skladové položky k inventuře s množstvím, které očekává sklad, a inventury ze zařízení. *(jen vlastní aplikace Profirestu)* - `stock:write`: Zapisovat inventury, které nastaví stav skladu. *(jen vlastní aplikace Profirestu)* - `backups:read`: Vidět a stahovat zálohy pokladen provozovny. *(jen vlastní aplikace Profirestu)* - `backups:write`: Nahrávat zálohy místní databáze pokladny. *(jen vlastní aplikace Profirestu)* - `diagnostics:write`: Posílat logy a hlášení chyb zařízení podpoře Profirestu. *(jen vlastní aplikace Profirestu)* - `table:sync`: Přebírat žádosti hostů, kteří objednávají od stolu, a zrcadlit stoly hlavní kasy do cloudu. *(jen vlastní aplikace Profirestu)* - `reservations:read`: Vidět rezervace stolů a služeb s kontakty hostů, pravidla rezervací, služby, volné časy a které stoly jsou teď volné. - `reservations:write`: Zakládat, měnit, potvrzovat, usazovat a rušit rezervace stolů a služeb. - `lodging:read`: Vidět právě ubytované hosty (pokoj, jméno, termín) a účty jejich pokojů. - `lodging:write`: Zapisovat útraty na účet pokoje. - `housekeeping:read`: Vidět úkoly úklidu pokojů a jejich závady – bez údajů hostů. - `housekeeping:write`: Odškrtávat úkoly úklidu a hlásit a opravovat závady pokojů. - `guest_passes:check`: Ověřovat QR kódy ubytovaných hostů u wellness, snídaní nebo parkoviště a zapisovat jejich vstupy – pokoj a co host smí, bez jmen. - `lodging_desk:read`: Recepce hotelu: vidět pokoje, plán obsazenosti a každý pobyt s kontakty hostů, jejich doklady totožnosti a historií pobytu. *(jen vlastní aplikace Profirestu)* - `lodging_desk:write`: Recepce hotelu: zakládat, měnit, přesouvat, ubytovávat, odhlašovat a rušit pobyty, zapisovat hosty a vyúčtovat účet pokoje. *(jen vlastní aplikace Profirestu)* ## Společné parametry - `restaurant_id` (path, Id, povinný): ID provozovny, ke které má vaše připojení přístup. Jiná ID vrátí 404. - `segment` (query, string): Jen jeden druh tržby: `food` – jídlo a pití (pokladna, e-shop s jídlem, rozvoz, platformy), `lodging` – doklady za pobyt (ubytování, služby a útrata zapsaná na pokoj), `tickets` – vstupenky (e-shop a prodej u vchodu). Výchozí všechno. - `order_id` (path, Id, povinný): ID objednávky, kterou vaše připojení vytvořilo na této provozovně (`Order.id`). Jiná ID vrátí 404. - `customer_id` (path, Id, povinný): Naše ID propojení zákazníka, jak ho vrátil `POST /customers`. - `object_type` (path, string, povinný): Typ objektu, ke kterému patří vaše vazba. - `cursor` (query, string): Hodnota `next_cursor` z předchozí stránky. Neprůhledná; nikdy ji neskládejte sami. - `limit` (query, integer): Velikost stránky. - `Idempotency-Key` (header, string, povinný): Jedinečný klíč tohoto požadavku, ideálně UUID. Opakování se stejným klíčem a stejným tělem vrátí uložený výsledek. Stejný klíč s jiným tělem vrátí `422 idempotency_key_mismatch`; dokud první požadavek běží, `409 idempotency_in_progress`. Ukládají se jen konečné výsledky (2xx a 4xx), na 24 hodin; klíče platí v rámci vašeho připojení, metody a cesty. - `If-None-Match` (header, string): ETag z předchozí odpovědi. Když se nic nezměnilo, odpověď je `304 Not Modified` bez těla. - `If-Match` (header, string, povinný): `ETag` verze, kterou jste načetli. Když se záznam mezitím změnil, odpověď je `412 precondition_failed`. - `If-Match` (header, string): `ETag` načteného pobytu (`getStay`); když se mezitím změnil, odpověď je `412 precondition_failed`. - `Accept-Language` (header, string): Jazyk názvů chyb. `cs` (výchozí) nebo `en`. - `employee_id` (path, Id, povinný): ID zaměstnance provozovny. Jiná ID vrátí 404. - `route_id` (path, Id, povinný): ID rozvozové trasy provozovny. Jiná ID vrátí 404. - `station_id` (path, Id, povinný): ID aktivního výrobního stanoviště provozovny (`DeviceSettings.kitchen_stations`). Jiná vrátí 404. - `ticket_id` (path, Id, povinný): ID kuchyňského bonu provozovny. Jiná ID vrátí 404. - `receipt_id` (path, string, povinný): UUID účtenky provozovny (vzniklo na zařízení). Jiná ID vrátí 404. - `tab_id` (path, string, povinný): Vaše UUID účtu stolu (vzniklo na zařízení, které ho otevřelo). - `reservation_id` (path, string, povinný): ID rezervace provozovny, nebo její `uuid`. Jiná ID vrátí 404. - `waitlist_id` (path, string, povinný): ID záznamu čekací listiny provozovny. Jiná ID vrátí 404. - `room_id` (path, string, povinný): ID pokoje provozovny (`HousekeepingRoom.id`). Jiná ID vrátí 404. - `issue_id` (path, string, povinný): ID závady provozovny (`RoomIssue.id`). Jiná ID vrátí 404. - `stay_id` (path, string, povinný): ID pobytu provozovny (`InHouseStay.id`). Jiná ID vrátí 404. - `If-Match` (header, string): `ETag` načtené rezervace; když se mezitím změnila, odpověď je `412 precondition_failed`. - `stock_taking_id` (path, string, povinný): UUID inventury provozovny (vzniklo na zařízení). Jiná ID vrátí 404. - `backup_id` (path, string, povinný): ID zálohy provozovny. Jiná ID vrátí 404. - `upload_id` (path, string, povinný): ID nahrávání logu (`LogUploadTarget.upload_id`). Token v `Authorization` k němu musí patřit, jinak 404. - `If-Match` (header, string): `ETag` verze, kterou jste načetli. Povinný při změně existujícího účtu; bez něj se zakládá nový. - `Profirest-Staff-Token` (header, string): Token z `POST /restaurants/{restaurant_id}/staff-sessions` – zaměstnanec, který na zařízení pracuje. - `external_id` (query, ExternalId): Jen objekty s tímto `external_id` vašeho připojení. ## API Kořen API a aktuální připojení. Reference: https://api.mujprofirest.cz/v2/docs#tag/API ### GET / – Kořen API `operationId`: `getApiRoot` · přihlášení: bez přihlášení · https://api.mujprofirest.cz/v2/docs#tag/API/operation/getApiRoot Verze API a odkazy na související zdroje. Nepotřebuje token. Parametry: - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Informace o API. `application/json`: ApiRoot – pole `name`, `version`, `docs_url`, `oauth_metadata_url`, `stream_url`, `server_time` ### GET /app-versions – Nejnovější verze aplikací Profirestu `operationId`: `listAppVersions` · přihlášení: bez přihlášení · https://api.mujprofirest.cz/v2/docs#tag/API/operation/listAppVersions Nejnovější vydaná verze každé vlastní aplikace Profirestu, ostrá a beta zvlášť, s odkazem ke stažení a seznamem změn – aby aplikace mohla nabídnout aktualizaci, i když ještě není spárovaná. `critical` znamená, že starší verzi už nemá používat. Nepotřebuje token; smí se 5 minut držet v mezipaměti. Parametry: - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Verze. `application/json`: AppVersionList – pole `data`, `next_cursor` ### GET /connection – Aktuální připojení `operationId`: `getConnection` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/API/operation/getConnection Ke kterému účtu, provozovnám a oprávněním access token patří a jaká nastavení k němu zvolil majitel. Parametry: - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Připojení. `application/json`: Connection – pole `id`, `client`, `account_id`, `scopes`, `restaurant_ids`, `settings`, `created_at`, `device` - chyby: 401 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /devices/current/legacy-identity – Vyzvednout identitu API v1 zařízení `operationId`: `createLegacyIdentity` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/API/operation/createLegacyIdentity Jen vlastní aplikace Profirestu pro pokladnu, kuchyňský displej a kurýra. Zařízení spárované rovnou na API v2 dostane záložní identitu API v1, aby se při vrácení provozovny (`Profirest-Api-Target: v1`, nebo když API v2 neodpovídá) vrátilo na API v1 bez nového párování. Zavolejte jednou po spárování, nebo při startu, když identitu API v1 uloženou nemáte. Opakované volání vrátí tutéž identitu (`200`). Držte ji jen na zařízení; nikde jinde se neukazuje. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Bez `Idempotency-Key` (viz popis). *Od verze 26.11.6.* Parametry: - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LegacyIdentityRequest – pole `v1_device_id` Odpovědi: - 201: Záložní identita API v1 vznikla. `application/json`: LegacyIdentity – pole `kind`, `login`, `device_id`, `app_key`, `token`, `password` - 200: Zařízení už identitu API v1 má – tatáž. `application/json`: LegacyIdentity – pole `kind`, `login`, `device_id`, `app_key`, `token`, `password` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## OAuth Připojení klienta k účtu („Připojit přes Profirest“). Reference: https://api.mujprofirest.cz/v2/docs#tag/OAuth ### GET /oauth/authorize – Zahájit připojení (v prohlížeči) `operationId`: `oauthAuthorize` · přihlášení: bez přihlášení · https://api.mujprofirest.cz/v2/docs#tag/OAuth/operation/oauthAuthorize Sem přesměrujte prohlížeč majitele restaurace. Majitel se přihlásí do Profirestu (včetně dvoufázového ověření), vybere provozovny a potvrdí oprávnění. Profirest pak přesměruje zpět na `redirect_uri` s parametry `code`, `state` a `iss` (RFC 9207), nebo s `error`, `state` a `iss`. Ověřte, že `iss` je `https://api.mujprofirest.cz`. Přístup smí povolit jen majitel účtu Profirest. Zaměstnanec místo toho uvidí vysvětlení. `redirect_uri` musí přesně odpovídat jedné z adres registrovaných u vašeho klienta. Nové spuštění pro už připojený účet upraví stávající připojení – druhé nikdy nevznikne: požadovaná oprávnění se přidají k těm, která má, a jeho provozovny budou ty, které majitel vybere (stávající jsou předvybrané). Připojení, které majitel odpojil, se obnoví jen s oprávněními, o která žádáte teď. Parametry: - `response_type` (query, string, povinný): Vždy `code`; cokoli jiného se vrátí jako `unsupported_response_type`. - `client_id` (query, string, povinný): Vaše `client_id`. Neznámé nebo neaktivní dostane chybovou stránku (`400`), bez přesměrování. - `redirect_uri` (query, string (uri), povinný): Přesně jedna z adres pro přesměrování registrovaných u vašeho klienta; jiná dostane chybovou stránku (`400`), bez přesměrování. - `scope` (query, string, povinný): Oprávnění oddělená mezerou, viz bezpečnostní schéma `oauth2`. Žádat tu jde jen o oprávnění partnerských aplikací – ta, která nejsou v `x-first-party-scopes`; ostatní a oprávnění, o která váš klient žádat nesmí, se… - `state` (query, string, povinný): Náhodná hodnota, kterou vygenerujete; vrátí se beze změny. Chrání proti CSRF. Jen tisknutelné ASCII (RFC 6749 VSCHAR), jinak `invalid_request`. - `code_challenge` (query, string, povinný): PKCE výzva, BASE64URL(SHA-256(code_verifier)). - `code_challenge_method` (query, string, povinný): Vždy `S256`; cokoli jiného se vrátí jako `invalid_request`. - `prompt` (query, string): Přijme se jen `consent` (jiná hodnota se vrátí jako `invalid_request`) a nic nemění: souhlasová stránka se ukáže vždy, i když už přístup existuje – například kvůli přidání provozoven. Odpovědi: - 302: Přesměrování na přihlášení a souhlas v Profirestu, potom zpět na `redirect_uri` s `code` + `state` + `iss`, nebo s `error` + `state` + `iss`: `access_denied` (majitel odmítl), `invalid_scope`… - chyby: 400, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /oauth/device_authorization – Zahájit párování zařízení `operationId`: `oauthDeviceAuthorization` · přihlášení: `clientBasic` nebo bez přihlášení · https://api.mujprofirest.cz/v2/docs#tag/OAuth/operation/oauthDeviceAuthorization Párování zařízení bez pohodlného prohlížeče podle RFC 8628: pokladna, kuchyňský displej, píchačka nebo telefon kurýra. Jen aplikace, kterým to Profirest povolil (naše vlastní aplikace). 1. Zařízení zavolá tento endpoint a ukáže `user_code` (a QR kód s `verification_uri_complete`). 2. Vedoucí otevře v Profirestu `verification_uri`, zadá kód, vybere provozovnu a potvrdí. 3. Zařízení mezitím každých `interval` sekund volá `POST /oauth/token` s `grant_type=urn:ietf:params:oauth:grant-type:device_code` a po potvrzení dostane tokeny. Zařízení pak pracuje jen pro jednu provozovnu a s oprávněními své aplikace. Odpárování v Profirestu ho zastaví okamžitě. Kód potvrzený těsně před vypršením jde vyměnit ještě 10 minut po vypršení; potvrzené zařízení, které si tokeny nikdy nevyzvedne, server později odpáruje. Z jedné IP adresy nejvýš 30 kódů za minutu (`429`). Tělo požadavku (povinné): - `application/x-www-form-urlencoded`: DeviceAuthorizationRequest Odpovědi: - 200: Kódy pro zařízení. `application/json`: DeviceAuthorizationResponse – pole `device_code`, `user_code`, `verification_uri`, `verification_uri_complete`, `expires_in`, `interval` - chyby: 400, 401, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /oauth/token – Získat nebo obnovit tokeny `operationId`: `oauthToken` · přihlášení: `clientBasic` nebo bez přihlášení · https://api.mujprofirest.cz/v2/docs#tag/OAuth/operation/oauthToken Výměna autorizačního kódu za tokeny, nebo refresh tokenu za nové tokeny. Důvěrný klient se ověří přes HTTP Basic (`client_secret_basic`) nebo parametry `client_id` a `client_secret` v těle (`client_secret_post`). Veřejný klient pošle jen `client_id` a spoléhá na PKCE. Neznámé parametry se ignorují (RFC 6749). Párované zařízení se ptá s `grant_type=urn:ietf:params:oauth:grant-type:device_code` (RFC 8628): dokud vedoucí nepotvrdí, dostává `authorization_pending`; při častějším dotazu než `interval` `slow_down` (od té doby čekejte o 5 sekund déle); `access_denied`, když vedoucí odmítl, a `expired_token` po 10 minutách. Tokeny zařízení patří zařízení: obnova je na něm drží a odpárování je zneplatní. Vlastní aplikace Profirestu pro pokladnu, kuchyňský displej a kurýra přecházejí mezi API v1 a API v2 bez nového párování podle toho, kam je provozovna přepnutá (hlavička `Profirest-Api-Target`, viz `ApiTarget`). Zařízení přihlášené v API v1 vymění identitu API v1 za tokeny zařízení přes `grant_type=urn:profirest:params:oauth:grant-type:v1-device` – jen když je provozovna na API v2 (jinak `access_denied`), nejvýš 5 výměn za hodinu na zařízení (`slow_down`). Zařízení je pokaždé stejné. Do prvního požadavku s novými tokeny platí i identita API v1, pak usne. Obnova tokenu zařízení vráceného na API v1 vrátí `invalid_grant` s `api_target: v1` – přihlaste se v API v1, zařízení odpárované není. Tělo požadavku (povinné): - `application/x-www-form-urlencoded`: TokenRequestAuthorizationCode | TokenRequestRefreshToken | TokenRequestDeviceCode | TokenRequestV1Device Odpovědi: - 200: Tokeny. `application/json`: TokenResponse – pole `access_token`, `token_type`, `expires_in`, `refresh_token`, `refresh_token_expires_in`, `scope` - chyby: 400, 401 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /oauth/revoke – Zneplatnit token `operationId`: `oauthRevoke` · přihlášení: `clientBasic` nebo bez přihlášení · https://api.mujprofirest.cz/v2/docs#tag/OAuth/operation/oauthRevoke Zneplatní access nebo refresh token (RFC 7009). Zneplatnění refresh tokenu ukončí jeho řadu tokenů – všechny access a refresh tokeny, které pocházejí ze stejného povolení nebo ze stejného spárování zařízení; ostatní řady tokenů připojení fungují dál. Patří-li řada spárovanému zařízení, zařízení se navíc odpáruje a přihlášení zaměstnanců na něm skončí, stejně jako když ho vedoucí odpáruje v administraci – zařízení se musí spárovat znovu. Zneplatnění access tokenu ukončí jen tento token. `token_type_hint` není potřeba (nečte se). Odpoví 200 i pro neznámý token nebo token jiného klienta; požadavek bez `token` odpoví `400 invalid_request`. Úplné odpojení udělá majitel v Profirestu v části „Připojené aplikace“. Tělo požadavku (povinné): - `application/x-www-form-urlencoded`: object Odpovědi: - 200: Zneplatněno (nebo neznámý token). - chyby: 400, 401 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /.well-known/oauth-authorization-server – Metadata OAuth serveru `operationId`: `oauthMetadata` · přihlášení: bez přihlášení · https://api.mujprofirest.cz/v2/docs#tag/OAuth/operation/oauthMetadata Metadata podle RFC 8414 pro OAuth knihovny, které si endpointy zjišťují samy. Odpovědi: - 200: Metadata. `application/json`: OAuthServerMetadata – pole `issuer`, `authorization_endpoint`, `token_endpoint`, `revocation_endpoint`, `scopes_supported`, `response_types_supported`, `grant_types_supported`, `code_challenge_methods_supported`, `token_endpoint_auth_methods_supported`, `authorization_response_iss_parameter_supported`, `device_authorization_endpoint` ## Restaurants Provozovny připojení, jejich otevírací doba, příjem objednávek, rozvozové zóny a časy, na které lze objednat. Otevírací doba říká, kdy má provozovna otevřeno (ukazujte ji hostům); příjem objednávek, kdy se přijímají objednávky aplikací `web` (e-shopů) – rozvoz i osobní odběr. Výchozí je obojí stejné. Reference: https://api.mujprofirest.cz/v2/docs#tag/Restaurants ### GET /restaurants – Provozovny připojení `operationId`: `listRestaurants` · přihlášení: `oauth2`, oprávnění `restaurants:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/listRestaurants Provozovny, ke kterým vám majitel povolil přístup. Parametry: - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `external_id` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka provozoven. `application/json`: RestaurantPage – pole `data`, `next_cursor` - chyby: 401, 403 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id} – Detail provozovny `operationId`: `getRestaurant` · přihlášení: `oauth2`, oprávnění `restaurants:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getRestaurant Kontaktní údaje, časová zóna, měna a co provozovna právě teď přijímá. `ordering` se počítá v okamžiku požadavku; načtěte ho znovu v `ordering.next_change_at` nebo při `restaurant.changed`. `restaurant.changed` přijde, když administrace uloží údaje provozovny (název, telefon, web), její adresu, rozvozové zóny, otevírací dobu nebo příjem objednávek, nebo pravidla objednávek z aplikací. Jiné změny událost nevydají – třeba licence, nastavení kuchyně (`portion_tracking`) nebo cokoli změněné přes pokladnu na API v1 – proto provozovnu občas načtěte znovu i tak. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Provozovna. `application/json`: Restaurant – pole `id`, `name`, `is_test`, `address`, `location`, `phone`, `website`, `timezone`, `currency`, `ordering`, `portion_tracking`, `external_id`, `metadata` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/opening-hours – Otevírací doba `operationId`: `getOpeningHours` · přihlášení: `oauth2`, oprávnění `restaurants:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getOpeningHours Skutečná otevírací doba po dnech pro zadané období, spočítaná Profirestem, a k tomu týdenní šablona pro zobrazení. Používejte `days`, ne vlastní výpočet: budoucí výjimky (svátky) se tam objeví bez jakékoli změny na vaší straně. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `from` (query, LocalDate): První den. Výchozí je dnešek. - `to` (query, LocalDate): Poslední den, nejvýš 31 dní po `from`. Výchozí `from` + 13 dní. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Otevírací doba. `application/json`: OpeningHours – pole `restaurant_id`, `timezone`, `weekly`, `days` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/opening-hours – Nastavit týdenní otevírací dobu `operationId`: `setOpeningHours` · přihlášení: `oauth2`, oprávnění `opening_hours:write` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/setOpeningHours Nahradí běžný týden provozovny – stejně jako uložení Nastavení → Otevírací doba v administraci. E-shop, aplikace (objednávání, časy) i administrace novou dobu použijí hned a přijde událost `restaurant.changed`. Pošlete všech 7 dní; den bez intervalů je zavřeno. Intervaly dne jdou po sobě bez překryvu (oba konce jsou včetně), `to` může být `24:00` a interval nikdy nepřekračuje půlnoc – noční provoz jsou dva intervaly ve dvou dnech. Intervaly, které na sebe navazují (`12:00` a `12:01`), jsou souvislý provoz a vrátí se spojené. Výjimky (svátky) zatím nastavit nejde. Odpověď je stejná jako `getOpeningHours` na příštích 14 dní. Příjem objednávek (`getOrderHours`) se s otevírací dobou změní jen tehdy, když je nastavený stejně jako otevírací doba; vlastní časy se nastavují v administraci. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: OpeningHoursInput – pole `weekly` Odpovědi: - 200: Nová otevírací doba. `application/json`: OpeningHours – pole `restaurant_id`, `timezone`, `weekly`, `days` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/order-hours – Příjem objednávek `operationId`: `getOrderHours` · přihlášení: `oauth2`, oprávnění `restaurants:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getOrderHours Kdy provozovna přijímá objednávky aplikací `web` (e-shopů) – rozvoz i osobní odběr, „co nejdřív“ i na pozdější čas – po dnech pro zadané období, a k tomu týdenní šablona pro zobrazení. Provozovna je nastavuje v administraci (Nastavení → Otevírací doba); výchozí je stejně jako otevírací doba (`same_as_opening_hours`). `ordering.open_now` a `listTimeSlots` aplikace `web` se řídí těmito časy, `ordering.venue_open_now` otevírací dobou. Když se liší, ukazujte hostům obojí, třeba „Otevřeno do 22:00 · Objednávky do 21:30“. Aplikace `staff` a `kiosk` neomezují. *Od verze 26.11.25.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `from` (query, LocalDate): První den. Výchozí je dnešek. - `to` (query, LocalDate): Poslední den, nejvýš 31 dní po `from`. Výchozí `from` + 13 dní. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Příjem objednávek. `application/json`: OrderHours – pole `restaurant_id`, `timezone`, `same_as_opening_hours`, `weekly`, `days` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/delivery-zones – Rozvozové zóny `operationId`: `listDeliveryZones` · přihlášení: `oauth2`, oprávnění `restaurants:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/listDeliveryZones Oblasti, kam provozovna rozváží, s cenou dopravy, minimální objednávkou a časy rozvozu. Jen pro zobrazení a našeptávání adres: zónu objednávky vždy určí Profirest v kalkulaci. Když adresa leží ve více zónách, vyhraje ta s nejnižší minimální objednávkou, potom ta s nejnižší cenou dopravy. Zóna si při uložení zón v administraci ponechá své `id`; zóna, kterou tam odeberete, zmizí a nová zóna dostane nové `id`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka rozvozových zón. `application/json`: DeliveryZonePage – pole `data`, `next_cursor` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/time-slots – Časy, na které lze objednat `operationId`: `listTimeSlots` · přihlášení: `oauth2`, oprávnění `restaurants:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/listTimeSlots Zda lze právě teď objednat „co nejdřív“ a které časy lze zvolit pro zadaný den. Počítá Profirest z příjmu objednávek (`getOrderHours`), časů rozvozu, předstihu a nástupu kurýrů. Objednávky na pozdější čas se přijímají jen v době, kdy provozovna přijímá objednávky. Nabízejte jen tyto časy; kalkulace je ověří znovu. U aplikace `staff` (`GET /connection`) se žádné z těchto časových pravidel nepoužije: `asap` je k dispozici, kdykoli je provozovna aktivní, a `slots` obsahuje každý čas dne, který není v minulosti. Samostatný `kiosk` dostane `asap` pro osobní odběr, když je otevřeno, a žádné `slots`; kiosek nastavený jako obsluha odpověď pro `staff`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `type` (query, FulfillmentType, povinný): `delivery` – časy, kdy může zákazník dostat rozvoz; `pickup` – časy, kdy může být objednávka připravená k vyzvednutí; `dine_in` – stejné časy jako `pickup`, jen pro kiosek a aplikace personálu. - `date` (query, LocalDate): Den, pro který vypsat časy. Výchozí je dnešek. - `zone_id` (query, Id): U `delivery` omezí časy na rozvozový čas této zóny. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Dostupné časy. `application/json`: TimeSlots – pole `restaurant_id`, `type`, `date`, `asap`, `slots` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/accounting-export – Účetní export pro Pohodu nebo Money `operationId`: `getAccountingExport` · přihlášení: `oauth2`, oprávnění `accounting:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getAccountingExport Účetní soubor pro jednu provozovnu a nejvýš 31 dní: `receipts` (účtenky) nebo `invoices` (faktury) objednávek dokončených v období (bez smazaných; karta při převzetí se počítá jako karta), nebo `summary` (souhrny uzávěrek). Pohoda: XML podle aktuální POHODY, jen zaplacené účtenky (ne kuchyňské bony otevřených stolů), `receipts` jako prodejky a `invoices` jako vydané faktury, s členěním DPH, předkontací a dalšími údaji dokladu podle nastavení Pohody provozovny v administraci (Nastavení → Integrace); na rozdíl od odkazu s tokenem API nefiltruje podle formy úhrady ani agendy a obsahuje i odpisy a obědy zaměstnanců. Když není co exportovat, je soubor pro Pohodu prázdný (0 bajtů) – POHODA soubor bez dokladů nenačte. Money: stejné XML, jaké Money stahuje tokenem. Čísla jsou na haléř stejná jako v administraci, včetně dárkových voucherů mimo DPH. Faktury nesou údaje odběratelů – se souborem zacházejte jako s účetními doklady. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `format` (query, string, povinný): Účetní program. - `type` (query, string, povinný): `receipts` – účtenky objednávek, `invoices` – faktury objednávek, `summary` – souhrny uzávěrek. - `date_from` (query, LocalDate, povinný): První den období (podle dne dokončení objednávky, nebo dne uzávěrky). - `date_to` (query, LocalDate, povinný): Poslední den období, nejvýš 30 dní po `date_from`. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Dokument XML pro účetní program (pro Pohodu prázdný, když není co exportovat). `application/xml`: string (binary) - chyby: 400, 401, 403, 404, 406, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/shift-closes – Uzávěrky `operationId`: `listShiftCloses` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/listShiftCloses Uzávěrky provozovny ze všech zdrojů – pokladny na API v1 i v2, webový kuchyňský displej, kuchyňské displeje a kuchyně přes toto API – od nejnovější, se součty, jaké ukazuje detail uzávěrky v administraci. `source` podle objednávek uzávěrky říká, odkud přišla. Částky jsou v databázi uložené s omezenou přesností; tady jsou zaokrouhlené na haléře stejně jako v administraci. Nová uzávěrka přichází i jako událost `shift.closed`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den (den uzávěrky). - `date_to` (query, LocalDate, povinný): Poslední den. - `limit` (query) – společný parametr - `cursor` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Jedna stránka uzávěrek. `application/json`: ShiftClosePage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/shift-closes/{close_id} – Jedna uzávěrka `operationId`: `getShiftClose` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getShiftClose Jedna uzávěrka se součty. Administrace může objednávky uzavřené směny později změnit (platbu, storno), takže se součty mohou změnit také – poznáte to podle `ETag`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `close_id` (path, Id, povinný): ID uzávěrky (`ShiftClose.id`, také `shift_id` z `kitchen.shift_closed`). - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Uzávěrka. `application/json`: ShiftClose – pole `id`, `restaurant_id`, `closed_at`, `closed_by`, `source`, `device_id`, `orders`, `totals` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reports/sales-summary – Souhrn tržeb `operationId`: `getSalesSummary` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getSalesSummary Tržba, počet objednávek, průměrná objednávka a spropitné za zadané dny a k tomu jeden rozpad (`group_by`). Objednávky tak, jak je počítají Statistiky v administraci: nesmazané, uzavřené (`finished`) v zadaných dnech, bez bonů otevřených stolů; tržba je celková částka objednávky i s dopravou – stejná čísla, jaká ukazuje administrace. Rozpady: `day` (jen dny s tržbou), `hour` a `weekday` (všech 24 hodin a 7 dní, ISO 1 = pondělí, podle času uzavření objednávky), `payment` (karta při převzetí jako karta), `source` (`pos`, `web`, `kitchen` a rozvozové platformy `wolt`, `bolt`, `foodora`, `choice` podle začátku názvu objednávky), `employee` (kdo objednávku uzavřel; `0` = nikdo, třeba web), `table` (účty pokladen podle názvu; ostatní zdroje ne, jejich název je jméno zákazníka) a `segment` (`food`, `lodging`, `tickets` – vždy všechny tři). `segment` omezí objednávky na jeden druh tržby: `food` (pokladna, e-shop s jídlem, rozvoz a platformy), `lodging` (doklady za pobyt vystavené při odjezdu – ubytování, služby a útrata zapsaná na pokoj) nebo `tickets` (vstupenky z e-shopu a od vchodu). Provozovna, která prodává i ubytování nebo vstupenky, dostane férovou průměrnou objednávku jen se `segment=food` – doklad za pobyt ani nákup vstupenek není účet od stolu. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den (den, kdy se objednávka uzavřela). - `date_to` (query, LocalDate, povinný): Poslední den; nejvýš 92 dní v jednom požadavku. - `group_by` (query, string): Rozpad v `rows`. Výchozí `day`. - `segment` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Souhrn. `application/json`: SalesSummary – pole `date_from`, `date_to`, `group_by`, `segment`, `totals`, `rows` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reports/product-sales – Prodej položek `operationId`: `getProductSales` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getProductSales Prodané kusy a tržba po produktech, kategoriích, sortimentech nebo výrobních stanovištích, jako „Výkonnost produktů“ ve Statistikách administrace. Objednávky tak, jak je počítají Statistiky v administraci: nesmazané, uzavřené (`finished`) v zadaných dnech, bez bonů otevřených stolů; tržba je celková částka objednávky i s dopravou – stejná čísla, jaká ukazuje administrace. `revenue` je cena s obalem krát podíl zaplacené části objednávky (sleva na celý účet sníží každou položku), prodej dárkového voucheru celý; `discounts` jsou slevy na položky. Úhrada dárkovým voucherem prodej není. Doprava položka není, součet `revenue` je proto o dopravné nižší než tržba objednávek. `segment` omezí objednávky na jeden druh tržby: `food` (pokladna, e-shop s jídlem, rozvoz a platformy), `lodging` (doklady za pobyt vystavené při odjezdu – ubytování, služby a útrata zapsaná na pokoj) nebo `tickets` (vstupenky z e-shopu a od vchodu). Vstupenky a doklady za pobyt jsou řádky bez produktu (`key` `0`), každý název na vlastním řádku. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den (den, kdy se objednávka uzavřela). - `date_to` (query, LocalDate, povinný): Poslední den; nejvýš 92 dní v jednom požadavku. - `group_by` (query, string): `product` (výchozí), `category`, `sortiment` nebo `station` (výrobní stanoviště produktu). - `source` (query, string): Jen objednávky z těchto zdrojů, oddělené čárkou (`pos`, `web`, `kitchen`). Výchozí všechny. - `segment` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Prodej položek. `application/json`: ProductSales – pole `date_from`, `date_to`, `group_by`, `segment`, `totals`, `rows` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reports/tips – Spropitné `operationId`: `getTipsReport` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getTipsReport Spropitné za zadané dny podle způsobu platby, podle zaměstnance, který objednávku uzavřel, a podle kurýra, jako Statistiky → Spropitné v administraci. Objednávky tak, jak je počítají Statistiky v administraci: nesmazané, uzavřené (`finished`) v zadaných dnech, bez bonů otevřených stolů; tržba je celková částka objednávky i s dopravou – stejná čísla, jaká ukazuje administrace. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den (den, kdy se objednávka uzavřela). - `date_to` (query, LocalDate, povinný): Poslední den; nejvýš 92 dní v jednom požadavku. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Spropitné. `application/json`: TipsReport – pole `date_from`, `date_to`, `totals`, `by_payment`, `by_employee`, `by_courier` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reports/charges – Poplatky `operationId`: `getChargesReport` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getChargesReport Kolik objednávek mělo dopravu, doplatek do minimální objednávky a expresní doručení a kolik vynesly, jako poplatky ve Statistikách administrace – ze všech zdrojů (pokladny, e-shop, kuchyňský displej, aplikace). Objednávky tak, jak je počítají Statistiky v administraci: nesmazané, uzavřené (`finished`) v zadaných dnech, bez bonů otevřených stolů; storno protidokladem vrátí objednávku i částku v den storna, stejně jako tržbu. Objednávka s poplatkem rozděleným do více sazeb DPH se počítá jednou. Vždy všechny tři řádky v pořadí `delivery_fee`, `minimum_order_surcharge`, `express_delivery`. *Od verze 26.10.5.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den (den, kdy se objednávka uzavřela). - `date_to` (query, LocalDate, povinný): Poslední den; nejvýš 92 dní v jednom požadavku. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Poplatky. `application/json`: ChargesReport – pole `date_from`, `date_to`, `rows` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reports/vat – Rozpis DPH `operationId`: `getVatReport` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getVatReport DPH po sazbách za zadané dny jako daňový přehled ve Statistikách administrace, spočítané stejně jako kopie účtenky a účetní exporty: sleva na celý účet, doprava a úprava ceny se dělí do sazeb poměrem hrubých částek položek, zaokrouhlení do DPH nevstupuje. Objednávky tak, jak je počítají Statistiky v administraci: nesmazané, uzavřené (`finished`) v zadaných dnech, bez bonů otevřených stolů a bez objednávek placených na účet podniku. Prodané dárkové vouchery DPH nepodléhají a jsou v `vouchers_sold`; úhrada dárkovým voucherem prodej není (daň je v plné ceně jídla a pití). Podklady pro účetní jsou účetní exporty (`getAccountingExport`). *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den (den, kdy se objednávka uzavřela). - `date_to` (query, LocalDate, povinný): Poslední den; nejvýš 92 dní v jednom požadavku. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: DPH po sazbách. `application/json`: VatReport – pole `date_from`, `date_to`, `rates`, `vouchers_sold` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/sales – Doklady prodeje `operationId`: `listSales` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/listSales Doklady prodeje provozovny ze všech zdrojů – pokladny na API v1 i v2, web, kuchyň a rozvozové platformy – od nejstaršího podle času uzavření, takže si je účetní nebo BI systém může stahovat den po dni. Stejné objednávky jako Statistiky v administraci (nesmazané, bez bonů otevřených stolů). Částky, rozpis DPH, slevy na celý účet, dopravu, úpravy ceny, zaokrouhlení a úhrady dárkovým voucherem počítá stejně jako kopie účtenky v administraci a exporty do Pohody a Money. Storno je samostatný doklad (`kind` `cancellation`, záporné částky, `cancels`). Kontakty zákazníků v dokladech nejsou. Nové doklady přicházejí i jako události `sale.created` a stornované jako `sale.cancelled` (s `reports:read`), seznam pak stačí na dohnání. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den (den uzavření dokladu). - `date_to` (query, LocalDate, povinný): Poslední den; nejvýš 92 dní v jednom požadavku (kurzor pokračuje v rámci nich). - `source` (query, string): Jen doklady z těchto zdrojů, oddělené čárkou (`pos`, `web`, `kitchen`). Výchozí všechny. - `limit` (query) – společný parametr - `cursor` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Jedna stránka dokladů. `application/json`: SalePage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/sales/{sale_id} – Jeden doklad prodeje `operationId`: `getSale` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getSale Jeden doklad. Administrace může doklad později změnit (způsob platby, storno, uzávěrka), takže se může změnit – poznáte to podle `ETag`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `sale_id` (path, Id, povinný): ID dokladu (`Sale.id`). - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Doklad. `application/json`: Sale – pole `id`, `number`, `kind`, `source`, `platform`, `table_name`, `created_at`, `closed_at`, `employee`, `lines`, `items_total`, `discounts`, `delivery_fee`, `price_adjustment`, `rounding`, `total`, `vat`, `voucher_payments`, `amount_paid`, `payment_method`, `card_at_handover`, `tip`, `eet`, `shift_id`, `cancels`, `cancelled_by` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/cash-book – Pokladní kniha `operationId`: `getCashBook` · přihlášení: `oauth2`, oprávnění `reports:read` · https://api.mujprofirest.cz/v2/docs#tag/Restaurants/operation/getCashBook Pokladní kniha provozovny za zadané dny tak, jak ji ukazuje Statistiky → Pokladní kniha v administraci: hotovost na začátku a na konci každého dne i teď, hotovost za účtenky a dýško v hotovosti za den (počítá se z objednávek placených hotově – karta při převzetí ne, bon do kuchyně před zaplacením ne) a ručně zapsané pohyby – vklady, výběry, výdaje, jiné příjmy, počáteční stav a rozdíly zjištěné kontrolou pokladny – z administrace i z pokladen (`createCashMovement`). Smazané pohyby zůstávají v seznamu s `deleted_at` a nepočítají se. Před počátečním stavem kniha stav nemá (`null`). *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date_from` (query, LocalDate, povinný): První den. - `date_to` (query, LocalDate, povinný): Poslední den; nejvýš 92 dní v jednom požadavku. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Pokladní kniha. `application/json`: CashBook – pole `date_from`, `date_to`, `opening`, `balance_start`, `balance_end`, `balance_now`, `days`, `movements` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Catalog Kategorie, produkty, ceny a dostupnost jedné provozovny. Reference: https://api.mujprofirest.cz/v2/docs#tag/Catalog ### GET /restaurants/{restaurant_id}/catalog – Sortiment provozovny `operationId`: `getCatalog` · přihlášení: `oauth2`, oprávnění `catalog:read` · https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/getCatalog Vše, co provozovna prodává online v okamžiku `at`: kategorie, produkty s cenami této provozovny, přílohy a doplňky, alergeny a denní menu toho dne. Ceny jsou konečné včetně DPH. Pro objednávku platí ceny a dostupnost v jejím čase (u „co nejdřív“ teď). Pro objednávku na později načtěte sortiment s `at` nastaveným na ten čas. Časová pravidla (skryté kategorie, okno denního menu) jsou už použitá. `next_change_at` říká, kdy se výsledek kvůli času příště změní. Používejte `If-None-Match`, pak nezměněný sortiment nestojí skoro nic. Kalkulace ceny vždy přepočítá. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `at` (query, Timestamp): Okamžik, pro který sortiment platí. Výchozí je teď. Nejvýš `ordering.scheduled_orders.max_days_ahead` dní dopředu. - `channel` (query, string): Čí nabídka: `web` (výchozí) – co nabízí e-shop (přepínač „W“ provozovny); `kitchen` – nabídka objednávky kuchyňského displeje („K“); `pos` – pokladna („B“). `kitchen` a `pos` smí používat jen aplikace personálu… - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Sortiment. `application/json`: Catalog – pole `restaurant_id`, `currency`, `at`, `generated_at`, `next_change_at`, `categories`, `products`, `daily_menu`, `allergens` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/availability – Zbývající porce `operationId`: `getAvailability` · přihlášení: `oauth2`, oprávnění `catalog:read` · https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/getAvailability Produkty s omezeným počtem porcí a kolik jich teď zbývá. Produkty, které tu nejsou, omezené nejsou. Mění se často, proto je oddělená od sortimentu; načtěte ji znovu při `availability.changed`. Každá příloha nebo doplněk spotřebuje také jednu porci svého produktu. Aplikace personálu vidí porce i tehdy, když je provozovna hlídá jen na pokladnách; aplikace pro hosty jen tehdy, když je hlídá i pro e-shop. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `channel` (query, string): Katalog, jehož produkty se vypíšou, jako `channel` u `GET /catalog`. - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Aktuální dostupnost. `application/json`: Availability – pole `restaurant_id`, `tracking`, `generated_at`, `items` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/availability/{product_id} – Nastavit zbývající porce produktu `operationId`: `setProductAvailability` · přihlášení: `oauth2`, oprávnění `availability:write` · https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/setProductAvailability Nastaví, kolik porcí produktu zbývá; `0` ho označí jako vyprodaný a `null` omezení zruší. Číslo se zapíše tam, odkud prodej porce bere: do dnešního denního menu, když v něm produkt je s omezenými porcemi, jinak do porcí produktu v provozovně – stejné číslo jako v administraci. `null` zruší omezení i v dnešním denním menu. Platí hned pro e-shop, pokladny i aplikace a následuje událost `availability.changed`. Aplikace personálu smí porce měnit, kdykoli je provozovna hlídá; aplikace hostů jen tehdy, když je hlídá i pro e-shop, tedy jak je ukazuje `getAvailability`. Jinak `409 portion_tracking_disabled`. Hodnota je absolutní: objednávku ze stejného okamžiku může přepsat, proto posílejte, co jste napočítali. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `product_id` (path, Id, povinný): ID produktu ze sortimentu provozovny (`Product.id`). Jiná ID vrátí 404. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ProductAvailabilityInput – pole `remaining` Odpovědi: - 200: Dostupnost produktu po změně. `application/json`: ProductAvailability – pole `product_id`, `remaining`, `sold_out`, `source` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/promotions – Akce a slevové kódy `operationId`: `listPromotions` · přihlášení: `oauth2`, oprávnění `catalog:read` · https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/listPromotions Akce provozovny platné v okamžiku `at` pro objednávky z aplikací hostů – abyste je mohli ukázat zákazníkům (třeba „Doprava zdarma nad 500 Kč“). Nastavuje je provozovna v administraci. Akce bez kódu se v kalkulaci uplatní sama; u akce s `requires_code` zákazník zadá kód a vy ho pošlete v `QuoteRequest.promo_codes`. Kód samotný se nikdy nevrací. Které akce se uplatní a kolik dají, rozhoduje vždy kalkulace (`Quote.discounts`); vyčerpaná akce (`uses_left` 0) v seznamu není. Seznam načtěte znovu při `promotions.changed`; posílejte `If-None-Match`, pak nezměněný seznam nestojí skoro nic. Akce platí podle okamžiku odeslání objednávky – když vytváříte kalkulaci –, ne podle času doručení nebo odběru: objednávka na večer odeslaná v poledne dostane akce z poledne. V seznamu jsou akce, jejichž platnost (`valid_from`, `valid_until`) zahrnuje `at`; dny a denní doba (happy hour) jsou v `conditions.days` a `conditions.time_windows` – ukažte je zákazníkovi. Akce pro registrované zákazníky a věrnostní karty platí jen s propojeným zákazníkem s ověřeným telefonem (viz `Promotion`). *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `at` (query, Timestamp): Okamžik, pro který seznam platí – filtruje jen platnost (`valid_from`, `valid_until`), ne dny a denní dobu. Výchozí je teď, a to bere i kalkulace: okamžik odeslání objednávky. - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Akce. `application/json`: PromotionList – pole `restaurant_id`, `at`, `promotions` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/daily-menu – Denní menu na týden `operationId`: `getDailyMenu` · přihlášení: `oauth2`, oprávnění `catalog:read` · https://api.mujprofirest.cz/v2/docs#tag/Catalog/operation/getDailyMenu Denní menu jednoho týdne, jak ho provozovna nastavila v administraci – třeba pro web restaurace. Pro každý den, kdy se podává, dostanete jeho položky s cenami menu; položky, ceny, alergeny i viditelnost jsou stejné jako v sortimentu toho dne v čase menu (`GET …/catalog?at=`). Dny bez menu chybí, `enabled: false` znamená, že ten týden menu není. `every_day` označuje položky nabídky na celý týden. Licence se tu nekontroluje: menu se vrátí, i když licence provozovny denní menu neobsahuje (`DeviceSettings.features.daily_menu`), stejně jako denní menu v sortimentu. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `week` (query, string): Týden ISO, například `2026-W41`, letos, loni nebo příští rok. Výchozí je aktuální týden provozovny. - `channel` (query, string): Sortiment, ze kterého položky jsou, jako `channel` u `GET /catalog`. - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Denní menu týdne. `application/json`: DailyMenuWeek – pole `restaurant_id`, `week`, `enabled`, `available_from`, `available_to`, `days` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 400, 401, 403, 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Orders Kalkulace a objednávky, které jdou do kuchyňského displeje. Reference: https://api.mujprofirest.cz/v2/docs#tag/Orders ### POST /restaurants/{restaurant_id}/quotes – Spočítat košík `operationId`: `createQuote` · přihlášení: `oauth2`, oprávnění `orders:write` · https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/createQuote Profirest spočítá košík s cenami platnými v čase objednávky, najde rozvozovou zónu, přidá cenu dopravy, doplatek do minimální objednávky zóny a na přání expresní doručení (`fulfillment.speed`), uplatní akce provozovny a slevový kód (`discounts`), vouchery a ověří čas. Ceny jsou zaručené do `expires_at` (15 minut). Zatím se nic nerezervuje: porce a vouchery se rezervují při vytvoření objednávky. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: QuoteRequest – pole `fulfillment`, `delivery_address`, `items`, `customer_id`, `vouchers`, `promo_codes`, `end_user_id`, `channel` Odpovědi: - 201: Kalkulace. `application/json`: Quote – pole `id`, `restaurant_id`, `created_at`, `expires_at`, `customer_id`, `fulfillment`, `delivery`, `lines`, `charges`, `discounts`, `totals`, `payments`, `amount_due` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/quotes/{quote_id} – Detail kalkulace `operationId`: `getQuote` · přihlášení: `oauth2`, oprávnění `orders:write` · https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/getQuote Kalkulace vytvořená vaším připojením, i po vypršení (drží se 24 hodin). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `quote_id` (path, Id, povinný) - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Kalkulace. `application/json`: Quote – pole `id`, `restaurant_id`, `created_at`, `expires_at`, `customer_id`, `fulfillment`, `delivery`, `lines`, `charges`, `discounts`, `totals`, `payments`, `amount_due` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/orders – Objednávky tohoto připojení `operationId`: `listOrders` · přihlášení: `oauth2`, oprávnění `orders:read` · https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/listOrders Objednávky, které vaše připojení vytvořilo na této provozovně, od nejnovější. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `external_id` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka objednávek. `application/json`: OrderPage – pole `data`, `next_cursor` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/orders – Vytvořit objednávku `operationId`: `createOrder` · přihlášení: `oauth2`, oprávnění `orders:write` · https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/createOrder Vytvoří objednávku z platné kalkulace s jejími cenami. Porce a vouchery se rezervují ve stejné transakci; když něco došlo nebo voucher už nelze použít, dostanete chybu a nic nevznikne. - Platby `paid` nebo `unpaid` (hotově či kartou při doručení nebo odběru): objednávka jde hned do kuchyně (`received`). - Online platba `pending`: objednávka čeká ve stavu `awaiting_payment`, dokud nezavoláte `confirm-payment`, nejdéle do `payment_deadline` (30 minut). Pak se zruší a rezervace se uvolní. Když platbu potvrdíte až po zvoleném čase, jde objednávka do kuchyně jako co nejdřív (`fulfillment.asap` je pak `true`) s poznámkou pro kuchyň. Čas kalkulace se ověří znovu: když mezitím provozovna zavřela nebo čas vypadl z mřížky `time-slots`, dostanete `restaurant_closed`, `time_unavailable` (nebo jiný důvod z časů) a nic nevznikne – spočítejte košík znovu. Akce z kalkulace se ověří znovu a zapíše se jejich použití (i kusy věrnostní karty bez slevy v této objednávce): když akce mezitím skončila nebo se vyčerpala, zákazník dosáhl svého limitu nebo jednorázový kód použila jiná objednávka, dostanete `409 promotion_changed` a nic nevznikne – spočítejte košík znovu. Zrušení objednávky použití vrátí. Platby musí dohromady na haléř odpovídat `amount_due` kalkulace. Opakování se stejným `Idempotency-Key` vrátí stejnou objednávku; druhá nikdy nevznikne. Kuchyně a detail objednávky v administraci ukazují objednávku s poznámkou složenou z plateb (třeba dárkový voucher se zamaskovaným kódem `ABC-***` nebo částka k vybrání), poznámky k adrese, vaší `note` a názvu vaší aplikace (`KitchenTicket.note`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: OrderCreate – pole `quote_id`, `customer`, `payments`, `note`, `external_id`, `metadata`, `eet` Odpovědi: - 201: Objednávka. `application/json`: Order – pole `id`, `restaurant_id`, `kitchen_number`, `status`, `status_changed_at`, `created_at`, `payment_deadline`, `fulfillment`, `customer`, `delivery`, `lines`, `charges`, `discounts`, `totals`, `payments`, `amount_to_collect`, `loyalty_points_earned`, `note`, `cancellation`, `eet`, `external_id`, `metadata` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/orders/{order_id} – Detail objednávky `operationId`: `getOrder` · přihlášení: `oauth2`, oprávnění `orders:read` · https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/getOrder Aktuální stav objednávky vytvořené vaším připojením. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `order_id` (path, povinný) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Objednávka. `application/json`: Order – pole `id`, `restaurant_id`, `kitchen_number`, `status`, `status_changed_at`, `created_at`, `payment_deadline`, `fulfillment`, `customer`, `delivery`, `lines`, `charges`, `discounts`, `totals`, `payments`, `amount_to_collect`, `loyalty_points_earned`, `note`, `cancellation`, `eet`, `external_id`, `metadata` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/orders/{order_id}/confirm-payment – Potvrdit online platbu `operationId`: `confirmOrderPayment` · přihlášení: `oauth2`, oprávnění `orders:write` · https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/confirmOrderPayment Označí `pending` online platbu jako zaplacenou a pošle objednávku do kuchyně. Jen ve stavu `awaiting_payment`; po `payment_deadline` je objednávka už zrušená a dostanete `409 order_not_awaiting_payment`, pak peníze zákazníkovi vraťte. Když platba neprošla, objednávku místo toho zrušte. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `order_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: PaymentConfirmation – pole `provider`, `reference` Odpovědi: - 200: Objednávka, nyní ve stavu `received`. `application/json`: Order – pole `id`, `restaurant_id`, `kitchen_number`, `status`, `status_changed_at`, `created_at`, `payment_deadline`, `fulfillment`, `customer`, `delivery`, `lines`, `charges`, `discounts`, `totals`, `payments`, `amount_to_collect`, `loyalty_points_earned`, `note`, `cancellation`, `eet`, `external_id`, `metadata` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/orders/{order_id}/cancel – Zrušit objednávku `operationId`: `cancelOrder` · přihlášení: `oauth2`, oprávnění `orders:write` · https://api.mujprofirest.cz/v2/docs#tag/Orders/operation/cancelOrder Zruší objednávku ve stavu `awaiting_payment` nebo `received` (kuchyně ji nezačala připravovat; Profirest to v okamžiku rušení ověří znovu). Bon už může být vytištěný; z displeje kuchyně objednávka zmizí. Později vrátí `409 order_not_cancellable`; pak ji může zrušit jen provozovna. Rezervované porce se uvolní a vouchery se vrátí; objednávku, která už je v kuchyni, tam zruší stornovací doklad. Vrácení online platby zákazníkovi je na vás. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `order_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: OrderCancel – pole `reason` Odpovědi: - 200: Zrušená objednávka. `application/json`: Order – pole `id`, `restaurant_id`, `kitchen_number`, `status`, `status_changed_at`, `created_at`, `payment_deadline`, `fulfillment`, `customer`, `delivery`, `lines`, `charges`, `discounts`, `totals`, `payments`, `amount_to_collect`, `loyalty_points_earned`, `note`, `cancellation`, `eet`, `external_id`, `metadata` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Customers Propojení vašich zákazníků s databází klientů účtu a věrnostní body. Reference: https://api.mujprofirest.cz/v2/docs#tag/Customers ### GET /customers – Zákazníci propojení tímto připojením `operationId`: `listCustomers` · přihlášení: `oauth2`, oprávnění `customers:read` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/listCustomers Zákazníci, které vaše připojení propojilo (`POST /customers`), v pořadí, v jakém byli propojeni. Propojení jiných připojení účtu se nikdy neukážou, ani se stejným telefonním číslem – každé připojení vidí jen svá (všechna zařízení jedné aplikace na účtu sdílejí jedno připojení). Neověření zákazníci v seznamu jsou také. Jediný filtr je `external_id`. Parametry: - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `external_id` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka zákazníků. `application/json`: CustomerPage – pole `data`, `next_cursor` - chyby: 401, 403 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /customers – Propojit zákazníka `operationId`: `createCustomer` · přihlášení: `oauth2`, oprávnění `customers:write` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/createCustomer Propojí vašeho zákazníka s databází klientů účtu podle telefonního čísla, takže se jeho objednávky počítají stejnému člověku jako v restauraci. Odpověď nikdy neprozradí, zda už telefon známe, a Profirest nikdy nevrátí údaje, které o člověku má: vidíte jen to, co jste poslali. Věrnostní body uvidíte po ověření telefonu, protože body mají hodnotu peněz. Parametry: - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: CustomerCreate – pole `phone`, `name`, `email`, `external_id`, `metadata` Odpovědi: - 201: Propojení zákazníka. `application/json`: Customer – pole `id`, `phone`, `name`, `email`, `phone_verified`, `created_at`, `external_id`, `metadata` - chyby: 400, 401, 403, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /customers/{customer_id} – Detail zákazníka `operationId`: `getCustomer` · přihlášení: `oauth2`, oprávnění `customers:read` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/getCustomer Jedno propojení zákazníka vaším připojením s `ETag` pro `PATCH`. Obsahuje jen to, co vaše připojení poslalo (viz `Customer`). Propojení jiného připojení, propojení, které jste odebrali (`DELETE`), nebo smazané, protože provozovna toho zákazníka smazala v administraci, vrátí `404`. Parametry: - `customer_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Propojení zákazníka. `application/json`: Customer – pole `id`, `phone`, `name`, `email`, `phone_verified`, `created_at`, `external_id`, `metadata` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PATCH /customers/{customer_id} – Upravit zákazníka `operationId`: `updateCustomer` · přihlášení: `oauth2`, oprávnění `customers:write` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/updateCustomer Změní jen poslaná pole. V `If-Match` pošlete `ETag`, který jste načetli. Změna telefonu zákazníka znovu propojí a zruší ověření. Parametry: - `customer_id` (path, povinný) – společný parametr - `If-Match` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: CustomerUpdate – pole `phone`, `name`, `email`, `external_id`, `metadata` Odpovědi: - 200: Upravené propojení zákazníka. `application/json`: Customer – pole `id`, `phone`, `name`, `email`, `phone_verified`, `created_at`, `external_id`, `metadata` - chyby: 400, 401, 403, 404, 409, 412, 422, 428 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /customers/{customer_id} – Zrušit propojení a smazat zákazníka `operationId`: `deleteCustomer` · přihlášení: `oauth2`, oprávnění `customers:write` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/deleteCustomer Odstraní propojení a všechny údaje, které vaše připojení o zákazníkovi poslalo (například když zákazník chce být zapomenut). Vlastní záznam restaurace o klientovi a jeho dřívější objednávky zůstávají, protože patří restauraci. Parametry: - `customer_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Odstraněno. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /customers/{customer_id}/phone-verification – Poslat ověřovací kód `operationId`: `startPhoneVerification` · přihlášení: `oauth2`, oprávnění `customers:write` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/startPhoneVerification Profirest pošle zákazníkovi SMS se šestimístným kódem. Kód platí 10 minut. Omezení: nový kód až po `resend_after`; nejvýš 5 kódů na telefonní číslo a připojení za den a 15 na číslo ze všech připojení; denní kvóta SMS na připojení; SMS jen do zemí, kam Profirest doručuje. SMS se platí z kreditu majitele restaurace. Parametry: - `customer_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 201: Kód byl odeslán. `application/json`: PhoneVerification – pole `id`, `expires_at`, `resend_after` - chyby: 400, 401, 403, 404, 422, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /customers/{customer_id}/phone-verification/confirm – Potvrdit ověřovací kód `operationId`: `confirmPhoneVerification` · přihlášení: `oauth2`, oprávnění `customers:write` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/confirmPhoneVerification Kód ověří jen telefon, na který odešel; změna telefonu zákazníka ho zruší. Po 5 špatných pokusech kód přestane platit a je potřeba vyžádat nový. Parametry: - `customer_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: PhoneVerificationConfirm – pole `code` Odpovědi: - 200: Ověřeno. Zákazník má nyní `phone_verified = true`. `application/json`: Customer – pole `id`, `phone`, `name`, `email`, `phone_verified`, `created_at`, `external_id`, `metadata` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /customers/{customer_id}/loyalty – Věrnostní body `operationId`: `getCustomerLoyalty` · přihlášení: `oauth2`, oprávnění `loyalty:read` · https://api.mujprofirest.cz/v2/docs#tag/Customers/operation/getCustomerLoyalty Body ověřeného zákazníka. Jsou společné pro všechny provozovny účtu. Objednávky přes API přičtou 1 bod za každou celou korunu ceny položek před vouchery – doprava ani doplatek do minima se nepočítají (stejně jako na pokladně). Parametry: - `customer_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Body. `application/json`: Loyalty – pole `customer_id`, `points`, `points_value`, `redeemable` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Vouchers Dárkové vouchery vydané účtem. Reference: https://api.mujprofirest.cz/v2/docs#tag/Vouchers ### POST /restaurants/{restaurant_id}/vouchers/check – Ověřit dárkový voucher `operationId`: `checkVoucher` · přihlášení: `oauth2`, oprávnění `vouchers:redeem` · https://api.mujprofirest.cz/v2/docs#tag/Vouchers/operation/checkVoucher Ukáže stav a zůstatek voucheru tohoto účtu, aniž by ho použil. Kód se posílá v těle, nikdy v URL, protože má hodnotu peněz. Vouchery jiných účtů a dosud neprodané vouchery – i zablokované – vypadají přesně jako neznámé kódy (`422 voucher_invalid`); stejně tak voucher v kalkulaci, v objednávce i v platbě účtenky. `blocked` přijde jen u prodaného voucheru. Každý neznámý kód se počítá jako neúspěšný pokus, i v kalkulacích a objednávkách. Limity: 10 neúspěšných pokusů na `end_user_id` a 200 na připojení v pevném desetiminutovém okně (začíná v :00, :10, :20 …); pak `429 voucher_attempts_exceeded` do konce okna (`Retry-After`, nejvýš 10 minut). Navíc 500 neúspěšných pokusů za den na připojení a 1 000 za den na účet napříč všemi připojeními; pak `429` do půlnoci. Posílejte `end_user_id` (vaše stálé anonymní ID nakupujícího), aby jeden nakupující nezablokoval celý váš e-shop. **Spárovaná pokladna** (zařízení s `receipts:write`) vouchery i prodává, a proto vidí i dosud neprodaný voucher série, která prodej povoluje: `status` `for_sale` (nebo `blocked`), `value` je cena, za kterou se prodá, `balance` je nula a `valid_until` `null` – platnost začíná dnem prodeje. Prodejte ho řádkem `voucher_sale` účtenky; `unit_price` smí chybět (od 26.11.26). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: VoucherCheck – pole `code`, `end_user_id` Odpovědi: - 200: Voucher v tomto účtu existuje. Viz `status` a `accepted_here`. `application/json`: Voucher – pole `code`, `status`, `value`, `balance`, `valid_until`, `partial_redemption`, `accepted_here` - chyby: 400, 401, 403, 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Reservations Rezervace stolů a služeb u pracovníků – volné časy, rezervace, změny, usazení a stav stolů v tuto chvíli. Reference: https://api.mujprofirest.cz/v2/docs#tag/Reservations ### GET /restaurants/{restaurant_id}/reservation-settings – Pravidla rezervací `operationId`: `getReservationSettings` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/getReservationSettings Jak provozovna přijímá rezervace: jak dlouho hosté sedí u stolu podle velikosti skupiny, krok nabízených časů, úklid stolu, poslední rezervace před zavřením, dny bez rezervací a pravidla pro hosty, kteří rezervují online. Provozovna je nastavuje v administraci (Rezervace › Nastavení). Použijte je k vysvětlení nabídky; které časy jsou volné, řekne `getReservationAvailability`. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Pravidla. `application/json`: ReservationSettings – pole `slot_step_minutes`, `table_durations`, `table_buffer_minutes`, `last_seating_before_close_minutes`, `use_opening_hours`, `max_guests_per_slot`, `closed_dates`, `online`, `services_enabled`, `deposit`, `reminders`, `feedback_enabled`, `guest_max_moves` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reservation-services – Služby k rezervaci `operationId`: `listReservationServices` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/listReservationServices Služby, které si host rezervuje u pracovníka – střih, masáž, konzultace – s délkou, cenou a pracovníky, kteří je dělají. Prázdné, když licence provozovny má jen rezervace stolů (`ReservationSettings.services_enabled`). Služby, které se teď nenabízejí, chybí. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Služby. `application/json`: ReservationServiceList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reservation-availability – Volné časy dne `operationId`: `getReservationAvailability` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/getReservationAvailability Časy jednoho dne, které provozovna nabízí, každý s `available` a u nedostupného s důvodem `reason`. U stolu pošlete `party_size`; u služby `kind=service`, `service_id` a případně `employee_id` (bez něj kdokoli volný). Stoly nebo pracovník u času jsou to, co by `createReservation` v tu chvíli vzal – čas se pro vás nedrží, proto rezervaci založte brzy a počítejte s `409 reservation_unavailable`, když byl někdo rychlejší. `channel=online` (výchozí) použije pravidla pro hosty, kteří rezervují online: jen když provozovna online rezervace přijímá, ne dřív než `online.lead_minutes`, ne dál než `online.horizon_days`, jen stoly nabízené online, a časy, které host už rezervovat nemůže, chybí. `channel=staff` je pro aplikace obsluhy (pokladna, kniha rezervací): všechny stoly a všechny časy dne. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `date` (query, LocalDate, povinný): Den (místní datum provozovny). - `kind` (query, string): `table` (výchozí), nebo `service`. - `party_size` (query, integer): Počet hostů (výchozí 2 u stolu, 1 u služby). - `service_id` (query, Id): Služba (`kind=service`). - `employee_id` (query, Id): Jen tento pracovník (`kind=service`). - `channel` (query, string): `online` (výchozí) – pravidla pro hosty; `staff` – aplikace obsluhy. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Časy dne. `application/json`: ReservationAvailability – pole `date`, `slots` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reservations – Seznam rezervací `operationId`: `listReservations` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/listReservations Rezervace se začátkem od `from` do `to` (místní dny včetně obou, nejvýš 31 dní; bez nich dnešek), podle začátku. Ze všech zdrojů – administrace, pokladny, hosté online i jiné aplikace. Dotazujte se s `If-None-Match`, nebo sledujte události `reservation.*`. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `from` (query, LocalDate): První den (výchozí dnešek). - `to` (query, LocalDate): Poslední den (výchozí `from`). - `status` (query, string): Jen tyto stavy, oddělené čárkou (`requested,confirmed`). - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Rezervace. `application/json`: ReservationList – pole `data` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations – Založit rezervaci `operationId`: `createReservation` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/createReservation Rezervace stolu (`kind=table`, `party_size`), nebo služby u pracovníka (`kind=service`, `service_id`, případně `employee_id`). Server zkontroluje kapacitu a stoly nebo pracovníka vybere sám (nejmenší vhodný stůl, jinak spojené stoly; nejméně vytížený pracovník); plný čas vrátí `409 reservation_unavailable`, čas, který pravidla nedovolí, `422 reservation_not_allowed`. `table_ids` můžete poslat u `channel=staff`. Aplikace obsluhy (`channel=staff`) může navíc zadat vlastní délku rezervace stolu (`duration_minutes`, oslava, blokace stolu), zálohu nechtít (`deposit: false`) a usadit hosty, kteří přišli bez rezervace (`walk_in: true` – začátek je teď, rezervace je hned `seated` a neplatí otevírací doba, zavřené dny ani tempo příchodů; stůl musí být volný). `channel=online` (výchozí) je host, který rezervuje přes vaši aplikaci: telefon i e-mail hosta jsou povinné, platí pravidla online rezervací a rezervace je hned `confirmed`, nebo `requested`, když provozovna online rezervace potvrzuje ručně (když ji nikdo včas nepotvrdí, propadne). Když pravidla chtějí zálohu, zůstane rezervace `requested` s `deposit.status` `pending`, dokud se nezaplatí. Opakování je bezpečné: stejný `Idempotency-Key` vrátí stejnou rezervaci; vaše vlastní `uuid` také – druhé založení s ním vrátí existující rezervaci. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ReservationCreate – pole `uuid`, `channel`, `kind`, `party_size`, `starts_at`, `service_id`, `employee_id`, `table_ids`, `guest`, `note_guest`, `note_internal`, `tags`, `duration_minutes`, `walk_in`, `deposit` Odpovědi: - 201: Založeno. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reservations/{reservation_id} – Detail rezervace `operationId`: `getReservation` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/getReservation Rezervace s kontakty hosta a `ETag` (verzí). *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Rezervace. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PATCH /restaurants/{restaurant_id}/reservations/{reservation_id} – Změnit rezervaci `operationId`: `updateReservation` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/updateReservation Pošlete jen to, co se mění. Nový čas, počet osob, stoly, služba nebo pracovník se znovu porovná s kapacitou (bez této rezervace); server ponechá stávající stoly nebo pracovníka, pokud pořád vyhovují, jinak vybere nové. Usazená rezervace mění jen stoly, počet osob a poznámky; ukončená se nemění (`409 reservation_state_conflict`). Pošlete `If-Match` s načteným `ETag`. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `If-Match` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ReservationUpdate – pole `party_size`, `starts_at`, `service_id`, `employee_id`, `table_ids`, `guest`, `note_guest`, `note_internal`, `tags`, `duration_minutes` Odpovědi: - 200: Změněno. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422, 428 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/confirm – Potvrdit rezervaci `operationId`: `confirmReservation` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/confirmReservation Rezervace `requested` se stane `confirmed` (provozovna přijme rezervaci, která čekala na potvrzení). Rezervace v jiném stavu vrátí `409 reservation_state_conflict`. `If-Match` je nepovinný: s ním se změna provede, jen když rezervaci od vašeho načtení nikdo nezměnil. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Rezervace v novém stavu. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/reject – Odmítnout rezervaci `operationId`: `rejectReservation` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/rejectReservation Rezervace `requested` se stane `rejected` a uvolní stoly nebo pracovníka. `reason` uvidí host. Rezervace v jiném stavu vrátí `409 reservation_state_conflict`. `If-Match` je nepovinný: s ním se změna provede, jen když rezervaci od vašeho načtení nikdo nezměnil. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku: - `application/json`: ReservationAction – pole `reason`, `tab_id` Odpovědi: - 200: Rezervace v novém stavu. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/cancel – Zrušit rezervaci `operationId`: `cancelReservation` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/cancelReservation Rezervace `requested` nebo `confirmed` se stane `cancelled` a uvolní stoly nebo pracovníka. `reason` uvidí host. Rezervace v jiném stavu vrátí `409 reservation_state_conflict`. `If-Match` je nepovinný: s ním se změna provede, jen když rezervaci od vašeho načtení nikdo nezměnil. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku: - `application/json`: ReservationAction – pole `reason`, `tab_id` Odpovědi: - 200: Rezervace v novém stavu. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/seat – Usadit hosty `operationId`: `seatReservation` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/seatReservation Hosté přišli: rezervace se stane `seated`. Pošlete `tab_id`, když jim vaše pokladna otevřela účet (`putTab`) – rezervace si vazbu ponechá. Rezervace v jiném stavu vrátí `409 reservation_state_conflict`. `If-Match` je nepovinný: s ním se změna provede, jen když rezervaci od vašeho načtení nikdo nezměnil. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku: - `application/json`: ReservationAction – pole `reason`, `tab_id` Odpovědi: - 200: Rezervace v novém stavu. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/complete – Hosté odešli `operationId`: `completeReservation` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/completeReservation Rezervace `seated` se stane `completed`. Když hosté odejdou dřív, než bylo v plánu, stůl je volný hned (`ends_at` se posune na teď). Rezervace v jiném stavu vrátí `409 reservation_state_conflict`. `If-Match` je nepovinný: s ním se změna provede, jen když rezervaci od vašeho načtení nikdo nezměnil. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Rezervace v novém stavu. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/no-show – Hosté nepřišli `operationId`: `markReservationNoShow` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/markReservationNoShow Rezervace `requested` nebo `confirmed` se stane `no_show` a uvolní stoly nebo pracovníka. Zaplacená záloha propadne. Rezervace v jiném stavu vrátí `409 reservation_state_conflict`. `If-Match` je nepovinný: s ním se změna provede, jen když rezervaci od vašeho načtení nikdo nezměnil. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Rezervace v novém stavu. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/payment-link – Poslat odkaz k zaplacení zálohy `operationId`: `sendReservationPaymentLink` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/sendReservationPaymentLink Pro rezervaci `requested` nebo `confirmed`, jejíž záloha čeká na zaplacení (`deposit.status` `pending`) – třeba přijatou po telefonu. Vytvoří nový odkaz na stránku rezervace hosta, pošle ho na e-mail hosta (má-li ho) a vrátí ho, abyste ho mohli poslat i SMS. Starší odkaz přestane platit. Jiná rezervace vrátí `409 reservation_state_conflict`. *Od verze 26.11.10.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Odkaz. `application/json`: ReservationPaymentLink – pole `url`, `emailed`, `due_at` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/reservations/{reservation_id}/waive-deposit – Odpustit zálohu `operationId`: `waiveReservationDeposit` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/waiveReservationDeposit Záloha čekající na zaplacení se odpustí (host zaplatí na místě, stálý host …): `deposit.status` bude `none` a rezervace, která čekala jen na zálohu, bude `confirmed`. Platba, která přijde potom, se vrátí sama. Rezervace bez čekající zálohy vrátí `409 reservation_state_conflict`. *Od verze 26.11.10.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `reservation_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Rezervace bez zálohy. `application/json`: Reservation – pole `id`, `uuid`, `restaurant_id`, `kind`, `status`, `source`, `party_size`, `starts_at`, `ends_at`, `blocked_until`, `table_ids`, `service_id`, `employee_id`, `employee_any`, `resource_id`, `guest`, `note_guest`, `note_internal`, `tags`, `deposit`, `confirm_due_at`, `tab_id`, `cancel_reason`, `version`, `created_at`, `updated_at` - chyby: 401, 403, 404, 409, 412 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reservation-guest – Historie hosta `operationId`: `getReservationGuest` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/getReservationGuest Známý host podle telefonu nebo e-mailu – kolikrát přišel, nepřišel nebo zrušil, jeho budoucí rezervace, poslední návštěva a štítky dřívějších rezervací (alergie, VIP), napříč provozovnami účtu. Hodí se při přijímání rezervace po telefonu. Telefon se porovná s předvolbou `+420` i bez ní. Pošlete aspoň jedno z `phone` a `email`. *Od verze 26.11.10.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `phone` (query, string) - `email` (query, string) - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Host. `application/json`: ReservationGuestHistory – pole `known`, `name`, `phone`, `email`, `visits`, `no_shows`, `cancelled`, `upcoming`, `last_visit_at`, `tags` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/waitlist – Čekací listina dneška `operationId`: `listWaitlist` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/listWaitlist Hosté bez stolu, kteří dnes čekají – nejdéle čekající první. Usazení a odešlí v seznamu nejsou. *Od verze 26.11.11.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Čekací listina. `application/json`: WaitlistList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/waitlist – Zapsat hosta na čekací listinu `operationId`: `addToWaitlist` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/addToWaitlist Host bez volného stolu. Pošlete jméno nebo telefon (pro SMS, že je stůl připravený). *Od verze 26.11.11.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: WaitlistEntryCreate – pole `name`, `phone`, `party_size`, `note` Odpovědi: - 201: Host na listině. `application/json`: WaitlistEntry – pole `id`, `name`, `phone`, `party_size`, `note`, `status`, `created_at`, `notified_at`, `can_sms` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/waitlist/{waitlist_id}/notify – Dát hostovi vědět, že je stůl připravený `operationId`: `notifyWaitlistEntry` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/notifyWaitlistEntry Pošle hostovi SMS, že je stůl připravený (jen na české mobilní číslo; platí se z kreditu jako ostatní SMS hostům). Host bez takového čísla vrátí `422 validation_failed` – zavolejte mu. Host, který už nečeká, vrátí `409 reservation_state_conflict`; SMS, která neodešla, `503 service_unavailable`. *Od verze 26.11.11.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `waitlist_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Záznam po SMS. `application/json`: WaitlistEntry – pole `id`, `name`, `phone`, `party_size`, `note`, `status`, `created_at`, `notified_at`, `can_sms` - chyby: 401, 403, 404, 409, 422, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/waitlist/{waitlist_id}/close – Usadit hosta, nebo ho z listiny vyřadit `operationId`: `closeWaitlistEntry` · přihlášení: `oauth2`, oprávnění `reservations:write` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/closeWaitlistEntry `seated` s `reservation_id` rezervace, kterou jste hostovi založili (`createReservation` s `channel=staff` a `walk_in: true`), nebo `left`, když host nečekal. *Od verze 26.11.11.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `waitlist_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: WaitlistClose – pole `status`, `reservation_id` Odpovědi: - 204: Uzavřeno. - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reservation-feedback – Hodnocení hostů `operationId`: `listReservationFeedback` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/listReservationFeedback Hodnocení po návštěvě (1–5 hvězdiček a komentář) rezervací začínajících v období, od nejnovějšího, nejvýš 500. Host hodnotí jednou, dvě hodiny po odchodu, když provozovna o hodnocení žádá. *Od verze 26.11.11.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `from` (query, string (date), povinný) - `to` (query, string (date), povinný): Včetně; nejvýš 366 dní po `from`. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Hodnocení a jejich průměr. `application/json`: ReservationFeedbackList – pole `data`, `count`, `average` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/reservation-stats – Přehled rezervací `operationId`: `getReservationStats` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/getReservationStats Čísla rezervací začínajících v období – stejná jako Rezervace › Kniha › Přehled v administraci: rezervace a hosté, kdo přišel a kdo ne, zrušené, odkud přišly, hosté podle dne a hodiny, zálohy, hodnocení, vracející se hosté, služby a pracovníci. `table_turn` je skutečná doba u stolu (od usazení do odchodu) podle velikosti skupiny vedle pravidla, s návrhem tam, kde se pravidlo liší aspoň o 15 minut a měření je aspoň 8. Blokace stolů se nepočítají. *Od verze 26.11.12.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `from` (query, string (date), povinný) - `to` (query, string (date), povinný): Včetně; nejvýš 366 dní po `from`. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Přehled za období. `application/json`: ReservationStats – pole `from`, `to`, `reservations`, `guests`, `arrived`, `arrived_guests`, `no_show`, `no_show_rate`, `cancelled`, `rejected`, `expired`, `upcoming`, `unresolved`, `avg_party_size`, `avg_lead_days`, `returning_guests`, `sources`, `weekdays`, `hours`, `deposits`, `ratings`, `services`, `employees`, `table_turn` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/table-status – Které stoly jsou teď volné `operationId`: `getTableStatus` · přihlášení: `oauth2`, oprávnění `reservations:read` · https://api.mujprofirest.cz/v2/docs#tag/Reservations/operation/getTableStatus Každý stůl z mapy provozovny se stavem v tuto chvíli: `occupied` – otevřený účet stolu (i hosté bez rezervace) nebo usazení hosté rezervace; `reserved` – rezervace začíná do 30 minut nebo běží a hosté ještě nejsou usazení; jinak `free`. `next_reservation` je další rezervace dne. Účty stolů nesou jen název stolu, s mapou se proto párují podle názvu. Dotazujte se s `If-None-Match`. *Od verze 26.11.9.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stoly. `application/json`: TableStatus – pole `at`, `tables` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Lodging Ubytování – kdo je právě ubytovaný a účet jeho pokoje, aby pokladna mohla útratu zapsat na pokoj. Reference: https://api.mujprofirest.cz/v2/docs#tag/Lodging ### GET /restaurants/{restaurant_id}/lodging/in-house – Kdo je právě ubytovaný `operationId`: `listInHouseStays` · přihlášení: `oauth2`, oprávnění `lodging:read` · https://api.mujprofirest.cz/v2/docs#tag/Lodging/operation/listInHouseStays Pobyty, které jsou právě ubytované (`checked_in`), seřazené podle pokoje – aby pokladna mohla nabídnout „na pokoj“. `balance` je, co zbývá zaplatit na účtu pokoje. Hosté, kteří ještě nepřijeli nebo už odjeli, tu nejsou. *Od verze 26.11.13.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Pobyty. `application/json`: InHouseStays – pole `stays` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/stays/{stay_id}/folio – Účet pokoje `operationId`: `getStayFolio` · přihlášení: `oauth2`, oprávnění `lodging:read` · https://api.mujprofirest.cz/v2/docs#tag/Lodging/operation/getStayFolio Účet pobytu: ubytování, poplatek z pobytu, služby a útraty (i z pokladen), platby a co zbývá zaplatit (`balance`, záporný při přeplatku). `city_tax.estimate` je `true`, dokud hosté nejsou zapsaní – poplatek se počítá z počtu osob. *Od verze 26.11.13.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Účet. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/charges – Zapsat útratu na pokoj `operationId`: `chargeToStay` · přihlášení: `oauth2`, oprávnění `lodging:write` · https://api.mujprofirest.cz/v2/docs#tag/Lodging/operation/chargeToStay Přidá útratu na účet pobytu, který je právě ubytovaný – účet z restaurace nebo baru, který host zaplatí při odjezdu. Pokladna na ni účtenku nevystaví: účet stolu uzavře bez dokladu a pošle sem celkovou částku, za každou sazbu DPH zvlášť. Tržbou se útrata stane na dokladu za pobyt, který ubytování vystaví při odjezdu (s ubytováním, službami a DPH) – účtenka z pokladny navíc by ji započítala dvakrát. Pobyt, který není ubytovaný, vrátí `409 lodging_state_conflict` (host ještě nepřijel nebo už odjel – útratu zapíše recepce v administraci). `reference` je vaše ID útraty (třeba číslo dokladu): druhá útrata se stejnou `reference` se nezapíše dvakrát a vrátí `200` s účtem. Odpověď je celý účet, aby pokladna mohla ukázat, kolik host dluží. *Od verze 26.11.13.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StayChargeInput – pole `name`, `amount`, `vat_rate`, `reference` Odpovědi: - 200: Útrata už na účtu byla (stejná `reference`); účet. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - 201: Zapsáno; účet po zápisu. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/packages – Pobytové balíčky `operationId`: `listLodgingPackages` · přihlášení: `oauth2`, oprávnění `lodging:read` · https://api.mujprofirest.cz/v2/docs#tag/Lodging/operation/listLodgingPackages Balíčky, které provozovna teď nabízí – noci zdarma (`pay_nights` + `free_nights`, zdarma jsou nejlevnější noci), sleva, příplatek za pobyt a služby v ceně. `online` – nabízí se na stránce rezervace. *Od verze 26.11.15.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Balíčky. `application/json`: LodgingPackageList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/stats – Přehled ubytování `operationId`: `getLodgingStats` · přihlášení: `oauth2`, oprávnění `lodging:read` · https://api.mujprofirest.cz/v2/docs#tag/Lodging/operation/getLodgingStats Čísla za období – stejná jako Ubytování › Přehled v administraci. Prodané noci jsou noci pokojů potvrzených, ubytovaných a skončených pobytů (nezávazné zvlášť); cena pobytu se rozpočítá rovnoměrně na jeho noci, takže pobyt přes přelom měsíce se rozdělí. `occupancy` = prodané / (pokoje × dny), `adr` = tržba / prodané noci, `revpar` = tržba / dostupné noci; poplatek z pobytu tržba není. Hosté podle zemí a věku jsou z evidence hostů (jen pobyty, které proběhly); zdroje, délka, předstih a storna podle příjezdu v období. `previous` jsou stejná čísla o rok dřív. *Od verze 26.11.17.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `from` (query, string (date), povinný) - `to` (query, string (date), povinný): Včetně; nejvýš 366 dní po `from`. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Přehled za období. `application/json`: LodgingStats – pole `from`, `to`, `kpi`, `previous`, `days`, `room_types`, `sources`, `countries`, `ages`, `services`, `packages`, `guest_pass_entries`, `reviews` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/reviews – Recenze ubytování `operationId`: `listLodgingReviews` · přihlášení: `oauth2`, oprávnění `lodging:read` · https://api.mujprofirest.cz/v2/docs#tag/Lodging/operation/listLodgingReviews Hodnocení hostů po pobytu (`source` `direct`) a recenze z portálů, které provozovna přepsala, od nejnovější, s přehledem: průměr na stupnici 1–5, počty po zdrojích a hvězdičkách, dílčí hodnocení a kolik čeká na odpověď. Jména hostů jsou zkrácená (křestní jméno a iniciála). *Od verze 26.11.16.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `filter` (query, string): `unanswered` bez odpovědi, `low` do 3 hvězdiček, `public` na stránce rezervace. - `source` (query, string) - `limit` (query, integer) - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Recenze a přehled. `application/json`: LodgingReviewList – pole `summary`, `data` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/reviews/{review_id}/reply – Odpovědět na recenzi `operationId`: `replyToLodgingReview` · přihlášení: `oauth2`, oprávnění `lodging:write` · https://api.mujprofirest.cz/v2/docs#tag/Lodging/operation/replyToLodgingReview Uloží odpověď (nová nahradí starou). Hodnocení hosta s `send_to_guest` odejde hostovi i e-mailem (když host e-mail má); na recenzi z portálu odpovězte i na portálu. *Od verze 26.11.16.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `review_id` (path, string, povinný): `LodgingReview.id`. Jiná ID vrátí 404. - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LodgingReviewReplyInput – pole `reply`, `send_to_guest` Odpovědi: - 200: Recenze s odpovědí. `application/json`: LodgingReview – pole `id`, `stay_id`, `source`, `rating`, `categories`, `comment`, `guest_name`, `country`, `date`, `public`, `reply`, `replied_at`, `reply_sent`, `link` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Reception Recepce hotelu – jen vlastní aplikace Profirestu (`lodging_desk:*`, na zařízení přihlášený zaměstnanec s rolí `reception`): pokoje, plán obsazenosti, pobyty s hosty a jejich doklady. Reference: https://api.mujprofirest.cz/v2/docs#tag/Reception ### GET /restaurants/{restaurant_id}/lodging/rooms – Pokoje a typy pokojů `operationId`: `listLodgingRooms` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/listLodgingRooms Typy pokojů a pokoje provozovny v pořadí plánu obsazenosti (podle typu, pak podle pokoje) se stavem úklidu. Pokoj `out_of_order` nejde rezervovat. Ceny jsou základní cena noci; cenu pobytu počítá server (sezóny, balíčky, přistýlky). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Typy pokojů a pokoje. `application/json`: LodgingRooms – pole `room_types`, `rooms` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/availability – Volné pokoje a ceny pro pobyt `operationId`: `getLodgingAvailability` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/getLodgingAvailability Pro každý typ pokoje: pokoje volné od `arrival` do `departure` a cena pobytu pro počet hostů (sezóny, přistýlky, balíček `package_id`). `unavailable` říká, proč typ rezervovat nejde (`no_room`, `too_many_guests`, `package_not_applicable`). Recepci neváže nejkratší pobyt online rezervací. Při změně pobytu pošlete `exclude_stay_id` – jeho vlastní pokoj se počítá jako volný. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `arrival` (query, LocalDate, povinný) - `departure` (query, LocalDate, povinný) - `adults` (query, integer): Dospělí (výchozí 1). - `children` (query, integer): Děti (výchozí 0). - `package_id` (query, string): Cena s tímto pobytovým balíčkem (`listLodgingPackages`). - `exclude_stay_id` (query, string): Měněný pobyt – jeho pokoje se počítají jako volné. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Typy pokojů s volnými pokoji a cenami. `application/json`: LodgingAvailability – pole `arrival`, `departure`, `nights`, `adults`, `children`, `room_types` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/registration-lists – Číselníky pro zápis hostů `operationId`: `getLodgingRegistrationLists` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/getLodgingRegistrationLists Hodnoty pro formulář zapsaného hosta: státy (`nationality`), druhy dokladů, účely pobytu pro cizineckou policii (Ubyport) a důvody, proč host neplatí poplatek z pobytu. Mění se zřídka – držte si je s `ETag`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Číselníky. `application/json`: LodgingRegistrationLists – pole `countries`, `document_types`, `purposes`, `city_tax` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/stays – Pobyty plánu obsazenosti `operationId`: `listStays` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/listStays Pobyty, které zasahují do dnů `from` – `to` (oba včetně, nejvýš 62 dní; bez nich dnešek): pobyt, který v nich má noc, přijíždí nebo odjíždí. Podle příjezdu. Bez `status` se zrušené pobyty a nepřijetí vynechají. Dnešek recepce je jedno volání s `from` = `to` = dnes: příjezdy mají `arrival` dnes, odjezdy `departure` dnes a právě ubytovaní `status` `checked_in`. `actions` říkají, které kroky server teď dovolí – ukažte jen tato tlačítka. Dotazujte se s `If-None-Match`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `from` (query, LocalDate): První den (výchozí dnešek). - `to` (query, LocalDate): Poslední den (výchozí `from`). - `status` (query, string): Jen tyto stavy, oddělené čárkou (`tentative,confirmed`). - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Pobyty. `application/json`: LodgingStayList – pole `data` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays – Založit pobyt `operationId`: `createStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/createStay Rezervace na recepci: pokoj (`room_id`) nebo typ pokoje (`room_type_id` – server vybere první volný pokoj), termín, hosté a kontakt hosta. Server zkontroluje, že je pokoj volný (`409 lodging_room_unavailable`) a že se hosté do pokoje vejdou (`422`), a cenu spočítá podle ceníku a balíčku, pokud nepošlete `price_total`. Pobyt z recepce neváží pravidla online rezervací (nejkratší pobyt, jak daleko dopředu). Opakování je bezpečné: stejný `Idempotency-Key` nebo vaše `uuid` vrátí stejný pobyt. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LodgingStayCreate – pole `room_id`, `room_type_id`, `arrival`, `departure`, `adults`, `children`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `status`, `source`, `price_total`, `package_id`, `uuid` Odpovědi: - 201: Založeno. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/stays/{stay_id} – Detail pobytu `operationId`: `getStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/getStay Pobyt se zapsanými hosty a jejich doklady, co zbývá zaplatit, doklad za pobyt a historie. `ETag` je verze (`version`) – při změně pobytu ji pošlete v `If-Match`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Pobyt. `application/json`: LodgingStayDetail – pole `stay`, `balance`, `guests`, `receipt`, `history` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PATCH /restaurants/{restaurant_id}/lodging/stays/{stay_id} – Změnit pobyt `operationId`: `updateStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/updateStay Pošlete jen to, co se mění: kontakt hosta, počet hostů, poznámky, štítky, cenu nebo balíček. Víc hostů se porovná s pokojem (`422`); cena, která není zadaná ručně, se spočítá znovu. Termín a pokoj mění `moveStay`. Pobyt s vystaveným dokladem se nemění (`409 stay_state_conflict`). Pošlete `If-Match` s `ETag` z `getStay`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-Match` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LodgingStayUpdate – pole `guest`, `adults`, `children`, `company`, `note_guest`, `note_internal`, `tags`, `price_total`, `package_id` Odpovědi: - 200: Změněno. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422, 428 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/move – Přesunout nebo prodloužit pobyt `operationId`: `moveStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/moveStay Pobyt dostane pokoj a termín (i delší nebo kratší pobyt). Nový pokoj musí být v novém termínu volný (bez tohoto pobytu) a ne mimo provoz (`409 lodging_room_unavailable`). Hosté, služby po nocích a poplatek z pobytu se posunou s pobytem; cena, která není zadaná ručně, se spočítá znovu. Odjetý nebo zrušený pobyt se nepřesouvá (`409 lodging_state_conflict`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-Match` (header, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LodgingStayMove – pole `room_id`, `arrival`, `departure` Odpovědi: - 200: Přesunuto. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422, 428 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/confirm – Potvrdit pobyt `operationId`: `confirmStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/confirmStay Předběžný pobyt se stane potvrzeným. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-Match` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Hotovo. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/check-in – Ubytovat hosty `operationId`: `checkInStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/checkInStay Ode dne příjezdu. Hosty zapište (`addStayGuest`) předem nebo potom – cizinci jdou do Ubyportu. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-Match` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Hotovo. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/check-out – Odhlásit hosty `operationId`: `checkOutStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/checkOutStay Hosté odjíždějí: pokoj jde k úklidu. Dřívější odjezd ukončí pobyt dnes a cenu spočítá znovu. Z vyrovnaného účtu (`balance` 0) server vystaví doklad za pobyt (`getStay.receipt`); když zbývá doplatit, doklad vznikne po zaplacení. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-Match` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Hotovo. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/cancel – Zrušit pobyt `operationId`: `cancelStay` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/cancelStay Před příjezdem. Zaplacená záloha se hostovi vrátí, pokud nepošlete `keep_deposit`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-Match` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku: - `application/json`: LodgingStayCancel – pole `reason`, `keep_deposit` Odpovědi: - 200: Hotovo. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/no-show – Host nepřijel `operationId`: `markStayNoShow` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/markStayNoShow Ode dne příjezdu; pokoj je zase volný a zaplacená záloha propadá. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-Match` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Hotovo. `application/json`: LodgingStay – pole `id`, `uuid`, `status`, `source`, `arrival`, `departure`, `nights`, `adults`, `children`, `rooms`, `price_total`, `price_manual`, `package`, `guest`, `company`, `note_guest`, `note_internal`, `tags`, `registered_guests`, `deposit`, `channel`, `cancel_reason`, `checked_in_at`, `checked_out_at`, `actions`, `balance`, `version`, `created_at`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/guests – Zapsat hosta `operationId`: `addStayGuest` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/addStayGuest Přidá hosta do evidence pobytu. Cizinec čeká na Ubyport (`ubyport.state` `pending`) a server ho odešle ve lhůtě. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LodgingGuestInput – pole `first_name`, `last_name`, `birth_date`, `nationality`, `document_type`, `document_no`, `visa_no`, `address`, `purpose`, `arrival`, `departure`, `fee_exempt`, `note` Odpovědi: - 201: Zapsáno. `application/json`: LodgingGuest – pole `id`, `first_name`, `last_name`, `birth_date`, `nationality`, `nationality_name`, `foreigner`, `document_type`, `document_no`, `visa_no`, `address`, `purpose`, `arrival`, `departure`, `fee_exempt`, `note`, `ubyport` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/lodging/stays/{stay_id}/guests/{guest_id} – Změnit zapsaného hosta `operationId`: `updateStayGuest` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/updateStayGuest Nahradí údaje hosta. Už nahlášený cizinec, kterému se změní jméno, narození, doklad nebo termín, jde do Ubyportu znovu. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `guest_id` (path, string, povinný): `LodgingGuest.id`. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LodgingGuestInput – pole `first_name`, `last_name`, `birth_date`, `nationality`, `document_type`, `document_no`, `visa_no`, `address`, `purpose`, `arrival`, `departure`, `fee_exempt`, `note` Odpovědi: - 200: Změněno. `application/json`: LodgingGuest – pole `id`, `first_name`, `last_name`, `birth_date`, `nationality`, `nationality_name`, `foreigner`, `document_type`, `document_no`, `visa_no`, `address`, `purpose`, `arrival`, `departure`, `fee_exempt`, `note`, `ubyport` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/lodging/stays/{stay_id}/guests/{guest_id} – Smazat zapsaného hosta `operationId`: `deleteStayGuest` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/deleteStayGuest Odebere hosta z evidence pobytu (omyl, host nepřijel). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.21.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `guest_id` (path, string, povinný): `LodgingGuest.id`. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Smazáno. - chyby: 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/services – Služby ceníku `operationId`: `listLodgingServices` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/listLodgingServices Služby, které recepce přidá na účet pokoje (`addStayService`): snídaně, strava, přistýlky, mazlíčci, wellness, parkování. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Služby. `application/json`: LodgingServiceList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/services – Přidat službu na účet `operationId`: `addStayService` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/addStayService Služba z ceníku na účet pokoje. Množství podle jednotky služby: `stay` a `item` podle `quantity`; `night` noci od `date_from` do `date_to` (výchozí celý pobyt) × `quantity`; `person_night` noci × `persons` (výchozí všichni hosté). Účet s vystaveným dokladem se nemění (`409 stay_state_conflict`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StayServiceInput – pole `service_id`, `quantity`, `persons`, `date_from`, `date_to`, `note` Odpovědi: - 201: Přidáno; účet. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/folio-lines – Přidat položku na účet `operationId`: `addStayCharge` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/addStayCharge Položka mimo ceník (minibar, škoda, taxi) s vlastním názvem, cenou a sazbou DPH. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StayChargeInput – pole `name`, `amount`, `vat_rate`, `reference` Odpovědi: - 201: Přidáno; účet. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/lodging/stays/{stay_id}/folio-lines/{line_id} – Odebrat položku z účtu `operationId`: `removeStayFolioLine` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/removeStayFolioLine Odebere službu nebo položku (omyl). Účet s vystaveným dokladem se nemění (`409 stay_state_conflict`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `line_id` (path, string, povinný): `StayFolio.lines[].id`. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Odebráno; účet. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/payments – Zapsat platbu `operationId`: `addStayPayment` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/addStayPayment Platba hosta na účet pokoje (i záloha před příjezdem). Peníze drží recepce: hotovost a karta tady nejsou účtenka – doklad za pobyt vzniká při odjezdu z vyrovnaného účtu. Platba, která vyrovná účet hosta, který už odjel, doklad vystaví hned. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StayPaymentInput – pole `amount`, `method`, `note` Odpovědi: - 201: Zapsáno; účet. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/lodging/stays/{stay_id}/payments/{payment_id} – Smazat platbu `operationId`: `deleteStayPayment` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/deleteStayPayment Smaže omylem zapsanou platbu. Ne po vystavení dokladu za pobyt (`409 stay_state_conflict`). Jen zaměstnanec s rolí `reception_manager` (od 26.11.23; ostatní `403 staff_role_missing`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `payment_id` (path, string, povinný): `StayFolio.payments[].id`. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Smazáno; účet. `application/json`: StayFolio – pole `stay_id`, `status`, `package`, `room`, `guest_name`, `arrival`, `departure`, `accommodation`, `city_tax`, `lines`, `total`, `payments`, `paid`, `balance` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/receipt – Vystavit doklad za pobyt `operationId`: `issueStayReceipt` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/issueStayReceipt Po odjezdu, když ho server nevystavil sám. Účet musí být vyrovnaný; platba fakturou vystaví fakturu pro firmu (dokončí se v administraci). Druhé volání vrátí už vystavený doklad. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 201: Vystaveno. `application/json`: LodgingReceipt – pole `id`, `kind`, `number`, `total`, `invoice`, `eet`, `issued_at` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/stays/{stay_id}/receipt/cancel – Stornovat doklad za pobyt `operationId`: `cancelStayReceipt` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/cancelStayReceipt Vystaví protidoklad; účet pokoje jde zase měnit. Vrací protidoklad. Jen zaměstnanec s rolí `reception_manager` (od 26.11.23; ostatní `403 staff_role_missing`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StayReceiptCancel – pole `reason` Odpovědi: - 200: Stornováno. `application/json`: LodgingReceipt – pole `id`, `kind`, `number`, `total`, `invoice`, `eet`, `issued_at` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/stays/{stay_id}/guest-pass – QR kód hosta `operationId`: `getStayGuestPass` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/getStayGuestPass Kód pro QR kód hosta (ukažte ho nebo vytiskněte) a co host smí podle účtu pokoje – čtečka u wellness, snídaní nebo parkoviště ho ověří přes `checkGuestPass`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stay_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Kód a co host smí. `application/json`: StayGuestPass – pole `code`, `places` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/lodging/ubyport – Cizinci čekající na Ubyport `operationId`: `getUbyportStatus` · přihlášení: `oauth2`, oprávnění `lodging_desk:read` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/getUbyportStatus Jestli je hlášení cizinecké policii (Ubyport) nastavené a cizinci, kteří na něj čekají nebo s chybou, se lhůtou (3 pracovní dny po příjezdu). Server je odesílá sám každou hodinu. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stav. `application/json`: UbyportStatus – pole `configured`, `test`, `pending` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/lodging/ubyport/send – Odeslat do Ubyportu teď `operationId`: `sendUbyport` · přihlášení: `oauth2`, oprávnění `lodging_desk:write` · https://api.mujprofirest.cz/v2/docs#tag/Reception/operation/sendUbyport Odešle čekající cizince hned, bez čekání na hodinový běh. `failure` řekne, když služba policie neodpovídá. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.11.22.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Odesláno. `application/json`: UbyportSendResult – pole `sent`, `errors`, `failure` - chyby: 401, 403, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Housekeeping Úklid pokojů a jejich závady – úkoly dne po pokojích, odškrtávání a hlášení závad. Bez údajů hostů. S `Profirest-Staff-Token` se zaměstnanec zapíše jako ten, kdo úkol udělal nebo závadu nahlásil. Vlastní aplikace Profirestu pro pokojské a recepci ho posílat musí, se zaměstnancem s rolí `housekeeping` nebo `reception` (od 26.11.23). Reference: https://api.mujprofirest.cz/v2/docs#tag/Housekeeping ### GET /restaurants/{restaurant_id}/housekeeping – Úkoly úklidu na den `operationId`: `getHousekeepingDay` · přihlášení: `oauth2`, oprávnění `housekeeping:read` · https://api.mujprofirest.cz/v2/docs#tag/Housekeeping/operation/getHousekeepingDay Každý pokoj s úkoly na den, nejnaléhavější první: pokoj, kam dnes přijíždí host a ještě není uklizený, pak odjezdy, pak obsazené pokoje. Úkoly se počítají z pobytů a pravidel provozovny pokaždé znovu – po přesunu pobytu ho následují. `waiting` – úkol ještě nejde udělat (host neodjel, nebo pokoj před kontrolou není uklizený). Jména hostů tu nikdy nejsou. Klíče úkolů: `checkout` úklid po odjezdu, `inspect` kontrola po úklidu (když ji provozovna chce), `stay` denní úklid obsazeného pokoje, `extra_bed` připravit přistýlky pro dnešní příjezd, `rule:{id}` pravidlo u delších pobytů (ručníky, povlečení, dezinfekce), `task:{id}` jednorázový úkol od recepce, `st:{stay_id}:{klíč}` úkol k pobytu (objednaná služba, která přináší úkol pro pokojské, od 26.11.23). Klíč posílejte zpět beze změny; mohou přibýt další druhy. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.14.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `date` (query, string (date)): Den; bez něj dnešek. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Pokoje a jejich úkoly. `application/json`: HousekeepingDay – pole `date`, `inspection`, `summary`, `rooms` - chyby: 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/housekeeping/rooms/{room_id}/done – Odškrtnout úkol `operationId`: `completeHousekeepingTask` · přihlášení: `oauth2`, oprávnění `housekeeping:write` · https://api.mujprofirest.cz/v2/docs#tag/Housekeeping/operation/completeHousekeepingTask Označí úkol pokoje a dne jako hotový. Úklid po odjezdu přepne pokoj na `clean`, kontrola na `inspected`. Opakované odškrtnutí nic nezmění. Úkol, který je `waiting`, vrátí `409 lodging_state_conflict`; úkol pozdějšího dne `422 validation_failed`. Se staff tokenem se zapíše zaměstnanec, který úkol udělal. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.14.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `room_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: HousekeepingTaskInput – pole `task`, `date` Odpovědi: - 200: Pokoj po změně. `application/json`: HousekeepingRoom – pole `id`, `name`, `floor`, `type`, `status`, `occupied`, `arrival`, `departure`, `tasks`, `assigned_employee_id`, `issues` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/housekeeping/rooms/{room_id}/undo – Vrátit odškrtnutý úkol `operationId`: `undoHousekeepingTask` · přihlášení: `oauth2`, oprávnění `housekeeping:write` · https://api.mujprofirest.cz/v2/docs#tag/Housekeeping/operation/undoHousekeepingTask Vrátí omylem odškrtnutý úkol. Úklid po odjezdu vrátí pokoj na `dirty`; dokud je hotová kontrola, vrátit nejde (`409 lodging_state_conflict`) – nejdřív vraťte kontrolu. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.14.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `room_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: HousekeepingTaskInput – pole `task`, `date` Odpovědi: - 200: Pokoj po změně. `application/json`: HousekeepingRoom – pole `id`, `name`, `floor`, `type`, `status`, `occupied`, `arrival`, `departure`, `tasks`, `assigned_employee_id`, `issues` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/room-issues – Závady pokojů `operationId`: `listRoomIssues` · přihlášení: `oauth2`, oprávnění `housekeeping:read` · https://api.mujprofirest.cz/v2/docs#tag/Housekeeping/operation/listRoomIssues Otevřené závady a závady opravené za posledních 30 dní, otevřené první, od nejnovější, nejvýš 300. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.14.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Závady. `application/json`: RoomIssueList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/room-issues – Nahlásit závadu `operationId`: `reportRoomIssue` · přihlášení: `oauth2`, oprávnění `housekeeping:write` · https://api.mujprofirest.cz/v2/docs#tag/Housekeeping/operation/reportRoomIssue Závada pokoje pro údržbu. S `blocks_room` je pokoj `out_of_order` a nejde prodat, dokud se závada neopraví; když má pokoj pobyty od dneška dál, `warning` řekne, ať se přesunou. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.14.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: RoomIssueInput – pole `room_id`, `text`, `blocks_room` Odpovědi: - 201: Nahlášeno. `application/json`: RoomIssueReported – pole `issue`, `warning` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/room-issues/{issue_id}/fix – Označit závadu jako opravenou `operationId`: `fixRoomIssue` · přihlášení: `oauth2`, oprávnění `housekeeping:write` · https://api.mujprofirest.cz/v2/docs#tag/Housekeeping/operation/fixRoomIssue Závada je opravená. Pokoj, který byl kvůli ní mimo provoz, se vrátí jako `dirty` (po opravě k úklidu), když ho neblokuje jiná otevřená závada. Opravená závada vrátí `409 lodging_state_conflict`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.14.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `issue_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku: - `application/json`: RoomIssueFixInput – pole `note` Odpovědi: - 200: Závada po opravě. `application/json`: RoomIssue – pole `id`, `room_id`, `room`, `text`, `blocks_room`, `status`, `created_at`, `created_by_employee_id`, `fixed_at`, `fix_note` - chyby: 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Guest passes QR kód ubytovaného hosta – čtečka u wellness, snídaní nebo parkoviště ověří, co host smí. Reference: https://api.mujprofirest.cz/v2/docs#tag/Guest-passes ### POST /restaurants/{restaurant_id}/guest-passes/check – Ověřit QR kód hosta `operationId`: `checkGuestPass` · přihlášení: `oauth2`, oprávnění `guest_passes:check` · https://api.mujprofirest.cz/v2/docs#tag/Guest-passes/operation/checkGuestPass Čtečka u wellness, snídaní, polopenze nebo parkoviště pošle přečtený kód (`PRU-…`). Host smí, co má na účtu pokoje (služby z ceníku nebo v ceně balíčku), dokud je ubytovaný: neomezeně, tolik osob denně, nebo tolikrát za pobyt. `result` `ok` hosta pustí a vstup zapíše (s `record: false` jen ověří); `denied` řekne proč v `text`. Kódy jiných provozoven jsou `denied`. Jména a kontakty hostů se nikdy nevracejí. *Od verze 26.11.15.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: GuestPassCheckInput – pole `code`, `place`, `persons`, `record`, `device` Odpovědi: - 200: Výsledek ověření. `application/json`: GuestPassCheck – pole `result`, `title`, `text`, `check_id`, `stay`, `used_today`, `allowed_today` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/guest-passes/checks/{check_id}/undo – Vrátit vstup `operationId`: `undoGuestPassCheck` · přihlášení: `oauth2`, oprávnění `guest_passes:check` · https://api.mujprofirest.cz/v2/docs#tag/Guest-passes/operation/undoGuestPassCheck Host nakonec nešel – vstup se nepočítá. Jiné čtení vrátí `409 lodging_state_conflict`. *Od verze 26.11.15.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `check_id` (path, string, povinný): `GuestPassCheck.check_id` povoleného čtení. - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Vráceno. - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## External references Vaše vlastní ID a metadata u provozoven, kategorií, produktů, objednávek a zákazníků. Reference: https://api.mujprofirest.cz/v2/docs#tag/External-references ### GET /external-refs/{object_type} – Najít objekty podle vašeho ID `operationId`: `listExternalRefs` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/External-references/operation/listExternalRefs Vaše ID a metadata u objektů tohoto typu. Filtrem `external_id` převedete své ID na naše. Vyžaduje oprávnění ke čtení daného typu objektu (například `orders:read` u objednávek). Parametry: - `object_type` (path, povinný) – společný parametr - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `external_id` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka vazeb. `application/json`: ExternalRefPage – pole `data`, `next_cursor` - chyby: 401, 403, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /external-refs/{object_type}/{object_id} – Vaše ID a metadata jednoho objektu `operationId`: `getExternalRef` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/External-references/operation/getExternalRef Vyžaduje oprávnění ke čtení daného typu objektu. Objekty, které vaše připojení nevidí, vrátí 404. Parametry: - `object_type` (path, povinný) – společný parametr - `object_id` (path, Id, povinný) - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Vazba (`external_id` může být `null` a `metadata` prázdná). `application/json`: ExternalRef – pole `object_type`, `object_id`, `external_id`, `metadata`, `updated_at` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /external-refs/{object_type}/{object_id} – Nastavit vaše ID a metadata `operationId`: `putExternalRef` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/External-references/operation/putExternalRef Nastaví vaše `external_id` a nahradí vaše `metadata` u objektu, který vaše připojení vidí (například produktu ze sortimentu) – u provozovny, kategorie, produktu, objednávky nebo zákazníka; jiné objekty vazbu nést nemohou. Kategorie a produkty jsou vidět, když jsou na webu („W“), včetně příloh a produktů denního menu; ty, které se nabízejí jen v kanálu `pos` nebo `kitchen`, vrátí `404`. Je idempotentní sám od sebe. Když stejnou vazbu může zapisovat víc vašich procesů, pošlete `If-Match`. `external_id` použité u jiného objektu stejného typu vrátí `409 external_id_conflict` s `existing_id`. Vyžaduje oprávnění ke čtení typu; u objednávek a zákazníků navíc `orders:write` nebo `customers:write` (nastavení i odebrání). Parametry: - `object_type` (path, povinný) – společný parametr - `object_id` (path, Id, povinný) - `If-Match` (header, string): Nepovinný `ETag` vazby, kterou jste načetli. - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ExternalRefUpdate – pole `external_id`, `metadata` Odpovědi: - 200: Vazba. `application/json`: ExternalRef – pole `object_type`, `object_id`, `external_id`, `metadata`, `updated_at` - chyby: 400, 401, 403, 404, 409, 412, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /external-refs/{object_type}/{object_id} – Odebrat vaše ID a metadata `operationId`: `deleteExternalRef` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/External-references/operation/deleteExternalRef Odebere jen vaši vazbu. Samotného objektu se nedotkne. Oprávnění jako u nastavení. Parametry: - `object_type` (path, povinný) – společný parametr - `object_id` (path, Id, povinný) - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Odebráno, nebo nebylo co odebrat. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Events Proud změn s kurzorem – po stránkách nebo živě přes Server-Sent Events. Webhooky doručují stejné události. Reference: https://api.mujprofirest.cz/v2/docs#tag/Events ### GET /events – Proud změn `operationId`: `listEvents` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/Events/operation/listEvents Události vašeho připojení v pořadí zápisu (`sequence`), po zadaném kurzoru. Toto je zdroj pravdy: webhooky jen říkají, že je tu něco nového; `streamEvents` dává tytéž události živě, se stejným kurzorem a bez dotazování. Dostanete jen typy událostí, které vaše oprávnění dovolují: `order.*` vyžaduje `orders:read`, `catalog.changed`, `availability.changed` a `promotions.changed` vyžadují `catalog:read`, `restaurant.changed` vyžaduje `restaurants:read`, `attendance.updated` vyžaduje `attendance:read`, `kitchen.*` vyžaduje `kitchen:read`, `call.*` vyžaduje `directory:read`, `receipt.*`, `pos_shift.*` a `tab.*` vyžadují `receipts:read`, `sale.*` a `shift.*` vyžadují `reports:read`, `table.*` vyžaduje `table:sync`, `reservation.*` vyžaduje `reservations:read`, `courier.*` vyžaduje `deliveries:read`; `grant.*` přijde vždy. Bez `cursor` začíná proud na aktuálním konci (žádné staré události, jen kurzor, od kterého pokračovat). Události se v proudu objeví pár sekund po změně, nikdy před událostí s nižším `sequence`, takže kurzor žádnou nepřeskočí. Drží se 30 dní (`courier.position` jen 24 hodin – je to živá poloha, načtěte znovu `listCourierPositions`); starší kurzor vrátí `410 cursor_expired`, pak si potřebný stav načtěte znovu a začněte bez kurzoru. Prázdná stránka vrátí kurzor na stejném místě, obnovený – proud, který čtete, nikdy nevyprší, ani když se týdny nic neděje. Parametry: - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `restaurant_id` (query, Id): Jen události této provozovny. - `types` (query, string): Typy událostí oddělené čárkou, například `order.status_changed,catalog.changed`, nebo celé skupiny jako `order.*` (všechny typy začínající `order.`) stejně jako `streamEvents`. Jiný tvar vrátí `422` s `invalid_format`… - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka událostí. `application/json`: EventPage – pole `data`, `next_cursor` - chyby: 400, 401, 410 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /events/stream – Proud změn živě (Server-Sent Events) `operationId`: `streamEvents` · přihlášení: `oauth2` · https://api.mujprofirest.cz/v2/docs#tag/Events/operation/streamEvents Tytéž události jako `listEvents` – stejné pořadí, stejná oprávnění a stejné zpoždění pár sekund po změně – posílané jednou dlouhou odpovědí `text/event-stream` místo dotazování. Hodí se všude, kde se čeká na změny: kuchyňské displeje, pokladny, integrace na serveru. Každá událost je jedna zpráva: `event:` je typ události, `data:` `Event` jako JSON na jednom řádku a `id:` kurzor za touto událostí – stejný kurzor jako `next_cursor` z `listEvents`. Po výpadku se připojte znovu s posledním `id` v hlavičce `Last-Event-ID` (nebo jako `?cursor=`) a nic se nepřeskočí; mezi proudem a `listEvents` jde kdykoli přecházet se stejným kurzorem. Bez kurzoru začne proud na aktuálním konci. První zpráva je `ready` (`StreamReady`; její `id` je kurzor aktuálního místa), pak chodí události; po 25 sekundách bez zprávy přijde komentář `: ping`. Proud končí sám; pak se připojte znovu. Zpráva `closing` (`StreamClosing`) říká proč: `max_age` (po 30 minutách – připojit hned), `token_expired` a `token_revoked` (nejdřív obnovit access token), `restart` (nová verze služby – znovu za 1–10 sekund náhodně), `forbidden` (připojení už nemá provozovnu z `restaurant_id` – stejný požadavek neopakovat). Bez `closing` (výpadek sítě) se připojujte znovu s pauzou rostoucí od 1 sekundy do 1 minuty. Access token patří jen do hlavičky `Authorization`, nikdy do adresy. Prohlížečový `EventSource` ho poslat neumí – proud čtěte přes `fetch` (dělá to `watchEvents` z `profirest-api.js`). Nejvýš 3 proudy na jedno zařízení nebo jeden token a 200 na jedno připojení, nad to `429`. Když proud není k dispozici (`503` s `Retry-After`, nebo `stream_url` z `getApiRoot` je `null`), ptejte se přes `listEvents` a o proud se pokuste znovu později. *Od verze 26.11.3.* Parametry: - `Last-Event-ID` (header, string): `id` poslední zprávy, kterou jste zpracovali (kurzor). Má přednost před `cursor`. - `cursor` (query) – společný parametr - `restaurant_id` (query, Id): Jen události této provozovny. - `types` (query, string): Typy událostí oddělené čárkou nebo skupiny jako `order.*`, stejně jako v `listEvents`. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Proud: `ready` (`StreamReady`), pak jedna zpráva za každou událost (`event:` typ, `data:` `Event`, `id:` kurzor), komentáře `: ping`, na konci případně `closing` (`StreamClosing`). `text/event-stream`: string (binary) - chyby: 401, 406, 410, 422, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Staff Zaměstnanci na vlastních zařízeních Profirestu – kdo v provozovně pracuje a přihlášení PINem nebo čipem. Reference: https://api.mujprofirest.cz/v2/docs#tag/Staff ### GET /restaurants/{restaurant_id}/staff – Zaměstnanci provozovny `operationId`: `listStaff` · přihlášení: `oauth2`, oprávnění `staff:read` · https://api.mujprofirest.cz/v2/docs#tag/Staff/operation/listStaff Zaměstnanci přiřazení k provozovně a jejich role na zařízeních, podle jména. PINy a čísla čipů server nikdy nevydá: `sign_in` říká jen to, zda má zaměstnanec PIN nebo čip. Jen pro vlastní aplikace Profirestu. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka zaměstnanců. `application/json`: StaffMemberPage – pole `data`, `next_cursor` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/staff-sessions – Přihlásit zaměstnance na zařízení `operationId`: `createStaffSession` · přihlášení: `oauth2`, oprávnění `staff:authenticate` · https://api.mujprofirest.cz/v2/docs#tag/Staff/operation/createStaffSession Ověří PIN nebo čip zaměstnance na serveru a vrátí token zaměstnance pro toto zařízení. Posílejte ho v hlavičce `Profirest-Staff-Token` u operací, které dělá zaměstnanec; token zařízení zůstává v `Authorization`. Token zaměstnance platí jen na zařízení, které přihlásilo, a jen v této provozovně. Vyprší po `idle_timeout_seconds` bez použití a nejpozději v `max_expires_at`. Přihlásit se mohou jen zaměstnanci přiřazení k provozovně. Když mají PIN stejný víc z nich, odpověď je `409 staff_ambiguous` se seznamem `candidates`; nechte člověka vybrat a pošlete požadavek znovu s `employee_id`. Po opakovaně špatném PINu dostane zařízení `429 staff_locked` na dobu podle nastavení docházky provozovny (výchozí je 5 špatných PINů během 5 minut a zámek do konce těch 5 minut). Správný PIN počítání nevynuluje – jinak by kdokoli, kdo zná jeden PIN, mohl dál hádat ostatní. Čipy mají vlastní zámek: 20 neznámých čipů během 5 minut zamkne čipy na zařízení na těch 5 minut (číslo bývá na čipu vytištěné a čipy z jedné várky jdou po sobě). Třikrát tolik špatných pokusů ze všech zařízení provozovny zamkne celou provozovnu. Počítá se každý pokus, i když přijde víc požadavků najednou. Bez `Idempotency-Key`: opakované přihlášení jen založí další relaci a odpověď nese tajemství, které se nikam neukládá. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Bez `Idempotency-Key` (viz popis). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StaffCredential – pole `method`, `secret`, `employee_id` Odpovědi: - 201: Přihlášeno. `application/json`: StaffSession – pole `token`, `expires_at`, `max_expires_at`, `idle_timeout_seconds`, `employee` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/staff-sessions/current – Odhlásit zaměstnance `operationId`: `deleteStaffSession` · přihlášení: `oauth2`, oprávnění `staff:authenticate` · https://api.mujprofirest.cz/v2/docs#tag/Staff/operation/deleteStaffSession Hned ukončí relaci zaměstnance z hlavičky `Profirest-Staff-Token`. Už ukončená relace odpoví také `204`. Bez hlavičky je odpověď `403 staff_session_required`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Odhlášeno. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/staff-sessions/current/pin – Změnit PIN přihlášeného zaměstnance `operationId`: `changeStaffPin` · přihlášení: `oauth2`, oprávnění `staff:authenticate` · https://api.mujprofirest.cz/v2/docs#tag/Staff/operation/changeStaffPin Přihlášený zaměstnanec si mění vlastní PIN. Současný PIN se ověří znovu, se stejným zámkem po špatných PINech jako přihlášení (`422 staff_credentials_invalid`, `429 staff_locked`). Nový PIN platí všude, kde ho zaměstnanec používá – na všech zařízeních, na docházkovém terminálu i při přihlášení zaměstnance do administrace – a změna se ukáže v auditu zaměstnanců v administraci. PIN jiného zaměstnance se mění jen v administraci. PIN má 4 až 9 číslic a nezačíná nulou. PIN, který už má jiný zaměstnanec účtu, použít nejde (`422` u `/new_pin`, počítá se jako špatný PIN), a jeden zaměstnanec smí zkusit nejvýš 5 změn za hodinu (`429 rate_limited`). Opakujte se stejným `Idempotency-Key`: po změně už poslaný současný PIN neplatí. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StaffPinChange – pole `current_pin`, `new_pin` Odpovědi: - 204: PIN je změněný. - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Attendance Příchody, odchody a přestávky z docházkových terminálů Profirestu a to, co tam vidí přihlášený zaměstnanec: své naplánované směny a své žádosti o volno. Jen u provozovny, jejíž licence zahrnuje modul Docházka, stejně jako docházka v administraci; jinak `403 module_not_licensed`. Reference: https://api.mujprofirest.cz/v2/docs#tag/Attendance ### GET /restaurants/{restaurant_id}/attendance/terminal – Nastavení docházkového terminálu `operationId`: `getAttendanceTerminal` · přihlášení: `oauth2`, oprávnění `attendance:read` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/getAttendanceTerminal Co docházkový terminál této provozovny ukazuje a smí: jméno provozovny, vzhled, který si provozovna zvolila v administraci (logo, barva, světlá nebo tmavá obrazovka a uvítání – `null` znamená vzhled Profirestu), a jestli terminál smí zapisovat píchnutí bez sítě a jak stará smí při doručení být (starší server odmítne s `occurred_at_out_of_range`). Načtěte ho po spárování a pak každých pár minut a poslední odpověď držte v zařízení, ať terminál nastartuje ve správném vzhledu i bez sítě. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Nastavení terminálu. `application/json`: AttendanceTerminal – pole `restaurant_name`, `branding`, `offline`, `absence_requests` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/attendance/presence – Kdo je v práci `operationId`: `listAttendancePresence` · přihlášení: `oauth2`, oprávnění `attendance:read` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/listAttendancePresence Zaměstnanci, kteří se na této provozovně vedou v docházce, a kde právě jsou: `off`, `working` nebo `on_break`, podle jména. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka zaměstnanců a jejich stavu docházky. `application/json`: AttendancePresencePage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/attendance/punches – Zapsat příchod, odchod nebo přestávku `operationId`: `createAttendancePunch` · přihlášení: `oauth2`, oprávnění `attendance:punch` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/createAttendancePunch Jedno píchnutí zaměstnance na zařízení. Zaměstnance určí `credential` (PIN nebo čip zadaný na zařízení), nebo relace zaměstnance v `Profirest-Staff-Token`. `id` je vaše UUID píchnutí, vytvořené na zařízení ve chvíli, kdy člověk píchl. Opakované odeslání stejného `id` nikdy nezapíše záznam dvakrát: dostanete první výsledek s `200` a píchnutí odmítnuté kvůli stavu docházky nebo času vrací dál stejné odmítnutí. Chyby přihlášení (`staff_credentials_invalid`, `staff_ambiguous`, `staff_locked`) se neukládají: pošlete stejné `id` znovu se správným PINem, vybraným `employee_id` nebo později. `occurred_at` je chvíle, kdy člověk píchl. U živého píchnutí ji vynechte nebo pošlete aktuální čas. Píchnutí starší než 2 minuty je offline záznam: přijme se, jen když provozovna offline zápisy na terminálech povoluje (`offline_records_disabled`), a jen do stáří, které je tam nastavené (`occurred_at_out_of_range`). Čas nejvýš 5 minut napřed se bere jako teď; pozdější se odmítne. Platí pravidla docházkového terminálu provozovny: příchod jen bez běžící směny, odchod a přestávka jen během směny; odchod během přestávky ukončí i přestávku. Směna se pak vyhodnotí pravidly docházky provozovny (tolerance, přestávky, přesčasy) stejně jako při píchnutí na terminálu. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: AttendancePunchCreate – pole `id`, `type`, `occurred_at`, `credential` Odpovědi: - 200: Toto `id` už bylo zapsáno; první výsledek. `application/json`: AttendancePunch – pole `id`, `employee`, `type`, `occurred_at`, `received_at`, `offline`, `state`, `shift` - 201: Zapsáno. `application/json`: AttendancePunch – pole `id`, `employee`, `type`, `occurred_at`, `received_at`, `offline`, `state`, `shift` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/attendance/punches/batch – Odeslat píchnutí pořízená offline `operationId`: `createAttendancePunchBatch` · přihlášení: `oauth2`, oprávnění `attendance:punch` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/createAttendancePunchBatch Nejvýš 100 píchnutí v pořadí, v jakém se stala. Každé se zpracuje samostatně jako `POST …/attendance/punches` a má vlastní výsledek; odmítnuté píchnutí nezastaví ostatní. Každá položka nese svůj `credential`, protože relaci zaměstnance nejde bez sítě otevřít. `status` položky: `created`, `duplicate` (toto `id` už bylo zapsáno; `punch` je první výsledek) nebo `rejected` (viz `problem`). Odmítnutá položka s `retryable: true` (třeba `staff_locked`) ještě rozhodnutá není: pošlete ji později znovu se stejným `id`. Po prvním `staff_locked` se zbytek dávky nezpracuje (každá další položka odpoví `staff_locked`, k opakování), takže záznamy zůstanou v pořadí – pošlete je znovu po zámku, ne dřív. Špatný PIN nebo čip zůstane špatný – ukažte ho vedoucímu, záznam je potřeba doplnit v administraci ručně. Odmítnutí kvůli stavu docházky nebo času (`attendance_state_conflict`, `occurred_at_out_of_range`) a také `attendance_not_enabled` a `offline_records_disabled` jsou konečná: stejné `id` je bude vracet dál a nikdy z něj nebude `duplicate`. `id`, které už použilo jiné zařízení nebo jiná provozovna, je `rejected` s `punch_id_conflict`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: AttendancePunchBatch – pole `items` Odpovědi: - 200: Jeden výsledek na položku, v pořadí požadavku. `application/json`: AttendancePunchBatchResult – pole `results` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/attendance/my-schedule – Rozpis přihlášeného zaměstnance `operationId`: `getMyAttendanceSchedule` · přihlášení: `oauth2`, oprávnění `attendance:read` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/getMyAttendanceSchedule Směny a volno zaměstnance z `Profirest-Staff-Token` naplánované na této provozovně, od dneška na `days` dní, v pořadí začátku: pracovní směny se sekcí a absence (dovolená, neplacené volno, nemoc) tak, jak je má rozpis směn v administraci. Patří sem i směna, která přes půlnoc zasahuje do dneška. Jen vlastní rozpis zaměstnance – směny ostatních se neukazují. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.10.7.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `days` (query, integer): Na kolik dní od dneška, nejvýš 31. Výchozí 14. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Rozpis zaměstnance. `application/json`: AttendanceSchedule – pole `employee`, `from`, `to`, `items` - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/attendance/absence-requests – Žádosti o volno přihlášeného zaměstnance `operationId`: `listMyAbsenceRequests` · přihlášení: `oauth2`, oprávnění `attendance:read` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/listMyAbsenceRequests Žádosti o volno zaměstnance z `Profirest-Staff-Token` na této provozovně: všechny čekající a ostatní, jejichž volno skončilo nejvýš před 60 dny, od nejnovější, nejvýš 50. Rozhoduje o nich vedoucí v administraci; schválená žádost se zapíše do rozpisu směn jako absence. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.10.7.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Žádosti zaměstnance. `application/json`: AbsenceRequestList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/attendance/absence-requests – Požádat o volno za přihlášeného zaměstnance `operationId`: `createAbsenceRequest` · přihlášení: `oauth2`, oprávnění `attendance:punch` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/createAbsenceRequest Zaměstnanec z `Profirest-Staff-Token` žádá o volno na celé dny. Pravidla určuje provozovna (`AttendanceTerminal.absence_requests`): o jaké volno se smí žádat, kolik dní předem (nemoc od dneška, bez předstihu), nejvýš kolik dní a jak daleko dopředu a kolik lidí z jedné sekce smí mít týž den volno. Žádost, která pravidlo poruší, odpoví `422 absence_request_not_allowed` a `detail` říká, co změnit; volno zaměstnance už požádané nebo naplánované na stejné dny odpoví `409 absence_request_conflict`; vypnuté žádosti `403 absence_requests_disabled`. Nová žádost je `pending`, dokud o ní nerozhodne vedoucí v administraci. Když provozovna dovoluje schvalovat samo a zaměstnanec v tom období nemá naplánovanou směnu, odpověď už je `approved` (`decided_automatically: true`) a volno je v rozpisu. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.10.7.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: AbsenceRequestCreate – pole `type`, `date_from`, `date_to`, `note` Odpovědi: - 201: Žádost je podaná. `application/json`: AbsenceRequest – pole `id`, `type`, `date_from`, `date_to`, `days`, `note`, `status`, `decided_automatically`, `created_at`, `decided_at`, `decision_note` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/attendance/absence-requests/{request_id} – Vzít zpět čekající žádost o volno `operationId`: `cancelAbsenceRequest` · přihlášení: `oauth2`, oprávnění `attendance:punch` · https://api.mujprofirest.cz/v2/docs#tag/Attendance/operation/cancelAbsenceRequest Zaměstnanec z `Profirest-Staff-Token` bere zpět svou čekající žádost; odpovědí je žádost se `status: cancelled`. Už vzatá zpět odpoví stejně. Vyřízená žádost odpoví `409 absence_request_decided` – schválené volno ruší vedoucí v administraci. Žádost jiného zaměstnance odpoví `404`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.10.7.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `request_id` (path, Id, povinný): ID žádosti (`AbsenceRequest.id`). - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Žádost je vzatá zpět. `application/json`: AbsenceRequest – pole `id`, `type`, `date_from`, `date_to`, `days`, `note`, `status`, `decided_automatically`, `created_at`, `decided_at`, `decision_note` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Kitchen Kuchyňský displej – objednávky ze všech zdrojů (pokladna, e-shop, rozvozové platformy, aplikace). Reference: https://api.mujprofirest.cz/v2/docs#tag/Kitchen ### GET /restaurants/{restaurant_id}/kitchen/tickets – Objednávky na tabuli kuchyně `operationId`: `listKitchenTickets` · přihlášení: `oauth2`, oprávnění `kitchen:read` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/listKitchenTickets Kuchyňské bony všech objednávek provozovny – z pokladny, e-shopu, rozvozových platforem i aplikací – stejné, jaké dnes ukazuje kuchyňský displej. - `view=active` (výchozí): nezačaté a rozpracované s termínem do 2 hodin (u předobjednávek podle objednaného času, jinak podle příchodu), nejstarší první. - `view=preorders`: objednané na čas víc než 2 hodiny dopředu. - `view=history`: hotové a zrušené objednávky aktuální směny (do uzávěrky), nejnovější první; objednávky `not_delivered` tu zůstávají, dokud je provozovna nevyřeší. `area=kitchen` (výchozí) ukazuje objednávky ze všech zdrojů kromě pokladen (`source` jiný než `pos`); `area=bar` je výdej baru: bony otevřených stolů z pokladen (`createKitchenTicket`, pokladny na API v1) za poslední 2 dny. Zaplacené účtenky pokladny poslané do kuchyně (`send_to_kitchen`) nejsou v žádné z oblastí, stejně jako na dnešním kuchyňském displeji – dostanou se na výrobní stanoviště a na obrazovku s čísly objednávek. Tabule na `If-None-Match` odpoví `304`, když se nic nezměnilo, takže se displej může ptát každých pár sekund. Nové bony přicházejí jako události `kitchen.ticket_created` a změny jako `kitchen.ticket_updated`: změny přes toto API hned, bony a změny odjinud (pokladny, webový kuchyňský displej, e-shop, rozvozové platformy) do zhruba dvou minut. Displej, který musí reagovat během sekund, se na tabuli ptá dál. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `view` (query, string): `active` (výchozí) – nezačaté a rozpracované s termínem do 2 hodin, nejstarší první; `preorders` – objednané víc než 2 hodiny dopředu; `history` – hotové a zrušené objednávky aktuální směny, nejnovější první. - `area` (query, string): `kitchen` (výchozí) – objednávky ze všech zdrojů kromě pokladen; `bar` – výdej baru, bony otevřených stolů z pokladen za poslední 2 dny. `preorders_later` počítá jen oblast `kitchen`. - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka kuchyňských bonů. `application/json`: KitchenTicketPage – pole `data`, `next_cursor`, `preorders_later` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/tickets – Poslat položky stolu do kuchyně `operationId`: `createKitchenTicket` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/createKitchenTicket Kuchyňský bon z pokladny nebo mobilního číšníka před zaplacením – dnešní „bon“ otevřeného stolu. Ukáže se na kuchyňském displeji v oblasti `bar` a ve výrobě po stanovištích, bez cen: peníze jsou až na účtence (`createReceipt`), takže se tržba ani sklad nikdy nezapočítají dvakrát. Každé kolo položek je nový bon jako dnes. Když provozovna posílá bony do kuchyně jiné provozovny (nastavení v administraci), bon vznikne tam s názvem „PRESMEROVANO Z …“ jako dnes; odpověď je ten bon. Bon sledujte přes `getKitchenTicket` (oprávnění `kitchen:read`) – třeba abyste číšníkovi ukázali, že je jídlo hotové. Změny přicházejí jako události `kitchen.ticket_updated` – hned, když kuchyně pracuje přes toto API, do zhruba dvou minut, když pracuje jinde (webový kuchyňský displej, zařízení na API v1). Přesměrovaný bon patří druhé provozovně, takže ho zařízení spárované s touto provozovnou sledovat nemůže. `id` je vaše UUID bonu vytvořené na zařízení; stejné `id` znovu ze stejného zařízení vrátí bon s `200` (`409 conflict`, když `id` patří jinému zařízení). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: KitchenTicketCreate – pole `id`, `table_name`, `order_type`, `preorder_at`, `note`, `items` Odpovědi: - 200: Toto `id` už bylo poslané; bon. `application/json`: KitchenTicket – pole `id`, `order_id`, `number`, `status`, `area`, `source`, `platform`, `name`, `fulfillment`, `express`, `customer`, `delivery_address`, `delivery_zone`, `note`, `payment_method`, `total`, `delivery_price`, `amount_due`, `paid_by`, `created_at`, `scheduled_for`, `printed`, `courier`, `not_delivered`, `items`, `receipt` - 201: Posláno do kuchyně. `application/json`: KitchenTicket – pole `id`, `order_id`, `number`, `status`, `area`, `source`, `platform`, `name`, `fulfillment`, `express`, `customer`, `delivery_address`, `delivery_zone`, `note`, `payment_method`, `total`, `delivery_price`, `amount_due`, `paid_by`, `created_at`, `scheduled_for`, `printed`, `courier`, `not_delivered`, `items`, `receipt` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/kitchen/queue – Čísla objednávek pro obrazovku hostů `operationId`: `getKitchenQueue` · přihlášení: `oauth2`, oprávnění `queue:read` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/getKitchenQueue Pořadník u pultu stejně jako kuchyňský displej v režimu pořadníku: objednávky z pokladen (účtenky a bony otevřených stolů, přes toto API i API v1), osobní odběry objednané přes web – e-shop nebo aplikaci pro hosty (`order_channel` `web`) – a osobní odběry z kiosku (`kiosk`, v kterémkoli jeho režimu), kromě objednávek pojmenovaných podle rozvozové platformy (Wolt, Bolt, Foodora, Choice), s termínem do 2 hodin, nejvýš 12 hodin staré a jen z aktuálního číslování (uzávěrka kuchyně ho začne znovu). Objednávky, které personál bere v kuchyni – telefonické objednávky kuchyňského displeje a objednávky aplikací personálu (`order_channel` `staff`), i osobní odběry – a rozvozy z webu na obrazovce nejsou. `preparing`, dokud výrobní stanoviště neodbaví všechno, co vyrábějí, pak `ready` (k vyzvednutí); uzavřená objednávka z obrazovky zmizí. Bez výrobních stanovišť se nic `ready` nestane. Jen čísla a časy – žádná jména ani položky – takže se dá ukazovat všem. Na `If-None-Match` odpoví `304`, když se nic nezměnilo. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Čísla. `application/json`: KitchenQueue – pole `preparing`, `ready` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/kitchen/stations/{station_id}/tickets – Objednávky pro jedno výrobní stanoviště `operationId`: `listStationTickets` · přihlášení: `oauth2`, oprávnění `kitchen:read` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/listStationTickets Pro rozdělenou kuchyni (výrobní stanoviště v administraci). Objednávky na tabuli (jako `view=active`, otevřené stoly za posledních 7 dní), ve kterých je něco, co toto stanoviště dělá, s jeho položkami rozdělenými do chodů a kategorií – stejné segmenty, jaké dnes ukazuje obrazovka stanoviště – a s tím, zda na objednávce stanoviště pracuje a která další stanoviště také. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `station_id` (path, povinný) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Objednávky stanoviště. `application/json`: StationTicketList – pole `data` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/kitchen/stations/{station_id}/tickets/{ticket_id}/working – Stanoviště začíná na objednávce pracovat `operationId`: `startStationWork` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/startStationWork Ostatní stanoviště to vidí; objednávka se počítá jako připravovaná (`order.status_changed` s `preparing`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `station_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Pracuje. - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/kitchen/stations/{station_id}/tickets/{ticket_id}/working – Stanoviště na objednávce přestává pracovat `operationId`: `stopStationWork` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/stopStationWork Vezme zpět `startStationWork`: ostatní stanoviště už nevidí, že na objednávce toto stanoviště pracuje; hotové položky zůstanou hotové. Když objednávku jako připravovanou nic jiného neoznačuje (nepracuje na ní jiné stanoviště, nic není hotové ani vydané, kuchyně nenastavila `preparing`), objednávka aplikace se vrátí do `received` (`order.status_changed`). Ukončení práce stanoviště, které nepracuje, nic nezmění a nevydá událost. Zrušená objednávka vrátí `409 ticket_cancelled`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `station_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Už nepracuje. - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/stations/{station_id}/tickets/{ticket_id}/complete – Odbavit segment stanoviště `operationId`: `completeStationSegment` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/completeStationSegment Odbaví otevřené položky tohoto stanoviště: celou objednávku (`scope=order`), jeden chod (`course`) nebo jednu kategorii v chodu (`category` s `course` a `category_id`). Akce se zapíše do historie stanoviště a jde vzít zpět. Když v segmentu nic otevřené není, odpověď je `409 nothing_to_complete` – i když ho o chvilku dřív odbavil jiný displej (dvě klepnutí naráz dají jednu akci). Zrušená objednávka vrátí `409 ticket_cancelled`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `station_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StationSegmentComplete – pole `scope`, `course`, `category_id` Odpovědi: - 201: Akce v historii stanoviště. `application/json`: ProductionAction – pole `id`, `ticket_id`, `kind`, `scope`, `name`, `item_count`, `undone`, `created_at`, `employee` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/kitchen/stations/{station_id}/actions – Poslední akce stanoviště `operationId`: `listStationActions` · přihlášení: `oauth2`, oprávnění `kitchen:read` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/listStationActions Posledních 12 akcí stanoviště za 12 hodin, nejnovější první, aby šla některá vzít zpět. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `station_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Akce. `application/json`: ProductionActionList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/stations/{station_id}/actions/{action_id}/undo – Vzít akci stanoviště zpět `operationId`: `undoStationAction` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/undoStationAction Položky té akce jsou znovu otevřené (jen ty, které přepnula, ne co mezitím udělala jiná obrazovka). Už vrácená akce odpoví `409 action_already_undone`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `station_id` (path, povinný) – společný parametr - `action_id` (path, Id, povinný) - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Akce, teď vzatá zpět. `application/json`: ProductionAction – pole `id`, `ticket_id`, `kind`, `scope`, `name`, `item_count`, `undone`, `created_at`, `employee` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/kitchen/tickets/{ticket_id} – Jeden kuchyňský bon `operationId`: `getKitchenTicket` · přihlášení: `oauth2`, oprávnění `kitchen:read` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/getKitchenTicket Jeden kuchyňský bon provozovny podle ID, v jakémkoli stavu a odkudkoli objednávka přišla – i hotový nebo zrušený, nebo takový, který už na tabuli není (`listKitchenTickets` ukazuje jen aktuální pohledy). Slouží ke sledování bonu, který jste poslali (`createKitchenTicket`), nebo bonu z události `kitchen.ticket_created` nebo `kitchen.ticket_updated`. Na `If-None-Match` odpoví `304`, když se nic nezměnilo. Bon přesměrovaný do kuchyně jiné provozovny patří té provozovně a tady vrátí `404`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Bon. `application/json`: KitchenTicket – pole `id`, `order_id`, `number`, `status`, `area`, `source`, `platform`, `name`, `fulfillment`, `express`, `customer`, `delivery_address`, `delivery_zone`, `note`, `payment_method`, `total`, `delivery_price`, `amount_due`, `paid_by`, `created_at`, `scheduled_for`, `printed`, `courier`, `not_delivered`, `items`, `receipt` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/tickets/{ticket_id}/status – Posunout objednávku v kuchyni `operationId`: `setKitchenTicketStatus` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/setKitchenTicketStatus `received` – zpět do fronty, `preparing` – kuchyně začala, `ready` – hotovo a čeká na výdej nebo kurýra, `delivered` – vydáno. Zrušená objednávka zůstane zrušená (`409 ticket_cancelled`); rušení je `POST …/cancel`. Vydanou objednávku vrátí zpět jen přihlášený vedoucí kuchyně (`403 staff_role_missing`); objednávka aplikace pro aplikaci zůstane `delivered`. Stejný stav znovu nic nezmění a nevydá událost. Jako dnes na kuchyňském displeji: když se objednávka stane `ready` a provozovna posílá SMS „objednávka je hotová“, zákazník ji dostane (ne když zákazníkům píše sama aplikace, která objednávku vytvořila). Vrácení do `received` nebo `preparing` objednávku sundá z trasy kurýra. Aplikace, která objednávku vytvořila, se nový stav dozví z události `order.status_changed`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: KitchenTicketStatusChange – pole `status` Odpovědi: - 200: Bon po změně. `application/json`: KitchenTicket – pole `id`, `order_id`, `number`, `status`, `area`, `source`, `platform`, `name`, `fulfillment`, `express`, `customer`, `delivery_address`, `delivery_zone`, `note`, `payment_method`, `total`, `delivery_price`, `amount_due`, `paid_by`, `created_at`, `scheduled_for`, `printed`, `courier`, `not_delivered`, `items`, `receipt` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/tickets/{ticket_id}/cancel – Zrušit objednávku v kuchyni `operationId`: `cancelKitchenTicket` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/cancelKitchenTicket Zruší objednávku protidokladem, stejně jako tlačítko storno na kuchyňském displeji: tržba i sklad se vrátí, zaplacený dárkový voucher se vrátí na voucher. Smí jen zaměstnanec s rolí `kitchen_manager` přihlášený na zařízení (`403 staff_role_missing`); zaměstnanec se zapíše. Zrušenou objednávku nejde vrátit (`409 ticket_cancelled`). S `write_off` se objednávka odepíše: tržba se vrátí, ale sklad ne – jídlo je uvařené a ztracené (objednávka, kterou zákazník nepřevzal); bez `reason` se použije důvod z hlášení kurýra. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: KitchenTicketCancel – pole `reason`, `write_off` Odpovědi: - 200: Zrušený bon. `application/json`: KitchenTicket – pole `id`, `order_id`, `number`, `status`, `area`, `source`, `platform`, `name`, `fulfillment`, `express`, `customer`, `delivery_address`, `delivery_zone`, `note`, `payment_method`, `total`, `delivery_price`, `amount_due`, `paid_by`, `created_at`, `scheduled_for`, `printed`, `courier`, `not_delivered`, `items`, `receipt` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/kitchen/tickets/{ticket_id}/printed – Potvrdit vytištění bonu `operationId`: `markKitchenTicketPrinted` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/markKitchenTicketPrinted Displej bon vytiskl; ostatní displeje ho znovu tisknout nebudou. Opakování nevadí. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Vytištěno. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/tickets/{ticket_id}/items – Přidat položky k objednávce v kuchyni `operationId`: `addKitchenTicketItems` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/addKitchenTicketItems Tlačítko PŘIDAT POLOŽKY kuchyňského displeje: co zákazník přidá po telefonu, jde do stejné objednávky, ne do druhé. Ceny položek Profirest spočítá z katalogu kanálu `channel` (výchozí `kitchen`) přesně jako kalkulaci; zařízení žádné ceny neposílá. Jako dnes dostanou nové položky vlastní skupiny za stávajícími, poznámka objednávky končí `[UPRAVENO: +…]`, součet vzroste a bon se vytiskne znovu (`printed: false`). Jen dokud objednávka čeká nebo se připravuje, a ne když je zaplacená kartou, online nebo předem. Objednávky, které přes toto API založily aplikace personálu provozovny, rozšířit jde – i objednávka v API dostane nové řádky, součty a částku k vybrání (`order.updated`); objednávky aplikací pro hosty ne, jejich zákazník platí to, co mu aplikace ukázala (`409 ticket_not_amendable`; založte novou objednávku). Ceny a nabídka jsou ty z okamžiku přidání – u předobjednávky, jejíž termín je ještě před námi, ty z jejího termínu. Produkt, který se nenabízí nebo došel, odmítne celý požadavek (`422 product_unavailable`); nic se nepřidá napůl. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: KitchenTicketItemsAdd – pole `items`, `channel` Odpovědi: - 200: Objednávka s přidanými položkami. `application/json`: KitchenTicket – pole `id`, `order_id`, `number`, `status`, `area`, `source`, `platform`, `name`, `fulfillment`, `express`, `customer`, `delivery_address`, `delivery_zone`, `note`, `payment_method`, `total`, `delivery_price`, `amount_due`, `paid_by`, `created_at`, `scheduled_for`, `printed`, `courier`, `not_delivered`, `items`, `receipt` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/tickets/{ticket_id}/handover – Označit část objednávky jako vydanou `operationId`: `handOverTicketSegment` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/handOverTicketSegment Výdej (obrazovka výdeje kuchyňského displeje): personál odškrtne, co odnesl zákazníkovi – celou objednávku (`scope=order`), jeden chod nebo jednu kategorii v chodu – a objednávku tím neuzavře, takže polévka jde ven, zatímco se hlavní jídlo ještě vaří. Platí přes všechna stanoviště a stav výroby položek nemění (mění jejich `handed_out`). Akce se zapíše do historie výdeje a jde vzít zpět. Když v segmentu nic k vydání nezbývá, odpověď je `409 nothing_to_complete`. Zrušená objednávka vrátí `409 ticket_cancelled` (i při vracení výdeje, převzetí a ukončení práce na ní). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StationSegmentComplete – pole `scope`, `course`, `category_id` Odpovědi: - 201: Akce v historii výdeje. `application/json`: ProductionAction – pole `id`, `ticket_id`, `kind`, `scope`, `name`, `item_count`, `undone`, `created_at`, `employee` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/kitchen/tickets/{ticket_id}/handover – Zrušit označení vydané části `operationId`: `takeBackTicketHandover` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/takeBackTicketHandover Vezme označení vydání segmentu zpět bez zápisu do historie – druhé klepnutí na výdeji. Opakování nevadí. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `scope` (query, string, povinný): Segment jako u `POST …/handover`: `order` – celá objednávka, `course` – jeden chod (pošlete `course`), `category` – jedna kategorie v chodu (pošlete `course` a `category_id`). - `course` (query, integer): Chod u `course` a `category`. - `category_id` (query, Id): Kategorie u `category`. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Už není vydané. - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/kitchen/handover/actions – Poslední akce výdeje `operationId`: `listHandoverActions` · přihlášení: `oauth2`, oprávnění `kitchen:read` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/listHandoverActions Posledních 12 akcí výdeje za 12 hodin, nejnovější první, aby šla některá vzít zpět. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Akce. `application/json`: ProductionActionList – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/handover/actions/{action_id}/undo – Vzít akci výdeje zpět `operationId`: `undoHandoverAction` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/undoHandoverAction Položky té akce už nejsou vydané; objednávka, kterou výdej uzavřel, se vrátí do fronty. Už vrácená akce odpoví `409 action_already_undone`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `action_id` (path, Id, povinný) - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Akce, teď vzatá zpět. `application/json`: ProductionAction – pole `id`, `ticket_id`, `kind`, `scope`, `name`, `item_count`, `undone`, `created_at`, `employee` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/kitchen/shift – Součty otevřené směny kuchyně `operationId`: `getKitchenShift` · přihlášení: `oauth2`, oprávnění `kitchen:read` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/getKitchenShift Co by teď obsahovala uzávěrka: objednávky z webu a z kuchyně, které ještě nejsou uzavřené, tržba za hotové a vydané celkem i podle platby, co ještě čeká nebo se připravuje (zůstane do další směny), zrušené a totéž po kurýrech – hotovost kurýra, než ji odevzdá. S `courier_id` jen objednávky toho kurýra. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `courier_id` (query, Id): Jen objednávky tohoto kurýra. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Otevřená směna. `application/json`: KitchenShiftSummary – pole `orders`, `completed`, `by_payment`, `not_completed`, `not_delivered`, `cancelled`, `courier_id`, `couriers` - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/kitchen/shift/close – Uzavřít směnu kuchyně `operationId`: `closeKitchenShift` · přihlášení: `oauth2`, oprávnění `kitchen:write` · https://api.mujprofirest.cz/v2/docs#tag/Kitchen/operation/closeKitchenShift Uzávěrka kuchyňského displeje jako dnes: záznam v uzávěrkách administrace s tržbou podle platby a s tím, co ještě zaplacené není, přiřadí se do ní všechny objednávky, které opustily frontu (hotové, vydané, zrušené), a číslování kuchyně začne znovu od 1. S `courier_id` se uzavřou jen objednávky toho kurýra (kurýři se během dne střídají) a číslování běží dál; `courier_id` musí být kurýr provozovny. Uzavřené objednávky z aplikací jsou doručené. Potřebuje přihlášeného zaměstnance s rolí v kuchyni; vzít zpět ji nejde. Když od poslední uzávěrky frontu žádná objednávka neopustila (jiný displej uzavřel o chvilku dřív), odpověď je `409 pos_shift_empty` – stejný kód jako u prázdné směny pokladny, navzdory názvu – a nic se nezmění: číslování se znovu nenuluje. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: KitchenShiftCloseRequest – pole `courier_id` Odpovědi: - 201: Uzávěrka. `application/json`: KitchenShiftClose – pole `id`, `closed_at`, `closed_by`, `closed_orders`, `numbering_reset`, `summary` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Deliveries Kurýři na směně, rozvozové trasy plánované v kuchyni, označení doručených objednávek a živá poloha a jízda kurýrů. Reference: https://api.mujprofirest.cz/v2/docs#tag/Deliveries ### GET /restaurants/{restaurant_id}/couriers – Kurýři provozovny `operationId`: `listCouriers` · přihlášení: `oauth2`, oprávnění `deliveries:read` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/listCouriers Zaměstnanci, kteří mohou rozvážet – stejně jako dnes na kuchyňském displeji ti s rolí kuchyně v této provozovně – s přihlášením na směnu a počtem otevřených tras, podle jména. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka kurýrů. `application/json`: CourierPage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/couriers/{employee_id}/shift – Přihlásit kurýra na směnu `operationId`: `startCourierShift` · přihlášení: `oauth2`, oprávnění `deliveries:write` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/startCourierShift Kurýr je k dispozici pro trasy. Na zařízení musí být přihlášený ten kurýr, nebo zaměstnanec s rolí `kitchen_manager` (`403 staff_role_missing`). Opakované přihlášení nechá původní čas. Není to píchnutí do docházky. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `employee_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Kurýr na směně. `application/json`: Courier – pole `employee`, `on_shift`, `on_shift_since`, `open_routes` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/couriers/{employee_id}/shift – Odhlásit kurýra ze směny `operationId`: `endCourierShift` · přihlášení: `oauth2`, oprávnění `deliveries:write` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/endCourierShift Stejná pravidla jako přihlášení. Trasy, na kterých kurýr je, zůstanou beze změny. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `employee_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Odhlášen. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/delivery-routes – Rozvozové trasy `operationId`: `listDeliveryRoutes` · přihlášení: `oauth2`, oprávnění `deliveries:read` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/listDeliveryRoutes `status=open` (výchozí) – trasy, které se ještě rozvážejí; `status=completed` – dokončené trasy. Oba výpisy obsahují jen trasy aktuální směny, stejně jako pokladna (API v1): trasy, které mají aspoň jednu objednávku, jež ještě není v uzavřené směně kuchyně. Uzávěrka kuchyně (celé směny nebo kurýra) zahrne i hotové objednávky, které jsou ještě na trase, takže taková trasa po ní ze `status=open` (i z `Courier.open_routes`) zmizí, přestože se ještě rozváží; `getDeliveryRoute` ji vrací dál. `courier_id` je zúží na jednoho kurýra. Nejnovější první. Na `If-None-Match` odpoví `304`, když se nic nezměnilo. Telefon kurýra (zařízení bez `kitchen:read`) potřebuje přihlášeného zaměstnance (`403 staff_session_required`) a vidí jen trasy toho kurýra s adresami a telefony zákazníků, pokud zaměstnanec není `kitchen_manager`. Kuchyňský displej vidí trasy všech kurýrů. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `status` (query, string): `open` (výchozí) – trasy, které se ještě rozvážejí; `completed` – dokončené trasy. Obojí jen z aktuální směny. - `courier_id` (query, Id): Jen trasy tohoto kurýra. Na telefonu kurýra, jehož přihlášený zaměstnanec není `kitchen_manager`, je to vždy tento zaměstnanec – jiné `courier_id` se nebere. ID, které kurýrovi nepatří, dá prázdný seznam. - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stránka tras. `application/json`: DeliveryRoutePage – pole `data`, `next_cursor` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/delivery-routes – Poslat objednávky s kurýrem `operationId`: `createDeliveryRoute` · přihlášení: `oauth2`, oprávnění `deliveries:write` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/createDeliveryRoute Dá rozvozové objednávky na jednu trasu kurýra v zadaném pořadí, jako plánovač tras na kuchyňském displeji: objednávky se stanou hotovými (`out_for_delivery`) a kurýr je převezme. Každá objednávka musí být rozvozem této provozovny, nezrušená, nedoručená a ne na jiné otevřené trase; jinak na ni ukáže `422 validation_failed`. SMS „objednávka je hotová“ dostanou zákazníci, jejichž objednávka se hotovou stala právě teď (ne podruhé a ne když zákazníkům píše sama aplikace, která objednávku vytvořila). Na telefonu kurýra (zařízení bez `kitchen:read`) musí být přihlášený zaměstnanec (`403 staff_session_required`); kurýr, který není vedoucí kuchyně, pošle jen sám sebe (`403 staff_role_missing`) a jen objednávky hotové a nepřidělené jinému kurýrovi (`422` s `not_ready` nebo `other_courier`). Takhle se znovu posílá i objednávka, která byla `not_delivered`; její hlášení zůstane v historii objednávky. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: DeliveryRouteCreate – pole `courier_id`, `ticket_ids` Odpovědi: - 201: Trasa. `application/json`: DeliveryRoute – pole `id`, `courier`, `status`, `created_at`, `completed_at`, `tickets` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/delivery-routes/{route_id} – Jedna rozvozová trasa `operationId`: `getDeliveryRoute` · přihlášení: `oauth2`, oprávnění `deliveries:read` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/getDeliveryRoute Telefon kurýra (zařízení bez `kitchen:read`) potřebuje přihlášeného zaměstnance a na trasu jiného kurýra dostane `404`, pokud zaměstnanec není `kitchen_manager`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `route_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Trasa. `application/json`: DeliveryRoute – pole `id`, `courier`, `status`, `created_at`, `completed_at`, `tickets` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/delivery-routes/{route_id}/tickets/{ticket_id}/delivered – Označit objednávku trasy jako doručenou `operationId`: `markTicketDelivered` · přihlášení: `oauth2`, oprávnění `deliveries:write` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/markTicketDelivered Kurýr objednávku doručil. Když jsou doručené, zrušené nebo nepřevzaté všechny objednávky trasy, trasa se dokončí (i když poslední objednávku označí, stornuje nebo vrátí do fronty kuchyňský displej). Opakované označení nevadí. Jako doručenou jde označit i objednávku `not_delivered`, dokud není zrušená – zákazník si ji vyzvedl později, nebo kurýr ťukl omylem. Když je přihlášený zaměstnanec bez role `kitchen_manager`, smí označit jen objednávky na svých trasách (`403 staff_role_missing`); telefon kurýra (zařízení bez `kitchen:read`) potřebuje přihlášeného zaměstnance (`403 staff_session_required`). Aplikace, která objednávku vytvořila, dostane `order.status_changed` s `delivered`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `route_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Trasa po změně. `application/json`: DeliveryRoute – pole `id`, `courier`, `status`, `created_at`, `completed_at`, `tickets` - chyby: 400, 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/delivery-routes/{route_id}/tickets/{ticket_id}/handover-payment – Zapsat platbu, kterou kurýr vybral u dveří `operationId`: `handoverTicketPayment` · přihlášení: `oauth2`, oprávnění `deliveries:write` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/handoverTicketPayment Kurýr vybral platbu za objednávku trasy – kartou na platebním terminálu (`method` `card`, s `gateway_payment_id` terminálu) nebo hotově. Funguje oběma směry: hotovostní objednávka zaplacená kartou se stane `card_at_handover`, objednávka `card_at_handover` zaplacená hotově se stane `cash` a uzávěrka (`getKitchenShift`) podle toho přesune tržbu mezi hotovostí a kartou. Objednávka pak má `amount_due` 0 a `paid_by`. Jen u objednávek s `payment_method` `cash` nebo `card_at_handover`, u kterých je co vybrat: zaplacené předem (kartou nebo online, u pokladny), stravenky, účet podniku a faktura vrátí `409 payment_method_not_changeable`; objednávka už zaplacená u dveří `409 already_paid` s `paid_by` v chybě; zrušená `409 ticket_cancelled`. `amount` se musí rovnat `amount_due` + `tip` – u objednávky bez části zaplacené online je to `total` + `tip` (`422 amount_mismatch`). Čas platby pošlete v `paid_at` – telefon ji může poslat později ze své fronty; víc než 5 minut napřed proti serveru se odmítne. Stejná platba poslaná znovu (stejné `gateway_payment_id`, u hotovosti stejné `paid_at`) vrátí bon a nic nezapíše, i po 24 hodinách platnosti `Idempotency-Key`; jedna transakce terminálu nezaplatí dvě objednávky (`422 validation_failed` s `duplicate`). Spropitné se zapíše k objednávce. Stejná oprávnění jako `markTicketDelivered`. Zápis platby objednávku nedoručí – označte ji i jako doručenou. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.2.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `route_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: HandoverPayment – pole `method`, `amount`, `tip`, `gateway_payment_id`, `card_brand`, `card_last4`, `paid_at` Odpovědi: - 200: Bon po zaplacení. `application/json`: KitchenTicket – pole `id`, `order_id`, `number`, `status`, `area`, `source`, `platform`, `name`, `fulfillment`, `express`, `customer`, `delivery_address`, `delivery_zone`, `note`, `payment_method`, `total`, `delivery_price`, `amount_due`, `paid_by`, `created_at`, `scheduled_for`, `printed`, `courier`, `not_delivered`, `items`, `receipt` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/delivery-routes/{route_id}/tickets/{ticket_id}/not-delivered – Označit objednávku trasy jako nepřevzatou, s důvodem `operationId`: `markTicketNotDelivered` · přihlášení: `oauth2`, oprávnění `deliveries:write` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/markTicketNotDelivered Kurýr objednávku nemohl předat – zákazník nebyl doma, odmítl ji, nezaplatil, adresa neexistuje… Bon se stane `not_delivered` s `not_delivered` (důvod, poznámka, čas, kurýr, poloha a hovory jako doklad o pokusu), nezapíše se platba ani tržba a hotovost se za ni od kurýra nečeká (`getKitchenShift` ji ukazuje v `not_delivered`). Trasa se dokončí, když jsou všechny objednávky doručené, zrušené nebo nepřevzaté. Aplikace, které objednávku vytvořily, dostanou `order.status_changed` s `not_delivered`. Provozovna pak rozhodne: odepíše ji (`cancelKitchenTicket` s `write_off` – na sklad se nic nevrací, jídlo je ztracené), pošle ji znovu (`createDeliveryRoute`), nebo ji označí jako doručenou (`markTicketDelivered` – zákazník si ji vyzvedl, nebo kurýr ťukl omylem). Do té doby zůstává ve směně i v té další. `reason` `other` potřebuje `note` (`422 note_required`). Doručená objednávka vrátí `409 ticket_already_delivered`, zrušená `409 ticket_cancelled`, objednávka už zaplacená u dveří (`handoverTicketPayment`) `409 already_paid` – zaplacenou objednávku řeší provozovna. Objednávky zaplacené předem označit jde; server sám žádné peníze nevrací. Opakované označení téže objednávky na téže trase nechá první hlášení. Stejná oprávnění jako `markTicketDelivered`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.2.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `route_id` (path, povinný) – společný parametr - `ticket_id` (path, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: NotDeliveredReport – pole `reason`, `note`, `attempted_at`, `location`, `call_attempts` Odpovědi: - 200: Trasa po změně. `application/json`: DeliveryRoute – pole `id`, `courier`, `status`, `created_at`, `completed_at`, `tickets` - chyby: 400, 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/couriers/{employee_id}/telemetry – Poslat polohu a jízdu kurýra během směny `operationId`: `postCourierTelemetry` · přihlášení: `oauth2`, oprávnění `deliveries:write` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/postCourierTelemetry Telefon kurýra posílá, co naměřil od minulé dávky: body trasy (`samples` – poloha, rychlost, směr, výška a špička přetížení), prudké manévry, které poznal (`driving_events` – prudké brzdění, prudké zrychlení a ostré zatáčky, v g), a stav telefonu (`device` – baterie, síť, oprávnění k poloze). Provozovna pak vidí své kurýry živě (`listCourierPositions`, události `courier.position`) a projetou stopu každé trasy se souhrnem (`getDeliveryRouteTrack`). Na telefonu musí být přihlášený ten kurýr sám (`403 staff_role_missing`). Body se zapisují jen během směny kurýra (`startCourierShift` až `endCourierShift`) a jen když provozovna sledování kurýrů zapnula v administraci, kde potvrdí, že své zaměstnance informovala. Jinak odpověď `200` s `mode` `off` a vším v `discarded` – přestaňte měřit. Odpověď říká, jak pokračovat. `mode` `route` (kurýr má otevřenou trasu): dávku každých `send_every_s` (15 s) s bodem každých `sample_every_s` (5 s, nebo po 25 m). `shift` (na směně bez trasy): dávku každých 60 s. `off`: přestaňte měřit – `off_reason` je `tracking_disabled`, `off_shift`, nebo `idle` (na směně bez trasy přes 3 hodiny, nejspíš zapomenuté odhlášení); znovu začněte, až kurýr dostane trasu nebo se znovu přihlásí na směnu. Dávka bez bodů se hodí na dotaz, jaký je režim. `thresholds` jsou prahy prudkých manévrů v g, které má telefon použít, `server_time` mu dovolí opravit hodiny. Bez signálu nechte dávky v telefonu a pošlete je později, nejstarší první. Znovu poslaná dávka nic nezapíše dvakrát – body se rozliší podle kurýra a `recorded_at` (`duplicates`), takže `Idempotency-Key` není potřeba. Body starší než 24 hodin, z doby před začátkem směny nebo víc než 2 minuty napřed proti serveru se zahodí (`discarded`). Posílejte `route_id` trasy, kterou kurýr jede, dokud se nevrátí do provozovny – cesta zpět patří k trase; bez něj server použije otevřenou trasu. Body s přesností horší než 50 m se uloží, ale nepočítají se do vzdálenosti ani do nejvyšší rychlosti. Body a manévry se drží 14 dní, pak zůstane jen souhrn trasy. V dávce nejvýš 300 bodů a 50 manévrů. Nezapisuje se do auditního logu. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. *Od verze 26.11.20.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `employee_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: CourierTelemetryBatch – pole `samples`, `driving_events`, `device` Odpovědi: - 200: Co se zapsalo a jak pokračovat. `application/json`: CourierTelemetryResult – pole `accepted`, `duplicates`, `discarded`, `mode`, `off_reason`, `send_every_s`, `sample_every_s`, `thresholds`, `server_time` - chyby: 400, 401, 403, 404, 422, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/courier-positions – Kde jsou kurýři na směně `operationId`: `listCourierPositions` · přihlášení: `oauth2`, oprávnění `deliveries:read` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/listCourierPositions Poslední poloha každého kurýra na směně, jehož telefon ji posílá (`postCourierTelemetry`), podle jména: stav, rychlost a směr, otevřená trasa se zbývajícími objednávkami a stav telefonu. `state` je `moving`, `stopped`, `at_restaurant` (do 100 m od provozovny), nebo `stale` – od telefonu přes 3 minuty nic (bez signálu, vypnutý telefon nebo zavřená aplikace); pak ukažte `received_at`. Kurýr, který se odhlásí ze směny, ze seznamu zmizí. Změny chodí živě jako události `courier.position` (nejvýš jedna za 10 sekund na kurýra, jen v proudu, viz `listEvents`) a `courier.shift_changed`. Seznam načtěte při startu a po novém připojení. Telefon kurýra (zařízení bez `kitchen:read`) vidí jen kurýra samotného. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.20.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Kurýři na směně s polohou. `application/json`: CourierPositionList – pole `data` - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/delivery-routes/{route_id}/track – Projetá stopa trasy `operationId`: `getDeliveryRouteTrack` · přihlášení: `oauth2`, oprávnění `deliveries:read` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/getDeliveryRouteTrack Kudy kurýr na trase jel, z bodů `postCourierTelemetry`: body aspoň 10 m od sebe (nejvýš 5 000), prudké manévry a souhrn – vzdálenost, čas v jízdě, nejvyšší a průměrná rychlost za jízdy a počet prudkých manévrů. Body a manévry se drží 14 dní, pak je `points_expired` `true` a zůstane jen souhrn. `summary` je `null`, když telefon k trase nic neposlal. Telefon kurýra vidí jen své trasy. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. *Od verze 26.11.20.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `route_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stopa trasy. `application/json`: DeliveryRouteTrack – pole `route_id`, `courier`, `summary`, `points_expired`, `points`, `driving_events` - chyby: 400, 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/address-suggestions – Našeptat doručovací adresy `operationId`: `suggestDeliveryAddresses` · přihlášení: `oauth2`, oprávnění `deliveries:read` · https://api.mujprofirest.cz/v2/docs#tag/Deliveries/operation/suggestDeliveryAddresses Hledání adresy pro objednávku přijatou po telefonu přes mapovou službu, kterou používá administrace (Mapy.cz). Vrátí jen adresy uvnitř rozvozové zóny provozovny, každou se zónou, kterou použije kalkulace – pro aplikace personálu jakoukoli aktivní zónu bez ohledu na časy rozvozu (jako v jejich kalkulacích), pro aplikace pro hosty jen zóny, které teď rozvážejí; `address` spolu s `location` pošlete jako `delivery_address` kalkulace. Nejvýš 8 adres; nejvýš 60 hledání za minutu na zařízení (`429 rate_limited`). Když mapová služba neodpovídá, odpověď je `503 service_unavailable`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `query` (query, string, povinný): Co zákazník řekl – ulice a číslo, místo, obec. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Adresy, kam provozovna teď rozváží. `application/json`: AddressSuggestionList – pole `data` - chyby: 400, 401, 403, 404, 422, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Receipts Pokladna a mobilní číšník: účtenky spočítané serverem, storno vedoucím, směna zařízení a EET 2.0, které odesílá server. Jen pro vlastní zařízení Profirestu. Reference: https://api.mujprofirest.cz/v2/docs#tag/Receipts ### POST /restaurants/{restaurant_id}/receipts/preview – Spočítat účtenku před placením `operationId`: `previewReceipt` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/previewReceipt Spočítá položky přesně jako `createReceipt`: sortiment pokladny v `issued_at` (bez něj teď), cenu půlky a pro zaměstnance, slevy, DPH a částku k placení v hotovosti zaokrouhlenou na celé koruny. Nic se neukládá. Volejte ho online před přijetím platby; účtenku pak pošlete se stejnými cenami. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Bez `Idempotency-Key` (viz popis). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ReceiptPreviewRequest – pole `issued_at`, `offline`, `order_type`, `manager_credential`, `items`, `discounts` Odpovědi: - 200: Spočítaná účtenka. `application/json`: ReceiptPreview – pole `lines`, `discounts`, `totals`, `price_differences`, `cash_amount_due`, `eet_recorded` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/receipts – Seznam účtenek `operationId`: `listReceipts` · přihlášení: `oauth2`, oprávnění `receipts:read` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/listReceipts Účtenky a storno doklady, které pokladny provozovny vystavily přes toto API, naposledy přijaté první (offline účtenka poslaná později přijde před staršími). Bez filtru jen účtenky volajícího zařízení. Tržby zapsané jinde – pokladnami na API v1 nebo v administraci – tu nejsou. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `device` (query, string): `this` – volající zařízení (výchozí), `all` – všechny pokladny provozovny, které vystavují účtenky přes toto API. - `shift` (query, string): `open` – jen účtenky, které ještě neuzavřela uzávěrka; `any` (výchozí) – i uzavřené. - `shift_id` (query, string (uuid)): Jen účtenky této uzávěrky (`PosShiftClose.id`, `listPosShifts`) – i dalších zařízení, která uzavřela, a doklady z API v1, které převzala (`legacy_receipt_ids`). Bez `device` všech zařízení. Neznámé ID odpoví `422` s… - `since` (query, Timestamp): Vystavené v tomto okamžiku nebo později. - `until` (query, Timestamp): Vystavené před tímto okamžikem. - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Jedna stránka účtenek. `application/json`: ReceiptPage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/receipts – Vystavit účtenku `operationId`: `createReceipt` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/createReceipt Zaplacená účtenka. Server ji spočítá, uloží stejně jako dnešní pokladna – jako objednávku v administraci, takže ji ukážou přehledy, uzávěrky i exporty –, odečte porce a sklad, prodá a uplatní vouchery, připíše věrnostní body a zaeviduje tržbu do EET 2.0. **Dělená platba.** Objednávka v administraci si drží jeden způsob platby – ten s největší částkou, dárkové vouchery se nepočítají –, takže statistiky podle platby, detail objednávky, exporty do Excelu, Pohody a Money, dýško v detailu uzávěrky i `KitchenTicket.payment_method` ukážou celou účtenku pod tímto způsobem. Rozdělení zůstává v účtence (`payments`), v `getPosShift` a v součtech uzávěrky podle způsobu platby. Platba dárkovým voucherem se v administraci a na kopii účtenky ukazuje se zamaskovaným kódem (`ABC-***`). `id` je vaše UUID vytvořené na zařízení ve chvíli zaplacení. Opakované odeslání stejného `id` nikdy nevytvoří druhou účtenku: dostanete první s `200` (`409 receipt_id_conflict`, když `id` patří jinému zařízení nebo číslu). Účtenky pořízené offline pošlete později s `offline: true`. Účtenka smí být nejvýš 7 dní stará; pořízená offline se přijme až do 62 dní (pokladna přes svátky bez sítě) – pak bez odečtení porcí a s upozorněním v Časové ose akcí v administraci, protože tržba se musí zaevidovat i tak. **Kdo.** Zaměstnanec přihlášený na zařízení (`Profirest-Staff-Token`) s rolí `pos` nebo `pos_manager`. Bez relace se přijme jen offline účtenka s `issued_by_id`. **Ceny.** Bez `unit_price` platí cena ze sortimentu v `issued_at`. Jinou cenu server přijme jen od vedoucího pokladny (přihlášený, `manager_credential`, nebo `approved_by_id` u offline účtenky) a u účtenky pořízené offline nebo poslané o víc než 10 minut později – zákazník zaplatil, co ukázala pokladna, a rozdíl je v `price_differences`. Jinak `409 price_changed`: načtěte sortiment znovu. Ruční sleva a položka s vlastní cenou potřebují vedoucího (`403 manager_approval_required`); automatickou slevu smí kdokoli. Voucher pod jeho hodnotou prodá jen vedoucí ověřený teď (přihlášený nebo `manager_credential`) – `approved_by_id` offline účtenky nestačí. `approved_by_id` a `issued_by_id` jsou jen údaj zařízení (PIN nikdo neověřil): offline účtenka s jinou cenou než ceník, s prodejem voucheru nebo s ruční slevou a vlastní položkou schválenou takto se ukáže v Časové ose akcí v administraci. **Peníze.** Platby dávají dohromady `totals.total`. Část placenou hotově (celkem bez ostatních plateb) jde zaokrouhlit na celé koruny – přesně o to zaokrouhlení, nebo vůbec; jiný rozdíl je `payment_amount_mismatch` (zaokrouhlení je mimo DPH). Dýško patří k platbě hotově nebo kartou a do celkové částky se nepočítá. **EET 2.0.** Když provozovna eviduje tržby, server je podepíše a odešle – zařízení certifikát nepotřebuje. Evidovaná tržba jsou platby hotově, kartou a stravenkami s dýškem a platby vouchery; prodané vouchery jsou platby určené k čerpání do výše plateb hotově, kartou a stravenkami (včetně dýška). Platby na firemní účet a na fakturu se neevidují (ani voucher prodaný na fakturu). Odpověď nese stav EET; tržba ve stavu `pending` se odesílá znovu sama, dokud ji finanční správa nepřijme – zákonná lhůta je 48 hodin (`eet.deadline_at`); po delším výpadku se odešle i tak, pozdě. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ReceiptCreate – pole `id`, `number`, `issued_at`, `offline`, `issued_by_id`, `approved_by_id`, `approval_signature`, `manager_credential`, `opened_at`, `opened_by_id`, `table_name`, `order_type`, `customer_id`, `note`, `tab_id`, `tab_version`, `send_to_kitchen`, `items`, `discounts`, `payments` Odpovědi: - 200: Toto `id` už bylo vystavené; první účtenka. `application/json`: Receipt – pole `id`, `restaurant_id`, `device_id`, `number`, `kind`, `status`, `issued_at`, `received_at`, `offline`, `issued_by`, `approved_by`, `table_name`, `order_type`, `customer_id`, `note`, `lines`, `discounts`, `totals`, `payments`, `tips`, `price_differences`, `kitchen_number`, `cancels`, `cancelled_by`, `eet`, `shift_closed_at` - 201: Vystaveno. `application/json`: Receipt – pole `id`, `restaurant_id`, `device_id`, `number`, `kind`, `status`, `issued_at`, `received_at`, `offline`, `issued_by`, `approved_by`, `table_name`, `order_type`, `customer_id`, `note`, `lines`, `discounts`, `totals`, `payments`, `tips`, `price_differences`, `kitchen_number`, `cancels`, `cancelled_by`, `eet`, `shift_closed_at` - chyby: 400, 401, 403, 404, 409, 412, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/receipts/{receipt_id} – Detail účtenky `operationId`: `getReceipt` · přihlášení: `oauth2`, oprávnění `receipts:read` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/getReceipt Jedna účtenka nebo storno doklad, které kterákoli pokladna provozovny vystavila přes toto API, s aktuálním stavem EET. Účtenky pokladen na API v1 vrátí `404`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `receipt_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Účtenka. `application/json`: Receipt – pole `id`, `restaurant_id`, `device_id`, `number`, `kind`, `status`, `issued_at`, `received_at`, `offline`, `issued_by`, `approved_by`, `table_name`, `order_type`, `customer_id`, `note`, `lines`, `discounts`, `totals`, `payments`, `tips`, `price_differences`, `kitchen_number`, `cancels`, `cancelled_by`, `eet`, `shift_closed_at` - chyby: 401, 403, 404, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/receipts/{receipt_id}/storno – Stornovat účtenku `operationId`: `cancelReceipt` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/cancelReceipt Storno doklad se zápornými částkami jako na dnešní pokladně: tržba se v přehledech odečte, vouchery, kterými se platilo, se vrátí na vouchery, prodané vouchery jsou znovu k prodeji (jen když se z nich nic nepoužilo), věrnostní body se odečtou a s `restock` (výchozí) se vrátí sklad i porce. EET 2.0 zaeviduje zápornou tržbu v čase storna. Kdo smí stornovat, nastavuje provozovna (`getDeviceSettings`, `pos.receipt_cancel_by`). `staff` (výchozí, jako v API v1): kdokoli s rolí `pos`, PIN vedoucího v `manager_credential` se jen zapíše. `manager`: jen vedoucí pokladny – přihlášený s `pos_manager`, nebo jeho PIN či čip v `manager_credential` (`403 manager_approval_required`). Účtenka se stornuje jednou (`409 receipt_already_cancelled`) a storno patří do otevřené směny tohoto zařízení, i když původní účtenka je v uzavřené směně. `id` je vaše UUID storno dokladu; stejné `id` znovu ho vrátí s `200`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `receipt_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ReceiptCancel – pole `id`, `number`, `reason`, `restock`, `manager_credential` Odpovědi: - 200: Toto `id` už storno má; storno doklad. `application/json`: Receipt – pole `id`, `restaurant_id`, `device_id`, `number`, `kind`, `status`, `issued_at`, `received_at`, `offline`, `issued_by`, `approved_by`, `table_name`, `order_type`, `customer_id`, `note`, `lines`, `discounts`, `totals`, `payments`, `tips`, `price_differences`, `kitchen_number`, `cancels`, `cancelled_by`, `eet`, `shift_closed_at` - 201: Stornováno; storno doklad. `application/json`: Receipt – pole `id`, `restaurant_id`, `device_id`, `number`, `kind`, `status`, `issued_at`, `received_at`, `offline`, `issued_by`, `approved_by`, `table_name`, `order_type`, `customer_id`, `note`, `lines`, `discounts`, `totals`, `payments`, `tips`, `price_differences`, `kitchen_number`, `cancels`, `cancelled_by`, `eet`, `shift_closed_at` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/receipts/{receipt_id}/payment-change – Změnit platbu účtenky `operationId`: `changeReceiptPayment` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/changeReceiptPayment Změní, jak se vydaná účtenka zaplatila, bez storna a nové účtenky – třeba když obsluha zvolila hotovost, ale zákazník platil kartou. Účtenka si nechá `id`, číslo, položky, celkovou částku i zaokrouhlení; mění se jen `payments` a hned se přizpůsobí součty směny, pokladní kniha, administrace i přehledy. Odpověď je účtenka po změně. Mění se jen platby hotově, stravenkami, na firemní účet a fakturou. Platby kartou a dárkovým voucherem zůstávají, jak jsou, a neposílají se: změna z karty by byla vrácení peněz na kartu, které pokladna zatím neumí, a dárkový voucher vrátí jen storno (`cancelReceipt`). V `payments` pošlete, čím se místo nich zaplatil zbytek – `cash`, `card` (s `terminal`), `meal_voucher`, `company_account` nebo `invoice` (ne `voucher`). Nové platby musí dát stejnou částku a stejné dýško jako měněné platby (`422 payment_amount_mismatch`); dýško se jen přesune s platbou. Účtenka zaokrouhlená na hotovost si zaokrouhlení nechá jen s platbou hotově za stejnou část – jinak ji stornujte a vystavte novou. Účtenka zaplacená jen kartou nebo dárkovým voucherem vrátí `409 receipt_payment_not_changeable`. Jen do uzávěrky směny účtenky (potom `409 pos_shift_closed` – hotovost už je spočítaná; administrace ji změnit může). Stornovaná účtenka se nemění (`409 receipt_already_cancelled`), storno doklad také ne. Kdo smí platbu změnit, nastavuje provozovna stejně jako u storna (`getDeviceSettings`, `pos.receipt_cancel_by`; `403 manager_approval_required`). Změna se zapíše do Časové osy administrace a přijde událost `receipt.updated`. EET 2.0: platby hotově, kartou a stravenkami evidují stejnou tržbu, takže změna mezi nimi nic neposílá. Když se evidovaná částka změní (např. hotově → faktura), server pošle zápornou tržbu dosavadní částky a novou tržbu, obě v čase změny, pod číslem účtenky; `eet` účtenky pak ukazuje novou tržbu. `id` je vaše UUID změny; stejné `id` znovu vrátí účtenku s `200` a nic nezmění. Platby stejné jako dosavadní také nic nezmění. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. *Od verze 26.11.28.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `receipt_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: ReceiptPaymentChange – pole `id`, `payments`, `reason`, `manager_credential` Odpovědi: - 200: Účtenka po změně (nebo beze změny, když toto `id` už změna má nebo jsou platby stejné). `application/json`: Receipt – pole `id`, `restaurant_id`, `device_id`, `number`, `kind`, `status`, `issued_at`, `received_at`, `offline`, `issued_by`, `approved_by`, `table_name`, `order_type`, `customer_id`, `note`, `lines`, `discounts`, `totals`, `payments`, `tips`, `price_differences`, `kitchen_number`, `cancels`, `cancelled_by`, `eet`, `shift_closed_at` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/pos-shift – Otevřená směna tohoto zařízení `operationId`: `getPosShift` · přihlášení: `oauth2`, oprávnění `receipts:read` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/getPosShift Součty účtenek a storno dokladů, které toto zařízení vystavilo přes toto API od své poslední uzávěrky, spočítané serverem, a pohyby hotovosti, které zapsalo (`cash_movements`). S `devices` souhrn pokryje otevřené směny víc zařízení provozovny – třeba telefonu číšníka, než je vedoucí uzavře spolu (`device_ids` uzávěrky). `by_device` a `by_employee` ho rozdělí po zařízeních a po zaměstnancích, kteří účtenky vystavili: platby hotově a dýško v hotovosti zaměstnance jsou to, co odvádí. Storno se počítá zařízení, které ho vystavilo, i když původní účtenka vznikla jinde. Tržby jiných zařízení a pokladen na API v1 tu nejsou; celou provozovnu zahrnuje jen `open_tabs`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `devices` (query, string): Další zařízení provozovny: `all` (každé zařízení s otevřenou směnou – účtenky nebo pohyby hotovosti bez uzávěrky) nebo jejich ID oddělená čárkou. Toto zařízení je v souhrnu vždy. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Otevřená směna. `application/json`: PosShiftSummary – pole `device_id`, `opened_at`, `receipts`, `totals`, `payments`, `tips`, `vat`, `vouchers`, `eet`, `open_tabs`, `cash_movements`, `device_ids`, `by_device`, `by_employee` - chyby: 401, 403, 404, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/pos-shift/close – Uzávěrka tohoto zařízení `operationId`: `closePosShift` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/closePosShift Uzavře otevřenou směnu tohoto zařízení se součty spočítanými serverem a uloží ji jako uzávěrku v administraci. S `counted_cash` odpověď ukáže rozdíl proti očekávané hotovosti (platby hotově, dýško v hotovosti a pohyby hotovosti zařízení). S `device_ids` jedna uzávěrka pokryje otevřené směny víc zařízení provozovny (telefon číšníka, druhou pokladnu) – jen vedoucí pokladny, přihlášený nebo svým PINem či čipem v `manager_credential`; očekávaná hotovost pak zahrne všechna. `id` je vaše UUID uzávěrky; stejné `id` znovu ji vrátí s `200`. Směnu bez účtenek uzavřít nejde (`409 pos_shift_empty`). Účty stolů, které jsou v provozovně ještě otevřené, jsou v `summary.open_tabs` – načtěte nejdřív `GET …/pos-shift` a nechte zaměstnance je vyřídit; uzávěrka uloží jejich součet jako nezaplacený. Stejně jako uzávěrka dnešní pokladny zahrne i storna položek stolů (kusy odebrané z účtů poté, co šly do kuchyně) celé provozovny, které ještě žádná uzávěrka nezahrnula, z kterékoli pokladny. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: PosShiftCloseRequest – pole `id`, `counted_cash`, `note`, `device_ids`, `legacy_receipt_ids`, `manager_credential` Odpovědi: - 200: Toto `id` už uzávěrka má; uzávěrka. `application/json`: PosShiftClose – pole `id`, `device_id`, `closed_at`, `closed_by`, `summary`, `cash_expected`, `counted_cash`, `cash_difference`, `note` - 201: Uzavřeno. `application/json`: PosShiftClose – pole `id`, `device_id`, `closed_at`, `closed_by`, `summary`, `cash_expected`, `counted_cash`, `cash_difference`, `note` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/pos-shifts – Seznam uzavřených směn `operationId`: `listPosShifts` · přihlášení: `oauth2`, oprávnění `receipts:read` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/listPosShifts Uzávěrky provozovny přesně tak, jak je vrátil `closePosShift` – co server sečetl, i s doklady z API v1 převzatými přes `legacy_receipt_ids` – naposledy uzavřené první. Bez filtru jen uzávěrky provedené na volajícím zařízení; `device=all` všech zařízení. Účtenky jedné uzávěrky jsou v `listReceipts?shift_id=`. Od 26.11.26. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. *Od verze 26.11.26.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `device` (query, string): `this` – uzávěrky provedené na volajícím zařízení (výchozí), `all` – všech zařízení provozovny. - `since` (query, Timestamp): Uzavřené v tomto okamžiku nebo později. - `until` (query, Timestamp): Uzavřené před tímto okamžikem. - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Jedna stránka uzávěrek. `application/json`: PosShiftClosePage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/pos-shifts/{shift_id} – Uzavřená směna `operationId`: `getPosShiftClose` · přihlášení: `oauth2`, oprávnění `receipts:read` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/getPosShiftClose Jedna uzávěrka provozovny, provedená na kterémkoli jejím zařízení, přesně tak, jak ji vrátil `closePosShift`. Od 26.11.26. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. *Od verze 26.11.26.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `shift_id` (path, string (uuid), povinný): `PosShiftClose.id` – UUID, které zařízení poslalo v `closePosShift`. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Uzávěrka. `application/json`: PosShiftClose – pole `id`, `device_id`, `closed_at`, `closed_by`, `summary`, `cash_expected`, `counted_cash`, `cash_difference`, `note` - chyby: 401, 403, 404, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/cash-movements – Zapsat vklad, výběr nebo výdaj hotovosti `operationId`: `createCashMovement` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/createCashMovement Zapíše peníze, které přišly do kasy nebo z ní odešly mimo účtenky, do pokladní knihy provozovny – téže, kterou vede administrace (Statistiky → Pokladní kniha) a exportuje do agendy Pokladna v Pohodě: `deposit` (vklad – drobné na směnu, doplnění), `income` (jiný příjem hotovosti), `withdrawal` (výběr – odvod do banky, předání majiteli), `expense` (výdaj z kasy – nákup, platba dodavateli) a `opening` (počáteční stav, kterým kniha začíná, jednou za provozovnu). Částka je vždy kladná, směr dává druh. Výběr, výdaj a počáteční stav zapisuje vedoucí pokladny – přihlášený s `pos_manager`, nebo svým PINem či čipem v `manager_credential`. Každý pohyb kromě počátečního stavu potřebuje `note`, o co šlo. Pokladní kniha se vede za provozovnu, ne za zařízení: hotovost za účtenky všech pokladen počítá sama. Pohyby, které toto zařízení zapsalo od své poslední uzávěrky, jsou v `GET …/pos-shift` (`cash_movements`) a v očekávané hotovosti `POST …/pos-shift/close`. Pohyb není tržba a do EET nejde. Kniha musí mít počáteční stav (`409 cash_book_not_started`); `occurred_at` smí být až 7 dní zpátky (pokladna dohání výpadek), nikdy před počátečním stavem. `id` je vaše UUID pohybu; stejné `id` znovu ho vrátí s `200`. Pohyb zapsaný omylem se maže v administraci. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: CashMovementInput – pole `id`, `kind`, `amount`, `note`, `document`, `occurred_at`, `manager_credential` Odpovědi: - 200: Toto `id` už pohyb má; pohyb. `application/json`: CashMovement – pole `id`, `number`, `kind`, `amount`, `note`, `document`, `occurred_at`, `recorded_at`, `recorded_by`, `approved_by`, `device_id` - 201: Zapsáno do pokladní knihy. `application/json`: CashMovement – pole `id`, `number`, `kind`, `amount`, `note`, `document`, `occurred_at`, `recorded_at`, `recorded_by`, `approved_by`, `device_id` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/tabs – Otevřené účty stolů provozovny `operationId`: `listTabs` · přihlášení: `oauth2`, oprávnění `receipts:read` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/listTabs Všechny otevřené účty stolů provozovny ze všech pokladen a číšníků, takže stůl může převzít kterékoli zařízení. Ptejte se s `If-None-Match` (nezměněný seznam skoro nic nestojí), nebo sledujte události `tab.updated` a `tab.closed`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Otevřené účty. `application/json`: TabList – pole `data` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/tabs/{tab_id} – Detail účtu stolu `operationId`: `getTab` · přihlášení: `oauth2`, oprávnění `receipts:read` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/getTab Otevřený nebo uzavřený účet stolu s `ETag` (verzí). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `tab_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Účet stolu. `application/json`: Tab – pole `id`, `restaurant_id`, `table_name`, `note`, `opened_at`, `opened_by`, `updated_by`, `lines`, `totals`, `version`, `status`, `updated_at`, `device_id`, `closed_at`, `receipt_id` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/tabs/{tab_id} – Otevřít nebo změnit účet stolu `operationId`: `putTab` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/putTab Pošle celý stav účtu: stůl a všechny položky. Bez `If-Match` se otevře nový účet (`201`). Při změně otevřeného účtu pošlete `If-Match` s načteným `ETag` (bez něj `428 precondition_required`); když ho mezitím změnilo jiné zařízení, dostanete `412 precondition_failed` – načtěte ho znovu, sloučte a pošlete znovu. Uzavřený účet měnit nejde (`409 tab_closed`). Ceny jsou ze sortimentu pokladny v tuto chvíli jen pro zobrazení; účtenka položky při placení spočítá znovu (`createReceipt` s `tab_id` účet uzavře). Každá změna množství se zapíše do logu stolů v administraci stejnými větami jako dnešní pokladna (přidáno, odebráno, uzavřeno), takže majitel dál vidí, co se u kterého stolu dělo; změna poznámky, chodu, názvu stolu nebo `sent_to_kitchen` se nezapisuje. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `tab_id` (path, povinný) – společný parametr - `If-Match` (header) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TabInput – pole `table_name`, `note`, `items`, `moved_line_ids` Odpovědi: - 200: Změněno. `application/json`: Tab – pole `id`, `restaurant_id`, `table_name`, `note`, `opened_at`, `opened_by`, `updated_by`, `lines`, `totals`, `version`, `status`, `updated_at`, `device_id`, `closed_at`, `receipt_id` - 201: Otevřeno. `application/json`: Tab – pole `id`, `restaurant_id`, `table_name`, `note`, `opened_at`, `opened_by`, `updated_by`, `lines`, `totals`, `version`, `status`, `updated_at`, `device_id`, `closed_at`, `receipt_id` - chyby: 400, 401, 403, 404, 409, 412, 422, 428 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### DELETE /restaurants/{restaurant_id}/tabs/{tab_id} – Uzavřít účet stolu bez účtenky `operationId`: `closeTab` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/closeTab Uzavře účet, který se platit nebude – zrušený stůl. Řádky, které na účtu zůstaly, se počítají jako zrušené: ty, které už šly do kuchyně, se zapíšou jako storna položek stejně jako při odebrání přes `putTab` a log stolů v administraci zapíše uzavření s nepovinným `reason`. Položky na jiný účet nejdřív přesuňte přes `moveTabLines` (přesunuté řádky storno nejsou). Zaplacený účet uzavře `createReceipt` s `tab_id`. Žádný kuchyňský bon se neruší; řádky zůstanou v uzavřeném účtu (`getTab`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `tab_id` (path, povinný) – společný parametr - `If-Match` (header, povinný) – společný parametr - `reason` (query, string): Proč se účet zavírá bez placení – do logu stolů v administraci. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 204: Uzavřeno. - chyby: 401, 403, 404, 409, 412, 428 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/tabs/{tab_id}/moves – Přesunout položky na jiný účet `operationId`: `moveTabLines` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/moveTabLines Přesune řádky nebo jejich část z tohoto účtu na jiný v jednom kroku – hosté se přesadí k jinému stolu, nebo se účet dělí (placenou část přesuňte na nový účet a zaplaťte ji přes `createReceipt`). Přesunuté kusy si nesou cenu, přílohy, poznámku, chod, `sent_to_kitchen` i `ordered_at`; nic se znovu neoceňuje, takže se přesune i denní menu po svém čase. Přesun není storno. Cílem je otevřený účet provozovny – pošlete jeho `version` v `target_version` (`412 precondition_failed`, když se změnil) – nebo nové UUID, které vytvoříte, a otevře se účet s `target_table_name`. Pošlete `If-Match` s `ETag` tohoto účtu. Účet, na kterém nic nezůstane, se uzavře (`tab.closed`). Oba účty dostanou novou verzi, log stolů v administraci přesun zapíše a odejde `tab.updated`. Když cílový účet už řádek se stejným ID má, pošlete jiné `target_line_id`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `tab_id` (path, povinný) – společný parametr - `If-Match` (header, povinný) – společný parametr - `Idempotency-Key` (header, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TabMoveInput – pole `target_tab_id`, `target_version`, `target_table_name`, `lines` Odpovědi: - 200: Přesunuto; oba účty po přesunu. `application/json`: TabMove – pole `source`, `target` - chyby: 400, 401, 403, 404, 409, 412, 422, 428 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/pos-activity – Poslat deník akcí pokladny `operationId`: `createPosActivity` · přihlášení: `oauth2`, oprávnění `receipts:write` · https://api.mujprofirest.cz/v2/docs#tag/Receipts/operation/createPosActivity Akce na pokladně, které nejsou doklady – otevření zásuvky, tisk kopie, přihlášení, přesun položek mezi stoly… – jako text pro Časovou osu akcí (bar) v administraci, stejně jako z dnešní pokladny. Jen zapíše text a nic nemění: přesun položek mezi stoly se třeba dělá dvěma voláními `putTab` – cílový účet s položkami, pak zdrojový účet bez nich a s jejich ID v `moved_line_ids` –, což jsou dva samostatné kroky, ne jeden nedělitelný přesun. Akce posílejte po dávkách, i později po práci offline; každá položka má vaše UUID, takže dvakrát poslaná dávka nic nezapíše dvakrát (`duplicates`). Zaměstnanec, který v provozovně nepracuje, odmítne celou dávku (`422`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: PosActivityBatch – pole `items` Odpovědi: - 200: Kolik položek se zapsalo a kolik už tam bylo. `application/json`: PosActivityResult – pole `created`, `duplicates` - chyby: 400, 401, 403, 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Stock Inventura na vlastních zařízeních Profirestu – položky k přepočítání a výsledek, který nastaví stav skladu, jako v administraci (Sklad → Inventury). Jen pro vlastní zařízení Profirestu. Reference: https://api.mujprofirest.cz/v2/docs#tag/Stock ### GET /restaurants/{restaurant_id}/stock-taking/items – Položky k inventuře `operationId`: `listStockTakingItems` · přihlášení: `oauth2`, oprávnění `stock:read` · https://api.mujprofirest.cz/v2/docs#tag/Stock/operation/listStockTakingItems Skladové položky, které má administrace označené k inventuře na baru (na pokladnách) nebo v kuchyni, s množstvím, které teď očekává sklad – seznam pro inventuru na zařízení. Položky skryté pro tuto provozovnu chybí. Když je vyplněné `weighing`, otevřené balení jde zvážit místo odhadu: jeho množství je `pack_content × (váha − empty_weight_g) / (full_weight_g − empty_weight_g)`. `tolerance_percent` je rozdíl, který provozovna ještě snese (`0` = nenastaveno); větší rozdíly ukažte zaměstnanci před odesláním. Seřazeno podle ID; podle `category` si položky seskupte sami. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `area` (query, string): `bar` – položky, které se počítají na pokladnách (výchozí), `kitchen` – položky, které se počítají v kuchyni. - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Jedna stránka položek. `application/json`: StockTakingItemPage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/stock-takings – Zapsat inventuru `operationId`: `createStockTaking` · přihlášení: `oauth2`, oprávnění `stock:write` · https://api.mujprofirest.cz/v2/docs#tag/Stock/operation/createStockTaking Napočítaná množství dokončené inventury v jednom požadavku. Server je porovná se stavem skladu, zapíše inventuru do administrace (Sklad → Inventury) na přihlášeného zaměstnance a nastaví sklad na napočítaná množství; rozdíly zapíše do pohybů skladu jako inventuru – pokud provozovna nemá zapnuté *Nenastavovat sklad dle inventur*; pak se inventura jen zapíše (`stock_updated: false`). Položky, které nepošlete, zůstanou, jak jsou. Na baru ji dělá zaměstnanec s rolí na pokladně (`pos`, `pos_manager`), v kuchyni zaměstnanec s rolí v kuchyni (`kitchen`, `kitchen_manager`). Každou položku pošlete nejvýš jednou. `id` je vaše UUID inventury vytvořené na zařízení; stejné `id` znovu vrátí inventuru s `200` (`409 stock_taking_id_conflict`, když `id` patří jinému zařízení). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. **Na zařízení musí být přihlášený zaměstnanec** – pošlete `Profirest-Staff-Token` z `POST /restaurants/{restaurant_id}/staff-sessions` (`403 staff_session_required`, `403 staff_session_expired`). Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: StockTakingCreate – pole `id`, `area`, `note`, `items` Odpovědi: - 200: Toto `id` už bylo poslané; inventura. `application/json`: StockTaking – pole `id`, `number`, `area`, `created_at`, `employee`, `note`, `stock_updated`, `items`, `difference_value` - 201: Zapsáno. `application/json`: StockTaking – pole `id`, `number`, `area`, `created_at`, `employee`, `note`, `stock_updated`, `items`, `difference_value` - chyby: 400, 401, 403, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/stock-takings/{stock_taking_id} – Detail inventury `operationId`: `getStockTaking` · přihlášení: `oauth2`, oprávnění `stock:read` · https://api.mujprofirest.cz/v2/docs#tag/Stock/operation/getStockTaking Jedna inventura zapsaná přes API s očekávaným a napočítaným množstvím. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `stock_taking_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Inventura. `application/json`: StockTaking – pole `id`, `number`, `area`, `created_at`, `employee`, `note`, `stock_updated`, `items`, `difference_value` - chyby: 401, 403, 404, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Backups Zálohy místní databáze pokladny – ZIP, který pokladna nahrává (pravidelně, na požádání, po uzávěrce) a stáhne při obnově, třeba na novém zařízení. Společné s pokladnami na API v1. Jen pro vlastní zařízení Profirestu. Reference: https://api.mujprofirest.cz/v2/docs#tag/Backups ### GET /restaurants/{restaurant_id}/backups – Seznam záloh `operationId`: `listBackups` · přihlášení: `oauth2`, oprávnění `backups:read` · https://api.mujprofirest.cz/v2/docs#tag/Backups/operation/listBackups Zálohy pokladen provozovny od nejnovější – i ty, které nahrály pokladny na API v1 (`legacy: true`). V seznamu jsou jen zálohy, které server umí vydat: záloha, jejíž soubor nenajde, se vynechá (`getBackup` i `downloadBackup` pro ni vrátí `404`). U záloh nahraných přes toto API server drží posledních 64 automatických, 10 ručních a 30 záloh po uzávěrce každého zařízení; starší zálohy zařízení zmizí s jeho dalším nahráním stejného typu, takže taková pokladna nikdy nevytlačí zálohy ostatních. Pokladna na API v1 ale uklízí po provozovně: její nahrání ponechá nejnovějších 64, 10 nebo 30 záloh daného typu celé provozovny a může smazat starší zálohy kteréhokoli zařízení, i nahrané přes toto API. Automatickou zálohu server přijme nejvýš jednou za 10 minut od jednoho zařízení (`429`). Zálohy typu `other` pocházejí ze starých verzí aplikace a zůstávají. Před obnovou zkontrolujte `db_version` (a `app_version`): záloha starší nebo novější místní databáze může v aplikaci potřebovat převod. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `type` (query, string): Jen zálohy tohoto typu. - `cursor` (query) – společný parametr - `limit` (query) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Jedna stránka záloh. `application/json`: BackupPage – pole `data`, `next_cursor` - chyby: 400, 401, 403, 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/backups – Nahrát zálohu `operationId`: `createBackup` · přihlášení: `oauth2`, oprávnění `backups:write` · https://api.mujprofirest.cz/v2/docs#tag/Backups/operation/createBackup Nahraje archiv ZIP s místní databází pokladny: tělem je samotný soubor (`Content-Type: application/zip`), nejvýš 50 MB. Server ho uloží k provozovně a nejstarší zálohy stejného typu nad limit smaže (viz `listBackups`). `type`: `automatic` – pravidelná záloha, `manual` – požádal o ni zaměstnanec, `closure` – po uzávěrce směny. Tělo, které není archiv ZIP, vrátí `422 validation_failed` (`/body`); když úložiště není dostupné, `503 service_unavailable` – zálohu si nechte a zkuste to později. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Tělo: samotný soubor jako `application/zip`, nejvýš 50 MB. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `type` (query, string, povinný): Proč záloha vznikla. - `app_version` (query, string): Verze aplikace, která zálohu vytvořila. - `db_version` (query, string): Verze místní databáze v záloze. - `Idempotency-Key` (header, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/zip`: string (binary) Odpovědi: - 201: Záloha je uložená. `application/json`: Backup – pole `id`, `type`, `created_at`, `size_bytes`, `app_version`, `db_version`, `device_name`, `this_device`, `legacy` - chyby: 400, 401, 403, 404, 409, 413, 415, 422, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/backups/{backup_id} – Detail zálohy `operationId`: `getBackup` · přihlášení: `oauth2`, oprávnění `backups:read` · https://api.mujprofirest.cz/v2/docs#tag/Backups/operation/getBackup Údaje o jedné záloze provozovny; samotný archiv je na `…/content`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `backup_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Záloha. `application/json`: Backup – pole `id`, `type`, `created_at`, `size_bytes`, `app_version`, `db_version`, `device_name`, `this_device`, `legacy` - chyby: 401, 403, 404, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/backups/{backup_id}/content – Stáhnout zálohu `operationId`: `downloadBackup` · přihlášení: `oauth2`, oprávnění `backups:read` · https://api.mujprofirest.cz/v2/docs#tag/Backups/operation/downloadBackup Archiv ZIP zálohy tak, jak ho pokladna nahrála. Záloha, jejíž soubor už není uložený, vrátí `404 not_found`. Archiv obsahuje data provozovny – mimo zařízení ho neuchovávejte. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `backup_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Archiv. `application/zip`: string (binary) - chyby: 401, 403, 404, 406, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Diagnostics Stav, chyby a logy vlastních zařízení Profirestu pro provozovnu a podporu Profirestu. Zařízení každou minutu přihlásí stav (`checkInDevice`), chyby hlásí hned (`reportDeviceError`) a log si drží u sebe; celý log nahraje jen na vyžádání (příkaz `upload_logs`, `putLogUploadPart`). Hlášení chyb od uživatelů (`createBugReport`) jdou podpoře e-mailem. Reference: https://api.mujprofirest.cz/v2/docs#tag/Diagnostics ### POST /restaurants/{restaurant_id}/device-logs – Poslat logy zařízení `operationId`: `createDeviceLogs` · přihlášení: `oauth2`, oprávnění `diagnostics:write` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/createDeviceLogs **Zastaralé (26.10.6):** záznamy logu už nejdou do databáze po řádcích. Log nechte na zařízení, chyby hlaste hned přes `reportDeviceError` a celý log nahrajte jen na vyžádání (`checkInDevice`, `putLogUploadPart`). Operace starším aplikacím dál funguje a později se odstraní. Dávka záznamů logu zařízení pro podporu Profirestu (nejvýš 500 záznamů, tělo nejvýš 1 MB). Varování a chyby server ukládá vždy, `debug` a `info` jen dokud má podpora Profirestu u provozovny zapnuté podrobné logování – `min_level` v odpovědi (`warning`, nebo tehdy `debug`) říká, co se teď ukládá; nižší záznamy se přijmou a zahodí, takže je zařízení posílat nemusí. Z jednoho zařízení se za den uloží nejvýš 20 000 záznamů; nad to se dávka přijme a zahodí (`stored` je menší než `received`). Záznamy se drží 2 dny od chvíle, kdy se staly (`logged_at`). Do zpráv nikdy nedávejte hesla, PINy ani tokeny; tokeny tohoto API se stejně zamaskují. Opakované odeslání dávku uloží znovu – logy jsou diagnostika a duplicita nevadí, proto bez `Idempotency-Key`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Bez `Idempotency-Key` (viz popis). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: DeviceLogBatch – pole `events` Odpovědi: - 202: Dávka je zpracovaná. `application/json`: DeviceLogResult – pole `received`, `stored`, `min_level` - chyby: 400, 401, 403, 404, 413, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/bug-reports – Nahlásit chybu `operationId`: `createBugReport` · přihlášení: `oauth2`, oprávnění `diagnostics:write` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/createBugReport Hlášení chyby od uživatele zařízení pro podporu Profirestu s nedávnými záznamy logu, které zařízení přiloží. Hlášení jde podpoře e-mailem spolu s tím, co zařízení za poslední hodinu poslalo do `device-logs`. `code` vymýšlí zařízení a ukazuje ho uživateli, který ho může nadiktovat do telefonu; stejný kód ze stejného zařízení se zapíše jednou (`200` s prvním hlášením). Z jednoho zařízení nejvýš 10 hlášení za hodinu, pak `429 rate_limited`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: BugReportCreate – pole `code`, `description`, `employee_name`, `app_version`, `db_version`, `os_version`, `device_model`, `device_ip`, `mode`, `server_id`, `logs` Odpovědi: - 201: Hlášení je zapsané a odeslané podpoře. `application/json`: BugReport – pole `code`, `received_at`, `logs_attached` - 200: Hlášení s tímto kódem z tohoto zařízení už je zapsané. `application/json`: BugReport – pole `code`, `received_at`, `logs_attached` - chyby: 400, 401, 403, 404, 413, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/device-checkin – Přihlásit stav zařízení `operationId`: `checkInDevice` · přihlášení: `oauth2`, oprávnění `diagnostics:write` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/checkInDevice Zařízení říká, že žije a v jakém je stavu, a vyzvedne si příkazy – asi 500 bajtů každých 60 sekund z kasy, každých 5 minut z telefonu číšníka s vlastním tokenem a internetem. Tělo je stav zařízení teď: verze, síť, fronty čekající na odeslání (účtenky, platby, tisk), poslední záloha, zařízení k němu připojená (`peers` – telefony číšníků, které s kasou mluví po místní síti a vlastní token nemají), volná `counters` (dotazy, broadcasty, chyby – co aplikace počítá), velikost vlastního úložiště logů a výsledky příkazů z minulé odpovědi. Logy samotné zůstávají na zařízení; server je dostane jen na vyžádání (níž) a chyby hned (`reportDeviceError`). Odpověď nese `commands` k vyřízení. `upload_logs` – podpora Profirestu nebo provozovna si vyžádala logy: pro každý cíl v `uploads` nahrajte log toho zařízení za období `from`–`to` s tokenem cíle (`putLogUploadPart`, `completeLogUpload`); kasa cíle svých číšníků předá po místní síti, cíl, který zařízení obsloužit nemůže, skončí přes `abortLogUpload`. `live_logs` – posílejte i varování a ke každé chybě víc kontextu až do `until`. `ping` – jen odpovědět. Každý příkaz se předá jednou, jen `upload_logs` přijde znovu (se stejnými tokeny), dokud některý jeho cíl 15 minut nic neposlal; co se s příkazem stalo, hlaste v `command_results` dalšího check-inu (`done`, `failed`, `unsupported`) – aplikace, která typ nezná, hlásí `unsupported`. Dokud příkaz čeká, nese každá odpověď tohoto API zařízení hlavičku `Profirest-Commands: pending` – přihlaste stav hned, nečekejte na další minutu. Ze stavu server odvozuje upozornění pro provozovnu a podporu Profirestu (účtenka neodeslaná 30 minut, platba čekající 10 minut, tisk visící 15 minut, záloha starší 3 dnů, kasa mlčící 5 minut v otevírací době, číšník odpojený 15 minut) – administrace je ukazuje u Zařízení. `server_time` v odpovědi dá zařízení posun hodin pro časy v jeho logu (`server_offset_ms` hlavičky logu); `next_in_seconds` říká, kdy přihlásit stav příště. Stejný stav poslaný znovu neškodí – bez `Idempotency-Key`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Bez `Idempotency-Key` (viz popis). *Od verze 26.10.6.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: DeviceCheckIn – pole `role`, `app_version`, `os_version`, `device_model`, `sent_at`, `uptime_seconds`, `battery`, `network`, `queues`, `last_backup_at`, `last_sync_at`, `log_store`, `counters`, `peers`, `command_results` Odpovědi: - 200: Stav je zapsaný; `commands` k vyřízení. `application/json`: DeviceCheckInResult – pole `server_time`, `api_target`, `next_in_seconds`, `commands` - chyby: 400, 401, 403, 404, 413, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/device-errors – Nahlásit chybu hned `operationId`: `reportDeviceError` · přihlášení: `oauth2`, oprávnění `diagnostics:write` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/reportDeviceError Jedna chyba (v živém režimu i varování) z logu zařízení hned, jak se stane, s řádky logu před ní (`context`, asi 30 řádků, od nejstaršího) – kolem 3 kB. Server ji drží jako soubor 90 dní a ukazuje v administraci (Zařízení → Chyby) a podpoře Profirestu; kasa hlásí i chyby svých číšníků (`peer_key`). Z jedné chyby server drží nejvýš 16 kB nejnovějších řádků kontextu a 16 kB `stack` a z jednoho zařízení nejvýš 1 MB takových souborů za den – nad to chybu zapíše bez nich. Tajemství maskujte na zařízení před odesláním (PINy, tokeny, čísla karet); tokeny tohoto API se zamaskují tak jako tak. `id` je UUID vytvořené na zařízení: stejné `id` z téhož zařízení se zapíše jednou (`200` s prvním záznamem). Z jednoho zařízení nejvýš 60 hlášení za hodinu, pak `429 rate_limited` – zbytek nechte na zařízení, podpora si může vyžádat celý log. `code` je z vlastního číselníku aplikace (`SOCK.timeout`, `PAY.pending`, `UI.crash` …), `area` část aplikace, `refs` ID platná v tu chvíli (směna, účet, pokus o platbu, požadavek) – stejná ID na kase i u číšníka skládají příběh dohromady. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. *Od verze 26.10.6.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: DeviceErrorCreate – pole `id`, `occurred_at`, `level`, `code`, `area`, `event`, `message`, `peer_key`, `employee_name`, `app_version`, `refs`, `context`, `stack` Odpovědi: - 201: Chyba je zapsaná. `application/json`: DeviceErrorResult – pole `id`, `received_at` - 200: Chyba s tímto `id` z tohoto zařízení už je zapsaná. `application/json`: DeviceErrorResult – pole `id`, `received_at` - chyby: 400, 401, 403, 404, 413, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /log-uploads/{upload_id} – Stav nahrávání logu `operationId`: `getLogUpload` · přihlášení: `logUpload` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/getLogUpload Jak je na tom jeden cíl příkazu `upload_logs`: které části server má (`parts_received`) a jestli je nahrávání ještě otevřené. Po přerušení ho přečtěte a pošlete jen chybějící části. Token cíle (`pfl_…` z příkazu) je `Authorization: Bearer` – žádný token zařízení, takže nahrává i telefon číšníka bez vlastního tokenu. *Od verze 26.10.6.* Parametry: - `upload_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Nahrávání. `application/json`: LogUploadStatus – pole `id`, `request_id`, `status`, `parts_received`, `parts_expected`, `bytes`, `from`, `to`, `detail`, `max_part_bytes`, `expires_at` - chyby: 401, 404, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /log-uploads/{upload_id}/parts/{part} – Nahrát část logu `operationId`: `putLogUploadPart` · přihlášení: `logUpload` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/putLogUploadPart Jedna část souboru logu: tělem je gzip (`Content-Type: application/gzip`), nejvýš 4 MB, s celými řádky NDJSON – server části po pořadí spojí do jednoho souboru gzip bez rozbalení (členy gzipu se dají zřetězit), takže každá část je sama o sobě úplný proud gzip. Části po 1–2 MB projdou i pomalou linkou; přerušené nahrávání pokračuje další částí, část poslaná znovu nahradí tu dřívější. Nahrávejte mimo frontu objednávek a plateb a během placení nahrávání pozastavte. Jedno nahrávání má nejvýš 200 MB, všechna nahrávání jedné žádosti dohromady 500 MB – nad to `413 payload_too_large` (vyžádejte kratší období nebo jen stopu). Když je úložiště serveru skoro plné, odpoví `503 service_unavailable` s `Retry-After`; log si nechte a zkuste to později. Požadavky na totéž nahrávání běží jeden po druhém – ten, který čeká příliš dlouho, odpoví `409 conflict` s `Retry-After`. Token cíle (`pfl_…`) je `Authorization: Bearer`. Dokončené nebo prošlé nahrávání odpoví `409 upload_closed`. Tělo: samotný soubor jako `application/gzip`, nejvýš 4 MB. *Od verze 26.10.6.* Parametry: - `upload_id` (path, povinný) – společný parametr - `part` (path, integer, povinný): Číslo části, od 1 po pořadí. - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/gzip`: string (binary) Odpovědi: - 200: Část je uložená. `application/json`: LogUploadStatus – pole `id`, `request_id`, `status`, `parts_received`, `parts_expected`, `bytes`, `from`, `to`, `detail`, `max_part_bytes`, `expires_at` - chyby: 400, 401, 404, 409, 413, 415, 422, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /log-uploads/{upload_id}/complete – Dokončit nahrávání logu `operationId`: `completeLogUpload` · přihlášení: `logUpload` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/completeLogUpload Všechny části jsou tam: `parts` říká kolik, server je spojí a nahrávání uzavře (`status` `done`). Chybějící část odpoví `422 upload_incomplete` s čísly v `detail` – pošlete je a dokončete znovu. `lines`, `from` a `to` popisují, co soubor nese (ukáže se podpoře). Dokončení už hotového nahrávání jen odpoví jeho stav. Bez `Idempotency-Key` (viz popis). *Od verze 26.10.6.* Parametry: - `upload_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LogUploadComplete – pole `parts`, `lines`, `from`, `to`, `sha256` Odpovědi: - 200: Nahrávání je dokončené. `application/json`: LogUploadStatus – pole `id`, `request_id`, `status`, `parts_received`, `parts_expected`, `bytes`, `from`, `to`, `detail`, `max_part_bytes`, `expires_at` - chyby: 400, 401, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /log-uploads/{upload_id}/abort – Vzdát nahrávání logu `operationId`: `abortLogUpload` · přihlášení: `logUpload` · https://api.mujprofirest.cz/v2/docs#tag/Diagnostics/operation/abortLogUpload Zařízení tento cíl obsloužit nemůže: `reason` `unsupported` (aplikace úložiště logů nemá), `no_data` (za období nic není – úložiště je kratší, zařízení bylo vypnuté), `failed` (chyba, přes kterou se zařízení nedostane, co přesně řekne `message`) nebo `declined`. Nahrávání se uzavře s tím stavem a podpora vidí proč. Už poslané části se zahodí. Bez `Idempotency-Key` (viz popis). *Od verze 26.10.6.* Parametry: - `upload_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: LogUploadAbort – pole `reason`, `message` Odpovědi: - 200: Nahrávání je uzavřené. `application/json`: LogUploadStatus – pole `id`, `request_id`, `status`, `parts_received`, `parts_expected`, `bytes`, `from`, `to`, `detail`, `max_part_bytes`, `expires_at` - chyby: 400, 401, 404, 409, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Device settings Co vlastní zařízení Profirestu potřebují k práci – údaje firmy, tiskové šablony, tiskárny, stoly, licence. Reference: https://api.mujprofirest.cz/v2/docs#tag/Device-settings ### GET /restaurants/{restaurant_id}/device-settings – Nastavení pro zařízení provozovny `operationId`: `getDeviceSettings` · přihlášení: `oauth2`, oprávnění `settings:read` · https://api.mujprofirest.cz/v2/docs#tag/Device-settings/operation/getDeviceSettings Vše nastavené v administraci, co potřebuje pokladna, kuchyňský displej nebo jiné zařízení provozovny: provozovna a firma na účtenkách (IČO, DIČ, plátce DPH), tiskové šablony (Tiskové sestavy), předdefinované poznámky, tiskárny a výrobní stanoviště rozdělené kuchyně, místnosti se stoly (když licence obsahuje mapu provozovny), nastavení kuchyně, původní nastavení EET 1.0 bez samotného certifikátu (EET 2.0 eviduje server a na zařízení se nic nenastavuje) a funkce licence. Ptejte se s `If-None-Match`; nezměněná odpověď je `304`. Žádná událost o změně neinformuje; ptejte se občas znovu. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Nastavení. `application/json`: DeviceSettings – pole `restaurant`, `company`, `receipt_layouts`, `predefined_notes`, `printers`, `kitchen_stations`, `rooms`, `kitchen`, `eet`, `features`, `paid_until`, `table_ordering`, `pos` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Customer directory Zákazníci celého účtu pro objednávky, které personál bere po telefonu – hledání podle telefonu nebo jména s jejich adresami a příchozí hovory. Jen pro vlastní zařízení Profirestu. Reference: https://api.mujprofirest.cz/v2/docs#tag/Customer-directory ### GET /restaurants/{restaurant_id}/customer-directory – Najít zákazníky podle telefonu nebo jména `operationId`: `searchCustomerDirectory` · přihlášení: `oauth2`, oprávnění `directory:read` · https://api.mujprofirest.cz/v2/docs#tag/Customer-directory/operation/searchCustomerDirectory Pro objednávku přijatou po telefonu. Zákazníci celého účtu – titíž, které administrace ukazuje v Zákaznících –, jejichž telefon začíná na `phone` nebo jejichž jméno obsahuje `name`, každý s jednou ze svých doručovacích adres: jeden výsledek na zákazníka a adresu, nejvýš 10. Napřed adresy s polohou, pak registrovaní zákazníci, pak naposledy přidané adresy. Zákazník bez adresy přijde jednou s `address: null`. Pošlete aspoň 2 číslice `phone` nebo 2 znaky `name`. Jedno zařízení hledá nejvýš 600krát za hodinu (`429 rate_limited` s `Retry-After` do další hodiny). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `phone` (query, string): Začátek telefonního čísla. Mezery a předvolba `+420` nebo `00420` se nepočítají. - `name` (query, string): Část jména zákazníka nebo začátek jeho přihlašovacího jména do e-shopu. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Nalezení zákazníci s adresami. `application/json`: CustomerDirectoryList – pole `data` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/calls – Nahlásit příchozí hovor `operationId`: `reportCall` · přihlášení: `oauth2`, oprávnění `calls:write` · https://api.mujprofirest.cz/v2/docs#tag/Customer-directory/operation/reportCall Telefon provozovny hlásí hovor. Odpověď řekne, kdo volá – zákazníka, počet jeho objednávek a adresu posledního rozvozu z této provozovny – a kuchyňské displeje provozovny dostanou událost `call.received`. Číslo, které účet ještě nezná, se jako dnes přidá mezi zákazníky, aby ho ukázaly i obrazovky, které hovory čtou postaru. Bez `Idempotency-Key`: nové nahlášení téhož hovoru ho jen nahlásí znovu. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Bez `Idempotency-Key` (viz popis). Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: CallReport – pole `phone`, `kind` Odpovědi: - 200: Kdo volá. `application/json`: IncomingCall – pole `phone`, `kind`, `received_at`, `customer`, `last_address` - chyby: 400, 401, 403, 404, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/calls/latest – Hovor posledních 45 sekund `operationId`: `getLatestCall` · přihlášení: `oauth2`, oprávnění `directory:read` · https://api.mujprofirest.cz/v2/docs#tag/Customer-directory/operation/getLatestCall Poslední hovor nahlášený za posledních 45 sekund, jak ho dnes kuchyňský displej ukazuje u nové objednávky; `call: null`, když žádný není. Jako dnes zahrnuje hovory celého účtu včetně těch, které nahlásily starší aplikace. Hovory nahlášené přes `POST …/calls` přicházejí zařízením jejich provozovny i jako `call.received`; hovory ze starších aplikací ne. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Poslední hovor, nebo `null`. `application/json`: LatestCall – pole `call` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Table ordering Hosté objednávají od stolu a volají obsluhu ze svého telefonu. O všem rozhoduje hlavní kasa podniku a hosty na Wi-Fi podniku obsluhuje sama (její místní API); tyto operace jsou záložní cesta přes internet pro telefony, které se k ní nedostanou (`/table/…`, s tokenem telefonu u stolu), a spojení hlavní kasy s cloudem (schránka žádostí, zrcadlo stavů, heartbeat). Jen pro vlastní aplikace Profirestu. Reference: https://api.mujprofirest.cz/v2/docs#tag/Table-ordering ### POST /table/sessions – Připojit se ke stolu kódem z QR `operationId`: `startTableSession` · přihlášení: bez přihlášení nebo `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/startTableSession Záložní cesta objednávání od stolu pro telefon, který se k hlavní kase podniku nedostane přes jeho Wi-Fi. Aplikace hosta pošle kód stolu z QR kódu (`table_code`) a dostane token tohoto telefonu u tohoto stolu. O všem rozhoduje hlavní kasa: požadavky k ní jdou přes cloud, proto je `ordering.blocked_reason` `connecting`, dokud si kasa telefon nepřevezme (obvykle během pár sekund). Token posílejte jako `Authorization: Bearer pfg_…` u ostatních operací této skupiny. Na nic jiného nejde, platí nejvýš 12 hodin a jen do konce návštěvy stolu (`410 visit_ended`). Když aplikace už má token téhož stolu, pošlete ho také: týž telefon dostane nový token, místo aby z něj byl další telefon. Tuto operaci volejte jen poté, co host naskenoval QR kód (nebo klepl na „začít znovu“), nikdy sama po `visit_ended` – telefon nechaný otevřený se nesmí přidat k další skupině u stolu. `table_not_found` – žádný stůl nemá tento kód; `ordering_disabled` – podnik objednávky od stolu nebere. Nejvýš 20 požadavků za minutu z jedné adresy. Bez `Idempotency-Key` (viz popis). *Od verze 26.10.4.* Parametry: - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableSessionStart – pole `table_code` Odpovědi: - 201: Nový telefon u stolu. `application/json`: TableSessionCreated – pole `token`, `expires_at`, `session` - 200: Týž telefon (token, který jste poslali) s novým tokenem; starý přestane platit. `application/json`: TableSessionCreated – pole `token`, `expires_at`, `session` - chyby: 404, 422, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /table/session – Stůl, jak ho vidí tento telefon `operationId`: `getTableSession` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/getTableSession Provozovna a stůl, návštěva stolu (`null`, dokud si telefon nepřevezme hlavní kasa), tento telefon, jestli a jak teď jde objednat (`ordering`), kód pro kamarády u stolu (jen ověřenému telefonu) a otevřená volání tohoto telefonu. Čtěte znovu po každé akci a každých 10 sekund, dokud je aplikace otevřená; `ordering.can_order` a `blocked_reason` říkají, co ukázat. *Od verze 26.10.4.* Parametry: - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Stůl. `application/json`: TableSession – pole `path`, `restaurant`, `table`, `visit`, `device`, `ordering`, `join`, `calls` - chyby: 401, 410, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /table/session/join – Přidat se ke skupině kódem od kamaráda `operationId`: `joinTable` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/joinTable Čtyři číslice, které ukazuje ověřený telefon u stolu (`TableSession.join.code`). Kód ověří hlavní kasa a odpoví přes cloud: odpověď je `202` se žádostí; čtěte ji přes `getTableRequest`, dokud `status` není `done` (telefon je ověřený – vidí účet a jeho objednávky nemusí čekat na obsluhu) nebo `failed` (`error.code`: `join_code_invalid` s `attempts_left`, `join_locked`, `join_not_available`). Po 5 špatných kódech se telefon zamkne, dokud ho obsluha neodemkne. Počítá se každý pokus – další pošlete, až bude předchozí rozhodnutý. `join_not_available` – podnik kód od kamaráda nepoužívá; `join_locked` – tento telefon je zamčený; `restaurant_offline` – hlavní kasa není připojená, zkuste to později nebo požádejte obsluhu. Bez `Idempotency-Key` (viz popis). *Od verze 26.10.4.* Parametry: - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableJoinInput – pole `code` Odpovědi: - 202: Předáno hlavní kase; výsledek čtěte přes `getTableRequest`. `application/json`: TableRequest – pole `id`, `kind`, `status`, `result`, `error` - chyby: 401, 409, 410, 422, 423, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /table/requests/{request_id} – Odpověď hlavní kasy na žádost tohoto telefonu `operationId`: `getTableRequest` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/getTableRequest Žádost, kterou tento telefon poslal přes cloud (`joinTable`, `cancelTableOrder`, `cancelTableCall`). `queued` – hlavní kasa ještě nerozhodla; čtěte znovu za 2 sekundy. `done` nebo `failed` je konečné. *Od verze 26.10.4.* Parametry: - `request_id` (path, Id, povinný): `TableRequest.id`. Žádosti jiných telefonů vrátí 404. - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Žádost. `application/json`: TableRequest – pole `id`, `kind`, `status`, `result`, `error` - chyby: 401, 404, 410, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /table/menu – Co si host může objednat od stolu `operationId`: `getTableMenu` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/getTableMenu Produkty kategorií, které podnik pro objednávky od stolu povolil, s cenami pokladny. `available: false` – teď vyprodané; ukažte ho, ale nedovolte ho přidat. `age_restricted` – věk kontroluje obsluha při podání. Čtěte s `If-None-Match`; mění se, když podnik změní sortiment. *Od verze 26.10.4.* Parametry: - `If-None-Match` (header) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Menu. `application/json`: TableMenu – pole `currency`, `generated_at`, `categories`, `products`, `allergens` - 304: Od zaslaného ETagu se nic nezměnilo. - chyby: 401, 410, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /table/orders – Objednávky tohoto telefonu `operationId`: `listTableOrders` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/listTableOrders Objednávky, které tento telefon u tohoto stolu poslal, od nejnovější (nejvýš 50), se stavem, jak ho hlásí hlavní kasa. Objednávky jiných telefonů tu nejsou; ověřený telefon vidí celý účet v `getTableTab`. *Od verze 26.10.4.* Parametry: - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Objednávky. `application/json`: TableOrderList – pole `data` - chyby: 401, 410, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /table/orders – Poslat objednávku na stůl `operationId`: `createTableOrder` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/createTableOrder `id` je UUID, které aplikace vytvoří, když host klepne na „objednat“; při opakování ho zachovejte (i přes druhou cestu – hlavní kasa ho zná). Stejné `id` se stejným tělem vrátí objednávku s `200`; s jiným tělem `422 idempotency_key_mismatch`. Cloud kontroluje jen to, co host může hned opravit (produkt je v menu a není vyprodaný, nejvýš `max_quantity` kusů), a objednávku předá hlavní kase: vrátí se `202` se `status` `submitted`. Kasa rozhodne podle pravidel podniku – `pending_confirmation` (čeká na obsluhu), `accepted`, nebo `rejected` s `reason_code` a `reason`. Čtěte `listTableOrders` každých 5 sekund, dokud objednávka neopustí `submitted` a `pending_confirmation`. Objednávka, kterou si kasa nepřevezme do čekací doby podniku, skončí jako `expired`. `ordering_disabled`, `ordering_paused` – podnik teď objednávky od stolu nebere (zavolat obsluhu jde); `product_not_orderable`, `product_unavailable`, `validation_failed` – viz `errors`; `too_many_pending_orders` – na obsluhu čekají 3 objednávky tohoto telefonu; `restaurant_offline` – hlavní kasa není připojená. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. *Od verze 26.10.4.* Parametry: - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableOrderCreate – pole `id`, `lines`, `note` Odpovědi: - 202: Předáno hlavní kase (`status` `submitted`). `application/json`: TableOrder – pole `id`, `visit_id`, `device_id`, `device_nickname`, `from_verified_device`, `status`, `reason_code`, `reason`, `lines`, `note`, `total`, `created_at`, `decided_at` - 200: Toto `id` už bylo odeslané; objednávka, jak je teď. `application/json`: TableOrder – pole `id`, `visit_id`, `device_id`, `device_nickname`, `from_verified_device`, `status`, `reason_code`, `reason`, `lines`, `note`, `total`, `created_at`, `decided_at` - chyby: 401, 409, 410, 422, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /table/orders/{order_id}/cancel – Požádat o zrušení objednávky, která ještě čeká na obsluhu `operationId`: `cancelTableOrder` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/cancelTableOrder Jen objednávka ve stavu `submitted` nebo `pending_confirmation` (jinak `order_not_cancellable`). Rozhodne hlavní kasa: odpověď čtěte přes `getTableRequest` – `done` (objednávka je `cancelled`) nebo `failed` s `order_not_cancellable` (obsluha ji mezitím přijala). Bez `Idempotency-Key` (viz popis). *Od verze 26.10.4.* Parametry: - `order_id` (path, string (uuid), povinný): `TableOrder.id` tohoto telefonu; objednávky jiných telefonů vrátí 404. - `Accept-Language` (header) – společný parametr Odpovědi: - 202: Předáno hlavní kase. `application/json`: TableRequest – pole `id`, `kind`, `status`, `result`, `error` - chyby: 401, 404, 409, 410, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /table/calls – Zavolat obsluhu ke stolu `operationId`: `createTableCall` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/createTableCall `waiter` – přijďte ke stolu; `bill` – host chce platit (u obsluhy, platba mobilem sem nepatří). Funguje i při pozastavených objednávkách. Dokud je volání stejného druhu z tohoto telefonu otevřené, dostanete místo druhého to první s `200`. Volání dojde na displej baru přes hlavní kasu: `submitted`, dokud si ho kasa nepřevezme, pak `open`, `acknowledged`, když ho obsluha potvrdí. Bez `Idempotency-Key` (viz popis). *Od verze 26.10.4.* Parametry: - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableCallCreate – pole `kind` Odpovědi: - 202: Předáno hlavní kase. `application/json`: TableCall – pole `id`, `kind`, `status`, `created_at`, `acknowledged_at` - 200: Volání tohoto druhu už je otevřené; to volání. `application/json`: TableCall – pole `id`, `kind`, `status`, `created_at`, `acknowledged_at` - chyby: 401, 410, 422, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /table/calls/{call_id}/cancel – Požádat o zrušení volání `operationId`: `cancelTableCall` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/cancelTableCall Volání zruší hlavní kasa; odpověď čtěte přes `getTableRequest`. Bez `Idempotency-Key` (viz popis). *Od verze 26.10.4.* Parametry: - `call_id` (path, string (uuid), povinný): `TableCall.id` tohoto telefonu; volání jiných telefonů vrátí 404. - `Accept-Language` (header) – společný parametr Odpovědi: - 202: Předáno hlavní kase. `application/json`: TableRequest – pole `id`, `kind`, `status`, `result`, `error` - chyby: 401, 404, 410, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /table/tab – Účet stolu `operationId`: `getTableTab` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/getTableTab Všechno na účtu stolu, i to, co namarkovala obsluha a co objednaly jiné telefony – jen pro ověřený telefon (jinak `device_not_verified`). Tak, jak ho naposledy poslala hlavní kasa; `404`, dokud stůl účet nemá. *Od verze 26.10.4.* Parametry: - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Účet. `application/json`: TableTab – pole `visit_id`, `items`, `total`, `updated_at` - chyby: 401, 403, 404, 410, 429 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /table/events – Upozornění na změny pro telefon u stolu (Server-Sent Events) `operationId`: `streamTableEvents` · přihlášení: `tableGuest` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/streamTableEvents Stejné jako události místního API hlavní kasy: dlouhá odpověď `text/event-stream`, jejíž zprávy říkají jen, co se změnilo (`TableGuestEvent` – typ a ID), nikdy jak; stav si aplikace pak načte GETem (`getTableSession`, `listTableOrders`, `getTableTab`). Typy: `session` (změnil se telefon, návštěva nebo objednávání – přijatý kód od kamaráda, pozastavené objednávky, kasa zase online), `orders` (objednávka tohoto telefonu, `id` je objednávka), `calls` (volání tohoto telefonu, `id` je volání), `tab` (účet stolu), `visit_ended` (poslední zpráva – pak se proud zavře a token přestane platit). Telefon dostává jen zprávy o sobě a své návštěvě, zhruba do sekundy po změně. Po 25 sekundách bez zprávy přijde komentář `: ping`; proud trvá nejvýš 10 minut, pak se připojte znovu. Nejvýš 2 proudy na jeden telefon – třetí zavře nejstarší. Token patří do hlavičky `Authorization`; `EventSource` hlavičky neumí, proud čtěte přes `fetch`. Když proud není k dispozici (`503`, výpadek sítě), načítejte stav GETem každých 5 sekund, dokud něco čeká, jinak každých 30 sekund – stejně jako u hlavní kasy. *Od verze 26.11.3.* Parametry: - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Proud zpráv `TableGuestEvent` (`event:` typ, `data:` JSON) a komentářů `: ping`. `text/event-stream`: string (binary) - chyby: 401, 406, 410, 429, 503 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/table/heartbeat – Hlavní kasa žije `operationId`: `putTableHeartbeat` · přihlášení: `oauth2`, oprávnění `table:sync` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/putTableHeartbeat Jen hlavní kasa provozovny (zařízení, které obsluhuje objednávky od stolu po Wi-Fi podniku). Posílejte ho každých 30 sekund, dokud je objednávání od stolu zapnuté, a hned při změně pauzy. 90 sekund po posledním bere cloud kasu jako online (`online_seconds`); potom hosté na záložní cestě dostanou `restaurant_offline`. `local` je adresa místního API kasy (pro podporu a administraci), `paused` pauza nových objednávek. `inbox_pending` – žádosti hostů čekající ve schránce: hned si je přečtěte přes `listTableInbox`. Novou dřív ohlásí událost `table.inbox_received`. Provozovna má jednu hlavní kasu: dokud heartbeat posílá jedno zařízení, jiné dostane `409 main_device_conflict` (ukažte to obsluze – dvě kasy nesmí obě brát objednávky od stolů). Převzít může 90 sekund po posledním heartbeatu té první. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableHeartbeatInput – pole `paused`, `local`, `app_version`, `guest_app_version` Odpovědi: - 200: Zapsáno. `application/json`: TableHeartbeat – pole `server_time`, `inbox_pending`, `online_seconds` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### GET /restaurants/{restaurant_id}/table/inbox – Žádosti hostů ze záložní cesty `operationId`: `listTableInbox` · přihlášení: `oauth2`, oprávnění `table:sync` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/listTableInbox Žádosti hostů, které se místo ke kase dostaly do cloudu, od nejstarší (nejvýš 100). Každou zpracujte stejným kódem jako stejný požadavek na místním API a výsledek pošlete přes `completeTableInboxItem`; do té doby tu položka zůstane. `kind` a `payload`: - `session_started` – nový telefon u stolu: `{device_id, table_id, table_code}`; výsledek `{visit_id, nickname}` (`visit_id` `null`, dokud stůl nemá návštěvu), nebo `failed` (`ordering_disabled`). - `join_requested` – `{device_id, code}`; `done` telefon ověří, `failed` s `join_code_invalid` (a `attempts_left`), `join_locked` nebo `join_not_available`. - `order_submitted` – `{device_id, order}` (`order`, jak ho poslal telefon, `TableOrderCreate`); výsledek `{order}` s objednávkou, jak o ní kasa rozhodla, nebo `failed` s důvodem (objednávka bude `rejected`). - `order_cancel_requested` – `{device_id, order_id}`; výsledek `{order}`, nebo `failed` s `order_not_cancellable`. - `call_requested` – `{device_id, call: {id, kind}}`; výsledek `{call}`. - `call_cancel_requested` – `{device_id, call_id}`; výsledek `{call}`. - `staff_action` – rozhodnutí obsluhy z webového kuchyňského displeje: `{action, order_id, call_id, device_id, reason, employee}` s `action` `accept_order`, `reject_order`, `acknowledge_call` nebo `unlock_device`; výsledek `{}` nebo `{order}` / `{call}`. Žádost starší než čekací doba podniku (`expire_minutes`) se nevydá: starou `order_submitted` cloud sám ukončí jako `expired`, takže objednávka poslaná během výpadku nikdy nedojde do kuchyně pozdě. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Odpovědi: - 200: Čekající žádosti. `application/json`: TableInboxPage – pole `data` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/table/inbox/{item_id} – Výsledek žádosti hosta `operationId`: `completeTableInboxItem` · přihlášení: `oauth2`, oprávnění `table:sync` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/completeTableInboxItem `done` s `result`, nebo `failed` s `error` (kód a věta pro hosta, viz `listTableInbox`). Host ho uvidí hned a podle něj se změní objednávka, volání nebo telefon v cloudu; co z výsledku nejde poznat (pozdější stavy, účet), pošlete přes `putTableState`. Stejný výsledek poslat znovu je v pořádku (ztracená odpověď); jiný výsledek k rozhodnuté položce je `409 inbox_item_conflict`. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `item_id` (path, Id, povinný): `TableInboxItem.id`. - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableInboxResultInput – pole `status`, `result`, `error` Odpovědi: - 200: Zapsáno. `application/json`: TableInboxCompletion – pole `id`, `kind`, `status`, `error_code`, `done_at` - chyby: 401, 403, 404, 409 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### PUT /restaurants/{restaurant_id}/table/state – Zrcadlo stavu stolů z hlavní kasy `operationId`: `putTableState` · přihlášení: `oauth2`, oprávnění `table:sync` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/putTableState Zdrojem pravdy je hlavní kasa. Po každé změně pošlete změněné návštěvy, telefony, objednávky a volání – i z místní cesty, aby je cloud ukázal hostům na záložní cestě, na webovém kuchyňském displeji a v administraci. Každý objekt nese svou `version` (číslo, které na kase roste s každou změnou): cloud si nechá vyšší a starší nebo stejnou přeskočí, takže opakovaná nebo opožděná dávka po výpadku nic nezmění. Objekty stolů jiných provozoven se přeskočí (`skipped`). Návštěva se `state` `closed` ukončí tokeny svých telefonů na záložní cestě (`visit_ended`); telefon s `revoked: true` také. `tab` je účet stolu pro ověřené telefony (`getTableTab`). **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableStateInput – pole `visits`, `devices`, `orders`, `calls` Odpovědi: - 200: Zapsáno. `application/json`: TableStateResult – pole `applied`, `skipped` - chyby: 401, 403, 404 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ### POST /restaurants/{restaurant_id}/table/orders/{order_id}/apply – Zapsat přijatou objednávku od stolu na účet a do kuchyně `operationId`: `applyTableOrder` · přihlášení: `oauth2`, oprávnění `table:sync` · https://api.mujprofirest.cz/v2/docs#tag/Table-ordering/operation/applyTableOrder Když hlavní kasa přijme objednávku od stolu (obsluha na kase nebo na displeji baru, nebo podle pravidel podniku bez obsluhy), přidá její řádky na účet stolu touto operací, ne přes `putTab` – na kase nemusí být přihlášený zaměstnanec a řádky se jen přidávají, takže není potřeba `If-Match`. `tab_id` je účet návštěvy; nové UUID otevře nový účet s `table_name`. S `kitchen` server udělá i kuchyňský bon zadaných řádků (jako `createKitchenTicket`) a označí je jako poslané do kuchyně. `accepted_by_id` je zaměstnanec, který objednávku přijal (na displeji baru ten, kdo je tam přihlášený); `null`, když ji přijala pravidla. Účet a jeho log pak ukážou `updated_by` s `id` `0` a jménem telefonu. S relací zaměstnance v `Profirest-Staff-Token` se použije její zaměstnanec. ID objednávky v adrese ji dělá idempotentní: stejná objednávka znovu vrátí účet s `200` a nic nezapíše; jiné řádky pro stejnou objednávku jsou `409 conflict`. `tab_closed` – účet se mezitím zaplatil nebo uzavřel: ukončete objednávku jako `cancelled` a řekněte to obsluze. **Jen pro spárované zařízení** vlastních aplikací Profirestu (párování kódem, `POST /oauth/device_authorization`). Jiné tokeny dostanou `403 device_required`. Když je na zařízení přihlášený zaměstnanec, pošlete `Profirest-Staff-Token`; zápis se zapíše na něj. Proti dvojímu zápisu hlídá ID, které zařízení posílá v těle (viz popis), ne `Idempotency-Key`. *Od verze 26.10.4.* Parametry: - `restaurant_id` (path, povinný) – společný parametr - `order_id` (path, string (uuid), povinný): `TableOrder.id` – UUID, které objednávce dal telefon. - `Profirest-Staff-Token` (header) – společný parametr - `Accept-Language` (header) – společný parametr Tělo požadavku (povinné): - `application/json`: TableOrderApplyInput – pole `tab_id`, `table_name`, `accepted_by_id`, `device_nickname`, `lines`, `kitchen` Odpovědi: - 201: Zapsáno. `application/json`: TableOrderApplied – pole `tab`, `kitchen_ticket` - 200: Tato objednávka už je zapsaná; účet, jak je teď. `application/json`: TableOrderApplied – pole `tab`, `kitchen_ticket` - chyby: 401, 403, 404, 409, 422 (kódy v https://api.mujprofirest.cz/v2/docs/errors) ## Schémata Pole objektů z těl požadavků a odpovědí (povinné = pole je vždy v odpovědi, v požadavku ho musíte poslat). ### Id Neprůhledný identifikátor. Nerozkládejte ho. Typ: string ### ExternalId Vaše vlastní ID z vašeho systému. Unikátní pro typ objektu v rámci vašeho připojení. Typ: string ### Metadata Vaše vlastní dvojice klíč–hodnota (nejvýš 20). Typ: object ### MetadataInput Až 20 vašich vlastních dvojic klíč–hodnota. Klíče mají 1–40 znaků `a-z`, `0-9`, `_`. Hodnoty jsou řetězce o 1–500 znacích. Nahradí všechna vaše metadata. Neukládejte sem tajné údaje ani údaje o kartách. Typ: object ### MetadataPatch Poslané klíče se nastaví; klíč s `null` se odebere; ostatní klíče zůstanou. Celkem nejvýš 20 klíčů. Typ: object ### Money Částka v nejmenších jednotkách (haléře u CZK, centy u EUR) a měna podle ISO 4217. - `amount` (integer, povinné): Nejmenší jednotky. U slev záporná. - `currency` (string, povinné) ### MoneyInput Částka v nejmenších jednotkách a měna podle ISO 4217. - `amount` (integer, povinné): Nejmenší jednotky, nejvýš 9 999 999 999 (99 999 999,99 – strop částek EET 2.0). - `currency` (string, povinné) ### VatRate Sazba DPH v procentech jako desetinný řetězec. Typ: string ### Timestamp Okamžik podle RFC 3339 s posunem. Typ: string (date-time) ### LocalDate Kalendářní datum v časové zóně provozovny. Typ: string (date) ### LocalTime Místní čas `HH:MM` v časové zóně provozovny. `24:00` znamená půlnoc na konci dne. Typ: string ### Phone Telefonní číslo ve formátu E.164. Přijímáme jakoukoli zemi. Typ: string ### Email Typ: string (email) ### GeoPoint - `lat` (number, povinné) - `lon` (number, povinné) ### GeoPointInput - `lat` (number, povinné) - `lon` (number, povinné) ### VatBreakdown - `rate` (VatRate, povinné) - `base` (Money, povinné): Částka bez DPH. - `vat` (Money, povinné) - `total` (Money, povinné): Částka s DPH. ### ApiRoot - `name` (string, povinné) - `version` (string, povinné): Verze této smlouvy (`info.version` v `openapi.json`) – RR.M.N, rok, měsíc a pořadí vydání v měsíci; porovnávejte číselně po částech. - `docs_url` (string (uri), povinné) - `oauth_metadata_url` (string (uri), povinné) - `stream_url` (string (uri) | null (uri), povinné): Adresa živého proudu změn (`streamEvents`, Server-Sent Events), nebo `null`, když služba proudu neběží – pak se ptejte přes `GET /events` a zeptejte se znovu za pár minut. Proud i `GET /events`… - `server_time` (Timestamp, povinné) ### AppVersionList - `data` (AppVersion[], povinné) - `next_cursor` (string | null, povinné): Vždy `null` – celý seznam v jedné odpovědi. ### AppVersion - `app` (string, povinné): Aplikace, jak ji pojmenovává administrace (Super → Software): `bar` – pokladna pro Windows; `kitchen` – kuchyňská aplikace pro Windows (bony, telefonické objednávky a objednávky z e-shopu; ne… Známé hodnoty (mohou přibýt další): `bar`, `kitchen`, `server`, `mobile`, `mobile_android`, `mobile_alpha`, `kitchen_windows` (od 26.11.1) - `channel` (string, povinné): `stable` – vydaná verze; `beta` – testovací verze. Každý kanál má svou nejnovější verzi, beta tedy může být starší než ostrá. Známé hodnoty (mohou přibýt další): `stable`, `beta` - `version` (string, povinné) - `critical` (boolean, povinné): Profirest označil aktualizaci jako kritickou – starší verzi už nepoužívejte. Server označení jen předává. - `released_at` (Timestamp, povinné): Kdy byla verze nahraná do Profirestu. - `download_url` (string (uri) | null (uri), povinné): Odkud verzi stáhnout; `null`, když soubor uložený není. - `changelog` (string | null, povinné): Co se změnilo, jak to Profirest napsal; `null`, když nic. - `sha256` (string | null, povinné): SHA-256 souboru z `download_url` malými hex znaky – stažený soubor před instalací ověřte; `null`, když Profirest otisk souboru nemá (nebo soubor není). - `size` (integer | null, povinné): Velikost souboru z `download_url` v bajtech; `null`, když není známá (nebo soubor není). ### Connection - `id` (Id, povinné) - `client` (object, povinné) - `id` (string, povinné) - `name` (string, povinné) - `order_channel` (string, povinné): Kdo zadává objednávky vaší aplikace. `web` – zákazníci sami (e-shop): platí příjem objednávek (`getOrderHours`), časy rozvozu, předstih a nastavení objednávek na čas. `staff` – personál podniku… Známé hodnoty (mohou přibýt další): `web`, `staff`, `kiosk` (od 26.10.4) - `account_id` (Id, povinné) - `scopes` (string[], povinné) - `restaurant_ids` (Id[], povinné) - `settings` (object, povinné): Nastavení, která pro toto připojení zvolil majitel v Profirestu. - `customer_messages` (string, povinné): Kdo posílá vašim zákazníkům zprávy o objednávce (potvrzení, hotovo, na cestě). `integrator` – vy; `profirest` – Profirest pošle SMS z kreditu majitele. Známé hodnoty (mohou přibýt další): `integrator`, `profirest` - `created_at` (Timestamp, povinné) - `device` (Device | null, povinné): Spárované zařízení, kterému token patří; `null` u aplikace připojené majitelem. ### Device - `id` (Id, povinné) - `name` (string, povinné) - `restaurant_id` (Id, povinné) - `platform` (string | null, povinné) - `app_version` (string | null, povinné) - `paired_at` (Timestamp, povinné) - `api_target` (ApiTarget | null, povinné): Kde má zařízení být – jen u vlastní pokladny, kuchyňského displeje a kurýra Profirestu; jinak `null`. ### ApiTarget Které API mají zařízení provozovny používat – Profirest pouští provozovny na API v2 jednu po druhé a umí je vrátit. Každá odpověď aplikaci pokladny, kuchyňského displeje nebo kurýra Profirestu nese totéž v hlavičce `Profirest-Api-Target: v1 | v2` (i API v1). Při `v1` dokončete rozdělanou práci, odešlete frontu, počkejte náhodně 0–90 sekund a přihlaste se v API v1 uloženou identitou (`createLegacyIdentity`); tokeny API v2 přestanou platit. - `target` (string, povinné): Od verze 26.11.6: `v1`, `v2`. Hodnoty: `v1`, `v2`. - `base_url` (string (uri), povinné): Adresa API v2. ### LegacyIdentityRequest - `v1_device_id` (string, povinné): `DEVICE_ID`, který by aplikace poslala v API v1 (aplikace kurýra ID telefonu). ### LegacyIdentity Identita API v1: pokladna se přihlásí `app_key`, `login` a `device_id` (`get_token`), kuchyňský displej posílá `token` jako `Authorization: Bearer`, kurýr se přihlásí `login` a `password`. - `kind` (string, povinné): Od verze 26.11.6: `pos`, `kds`, `courier`. Hodnoty: `pos`, `kds`, `courier`. - `login` (string, povinné) - `device_id` (string, povinné) - `app_key` (string | null, povinné): Jen pokladna, jinak `null`. - `token` (string | null, povinné): Jen kuchyňský displej, jinak `null`. - `password` (string | null, povinné): Jen kurýr, jinak `null`. ### EmployeeRef - `id` (Id, povinné) - `name` (string, povinné) ### StaffMember - `id` (Id, povinné) - `name` (string, povinné) - `roles` (string[], povinné): Co smí zaměstnanec na zařízeních této provozovny: `pos` (pokladna a mobilní číšník), `pos_manager` (manažerské akce na pokladně), `kitchen` (kuchyňský displej), `kitchen_manager` (manažerské akce v… - `attendance` (object, povinné) - `enabled` (boolean, povinné): Zaměstnanec se na této provozovně vede v docházce a smí tu píchat. - `sign_in` (object, povinné): Jak se zaměstnanec může přihlásit. Samotný PIN ani číslo čipu se nikdy nevracejí. - `pin` (boolean, povinné) - `card` (boolean, povinné) - `offline_approval` (OfflineApproval | null, povinné): Jen v `GET …/staff` pro spárovanou pokladnu (`receipts:write`) a jen u vedoucích pokladny s PINem, jinak `null`. Co pokladna potřebuje ke schválení ruční slevy a ceny na offline účtence. - `offline_sign_in` (OfflineApproval | null, povinné): Jen v `GET …/staff` pro spárovanou pokladnu (`receipts:write`) a jen u zaměstnanců s rolí `pos` nebo `pos_manager` a PINem, jinak `null`. Přihlášení na pokladně bez spojení (spustila se offline)… ### OfflineApproval Schválení ruční slevy a ceny na offline účtence vedoucím pokladny. Pokladna PIN zkontroluje na překlep pomocí `check` a účtenku podepíše; server podpis ověří, až účtenka dorazí (`approval_signature`). Oficiální knihovny to spočítají za vás. - `salt` (string, povinné): 16 bajtů v base64url bez zarovnání. - `iterations` (integer, povinné) - `check` (integer, povinné) ### StaffMemberPage - `data` (StaffMember[], povinné) - `next_cursor` (string | null, povinné) ### StaffCredential PIN nebo čip zadaný na zařízení. - `method` (string, povinné): `pin` – PIN zaměstnance; `card` – číslo načtené z čipu zaměstnance. Hodnoty: `pin`, `card`. - `secret` (string, povinné): PIN (jen číslice) nebo číslo načtené z čipu. - `employee_id` (Id | null): Zaměstnanec vybraný po `409 staff_ambiguous`. ### StaffPinChange Současný a nový PIN přihlášeného zaměstnance. - `current_pin` (string, povinné) - `new_pin` (string, povinné): 4 až 9 číslic, nezačíná nulou. ### StaffSession - `token` (string, povinné): Posílejte ho v hlavičce `Profirest-Staff-Token`. Držte ho jen v paměti. - `expires_at` (Timestamp, povinné): Kdy relace skončí, když se nepoužije. Každé použití ji posune o `idle_timeout_seconds`. - `max_expires_at` (Timestamp, povinné): Nejpozději v tuto chvíli relace skončí. - `idle_timeout_seconds` (integer, povinné): Kolik sekund bez použití relace vydrží. 300 na sdílených zařízeních (kuchyňský displej, recepce); pokladna a mobilní číšník (`profirest-pos`, od 26.11.27), kurýr a pokojská mají relaci na celou… - `employee` (StaffMember, povinné) ### AttendanceTerminal Jak docházkový terminál provozovny vypadá a co smí. - `restaurant_name` (string, povinné) - `branding` (object, povinné): Vzhled provozovny z administrace; hodnoty `null` znamenají vzhled Profirestu. - `logo_url` (string (uri) | null (uri), povinné): Logo provozovny (PNG, JPEG, SVG nebo WebP); `null` – ukažte logo Profirestu. - `accent_color` (string | null, povinné): Barva značky na tlačítkách a zvýrazněních; `null` – oranžová Profirestu `#ff8c00`. - `theme` (string, povinné): Tmavá (`dark`, výchozí) nebo světlá (`light`) obrazovka. Známé hodnoty (mohou přibýt další): `dark`, `light` - `welcome_text` (string | null, povinné): Krátký text pod hodinami, třeba pozdrav týmu. - `offline` (object, povinné) - `allowed` (boolean, povinné): Píchnutí bez sítě smí terminál uložit a poslat později (`POST …/attendance/punches/batch`). - `max_age_hours` (integer, povinné): Jak staré smí být píchnutí bez sítě, když dorazí. - `absence_requests` (AbsenceRequestRules, povinné) ### AttendanceState `off` – není v práci, `working` – ve směně, `on_break` – na přestávce během směny. Typ: string. Známé hodnoty (mohou přibýt další): `off`, `working`, `on_break` ### AttendancePresence - `employee` (EmployeeRef, povinné) - `state` (AttendanceState, povinné) - `since` (Timestamp | null, povinné): Kdy začal aktuální stav (příchod nebo začátek přestávky); u `off` je `null`. - `shift_started_at` (Timestamp | null, povinné) ### AttendancePresencePage - `data` (AttendancePresence[], povinné) - `next_cursor` (string | null, povinné) ### AttendancePunchCreate - `id` (string (uuid), povinné): Vaše UUID píchnutí vytvořené na zařízení (doporučujeme UUIDv7). - `type` (string, povinné): `clock_in` – příchod, začne směnu (ne během běžící směny); `clock_out` – odchod, ukončí směnu i běžící přestávku; `break_start` – přestávka během směny; `break_end` – návrat z přestávky. Hodnoty: `clock_in`, `clock_out`, `break_start`, `break_end`. - `occurred_at` (Timestamp | null): Kdy člověk píchl. U živého píchnutí ho vynechte. - `credential` (StaffCredential | null): PIN nebo čip zadaný při píchnutí; vynechte ho, když posíláte `Profirest-Staff-Token`. ### AttendancePunchOffline Píchnutí pořízené bez sítě; vždy nese PIN nebo čip, který byl při něm zadaný. - `id` (string (uuid), povinné) - `type` (string, povinné): Jako `AttendancePunchCreate.type`. Hodnoty: `clock_in`, `clock_out`, `break_start`, `break_end`. - `occurred_at` (Timestamp, povinné) - `credential` (StaffCredential, povinné) ### AttendancePunchBatch - `items` (AttendancePunchOffline[], povinné) ### AttendanceShift Směna, ke které píchnutí patří. Délky jsou známé po odchodu. - `started_at` (Timestamp, povinné) - `ended_at` (Timestamp | null, povinné) - `break_minutes` (integer | null, povinné): Přestávky směny v minutách. - `worked_minutes` (integer | null, povinné): Odpracovaná doba podle pravidel docházky provozovny (tolerance, přestávky, přesčasy). ### AttendancePunch - `id` (string (uuid), povinné) - `employee` (EmployeeRef, povinné) - `type` (string, povinné): `clock_in` – příchod, `clock_out` – odchod, `break_start` – začátek přestávky, `break_end` – konec přestávky. Známé hodnoty (mohou přibýt další): `clock_in`, `clock_out`, `break_start`, `break_end` - `occurred_at` (Timestamp, povinné): Čas zapsaný do docházky. - `received_at` (Timestamp, povinné) - `offline` (boolean, povinné): Pořízeno offline, s časem ze zařízení. - `state` (AttendanceState, povinné): Stav zaměstnance po píchnutí. - `shift` (AttendanceShift, povinné) ### AttendancePunchBatchItem - `id` (string (uuid), povinné) - `status` (string, povinné): `created` – zapsáno teď; `duplicate` – toto `id` už bylo zapsáno dřív (`punch` je ten první výsledek; znovu poslaný obsah se neporovnává); `rejected` – nezapsáno, viz `problem` a `retryable`. Známé hodnoty (mohou přibýt další): `created`, `duplicate`, `rejected` - `retryable` (boolean, povinné): Položka ještě rozhodnutá není (třeba zamčený PIN); pošlete ji později znovu se stejným `id`. - `punch` (AttendancePunch | null, povinné) - `problem` (Problem | null, povinné) - `employee` (EmployeeRef | null, povinné): U odmítnuté položky zaměstnanec, kterému přihlašovací údaj patřil, když ho server poznal (odmítlo pravidlo, ne PIN) – vedoucí pak ví, komu záznam ručně doplnit. Jinak `null`. ### AttendancePunchBatchResult - `results` (AttendancePunchBatchItem[], povinné) ### AbsenceType `holiday` – dovolená, `unpaid` – neplacené volno, `sick` – nemoc. Typ: string. Známé hodnoty (mohou přibýt další): `holiday` (od 26.10.7), `unpaid` (od 26.10.7), `sick` (od 26.10.7) ### AbsenceRequestRules Pravidla provozovny pro žádosti o volno na terminálu (nastavují se v administraci). - `enabled` (boolean, povinné): Zaměstnanci smí na terminálu žádat o volno. - `types` (AbsenceType[], povinné): O jaké volno se smí žádat. - `notice_days` (integer, povinné): Dovolená a neplacené volno nejméně tolik dní předem; nemoc od dneška. - `max_days` (integer, povinné): Nejvýš tolik dní v jedné žádosti. - `horizon_days` (integer, povinné): Poslední den nejvýš tolik dní od dneška. ### AttendanceScheduleItem - `type` (string, povinné): `work` – pracovní směna; `holiday`, `unpaid`, `sick` – volno jako u `AbsenceType`. Známé hodnoty (mohou přibýt další): `work` (od 26.10.7), `holiday` (od 26.10.7), `unpaid` (od 26.10.7), `sick` (od 26.10.7) - `starts_at` (Timestamp, povinné) - `ends_at` (Timestamp, povinné): Konec; volno přes celé dny končí o půlnoci po svém posledním dni. - `section` (AttendanceSectionRef | null, povinné): Sekce pracovní směny; `null` bez sekce a u volna. ### AttendanceSectionRef - `id` (Id, povinné) - `name` (string, povinné) ### AttendanceSchedule - `employee` (EmployeeRef, povinné) - `from` (LocalDate, povinné): První den (dnešek). - `to` (LocalDate, povinné): Poslední zahrnutý den. - `items` (AttendanceScheduleItem[], povinné) ### AbsenceRequestCreate - `type` (AbsenceType, povinné) - `date_from` (LocalDate, povinné): První den volna. - `date_to` (LocalDate, povinné): Poslední den volna (včetně); u jednoho dne stejný jako `date_from`. - `note` (string | null): Poznámka pro vedoucího, nejvýš 300 znaků. ### AbsenceRequest - `id` (Id, povinné) - `type` (AbsenceType, povinné) - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `days` (integer, povinné): Kalendářní dny žádosti včetně obou krajních. - `note` (string | null, povinné) - `status` (string, povinné): `pending` – čeká na vedoucího, `approved` – je v rozpisu, `rejected` – zamítnutá (proč, říká `decision_note`), `cancelled` – zaměstnanec ji vzal zpět. Známé hodnoty (mohou přibýt další): `pending` (od 26.10.7), `approved` (od 26.10.7), `rejected` (od 26.10.7), `cancelled` (od 26.10.7) - `decided_automatically` (boolean, povinné): Schválená podle pravidel provozovny bez vedoucího. - `created_at` (Timestamp, povinné) - `decided_at` (Timestamp | null, povinné) - `decision_note` (string | null, povinné): Poznámka vedoucího k rozhodnutí, třeba proč žádost zamítl. ### AbsenceRequestList - `data` (AbsenceRequest[], povinné) ### KitchenTicket Jedna objednávka tak, jak ji vidí kuchyně, z jakéhokoli zdroje – z pokladen, e-shopu, rozvozových platforem, kuchyňského displeje i aplikací – s jejími položkami. Peníze objednávky jsou v `total`, `delivery_price` a `payment_method`; ceny položek jsou u položek a účtenka k vytištění pro rozvoz je `receipt`. Pořadník (`queue:read`) bony nedostává nikdy – jen `KitchenQueue`. - `id` (Id, povinné): ID kuchyňského bonu – `ticket_id` v adresách. - `order_id` (Id, povinné): ID objednávky v Profirestu (doklad v administraci), ne `Order.id` aplikací. - `number` (string | null, povinné): Krátké číslo pro kuchyň a zákazníka, nejméně tři číslice (`042`, `1027`); po každé uzávěrce celé směny kuchyně začíná znovu od 1 (uzávěrka kurýra ho nenuluje). `null`, když žádné nemá. - `status` (string, povinné): `received` – čeká ve frontě, `preparing` – kuchyně začala, `ready` – hotovo, `out_for_delivery` – hotovo a na trase kurýra, `delivered` – vydáno nebo doručeno, `not_delivered` – kurýr ji nemohl… Známé hodnoty (mohou přibýt další): `received`, `preparing`, `ready`, `out_for_delivery`, `delivered`, `not_delivered` (od 26.11.2), `cancelled` - `area` (string, povinné): `bar` u každé objednávky z pokladny (`source` `pos`) – bonů otevřených stolů i účtenek poslaných do kuchyně; `kitchen` u všech ostatních. Výdej baru (`listKitchenTickets?area=bar`) ukazuje jen bony… Známé hodnoty (mohou přibýt další): `kitchen`, `bar` - `source` (string, povinné): Odkud objednávka přišla – `pos` (pokladna), `kitchen` (kuchyňský displej nebo aplikace personálu), `web` (e-shop, partnerské aplikace, rozvozové platformy). Známé hodnoty (mohou přibýt další): `pos`, `kitchen`, `web` - `platform` (string | null, povinné): Rozvozová platforma, ze které objednávka přišla, poznaná podle názvu objednávky jako na kuchyňském displeji a pořadníku (`Wolt #…`); u ostatních objednávek `null`. Objednávky platforem mají `source`… Známé hodnoty (mohou přibýt další): `wolt` (od 26.10.4), `bolt` (od 26.10.4), `foodora` (od 26.10.4), `choice` (od 26.10.4) - `name` (string | null, povinné): Jméno u objednávky – stůl, zákazník nebo rozvozová platforma s číslem objednávky. - `fulfillment` (string, povinné): `delivery` – rozvoz na `delivery_address`; `takeaway` – s sebou nebo osobní odběr (objednávky vytvořené přes toto API jsou vždy `delivery` nebo `takeaway`); `dine_in` – vše ostatní: jídlo v… Známé hodnoty (mohou přibýt další): `dine_in`, `takeaway`, `delivery` - `express` (boolean, povinné): Expresní doručení – na displeji, tištěném bonu i u kurýra ukažte výrazný štítek EXPRES. Je to přednost bez slíbeného času: pořadí bonů se nemění, kdy ho vzít, rozhodne kuchyně. Samotný příplatek je… - `customer` (object | null, povinné): Zákazník z databáze klientů provozovny, ke kterému objednávka patří, jak je tam uložený (jméno se od `name` může lišit velikostí písmen); `null`, když objednávka žádného nemá nebo jsou obě hodnoty… - `delivery_address` (object | null, povinné): Jen u `delivery`, jinak `null`. `street` je ulice s číslem, jak je uložená, `city` může být prázdné, `location` je `null`, když adresa nemá souřadnice. - `delivery_zone` (object | null, povinné): Rozvozová zóna, do které padne adresa objednávky s `delivery` (`id` a `name` jako v `listDeliveryZones`). Spočítá ji Profirest z polohy adresy pravidly e-shopu: zóna, která rozvážela v čase, na… - `note` (string | null, povinné): Poznámka objednávky pro kuchyň a kurýra; `null`, když je prázdná. U objednávek vytvořených přes toto API je složená z plateb (třeba dárkový voucher se zamaskovaným kódem `ABC-*… - `payment_method` (string, povinné): Jak se objednávka platí – `cash` (zákazník platí hotově při převzetí, nebo zaplatil hotově u pokladny), `card_at_handover` (platí kartou při převzetí, kurýrovi nebo při výdeji; nic hotově), `card`… Známé hodnoty (mohou přibýt další): `cash`, `card_at_handover`, `card`, `meal_voucher`, `company_account`, `invoice` - `total` (Money, povinné): Částka objednávky včetně dopravy, po odečtení dárkových voucherů (jsou to záporné řádky objednávky), ale ne online platby. Čte se ze záznamu objednávky kuchyně, který drží jen 6 platných číslic: od… - `delivery_price` (Money, povinné): Cena dopravy obsažená v `total`, v celých korunách. - `amount_due` (Money, povinné): Co zbývá vybrat při převzetí, hotově nebo kartou: u `cash` a `card_at_handover` `total` bez části zaplacené online přes toto API, `0` po zapsání platby (`handoverTicketPayment`). `0` u objednávek… - `paid_by` (PaidBy | null, povinné): Čím a kdy kurýr u dveří vybral platbu (`handoverTicketPayment`); předtím `null`. - `created_at` (Timestamp, povinné): Kdy objednávka přišla do kuchyně. - `scheduled_for` (Timestamp | null, povinné): Čas, na který zákazník objednal; `null`, když co nejdřív. - `printed` (boolean, povinné): Některý displej potvrdil vytištění bonu (`markKitchenTicketPrinted`); po přidání položek znovu `false`. - `courier` (EmployeeRef | null, povinné): Kurýr, se kterým objednávka odjela (`createDeliveryRoute`); předtím `null` a znovu, když se objednávka vrátí do `received` nebo `preparing`. - `not_delivered` (NotDeliveredInfo | null, povinné): Hlášení kurýra, dokud je bon `not_delivered` (`markTicketNotDelivered`); jinak `null`. - `items` (KitchenItem[], povinné): Položky v pořadí přidání; přísady a další části položky jsou její `modifiers`. - `receipt` (KitchenTicketReceipt | null, povinné): Účtenka objednávky jako kopie účtenky v administraci – k vytištění pro kurýra nebo zákazníka; `null`, když ji nejde sestavit. ### KitchenTicketReceipt Částky účtenky kuchyňského bonu, které spočítá server stejně jako kopii účtenky v administraci a webový kuchyňský displej. `total` = `items` + součet `discounts` + `delivery` + `rounding` + `adjustment`; `to_pay` je `total` po dárkových voucherech (co zákazník platí jinak) a rovná se `KitchenTicket.total`. Na storno dokladu mají částky opačné znaménko. - `items` (Money, povinné): Položky včetně obalů, po slevách na položky (ceny řádků), bez úhrad dárkovými vouchery. - `discounts` (object[], povinné): Slevy na celý účet v pořadí účtenky. - `name` (string, povinné): Název akce, nebo „Sleva na účet“ / „Sleva na účet 10 %“ u slevy bez akce. - `amount` (Money, povinné): Záporná částka. - `delivery` (Money, povinné): Cena dopravy. - `rounding` (Money, povinné): Zaokrouhlení celkové částky, méně než jedna koruna oběma směry. - `adjustment` (Money, povinné): Úprava ceny po objednání (uložený součet se od řádků liší víc než o zaokrouhlení); obvykle nula. - `total` (Money, povinné): Úplata za celý účet. - `to_pay` (Money, povinné): Co zákazník platí jinak než dárkovým voucherem – totéž co `KitchenTicket.total`. - `vat` (VatBreakdown[], povinné): DPH po sazbách jako na účtence – slevy na účet, doprava a úpravy rozdělené do sazeb položek; sazby s nulovým součtem chybí. Tiskněte ho jen u plátce DPH (`DeviceSettings.company.vat_payer`). - `document` (object, povinné) - `title` (string, povinné): „Účtenka“, u storno dokladu „Storno účtenky“. - `number` (string, povinné): Číslo dokladu jako na kopii účtenky v administraci. - `tax_document` (string, povinné): „Zjednodušený daňový doklad“ u plátce DPH s DIČ do limitu zjednodušeného daňového dokladu; jinak prázdný řetězec (neplátce, storno, nad limit). ### KitchenItem - `id` (Id, povinné) - `product_id` (Id | null, povinné) - `name` (string, povinné) - `kitchen_name` (string | null, povinné): Kuchyňský název produktu, když ho má. - `note` (string | null, povinné) - `quantity` (number, povinné) - `kind` (string, povinné): `full` – celá porce; `half` – poloviční porce (z pokladny, kuchyňského displeje nebo `QuoteItemInput.variant` `half`); `split_half` / `split_quarter` – polovina nebo čtvrtina dělené pizzy (první… Známé hodnoty (mohou přibýt další): `full`, `half`, `split_half`, `split_quarter`, `virtual` - `charge` (string | null, povinné): Poplatek zapsaný jako řádek objednávky, ne jídlo: `minimum_order_surcharge` – doplatek do minimální objednávky zóny; `express_delivery` – expresní doručení (bon má `express`). V seznamu jídel a na… Známé hodnoty (mohou přibýt další): `minimum_order_surcharge` (od 26.10.5), `express_delivery` (od 26.10.5) - `course` (integer, povinné): Číslo chodu, od 0 pro první chod; chody se vydávají postupně. - `category` (object, povinné): Kategorie produktu v sortimentu, podle které položky seskupují výrobní stanoviště i výdej. Přísady patří do kategorie své položky; řádek bez kategorie má `id` `0` a název `Ostatní`. `id` použijte… - `id` (Id, povinné) - `name` (string, povinné) - `from_daily_menu` (boolean, povinné): Prodáno přes denní menu; kuchyňský displej to označí, ať to kuchař pozná. - `station_id` (Id | null, povinné): Výrobní stanoviště, které položku dělá, když má provozovna rozdělenou kuchyni. Může ukazovat na stanoviště, které už není aktivní, a to `listStationTickets` odpoví `404`. - `status` (string, povinné): `pending` – ještě není hotová; `done` – výrobní stanoviště ji odbavilo (`completeStationSegment`; vzetím akce zpět je znovu `pending`). Známé hodnoty (mohou přibýt další): `pending`, `done` - `handed_out` (boolean, povinné): Výdej už ji odnesl zákazníkovi (`POST …/handover`). - `part` (integer | null, povinné): U dělené pizzy (`kind` `split_half` / `split_quarter`) `1` – položka je první díl; další díly i přísady každého dílu jsou v `modifiers` se svým `part`. U ostatních položek `null`. - `size` (KitchenItemSize | null, povinné): Velikost produktu jako štítek před názvem, stejně jako na webovém kuchyňském displeji: `name` – jen velikost („Ø32cm“), `dish_name` – zobrazený název (`kitchen_name`, jinak `name`) bez velikosti.… - `unit_price` (Money, povinné): Cena za kus po slevě `discount`, bez obalu – řádek účtenky je `quantity` × (`unit_price` + `packaging_price`). U dárku `0`. - `packaging_price` (Money, povinné): Obal za kus. - `discount` (Money, povinné): Sleva na kus z akce nebo z pokladny, už odečtená v `unit_price`; záporně, bez slevy `0`. Cena před slevou je `unit_price` − `discount`. - `gift` (boolean, povinné): Dárek z akce (cena `0` a plná cena v `discount`). Kus zdarma z „2+1“ ani ruční 100% sleva dárek nejsou – mají jen slevu. - `vat_rate` (VatRate, povinné): Sazba DPH řádku. - `removed_ingredients` (string[], povinné): Názvy surovin, které host z jídla odebral (u dělené pizzy z prvního dílu – ostatní díly je mají v `modifiers`), v pořadí složení; prázdné, když nic neodebral. Ukažte je výrazně u jídla stejně jako… - `modifiers` (KitchenModifier[], povinné): Přísady, volby a další části, které k položce patří. ### KitchenItemSize - `name` (string, povinné): Jen velikost, jak ji pojmenuje sada („Ø42cm“, „300 g“) – jako `ProductSize.name`. - `dish_name` (string, povinné): Zobrazený název bez velikosti („Margherita“). ### KitchenModifier Část kuchyňské položky – přísada nebo další část dělené pizzy: řádky objednávky, které patří ke stejné položce. Pole znamenají totéž co v `KitchenItem`. - `id` (Id, povinné) - `charge` (string | null, povinné): Jako `KitchenItem.charge` – další sazba DPH poplatku; u přísad a částí jídel `null`. Známé hodnoty (mohou přibýt další): `minimum_order_surcharge` (od 26.10.5), `express_delivery` (od 26.10.5) - `product_id` (Id | null, povinné): Produkt; `null` u řádku bez produktu. - `name` (string, povinné): Aktuální název produktu (u řádku bez produktu název z objednávky). - `kitchen_name` (string | null, povinné): Kuchyňský název produktu, když ho má. - `note` (string | null, povinné): Poznámka řádku. - `quantity` (number, povinné): Kusy; desetinná čísla u položek na váhu. - `kind` (string, povinné): Jako `KitchenItem.kind`; u části dělené pizzy `split_half` nebo `split_quarter`. Známé hodnoty (mohou přibýt další): `full`, `half`, `split_half`, `split_quarter`, `virtual` - `status` (string, povinné): Jako `KitchenItem.status`. Známé hodnoty (mohou přibýt další): `pending`, `done` - `handed_out` (boolean, povinné): Jako `KitchenItem.handed_out`. - `part` (integer | null, povinné): Díl dělené pizzy, ke kterému řádek patří, od 1 (samotná položka je díl 1): díl začíná řádkem `split_half` / `split_quarter` a jeho přísady jdou za ním. `null`, když položka není dělená pizza. - `size` (KitchenItemSize | null, povinné): Jako `KitchenItem.size`. - `unit_price` (Money, povinné): Jako `KitchenItem.unit_price` – cena přílohy nebo dílu za kus po slevě `discount`. - `packaging_price` (Money, povinné): Jako `KitchenItem.packaging_price`. - `discount` (Money, povinné): Jako `KitchenItem.discount`. - `gift` (boolean, povinné): Jako `KitchenItem.gift`. - `vat_rate` (VatRate, povinné): Jako `KitchenItem.vat_rate`. - `removed_ingredients` (string[], povinné): Jako `KitchenItem.removed_ingredients` – u další části dělené pizzy (`kind` `split_half` / `split_quarter`) suroviny odebrané z toho dílu; u přísad prázdné. ### StationTicketList - `data` (StationTicket[], povinné) ### StationTicket - `ticket` (KitchenTicket, povinné) - `working` (boolean, povinné): Toto stanoviště na objednávce pracuje. - `other_stations` (object[], povinné): Další stanoviště, která na stejné objednávce pracují. - `id` (Id, povinné) - `name` (string, povinné) - `courses` (object[], povinné): Položky tohoto stanoviště podle chodů a kategorií, jak je ukazuje obrazovka stanoviště. - `course` (integer, povinné) - `done` (boolean, povinné) - `categories` (object[], povinné) - `id` (Id, povinné) - `name` (string, povinné) - `done` (boolean, povinné) - `item_ids` (Id[], povinné) ### ShiftTotals - `orders` (integer, povinné): Objednávky ve směně v jakémkoli stavu. - `completed` (Money, povinné): Tržba – hotové a vydané nebo doručené objednávky včetně dopravy. - `by_payment` (object, povinné): Tržba podle platby. - `cash` (Money, povinné) - `card` (Money, povinné) - `meal_voucher` (Money, povinné) - `company_account` (Money, povinné) - `invoice` (Money, povinné) - `not_completed` (Money, povinné): Objednávky, které ještě čekají nebo se připravují – zatím nezaplacené; zůstanou do další směny. - `not_delivered` (object, povinné): Objednávky, které zákazník od kurýra nepřevzal (`not_delivered`) a provozovna je ještě nevyřešila – počet a hodnota. Nejsou v tržbě, hotovost se za ně nečeká a uzávěrka je nechá do další směny… - `orders` (integer, povinné) - `total` (Money, povinné) - `cancelled` (Money, povinné) ### KitchenShiftSummary - `orders` (integer, povinné): Objednávky ve směně v jakémkoli stavu. - `completed` (Money, povinné): Tržba – hotové a vydané nebo doručené objednávky včetně dopravy. - `by_payment` (object, povinné): Tržba podle platby. - `cash` (Money, povinné) - `card` (Money, povinné) - `meal_voucher` (Money, povinné) - `company_account` (Money, povinné) - `invoice` (Money, povinné) - `not_completed` (Money, povinné): Objednávky, které ještě čekají nebo se připravují – zatím nezaplacené; zůstanou do další směny. - `not_delivered` (object, povinné): Objednávky, které zákazník od kurýra nepřevzal (`not_delivered`) a provozovna je ještě nevyřešila – počet a hodnota. Nejsou v tržbě, hotovost se za ně nečeká a uzávěrka je nechá do další směny… - `orders` (integer, povinné) - `total` (Money, povinné) - `cancelled` (Money, povinné) - `courier_id` (Id | null, povinné): Kurýr, na kterého jsou součty omezené; `null` za celou směnu. - `couriers` (ShiftTotals & object[], povinné): Tytéž součty po kurýrech; `courier: null` u objednávek bez kurýra. - `orders` (integer, povinné): Objednávky ve směně v jakémkoli stavu. - `completed` (Money, povinné): Tržba – hotové a vydané nebo doručené objednávky včetně dopravy. - `by_payment` (object, povinné): Tržba podle platby. - `cash` (Money, povinné) - `card` (Money, povinné) - `meal_voucher` (Money, povinné) - `company_account` (Money, povinné) - `invoice` (Money, povinné) - `not_completed` (Money, povinné): Objednávky, které ještě čekají nebo se připravují – zatím nezaplacené; zůstanou do další směny. - `not_delivered` (object, povinné): Objednávky, které zákazník od kurýra nepřevzal (`not_delivered`) a provozovna je ještě nevyřešila – počet a hodnota. Nejsou v tržbě, hotovost se za ně nečeká a uzávěrka je nechá do další směny… - `orders` (integer, povinné) - `total` (Money, povinné) - `cancelled` (Money, povinné) - `courier` (EmployeeRef | null, povinné) ### KitchenShiftCloseRequest - `courier_id` (Id | null): Uzavřít jen objednávky tohoto kurýra; chybějící nebo `null` uzavře celou směnu. ### KitchenShiftClose - `id` (Id, povinné): Uzávěrka v administraci. - `closed_at` (Timestamp, povinné) - `closed_by` (EmployeeRef, povinné) - `closed_orders` (integer, povinné): Objednávky, které do uzávěrky přešly. Smazané se uzavřou taky, ale nepočítají se a samy uzávěrku nepovolí. - `numbering_reset` (boolean, povinné): Číslování kuchyně začíná znovu od 1 (jen u celé směny). - `summary` (KitchenShiftSummary, povinné): Součty tak, jak byly při uzávěrce. ### EventKitchenShiftData - `shift_id` (Id, povinné) - `courier_id` (Id | null, povinné) - `closed_orders` (integer, povinné): Jako `KitchenShiftClose.closed_orders` (smazané objednávky se nepočítají). ### KitchenTicketItemsAdd - `items` (QuoteItemInput[], povinné) - `channel` (string): Sortiment, ze kterého položky jsou, jako `channel` u `GET /catalog`: `kitchen` – nabídka objednávky kuchyňského displeje („K“), `pos` – pokladna („B“), `web` – e-shop („W“). Ceny jsou ve všech… Hodnoty: `kitchen`, `pos`, `web`. ### StationSegmentComplete - `scope` (string, povinné): `order` – všechny otevřené položky objednávky (přes všechny chody); `course` – otevřené položky jednoho chodu (`course`); `category` – otevřené položky jedné kategorie sortimentu v chodu (`course` a… Hodnoty: `order`, `course`, `category`. - `course` (integer | null): Chod u `course` a `category`. - `category_id` (Id | null): Kategorie u `category`. ### ProductionAction - `id` (Id, povinné) - `ticket_id` (Id | null, povinné) - `kind` (string, povinné): `production` (odbaveno na stanovišti), `handover` nebo `order_complete` (na výdeji). Známé hodnoty (mohou přibýt další): `production`, `handover`, `order_complete` - `scope` (string, povinné): Segment, kterého se akce týkala, jako `StationSegmentComplete.scope` – `order`, `course` nebo `category`. Známé hodnoty (mohou přibýt další): `order`, `course`, `category` - `name` (string, povinné): Co se udělalo, pro člověka, např. „Pizza · 2. chod“. - `item_count` (integer, povinné) - `undone` (boolean, povinné) - `created_at` (Timestamp, povinné) - `employee` (EmployeeRef | null, povinné) ### ProductionActionList - `data` (ProductionAction[], povinné) ### KitchenQueue - `preparing` (KitchenQueueNumber[], povinné) - `ready` (KitchenQueueNumber[], povinné) ### KitchenQueueNumber - `ticket_id` (Id, povinné) - `number` (string, povinné) - `since` (Timestamp, povinné): Kdy objednávka přišla, nebo čas, na který byla objednaná. ### KitchenTicketPage - `data` (KitchenTicket[], povinné) - `next_cursor` (string | null, povinné) - `preorders_later` (integer, povinné): Kolik předobjednávek čeká víc než 2 hodiny dopředu (pro odznak na displeji). ### KitchenTicketStatusChange - `status` (string, povinné): `received` – zpět do fronty (sundá objednávku z trasy kurýra); `preparing` – kuchyně začala (také ji sundá z trasy); `ready` – hotovo, čeká na výdej nebo kurýra; `delivered` – vydáno. Hodnoty: `received`, `preparing`, `ready`, `delivered`. ### KitchenTicketCancel - `reason` (string | null, povinné): Proč, pro historii objednávky. S `write_off` a bez důvodu se použije důvod z hlášení kurýra (`not_delivered`). - `write_off` (boolean): Odepsat objednávku – tržba se vrátí, sklad ne (jídlo je uvařené a ztracené). ### Courier - `employee` (EmployeeRef, povinné) - `on_shift` (boolean, povinné) - `on_shift_since` (Timestamp | null, povinné) - `open_routes` (integer, povinné): Kolik tras aktuální směny kurýr ještě rozváží – počítá se jako `listDeliveryRoutes` se `status=open`, takže trasa, jejíž objednávky už zahrnula uzávěrka kuchyně, se nepočítá. ### CourierPage - `data` (Courier[], povinné) - `next_cursor` (string | null, povinné) ### CourierTelemetryBatch Co telefon kurýra naměřil od minulé dávky. Kterákoli část může chybět. - `samples` (CourierTelemetrySample[]): Body trasy v libovolném pořadí – server je seřadí podle `recorded_at`. - `driving_events` (DrivingEventInput[]): Prudké manévry, které telefon poznal podle `thresholds` z minulé odpovědi. - `device` (CourierDeviceStateInput | null): Stav telefonu teď; když chybí nebo je `null`, zůstane poslední. ### CourierTelemetrySample - `recorded_at` (Timestamp, povinné): Kdy telefon bod změřil – ne kdy ho odeslal. Milisekundy se zachovají. - `location` (CourierLocationInput, povinné) - `speed_mps` (number | null): Rychlost z GPS v metrech za sekundu (ne spočítaná ze vzdálenosti bodů). - `heading_deg` (number | null): Směr jízdy ve stupních po směru hodinových ručiček od severu. - `altitude_m` (number | null): Nadmořská výška v metrech. - `accel_peak_g` (number | null): Nejvyšší zrychlení bez gravitace od předchozího bodu, v g. - `route_id` (Id | null): Trasa, kterou kurýr jede, včetně cesty zpět do provozovny; `null` bez trasy. ### CourierLocationInput - `lat` (number, povinné) - `lon` (number, povinné) - `accuracy_m` (number | null): Přesnost polohy v metrech. ### DrivingEventInput - `type` (string, povinné): Jaký to byl manévr – viz `DrivingEventType`. Hodnoty: `harsh_braking`, `harsh_acceleration`, `sharp_turn`. - `recorded_at` (Timestamp, povinné): Kdy manévr začal. - `value_g` (number, povinné): Špička přetížení během manévru v g – podélně u brzdění a zrychlení, bočně u zatáčky. - `duration_ms` (integer | null): Jak dlouho přetížení drželo nad prahem. - `speed_mps` (number | null): Rychlost na začátku manévru v metrech za sekundu. - `location` (CourierLocationInput | null) - `route_id` (Id | null): Trasa, kterou kurýr jel; `null` bez trasy. ### CourierDeviceStateInput Stav telefonu. `null` v poli znamená, že to telefon neví. - `battery_pct` (integer | null) - `charging` (boolean | null) - `network` (string | null): Připojení telefonu – viz `CourierNetwork`. Hodnoty: `wifi`, `cellular`, `none`, `unknown`, `None`. - `activity` (string | null): Jak se kurýr pohybuje podle pohybových senzorů telefonu – viz `CourierActivity`. Hodnoty: `still`, `walking`, `running`, `cycling`, `vehicle`, `unknown`, `None`. - `mock_location` (boolean | null): Telefon hlásí podvrženou polohu (aplikace na falešné GPS). - `location_permission` (string | null): Co kurýr aplikaci povolil – viz `LocationPermission`. Hodnoty: `always`, `while_in_use`, `denied`, `unknown`, `None`. - `power_save` (boolean | null): Telefon šetří energii – měření na pozadí může zastavit. - `app_version` (string | null) ### CourierTelemetryResult - `accepted` (integer, povinné): Body a manévry zapsané teď. - `duplicates` (integer, povinné): Body a manévry zapsané už dřív – dávka přišla znovu. - `discarded` (integer, povinné): Zahozené – mimo směnu, starší než 24 hodin, napřed proti serveru, nebo je sledování vypnuté. - `mode` (CourierTrackingMode, povinné) - `off_reason` (CourierTrackingOffReason | null, povinné): Proč je `mode` `off`; jinak `null`. - `send_every_s` (integer | null, povinné): Další dávku pošlete za tolik sekund; `null` u `off`. - `sample_every_s` (integer | null, povinné): Bod berte takhle často za jízdy (a po 25 m); `null` u `off`. - `thresholds` (DrivingThresholds, povinné) - `server_time` (Timestamp, povinné): Čas serveru – podle něj opravte hodiny telefonu. ### CourierTrackingMode `route` – kurýr má otevřenou trasu, dávku každých 15 s; `shift` – na směně bez trasy, každých 60 s; `off` – přestaňte měřit. Typ: string. Známé hodnoty (mohou přibýt další): `route` (od 26.11.20), `shift` (od 26.11.20), `off` (od 26.11.20) ### CourierTrackingOffReason `tracking_disabled` – provozovna sledování kurýrů nezapnula; `off_shift` – kurýr není na směně; `idle` – na směně bez trasy přes 3 hodiny (zapomenuté odhlášení), znovu začněte s novou trasou. Typ: string. Známé hodnoty (mohou přibýt další): `tracking_disabled` (od 26.11.20), `off_shift` (od 26.11.20), `idle` (od 26.11.20) ### DrivingThresholds Prahy prudkých manévrů v g podle provozovny (nebo výchozí). - `harsh_braking_g` (number, povinné): Zpomalení aspoň takhle silné je prudké brzdění. - `harsh_acceleration_g` (number, povinné): Zrychlení aspoň takhle silné je prudké zrychlení. - `sharp_turn_g` (number, povinné): Boční přetížení aspoň takhle silné je ostrá zatáčka. ### DrivingEventType `harsh_braking` – prudké brzdění; `harsh_acceleration` – prudké zrychlení; `sharp_turn` – ostrá zatáčka (boční přetížení). Typ: string. Známé hodnoty (mohou přibýt další): `harsh_braking` (od 26.11.20), `harsh_acceleration` (od 26.11.20), `sharp_turn` (od 26.11.20) ### CourierNetwork `wifi`, `cellular` (mobilní data), `none` (bez připojení, dávka čekala v telefonu), `unknown`. Typ: string. Známé hodnoty (mohou přibýt další): `wifi` (od 26.11.20), `cellular` (od 26.11.20), `none` (od 26.11.20), `unknown` (od 26.11.20) ### CourierActivity `still` (stojí), `walking`, `running`, `cycling`, `vehicle` (auto nebo skútr), `unknown`. Typ: string. Známé hodnoty (mohou přibýt další): `still` (od 26.11.20), `walking` (od 26.11.20), `running` (od 26.11.20), `cycling` (od 26.11.20), `vehicle` (od 26.11.20), `unknown` (od 26.11.20) ### LocationPermission `always` – i na pozadí; `while_in_use` – když aplikace běží (s oznámením o směně to stačí); `denied` – poloha je vypnutá, provozovna kurýra nevidí; `unknown`. Typ: string. Známé hodnoty (mohou přibýt další): `always` (od 26.11.20), `while_in_use` (od 26.11.20), `denied` (od 26.11.20), `unknown` (od 26.11.20) ### CourierLocation - `lat` (number, povinné) - `lon` (number, povinné) - `accuracy_m` (number | null, povinné): Přesnost polohy v metrech; `null`, když není známá. ### CourierDeviceState Poslední stav, který telefon poslal; `null` v poli znamená, že neví nebo nikdy neřekl. - `battery_pct` (integer | null, povinné) - `charging` (boolean | null, povinné) - `network` (CourierNetwork | null, povinné) - `activity` (CourierActivity | null, povinné) - `mock_location` (boolean | null, povinné) - `location_permission` (LocationPermission | null, povinné) - `power_save` (boolean | null, povinné) - `app_version` (string | null, povinné) ### CourierPositionState `moving` – jede (aspoň 7 km/h); `stopped` – stojí (u zákazníka, v koloně); `at_restaurant` – do 100 m od provozovny; `stale` – od telefonu přes 3 minuty nic, poloha je stará. Typ: string. Známé hodnoty (mohou přibýt další): `moving` (od 26.11.20), `stopped` (od 26.11.20), `at_restaurant` (od 26.11.20), `stale` (od 26.11.20) ### CourierPosition - `employee` (EmployeeRef, povinné) - `state` (CourierPositionState, povinné) - `location` (CourierLocation, povinné) - `speed_mps` (number | null, povinné): Rychlost z GPS v metrech za sekundu (× 3,6 = km/h). - `heading_deg` (integer | null, povinné): Směr jízdy, 0–359 stupňů po směru hodinových ručiček od severu. - `altitude_m` (integer | null, povinné) - `recorded_at` (Timestamp, povinné): Kdy telefon polohu změřil. - `received_at` (Timestamp, povinné): Kdy se telefon serveru naposledy ozval. - `route_id` (Id | null, povinné): Otevřená trasa kurýra; `null`, když žádnou nemá. - `remaining_tickets` (integer, povinné): Objednávky otevřené trasy, které kurýr ještě musí předat (nedoručené, nezrušené a nenahlášené jako nepřevzaté); bez trasy 0. - `device` (CourierDeviceState, povinné) ### CourierPositionList - `data` (CourierPosition[], povinné) ### DeliveryRouteTrack - `route_id` (Id, povinné) - `courier` (EmployeeRef, povinné) - `summary` (DeliveryRouteTrackSummary | null, povinné): Souhrn jízdy; `null`, když telefon k trase nic neposlal. - `points_expired` (boolean, povinné): Body a manévry se po 14 dnech smazaly; zůstal jen souhrn. - `points` (TrackPoint[], povinné): Projetá stopa od nejstaršího bodu, aspoň 10 m mezi body, nejvýš 5 000. - `driving_events` (DrivingEvent[], povinné) ### DeliveryRouteTrackSummary - `started_at` (Timestamp, povinné): První bod trasy. - `ended_at` (Timestamp, povinné): Poslední bod trasy. - `distance_m` (integer, povinné): Ujetá vzdálenost v metrech – z bodů s přesností do 50 m, bez skoků GPS. - `moving_s` (integer, povinné): Čas v jízdě v sekundách. - `duration_s` (integer, povinné): Od prvního do posledního bodu v sekundách. - `max_speed_mps` (number | null, povinné) - `avg_moving_speed_mps` (number | null, povinné): Průměrná rychlost za jízdy; `null`, dokud se kurýr nerozjel. - `points` (integer, povinné): Přijaté body trasy. - `harsh_braking` (integer, povinné) - `harsh_acceleration` (integer, povinné) - `sharp_turn` (integer, povinné) ### TrackPoint - `recorded_at` (Timestamp, povinné) - `lat` (number, povinné) - `lon` (number, povinné) - `accuracy_m` (number | null, povinné) - `speed_mps` (number | null, povinné) - `heading_deg` (integer | null, povinné) ### DrivingEvent - `type` (DrivingEventType, povinné) - `recorded_at` (Timestamp, povinné) - `value_g` (number, povinné) - `duration_ms` (integer | null, povinné) - `speed_mps` (number | null, povinné) - `location` (CourierLocation | null, povinné) ### DeliveryRoute - `id` (Id, povinné) - `courier` (EmployeeRef, povinné) - `status` (string, povinné): `open` – ještě se rozváží; `completed` – všechny objednávky trasy jsou doručené, zrušené nebo nepřevzaté (`completed_at`). Známé hodnoty (mohou přibýt další): `open`, `completed` - `created_at` (Timestamp, povinné) - `completed_at` (Timestamp | null, povinné): Kdy se trasa dokončila; `null`, dokud je otevřená. - `tickets` (KitchenTicket[], povinné): Objednávky trasy v naplánovaném pořadí, s adresami, telefony, `payment_method` a `total`. Objednávka vrácená do fronty kuchyně z trasy zmizí. ### DeliveryRoutePage - `data` (DeliveryRoute[], povinné) - `next_cursor` (string | null, povinné) ### DeliveryRouteCreate - `courier_id` (Id, povinné) - `ticket_ids` (Id[], povinné): Kuchyňské bony v pořadí, v jakém je kurýr rozveze. ### HandoverPayment - `method` (string, povinné): Čím zákazník u dveří skutečně zaplatil. Hodnoty: `card`, `cash`. - `amount` (MoneyInput, povinné): Zaplacená částka včetně spropitného – musí se rovnat `amount_due` + `tip` bonu. - `tip` (MoneyInput | null): Spropitné, které zákazník přidal na terminálu; `null` nebo chybí = žádné. - `gateway_payment_id` (string | null): ID transakce platebního terminálu (Teya) – k dohledání a vrácení platby. U `card` povinné. - `card_brand` (string | null): Karetní asociace pro účtenku a administraci, jak ji hlásí terminál. - `card_last4` (string | null): Poslední čtyři číslice karty. - `paid_at` (Timestamp, povinné): Kdy zákazník u dveří zaplatil – ne kdy to telefon odeslal. ### PaidBy - `method` (string, povinné): Čím zákazník u dveří zaplatil. Známé hodnoty (mohou přibýt další): `card` (od 26.11.2), `cash` (od 26.11.2) - `amount` (Money, povinné): Zaplacená částka včetně spropitného. - `tip` (Money, povinné): Spropitné obsažené v `amount`; nula, když žádné. - `card_brand` (string | null, povinné) - `card_last4` (string | null, povinné) - `gateway_payment_id` (string | null, povinné) - `paid_at` (Timestamp, povinné) ### NotDeliveredReason `customer_absent` – zákazník nebyl k zastižení (neotvírá, nebere telefon); `refused` – odmítl převzít; `refused_payment` – nezaplatil (nemá hotovost, karta neprošla, odmítl); `cancelled_by_customer` – objednávku zrušil (po telefonu, cestou); `wrong_address` – adresa neexistuje, nedá se najít nebo se nedá dostat dovnitř; `damaged` – jídlo se cestou poškodilo; `other` – jiný důvod, `note` povinná. Typ: string. Známé hodnoty (mohou přibýt další): `customer_absent` (od 26.11.2), `refused` (od 26.11.2), `refused_payment` (od 26.11.2), `cancelled_by_customer` (od 26.11.2), `wrong_address` (od 26.11.2), `damaged` (od 26.11.2), `other` (od 26.11.2) ### NotDeliveredReport - `reason` (string, povinné): Proč zákazník objednávku nepřevzal – viz `NotDeliveredReason`. Hodnoty: `customer_absent`, `refused`, `refused_payment`, `cancelled_by_customer`, `wrong_address`, `damaged`, `other`. - `note` (string | null): Poznámka kurýra; u `other` povinná. - `attempted_at` (Timestamp, povinné): Kdy byl kurýr u dveří – ne kdy to telefon odeslal. - `location` (DeliveryAttemptLocationInput | null): Kde telefon byl, jako doklad o pokusu; `null` nebo chybí, když ji nezná. - `call_attempts` (integer | null): Kolikrát kurýr zákazníkovi volal z aplikace. ### DeliveryAttemptLocationInput - `lat` (number, povinné) - `lon` (number, povinné) - `accuracy_m` (number | null): Přesnost polohy v metrech. ### DeliveryAttemptLocation - `lat` (number, povinné) - `lon` (number, povinné) - `accuracy_m` (number | null, povinné): Přesnost polohy v metrech; `null`, když není známá. ### NotDeliveredInfo - `reason` (NotDeliveredReason, povinné) - `note` (string | null, povinné) - `attempted_at` (Timestamp, povinné): Kdy byl kurýr u dveří. - `employee` (EmployeeRef | null, povinné): Kurýr, který to nahlásil; `null`, když nebyl přihlášený žádný zaměstnanec (kuchyňský displej). - `location` (DeliveryAttemptLocation | null, povinné) - `call_attempts` (integer | null, povinné) ### PostalAddress Poštovní adresa tak, jak je zadaná v administraci (provozovna nebo firma). Nevyplněná část je prázdný řetězec. - `street` (string, povinné): Ulice s číslem domu jako jeden text. - `city` (string, povinné): Obec. - `postal_code` (string, povinné): PSČ, jak je zadané. ### DeviceSettings Co zařízení provozovny potřebuje z administrace (viz `getDeviceSettings`). Změnu neohlásí žádná událost; čtěte znovu s `If-None-Match`. - `restaurant` (object, povinné): Provozovna, jak se tiskne na účtenky: název, telefon a web, jak jsou zadané (`null`, když chybí), adresa, poloha (`null` bez souřadnic), měna účtu a časová zóna (`Europe/Prague`). - `name` (string, povinné) - `phone` (string | null, povinné) - `website` (string | null, povinné) - `address` (PostalAddress, povinné) - `location` (GeoPoint | null, povinné) - `currency` (string, povinné) - `timezone` (string, povinné) - `company` (object, povinné): Firma na účtenkách a fakturách (nastavuje se v nastavení uživatele účtu). - `name` (string, povinné) - `registration_number` (string | null, povinné): IČO. - `vat_number` (string | null, povinné): DIČ. - `vat_payer` (boolean, povinné) - `address` (PostalAddress, povinné) - `email` (string | null, povinné) - `receipt_layouts` (object, povinné): Tiskové šablony z Tiskových sestav v administraci tak, jak je čte pokladna a kuchyňský displej; `null`, když provozovna vlastní nenastavila. - `receipt` (object[] | object | null, povinné) - `takeaway` (object[] | object | null, povinné) - `predefined_notes` (object[], povinné): Poznámky připravené v administraci, ze kterých personál vybírá, seřazené podle `id`. Administrace je jen přidává a maže, takže `id` si svůj text drží vždy. - `id` (Id, povinné) - `text` (string, povinné) - `printers` (ProductionDevice[], povinné): Další tiskárny rozdělené kuchyně; produkty k nim vede `KitchenItem.station_id`. - `kitchen_stations` (ProductionDevice[], povinné): Výrobní monitory rozdělené kuchyně. - `rooms` (Room[] | null, povinné): Místnosti se stoly v procentech místnosti; `null`, když licence mapu provozovny neobsahuje. - `kitchen` (object, povinné): Nastavení kuchyně a objednávek v ní. - `portion_mode` (string, povinné): Jak provozovna hlídá porce: `none` – vůbec; `local` – na pokladnách a v aplikacích personálu provozovny (server porce odečte u jejich účtenek a objednávek); `full` – i pro e-shop a aplikace pro… Známé hodnoty (mohou přibýt další): `none`, `local`, `full` - `extra_ticket` (boolean, povinné): Tisknout ke každému kuchyňskému bonu ještě zkrácenou kopii (v administraci extra bon pro rozvoz). - `redirect_restaurant_id` (Id | null, povinné): Kuchyňské bony otevřených stolů jdou do kuchyně této provozovny – platí jen tehdy, když je to existující provozovna stejného účtu. - `ready_sms` (boolean, povinné): Provozovna posílá zákazníkům svou SMS „objednávka je hotová“, když se objednávka stane hotovou nebo odjede na trase – ne když je text SMS prázdný a ne u objednávek aplikace, která zákazníkům píše… - `eet` (object, povinné): Původní nastavení EET 1.0 (certifikát EET 1.0 v administraci), ponechané pro starší pokladny. `enabled` – EET 1.0 je zapnuté a certifikát je uložený; `premises_id` – číslo provozovny EET 1.0… - `enabled` (boolean, povinné) - `premises_id` (string | null, povinné) - `certificate_valid_to` (Timestamp | null, povinné) - `features` (object, povinné): Co licence provozovny obsahuje. - `kitchen` (boolean, povinné): Smí se používat kuchyňský displej. - `multiple_cash_registers` (boolean, povinné): Smí se používat víc než jedna pokladna. - `multiple_kitchen_devices` (boolean, povinné): Smí se používat víc než jeden kuchyňský displej. - `other_devices` (boolean, povinné): Smí se používat víc než jedna pokladna, nebo kuchyňský displej. - `attendance` (boolean, povinné): Modul Docházka. - `reservations` (boolean, povinné): Modul Rezervační systém (skupina *Reservations*). - `lodging` (boolean, povinné): Modul Ubytování – pokladna může nabídnout zapsání útraty na pokoj (`chargeToStay`). - `daily_menu` (boolean, povinné): Denní menu (API denní menu vrací i bez něj, viz `getDailyMenu`). - `table_map` (boolean, povinné): Mapa provozovny se stoly (`rooms`). - `customer_database` (boolean, povinné): Databáze klientů. - `paid_until` (Timestamp | null, povinné): Licence je zaplacená do tohoto okamžiku. Po něm server nejdřív zkusí licenci obnovit z kreditu účtu; když to nejde, operace zařízení provozovny odpoví `403 license_expired` (od 26.11.27) – kromě… - `table_ordering` (TableOrderingSettings, povinné): Pravidla objednávání od stolu (skupina *Table ordering*); `enabled` `false`, když je vypnuté. - `pos` (object, povinné): Pravidla pokladny, která nastavuje provozovna (Nastavení provozovny, část Pokladna). - `receipt_cancel_by` (string, povinné): Kdo smí stornovat účtenku (`cancelReceipt`) a změnit její platbu (`changeReceiptPayment`). `staff` – kdokoli s rolí `pos`, bez PINu vedoucího (výchozí, jako v API v1); `manager` – jen vedoucí… Hodnoty: `staff`, `manager`. - `takeaway_only` (boolean, povinné): Výdejna bez stolů (třeba výdejna pizzy): každá účtenka a bon pokladny je `takeaway` s obalem produktů, i když pošlete `order_type` `dine_in`. Jídlo na místě nenabízejte; předvolte s sebou, ať cena… - `calculator` (PosCalculator, povinné): Režim Kalkulačka pokladny – prodej bez produktů. `enabled` `false`, když je vypnutý. ### PosCalculator Režim Kalkulačka pro provozovny bez sortimentu (pekárna, stánek): obsluha napíše počet a cenu a klepne na tlačítko skupiny („Pečivo 12 %“). Pokladna pošle řádek `open_item` s názvem a sazbou tlačítka a `calculator_key_id` (`createReceipt`); prodat ho smí každý s rolí `pos`, bez PINu vedoucího. Řádek nemá produkt – nic se neodepisuje ze skladu, nic nejde do kuchyně. Režim zapíná majitel pro celou provozovnu v administraci, na pokladně žádný přepínač není. Když je `enabled` `true`, ukažte místo… - `enabled` (boolean, povinné): Provozovna režim zapnula a má aspoň jedno tlačítko – přepněte pokladnu na kalkulačku. - `keys` (PosCalculatorKey[], povinné): Tlačítka v pořadí z administrace (`position`); prázdné, když je režim vypnutý. ### PosCalculatorKey - `id` (Id, povinné) - `name` (string, povinné): Skupina, zároveň název řádku na účtence. - `vat_rate` (VatRate, povinné) - `color` (string, povinné): Barva tlačítka, `#rrggbb`. - `position` (integer, povinné): Pořadí tlačítka, od 1. ### ProductionDevice - `id` (Id, povinné) - `name` (string, povinné) - `sections` (string, povinné): `all`, `kitchen` (rozvoz a s sebou) nebo `bar` (objednávky na místě). Známé hodnoty (mohou přibýt další): `all`, `kitchen`, `bar` - `auto_print` (boolean, povinné) ### Room - `id` (Id, povinné) - `name` (string, povinné) - `width` (integer, povinné): Velikost místnosti na mapě; dnes 100 (poloha stolů je v procentech). - `height` (integer, povinné): Jako `width`. - `tables` (object[], povinné): Stoly a další předměty; poloha a velikost v celých procentech místnosti (0–100). - `id` (Id, povinné): Při uložení mapy v administraci zůstává stejné (stůl se páruje podle ID, jinak podle názvu); odebraný stůl zmizí a nový dostane nové ID. Účty stolů a kuchyňské bony nesou jen název stolu… - `name` (string, povinné) - `kind` (string, povinné): `table` – stůl; `item` – jiný předmět na mapě. Známé hodnoty (mohou přibýt další): `table`, `item` - `code` (string | null, povinné): Kód stolu pro objednávání od stolu (jeho QR kód): 8 znaků Crockford base32 (bez I, L, O, U), jedinečný v celém Profirestu, stůl si ho drží i po přejmenování a přesunu. U jiných předmětů a dokud… - `left` (integer, povinné) - `top` (integer, povinné) - `width` (integer, povinné) - `height` (integer, povinné) ### EventKitchenTicketData - `ticket_id` (Id, povinné) - `order_id` (Id, povinné) - `status` (string, povinné): Stav po změně s významy jako `KitchenTicket.status`. Změna stavu přes `setKitchenTicketStatus` hlásí stav tak, jak ho počítá objednávka aplikace (`Order.status`), a ten se může od stavu bonu lišit… Známé hodnoty (mohou přibýt další): `received`, `preparing`, `ready`, `out_for_delivery`, `delivered`, `not_delivered` (od 26.11.2), `cancelled` ### EventAttendanceData - `employee` (EmployeeRef, povinné) - `state` (AttendanceState, povinné) - `since` (Timestamp | null, povinné) ### DirectoryCustomer Zákazník účtu tak, jak ho vede administrace. - `id` (Id, povinné) - `name` (string | null, povinné) - `phone` (string | null, povinné): Jak ho Profirest ukládá; česká čísla obvykle bez `+420`. - `registered` (boolean, povinné): Zákazník má účet v e-shopu provozovny. - `points` (integer, povinné): Věrnostní body. - `orders` (integer, povinné): Počet objednávek zákazníka. ### DirectoryAddress - `id` (Id, povinné) - `street` (string, povinné): Ulice a číslo na jednom řádku, jak je uložená. - `city` (string | null, povinné) - `location` (GeoPoint | null, povinné): `null`, když adresa nemá souřadnice (pro rozvoz se tak, jak je, použít nedá). ### DirectoryEntry - `customer` (DirectoryCustomer, povinné) - `address` (DirectoryAddress | null, povinné) ### CustomerDirectoryList - `data` (DirectoryEntry[], povinné) ### CallReport - `phone` (Phone, povinné): Volající číslo. K národnímu číslu doplňte předvolbu země. - `kind` (string): `incoming` – telefon zvoní nebo byl přijat, `missed` – zmeškaný hovor. Hodnoty: `incoming`, `missed`. ### IncomingCall Hovor do provozovny a kdo volá. Také `data` události `call.received`. - `phone` (string, povinné): Volající číslo, jak ho Profirest ukládá. - `kind` (string, povinné): `incoming` – telefon zvoní nebo byl přijat; `missed` – zmeškaný hovor (jak ho hlásí `CallReport.kind`). Známé hodnoty (mohou přibýt další): `incoming`, `missed` - `received_at` (Timestamp, povinné) - `customer` (DirectoryCustomer | null, povinné): Zákazník s tímto číslem; `null`, když ho účet nezná. `reportCall` neznámé číslo nejdřív přidá mezi zákazníky účtu, takže jeho odpověď zákazníka má vždy. - `last_address` (DirectoryAddress | null, povinné): Adresa posledního rozvozu zákazníkovi z této provozovny; `null`, když žádný nebyl. ### LatestCall - `call` (IncomingCall | null, povinné) ### SuggestedAddress Části adresy tak, jak je bere `AddressInput`. - `street` (string | null, povinné) - `house_number` (string | null, povinné) - `city` (string, povinné) - `postal_code` (string | null, povinné) - `country` (string, povinné) ### AddressSuggestion - `label` (string, povinné): Adresa na jednom řádku, jak ji píše mapová služba. - `address` (SuggestedAddress, povinné) - `location` (GeoPoint, povinné) - `zone` (object, povinné) - `id` (Id, povinné) - `name` (string, povinné) - `fee` (Money, povinné) - `minimum_order` (Money, povinné) - `express_fee` (Money | null, povinné): Příplatek za expresní doručení; `null`, když ho zóna nenabízí. ### AddressSuggestionList - `data` (AddressSuggestion[], povinné) ### ReceiptPreviewRequest - `issued_at` (Timestamp): Spočítat v tomto okamžiku; bez něj teď. - `offline` (boolean): Spočítat jako účtenku pořízenou offline (`ReceiptCreate.offline`). - `order_type` (string): Jako `ReceiptCreate.order_type`. Hodnoty: `dine_in`, `takeaway`. - `manager_credential` (StaffCredential | null) - `items` (ReceiptItemInput[], povinné) - `discounts` (ReceiptDiscountInput[]) ### ReceiptCreate - `id` (string (uuid), povinné): Vaše UUID účtenky vytvořené na zařízení. - `number` (integer, povinné): Číslo účtenky z vlastního počítadla pokladny. Tiskne se na účtenku, ukazuje v administraci a do EET 2.0 jde jako pořadové číslo. Čísla různých zařízení se mohou opakovat; číslo, které zařízení už… - `issued_at` (Timestamp, povinné): Kdy byla účtenka zaplacena (hodiny zařízení). Nejvýš 7 dní zpět (pořízená offline 62 dní) a 5 minut napřed. - `offline` (boolean): Pořízeno offline – ponechají se ceny, které pokladna účtovala (viz `price_differences`). - `issued_by_id` (Id | null): Jen bez relace zaměstnance (offline účtenka) – kdo ji vystavil. Účtenka ho vrací jako `issued_by` (objekt zaměstnance). Od 26.11.27 i zaměstnanec účtu, kterého mezitím smazali nebo odebrali z… - `approved_by_id` (Id | null): Jen u offline účtenky – vedoucí pokladny, který na zařízení schválil ruční slevu nebo cenu (účtenka ho vrací jako `approved_by`). Bez `approval_signature` je to jen údaj zařízení – účtenka jde do… - `approval_signature` (string | null): Jen s `offline` a `approved_by_id` – schválení podepsané klíčem z PINu vedoucího (viz `OfflineApproval`). Když sedí, schválení platí jako ověřené; když nesedí, účtenka se přesto přijme (už je… - `manager_credential` (StaffCredential | null): PIN nebo čip vedoucího pokladny, který teď schvaluje ruční slevu nebo cenu. - `opened_at` (Timestamp | null): Kdy se stůl nebo účet otevřel; bez něj `issued_at`. - `opened_by_id` (Id | null): Kdo stůl otevřel; bez něj ten, kdo účtenku vystavil. - `table_name` (string | null) - `order_type` (string): `dine_in` (výchozí) – na místě; `takeaway` – s sebou: každý řádek produktu připočte obal produktu (`packaging_unit_price`). Sazba DPH je v obou případech stejná. Účtenka poslaná do kuchyně se tam… Hodnoty: `dine_in`, `takeaway`. - `customer_id` (Id | null): Zákazník ze `searchCustomerDirectory`; získá věrnostní body (1 bod za celou korunu, bez prodaných voucherů). - `note` (string | null) - `tab_id` (string (uuid) | null (uuid)): Otevřený účet stolu, který účtenka platí; uzavře se spolu s ní (`409 tab_closed`, když už je uzavřený, `422` s `not_found`, když takový účet není). Pošlete k němu `tab_version`. Účtenka účtuje… - `tab_version` (integer | null): `version` účtu, který jste účtovali; s `tab_id` povinné. Když účet mezitím změnilo jiné zařízení (například přidalo položky), odpověď je `412 precondition_failed` a nic se nevystaví – načtěte účet… - `send_to_kitchen` (boolean): Zaplacenou účtenku poslat i do fronty kuchyně (výdej u pultu). Bez kuchyňského displeje se ignoruje. - `items` (ReceiptItemInput[], povinné) - `discounts` (ReceiptDiscountInput[]): Slevy na celou účtenku, po slevách položek. Prodané vouchery se nikdy nezlevňují. - `payments` (ReceiptPaymentInput[], povinné): Jak se účtenka zaplatila; dávají dohromady `totals.total`. Prázdné jen u účtenky na nulu. ### ReceiptItemInput - `type` (string): `product` – ze sortimentu pokladny; `open_item` – název, cena a sazba DPH zadané na pokladně (jen vedoucí, nebo kdokoli s `calculator_key_id`); `voucher_sale` – prodej dárkového voucheru podle kódu… Hodnoty: `product`, `open_item`, `voucher_sale`. - `product_id` (Id | null) - `variant` (string): `full` (výchozí) – celá porce; `half` – polovina za `Product.pos.half_price` (cena půlky platí i s `at_employee_price`); produkt, který se po půlkách neprodává, odpoví `422` s `not_allowed`. Hodnoty: `full`, `half`. - `quantity` (number, povinné): Kusy; desetinná čísla u položek na váhu. - `unit_price` (MoneyInput | null): Cena za kus, kterou pokladna účtovala, bez příloh a obalu. Vynechte pro cenu ze sortimentu; u `voucher_sale` pro hodnotu voucheru (od 26.11.26 – dřív byla povinná). - `at_employee_price` (boolean): Prodáno za cenu pro zaměstnance (`PosProductInfo.employee_price`). - `ordered_at` (Timestamp | null): Kdy host položku objednal – u položek otevřeného stolu (`ordered_at` řádku účtu). Cena, dostupnost a porce položky se berou k tomuto okamžiku, takže denní menu objednané v jeho čase jde zaplatit i… - `name` (string | null): Jen u `open_item`. - `vat_rate` (VatRate | null): Jen u `open_item`. - `calculator_key_id` (Id | null): Jen u `open_item` v režimu Kalkulačka: tlačítko skupiny, kterým se řádek prodal (`getDeviceSettings`, `pos.calculator.keys… - `voucher_code` (string | null): Jen u `voucher_sale`. - `add_ons` (ReceiptAddOnInput[]) - `removed_ingredient_ids` (Id[]): Jen u `product`: suroviny, které host odebral – `Product.removable_ingredients… - `note` (string | null) - `course` (integer): Číslo chodu pro kuchyň. - `discount` (ReceiptDiscountInput | null): Sleva této položky, jen z ceny produktu (ne z příloh a obalu). ### ReceiptAddOnInput - `product_id` (Id, povinné) - `unit_price` (MoneyInput | null) ### ReceiptDiscountInput Sleva: `percent` s `value`, nebo `amount` s `amount` v měně provozovny. U položky platí pro celý řádek – procento z ceny položky × množství zaokrouhlené matematicky na nejmenší jednotky, nebo přímo částka (nejvýš cena položky × množství); přílohy a obal položky se nezlevňují. Na celou účtenku se počítá z částky po slevách položek včetně příloh a obalů (prodané vouchery nikdy). Procenta nad 100 nebo částka nad základem jsou `422` s `too_large` – nic se tiše neořezává; `value` u částky nebo… - `type` (string, povinné): `percent` – `value` procent; `amount` – pevná částka `amount`. Hodnoty: `percent`, `amount`. - `value` (integer): Procenta (1–100), jen u `type` `percent`. - `amount` (MoneyInput): Výše slevy, jen u `type` `amount`; aspoň jedna nejmenší jednotka. - `method` (string): `manual` (výchozí) – zadal ji zaměstnanec; potřebuje vedoucího pokladny. `automatic` – použilo ji pravidlo pokladny (například happy hour). Server pravidlo nekontroluje: `automatic` smí poslat… Hodnoty: `manual`, `automatic`. - `name` (string | null) ### ReceiptPaymentInput - `method` (string, povinné): `cash` – hotově; `card` – kartou (s `terminal` z platebního terminálu); `meal_voucher` – stravenky; `company_account` – na účet firmy; `invoice` – fakturou (`reference`); `voucher` – dárkový voucher… Hodnoty: `cash`, `card`, `meal_voucher`, `company_account`, `invoice`, `voucher`. - `amount` (MoneyInput, povinné): Kolik z účtenky tato platba hradí, bez dýška. U hotovosti po zaokrouhlení. - `tip` (MoneyInput | null): Dýško zaplacené s touto platbou (jen hotově nebo kartou). - `tip_source` (string | null): Jak pokladna k dýšku přišla, slovy samotné aplikace pokladny (`not_requested`, `terminal_confirmed`, `request_fallback`, `recovered_from_context`, `unresolved_manual_required`). Server hodnotu… Hodnoty: `not_requested`, `terminal_confirmed`, `request_fallback`, `recovered_from_context`, `unresolved_manual_required`, `None`. - `tendered` (MoneyInput | null): Hotovost přijatá od zákazníka, pro výpočet vrácení. - `voucher_code` (string | null): Jen u `voucher`. - `reference` (string | null): Například číslo faktury nebo firma. - `terminal` (TerminalPaymentInput | null) ### TerminalPaymentInput Záznam platby z platebního terminálu, jak ho terminál vrátil – jen u `card`. Server ho uloží k účtence pro administraci a nekontroluje ho (posílejte jen schválené platby); `provider`, `transaction_id`, `card_number_masked` a `auth_code` se vracejí v `ReceiptPayment.terminal`. `transaction_id`, který už uložený je, se znovu neuloží; účtenka se vystaví i tak. - `provider` (string, povinné): Poskytovatel platebního terminálu, jak ho pojmenovává pokladna. - `transaction_id` (string, povinné): ID transakce z terminálu. - `terminal_id` (string | null): ID terminálu. - `response_code` (string | null): Kód odpovědi terminálu. - `response_message` (string | null): Text odpovědi terminálu. - `card_number_masked` (string | null): Maskované číslo karty, jak ho dal terminál. - `auth_code` (string | null): Autorizační kód platby. - `aid` (string | null): Identifikátor aplikace karty (EMV AID). - `app_label` (string | null): Označení aplikace karty, například `VISA`. - `acquirer_terminal_id` (string | null): ID terminálu u banky příjemce. - `merchant_id` (string | null): ID obchodníka u banky příjemce. - `sequence_number` (string | null): Pořadové číslo transakce v terminálu. - `terminal_time` (string | null): Čas transakce, jak ho zapsal terminál (volný text, nezpracovává se). - `card_input_type` (string | null): Jak se karta načetla (například bezkontaktně nebo čipem), jak to zapsal terminál. ### KitchenTicketCreate - `id` (string (uuid), povinné): Vaše UUID bonu vytvořené na zařízení. - `table_name` (string | null) - `order_type` (string): `dine_in` (výchozí) nebo `takeaway` – jen označí bon (`KitchenTicket.fulfillment`); bon nemá ceny ani obaly. Výdejna bez stolů (`pos.takeaway_only`) je vždy `takeaway`. Hodnoty: `dine_in`, `takeaway`. - `preorder_at` (Timestamp | null): Kdy má být bon hotový – stůl objednaný dopředu. `null`, chybějící i čas v minulosti znamená teď; nejvýš 7 dní dopředu. S termínem víc než 2 hodiny dopředu čeká bon ve `view=preorders` kuchyňského… - `note` (string | null) - `items` (object[], povinné) - `product_id` (Id, povinné) - `variant` (string): Hodnoty: `full`, `half`. - `quantity` (number, povinné) - `add_ons` (object[]) - `product_id` (Id, povinné) - `removed_ingredient_ids` (Id[]): Suroviny, které host odebral – `Product.removable_ingredients[].id` produktu v sortimentu `pos`, každá nejvýš jednou (jinak `ingredient_not_removable`); kuchyň je ukáže u jídla. - `note` (string | null) - `course` (integer) ### TabInput - `table_name` (string, povinné) - `note` (string | null) - `items` (object[], povinné) - `id` (string, povinné): Vaše stálé ID řádku, aby zařízení mohla slučovat změny. - `product_id` (Id, povinné) - `variant` (string): Hodnoty: `full`, `half`. - `quantity` (number, povinné) - `add_ons` (object[]) - `product_id` (Id, povinné) - `removed_ingredient_ids` (Id[]): Suroviny, které host odebral – `Product.removable_ingredients… - `note` (string | null) - `course` (integer) - `sent_to_kitchen` (boolean): Řádek už šel do kuchyně (`createKitchenTicket`). - `moved_line_ids` (string[]): ID řádků, které jste z účtu sundali nebo snížili, protože se přesunuly na jiný účet: celé množství odebrané z takového řádku se nezapíše jako storno. Jinak se kusy odebrané z řádku, který už šel do… ### TabMoveInput - `target_tab_id` (string (uuid), povinné): Účet, na který se řádky přesouvají – otevřený účet provozovny, nebo nové UUID, které otevře nový účet. - `target_version` (integer | null): `version` cílového účtu, jak jste ji načetli; u existujícího účtu povinná, u nového `null` nebo chybí. - `target_table_name` (string | null): Stůl nového cílového účtu; jen u nového. - `lines` (object[], povinné) - `line_id` (string, povinné): ID řádku na tomto účtu. - `quantity` (number, povinné): Kolik z řádku se přesouvá, nejvýš jeho množství. - `target_line_id` (string | null): ID řádku na cílovém účtu; když chybí, `line_id`. ### TabMove - `source` (Tab, povinné): Tento účet po přesunu; `status` `closed`, když na něm nic nezůstalo. - `target` (Tab, povinné): Cílový účet po přesunu. ### TabLine Řádek si drží cenu z doby, kdy byl přidán: řádek, který pošlete beze změny (stejné `id`, produkt, varianta, přílohy i odebrané suroviny, stejné nebo nižší množství), se proti sortimentu znovu nekontroluje, takže denní menu zůstane na účtu i po svém čase. Nový řádek nebo vyšší množství se ocení teď – později objednané kusy přidejte jako nový řádek. - `id` (string, povinné) - `product_id` (Id, povinné) - `name` (string, povinné) - `variant` (string, povinné): `full` – celá porce; `half` – polovina (`Product.pos.half_price`). Známé hodnoty (mohou přibýt další): `full`, `half` - `quantity` (number, povinné) - `ordered_at` (Timestamp, povinné): Kdy byl řádek přidán (nebo zvýšeno množství). Pošlete ho jako `ordered_at` položky účtenky. - `unit_price` (Money, povinné) - `add_ons` (object[], povinné) - `product_id` (Id, povinné) - `name` (string, povinné) - `unit_price` (Money, povinné) - `removed_ingredients` (RemovableIngredient[], povinné): Suroviny, které host odebral (`TabInput.items[].removed_ingredient_ids`), s názvy z doby, kdy byl řádek přidán; prázdné, když nic neodebral (i u účtů z doby před tímto polem). - `note` (string | null, povinné) - `course` (integer, povinné) - `sent_to_kitchen` (boolean, povinné) - `total` (Money, povinné) ### Tab Účet stolu na pokladnách a u mobilních číšníků, společný všem zařízením provozovny. `putTab` zapíše celý jeho stav; `createReceipt` s `tab_id` nebo `closeTab` ho uzavře. - `id` (string (uuid), povinné): Vaše UUID účtu vytvořené na zařízení, které ho otevřelo (`tab_id` v adrese). - `restaurant_id` (Id, povinné) - `table_name` (string, povinné): Stůl, jak ho poslalo zařízení. Proti mapě se nekontroluje a stejný název může mít víc otevřených účtů. - `note` (string | null, povinné): Poznámka účtu; `null`, když je prázdná. - `opened_at` (Timestamp, povinné): Kdy se účet otevřel (první `putTab`). - `opened_by` (EmployeeRef, povinné): Zaměstnanec, který účet otevřel; `id` `0` se jménem telefonu, když ho otevřela objednávka od stolu bez zaměstnance (`applyTableOrder`). - `updated_by` (EmployeeRef, povinné): Zaměstnanec posledního `putTab` nebo `applyTableOrder` (`id` `0` se jménem telefonu, když objednávku přijala pravidla podniku); uzavření účtu ho nemění. - `lines` (TabLine[], povinné) - `totals` (object, povinné): Součet řádků – `items` a `total` jsou stejné, účet stolu slevy nemá. Každý řádek si drží cenu z doby, kdy byl přidán (viz `TabLine`); účtenka položky spočítá znovu. - `items` (Money, povinné) - `total` (Money, povinné) - `version` (integer, povinné): Roste s každou změnou; z ní je `ETag`. - `status` (string, povinné): `open` – účet jde měnit; `closed` – uzavřel ho účtenka (`receipt_id`) nebo `closeTab` a znovu otevřít už nejde (`409 tab_closed`); `transferred` – jeho pokladna přešla na API v1 a účet převzala… Známé hodnoty (mohou přibýt další): `open`, `closed`, `transferred` (od 26.11.6) - `updated_at` (Timestamp, povinné): Kdy se účet naposledy změnil – poslední `putTab` nebo uzavření. - `device_id` (Id, povinné): Zařízení posledního `putTab`; uzavření účtu ho nemění. - `closed_at` (Timestamp | null, povinné): Kdy se účet uzavřel; `null`, dokud je otevřený. - `receipt_id` (string (uuid) | null (uuid), povinné): Účtenka, která účet zaplatila; `null`, dokud je otevřený, a po `closeTab`. ### TabList - `data` (Tab[], povinné) ### EventTabClosedData - `tab_id` (string (uuid), povinné) - `table_name` (string, povinné) - `receipt_id` (string (uuid) | null (uuid), povinné) ### PosActivityBatch - `items` (object[], povinné) - `id` (string (uuid), povinné) - `employee_id` (Id, povinné) - `occurred_at` (Timestamp, povinné) - `action` (string, povinné) ### PosActivityResult - `created` (integer, povinné) - `duplicates` (integer, povinné) ### StockUnit `kg`, `l`, `pcs` (kusy), `pack` (balení), `m` (metry). Typ: string. Známé hodnoty (mohou přibýt další): `kg`, `l`, `pcs`, `pack`, `m` ### StockTakingItem Skladová položka k přepočítání. - `warehouse_item_id` (Id, povinné) - `name` (string, povinné) - `category` (object, povinné) - `id` (Id | null, povinné): `null` u položek bez kategorie. - `name` (string, povinné) - `unit` (StockUnit, povinné) - `ean` (string | null, povinné): Čárový kód ke skenování, když je vyplněný. - `expected_quantity` (number, povinné): Kolik teď očekává sklad, v jednotce `unit`. Může být záporné, když se spotřebovalo víc, než se naskladnilo. - `tolerance_percent` (integer, povinné): Rozdíl, který provozovna ještě snese, v procentech očekávaného množství. `0` = nenastaveno. - `weighing` (object | null, povinné): Pro přepočet otevřeného balení podle váhy; `null`, když se položka neváží. ### StockTakingItemPage Jedna stránka položek k přepočítání. - `data` (StockTakingItem[], povinné) - `next_cursor` (string | null, povinné) ### StockTakingCreate Dokončená inventura ze zařízení. - `id` (string (uuid), povinné): Vaše UUID inventury vytvořené na zařízení. - `area` (string): Kde se počítalo – určuje roli, kterou zaměstnanec potřebuje: `bar` (výchozí) – na pokladnách, `pos` nebo `pos_manager`; `kitchen` – v kuchyni, `kitchen` nebo `kitchen_manager`. Nevybírá sklad… Hodnoty: `bar`, `kitchen`. - `note` (string | null): Poznámka, kterou administrace ukáže u inventury. - `items` (object[], povinné) - `warehouse_item_id` (Id, povinné) - `quantity` (number, povinné): Napočítané množství v jednotce položky. ### StockTaking Inventura zapsaná přes API. - `id` (Id, povinné): Vaše UUID inventury. - `number` (Id, povinné): Číslo inventury v administraci. - `area` (string, povinné): Kde se počítalo, jak přišlo v `StockTakingCreate.area` – `bar` nebo `kitchen`. Známé hodnoty (mohou přibýt další): `bar`, `kitchen` - `created_at` (Timestamp, povinné) - `employee` (EmployeeRef, povinné) - `note` (string | null, povinné) - `stock_updated` (boolean, povinné): `false`, když provozovna nenastavuje sklad podle inventur ze zařízení; inventura se jen zapsala. - `items` (StockTakingLine[], povinné) - `difference_value` (Money, povinné): Hodnota všech rozdílů v nákupních cenách bez DPH (záporná = manko). ### StockTakingLine - `warehouse_item_id` (Id, povinné) - `name` (string, povinné) - `unit` (StockUnit, povinné) - `expected_quantity` (number, povinné): Stav skladu před inventurou. - `counted_quantity` (number, povinné) - `difference` (number, povinné): `counted_quantity − expected_quantity`. - `difference_value` (Money, povinné): Rozdíl v nákupní ceně bez DPH. ### BackupPage Jedna stránka záloh od nejnovější. - `data` (Backup[], povinné) - `next_cursor` (string | null, povinné) ### Backup Záloha místní databáze pokladny. - `id` (Id, povinné) - `type` (string, povinné): `automatic`, `manual`, `closure`; `other` – ze staré verze aplikace. Známé hodnoty (mohou přibýt další): `automatic`, `manual`, `closure`, `other` - `created_at` (Timestamp, povinné) - `size_bytes` (integer, povinné) - `app_version` (string, povinné): Verze aplikace, která ji vytvořila (prázdné, když není známá). - `db_version` (string, povinné): Verze místní databáze (prázdné, když není známá). - `device_name` (string | null, povinné): Zařízení, které ji nahrálo, když je známé. - `this_device` (boolean, povinné): Nahrálo ji zařízení, které se ptá. - `legacy` (boolean, povinné): Nahrála ji pokladna na API v1. ### DeviceLogBatch Záznamy logu zařízení. - `events` (DeviceLogEvent[], povinné) ### DeviceLogEvent Jeden záznam logu. - `level` (string, povinné): Úroveň od nejnižší: `debug`, `info`, `warning`, `error`. Záznamy pod `DeviceLogResult.min_level` se zahodí. Hodnoty: `debug`, `info`, `warning`, `error`. - `logged_at` (string (date-time), povinné): Kdy se to na zařízení stalo. - `message` (string, povinné) - `tag` (string | null): Část aplikace, například `printer`, `sync`, `payment`. - `employee_name` (string | null): Kdo byl na zařízení přihlášený. ### DeviceLogResult Co server s dávkou udělal. - `received` (integer, povinné) - `stored` (integer, povinné): Uložené záznamy (úrovně od `min_level` výš). - `min_level` (string, povinné): Nejnižší úroveň, kterou server u této provozovny teď ukládá: `warning`, nebo `debug`, dokud má podpora Profirestu zapnuté podrobné logování (`info` a `error` dnes nepřicházejí). Nižší záznamy se… Známé hodnoty (mohou přibýt další): `debug`, `info`, `warning`, `error` ### BugReportCreate Hlášení chyby od uživatele zařízení. - `code` (string, povinné): Kód hlášení, který vymyslí zařízení a ukáže uživateli (například `A3F2-K8XQ1`). - `description` (string, povinné): Co uživatel napsal (smí být prázdné). - `employee_name` (string | null) - `app_version` (string | null) - `db_version` (string | null): Verze místní databáze (text, stejně jako `Backup.db_version`). - `os_version` (string | null) - `device_model` (string | null): Výrobce a model zařízení. - `device_ip` (string | null): Adresa zařízení v místní síti. - `mode` (string | null): Režim aplikace (například jak pokladny v provozovně sdílejí data). - `server_id` (string | null) - `logs` (DeviceLogEvent[]): Nedávné záznamy logu ze zařízení od nejstaršího. ### BugReport Zapsané hlášení chyby. - `code` (string, povinné) - `received_at` (Timestamp, povinné) - `logs_attached` (integer, povinné): Záznamy logu uložené k hlášení. ### DeviceCheckIn Stav zařízení teď (`checkInDevice`). - `role` (string, povinné): Co zařízení je – `register` (pokladna), `waiter` (telefon číšníka), `kds`, `terminal` (docházka), `courier`, `kiosk`. Hodnoty: `register`, `waiter`, `kds`, `terminal`, `courier`, `kiosk`, `other`. - `app_version` (string, povinné) - `os_version` (string | null) - `device_model` (string | null) - `sent_at` (Timestamp | null): Hodiny zařízení ve chvíli odeslání – se `server_time` odpovědi zařízení spočítá svůj posun. - `uptime_seconds` (integer | null) - `battery` (object | null) - `network` (object | null) - `queues` (object | null): Co na zařízení čeká na odeslání nebo vyřízení – z nejstarší položky server odvozuje upozornění. - `last_backup_at` (Timestamp | null) - `last_sync_at` (Timestamp | null): Poslední úspěšná výměna se serverem (objednávky, stoly). - `log_store` (object | null): Vlastní úložiště logů zařízení (černá skříňka). - `counters` (object): Volná počítadla aplikace od startu (`polls`, `broadcasts`, `errors`, `socket_reconnects` …): název do 40 znaků a celé číslo. - `peers` (DevicePeer[]): Zařízení připojená k tomuto po místní síti bez vlastního tokenu (telefony číšníků kasy). - `command_results` (DeviceCommandResult[]): Co se stalo s příkazy z minulé odpovědi. ### DeviceQueue - `count` (integer, povinné): Kolik jich čeká. - `oldest_at` (Timestamp | null): Od kdy čeká nejstarší. ### DevicePeer - `key` (string, povinné): Stálé ID zařízení u kasy (stejné v hlavičce jeho logu a v `reportDeviceError.peer_key`). - `name` (string, povinné) - `role` (string): Od verze 26.10.6: `waiter`, `kds`, `terminal`, `courier`, `kiosk`, `other`. Hodnoty: `waiter`, `kds`, `terminal`, `courier`, `kiosk`, `other`. - `app_version` (string | null) - `connected` (boolean, povinné): Teď připojené ke kase. - `last_seen_at` (Timestamp | null) - `log_store` (boolean): Zařízení má vlastní úložiště logů – jdou si od něj vyžádat. ### DeviceCommandResult - `command_id` (string, povinné) - `status` (string, povinné): `done` – vyřízeno, `failed` – nešlo (proč, řekne `message`), `unsupported` – aplikace příkaz nezná. Hodnoty: `done`, `failed`, `unsupported`. - `message` (string | null) ### DeviceCheckInResult - `server_time` (Timestamp, povinné) - `api_target` (ApiTarget | null, povinné): Kde má zařízení být – jen u vlastní pokladny, kuchyňského displeje a kurýra Profirestu; jinak `null`. - `next_in_seconds` (integer, povinné): Kdy přihlásit stav příště (60 u kasy, 300 u telefonu číšníka; server může zvednout). - `commands` (DeviceCommand[], povinné): Příkazy k vyřízení, od nejstaršího. ### DeviceCommand Příkaz pro zařízení od podpory Profirestu nebo provozovny. Po `expires_at` neplatí – už ho nevyřizujte. - `id` (string, povinné) - `type` (string, povinné): `upload_logs` (podrobnosti v `upload_logs`), `live_logs` (podrobnosti v `live_logs`), `ping`. Neznámý typ: hlaste `unsupported`. Známé hodnoty (mohou přibýt další): `upload_logs` (od 26.10.6), `live_logs` (od 26.10.6), `ping` (od 26.10.6) - `created_at` (Timestamp, povinné) - `expires_at` (Timestamp, povinné) - `upload_logs` (LogUploadCommand | null, povinné) - `live_logs` (object | null, povinné) ### LogUploadCommand - `request_id` (string, povinné) - `reason` (string | null, povinné): Proč jsou logy potřeba (ukažte obsluze, když se aplikace ptá na souhlas). - `from` (Timestamp, povinné) - `to` (Timestamp, povinné) - `detail` (string, povinné): `trace` – jen úrovně E, W a I; `full` – i záznamy D s celými zprávami. Hodnoty: `trace`, `full`. - `uploads` (LogUploadTarget[], povinné): Jeden cíl na zařízení – toto zařízení (`peer_key` null) a jeho připojená zařízení. ### LogUploadTarget - `upload_id` (string, povinné) - `peer_key` (string | null, povinné): Připojené zařízení, jehož log to je; `null` – zařízení, které přihlašuje stav. - `token` (string, povinné): Bearer token pro `putLogUploadPart`, `completeLogUpload` a `abortLogUpload` tohoto cíle (`pfl_…`). Předejte ho připojenému zařízení; platí jen pro toto nahrávání. - `upload_url` (string (uri), povinné): Adresa nahrávání (`…/v2/log-uploads/{upload_id}`); přidejte `/parts/{part}`, `/complete` nebo `/abort`. - `max_part_bytes` (integer, povinné) - `expires_at` (Timestamp, povinné) ### LogUploadStatus - `id` (string, povinné) - `request_id` (string, povinné) - `status` (string, povinné): `waiting` – zatím žádná část, `uploading` – části přicházejí, `done` – hotovo; `failed`, `unsupported`, `no_data`, `declined` – vzdané zařízením; `expired` – žádost vypršela; `cancelled` – stažené v… Hodnoty: `waiting`, `uploading`, `done`, `failed`, `unsupported`, `no_data`, `declined`, `expired`, `cancelled`. - `parts_received` (integer[], povinné): Čísla částí, které server má. - `parts_expected` (integer | null, povinné): Z `completeLogUpload`. - `bytes` (integer, povinné): Zatím přijaté bajty. - `from` (Timestamp, povinné) - `to` (Timestamp, povinné) - `detail` (string, povinné): Od verze 26.10.6: `trace`, `full`. Hodnoty: `trace`, `full`. - `max_part_bytes` (integer, povinné) - `expires_at` (Timestamp, povinné) ### LogUploadComplete - `parts` (integer, povinné): Kolik částí bylo odesláno. - `lines` (integer | null): Řádků NDJSON v souboru. - `from` (Timestamp | null): První záznam v souboru (může být později, než se chtělo, když je úložiště kratší). - `to` (Timestamp | null) - `sha256` (string | null): SHA-256 celého spojeného souboru (nepovinná kontrola). ### LogUploadAbort - `reason` (string, povinné): Od verze 26.10.6: `failed`, `unsupported`, `no_data`, `declined`. Hodnoty: `failed`, `unsupported`, `no_data`, `declined`. - `message` (string | null) ### DeviceErrorCreate Jedna chyba z logu zařízení s řádky před ní. - `id` (string (uuid), povinné): UUID vytvořené na zařízení – stejné podruhé se zapíše jednou. - `occurred_at` (Timestamp, povinné) - `level` (string): Od verze 26.10.6: `error`, `warning`. Hodnoty: `error`, `warning`. - `code` (string, povinné): Kód z číselníku aplikace (`SOCK.timeout`, `PAY.pending`, `UI.crash`). - `area` (string | null): Část aplikace (`SOCK`, `PAY`, `UI`, `ENV`, `PRINT` …). - `event` (string | null): Jméno události z číselníku aplikace. - `message` (string, povinné) - `peer_key` (string | null): Chyba se stala na zařízení připojeném ke kase (jeho `DevicePeer.key`); `null` – na tomto zařízení. - `employee_name` (string | null) - `app_version` (string | null) - `refs` (object | null): ID platná v tu chvíli – stejná na kase i u číšníka. - `context` (string[]): Řádky logu před chybou (NDJSON, jeden záznam na položku), od nejstaršího – asi 30. - `stack` (string | null): Zásobník volání při pádu. ### DeviceErrorResult - `id` (string, povinné): ID záznamu na serveru. - `received_at` (Timestamp, povinné) ### ReceiptCancel - `id` (string (uuid), povinné): Vaše UUID storno dokladu. - `number` (integer, povinné): Číslo storno dokladu z počítadla pokladny. Číslo, které zařízení už u storna použilo, vrátí `409 receipt_number_conflict`. - `reason` (string, povinné) - `restock` (boolean): Vrátit sklad a porce. - `manager_credential` (StaffCredential | null) ### ReceiptPaymentChange - `id` (string (uuid), povinné): Vaše UUID změny; stejné `id` znovu vrátí účtenku a nic nezmění. - `payments` (ReceiptPaymentInput[], povinné): Čím se zaplatila část účtenky placená hotově, stravenkami, na firemní účet nebo fakturou – místo těchto plateb. Platby kartou a dárkovým voucherem zůstávají a neposílají se; `voucher` tu nejde.… - `reason` (string | null): Proč se platba mění; ukáže se v Časové ose administrace. - `manager_credential` (StaffCredential | null) ### ReceiptLine - `id` (Id, povinné) - `type` (string, povinné): `product` – ze sortimentu pokladny; `open_item` – název, cena a sazba DPH zadané na pokladně; `voucher_sale` – prodaný dárkový voucher (`voucher_code`, mimo DPH). Známé hodnoty (mohou přibýt další): `product`, `open_item`, `voucher_sale` - `product_id` (Id | null, povinné) - `name` (string, povinné) - `variant` (string | null, povinné): `full` nebo `half` u `product`; `null` u `open_item` a `voucher_sale`. Známé hodnoty (mohou přibýt další): `full`, `half`, `None` - `quantity` (number, povinné): Na storno dokladu záporný. - `unit_price` (Money, povinné): Účtovaná cena za kus, před slevou položky. - `catalog_unit_price` (Money | null, povinné): Cena za kus varianty ze sortimentu v okamžiku, ke kterému se položka počítala – v `issued_at`, nebo v `ordered_at`, když se použil; `null` u položek s vlastní cenou a voucherů. - `price_source` (string, povinné): `catalog`, `manager` (cena vedoucího nebo položka s vlastní cenou), `device` (cena pokladny u opožděné účtenky) nebo `calculator` (položka s vlastní cenou prodaná tlačítkem režimu Kalkulačka… Známé hodnoty (mohou přibýt další): `catalog`, `manager`, `device`, `calculator` (od 26.11.24) - `at_employee_price` (boolean, povinné) - `packaging_unit_price` (Money | null, povinné) - `vat_rate` (VatRate, povinné): `0` u prodeje voucheru, který je mimo DPH a není v `totals.vat`. - `add_ons` (object[], povinné) - `product_id` (Id, povinné) - `name` (string, povinné) - `unit_price` (Money, povinné) - `vat_rate` (VatRate, povinné) - `note` (string | null, povinné) - `course` (integer, povinné) - `total` (Money, povinné): počet × (cena za kus + obal + přílohy), před slevami. - `voucher_code` (string | null, povinné): Prodaný voucher, maskovaně. ### ReceiptDiscount - `line_id` (Id | null, povinné): Zlevněný řádek; `null` u slevy na celou účtenku. - `method` (string, povinné): Jako `ReceiptDiscountInput.method` – `manual` nebo `automatic`. Známé hodnoty (mohou přibýt další): `manual`, `automatic` - `type` (string, povinné): Jako `ReceiptDiscountInput.type` – `percent` nebo `amount`. Známé hodnoty (mohou přibýt další): `percent`, `amount` - `value` (integer | null, povinné): Procenta u `percent`; u `amount` na účtence `null` – sleva je v `amount`. V náhledu (`previewReceipt`) je tu u slevy `amount` místo toho částka v nejmenších jednotkách; čtěte `amount`. - `name` (string | null, povinné) - `amount` (Money, povinné): Záporná částka (na storno dokladu kladná). - `vat` (VatBreakdown[], povinné) ### ReceiptPayment - `id` (Id, povinné) - `method` (string, povinné): Jako `ReceiptPaymentInput.method`. Známé hodnoty (mohou přibýt další): `cash`, `card`, `meal_voucher`, `company_account`, `invoice`, `voucher` - `amount` (Money, povinné): Kolik z účtenky platba hradí, bez dýška; na storno dokladu záporné. - `tip` (Money, povinné): Dýško této platby; na storno dokladu záporné. - `tendered` (Money | null, povinné): Hotovost přijatá od zákazníka; `null`, když nepřišla, a na storno dokladu. - `change` (Money | null, povinné): Vráceno zákazníkovi – `tendered` minus `amount` a `tip`; `null` bez `tendered`. - `voucher_code` (string | null, povinné): Maskovaně. - `reference` (string | null, povinné) - `terminal` (object | null, povinné): Část záznamu z platebního terminálu (`TerminalPaymentInput`); na storno dokladu záznam původní platby. ### ReceiptPriceDifference Cena, kterou pokladna účtovala jinak než sortiment – pro audit. Přijme se od vedoucího pokladny, nebo u opožděné účtenky (pořízené offline, nebo poslané víc než 10 minut po vystavení). - `line_id` (Id, povinné): Řádek účtenky. - `product_id` (Id, povinné): Produkt řádku – i když se liší cena některé jeho přílohy. - `add_on_product_id` (Id | null, povinné): Příloha, jejíž cena se liší; `null`, když se liší cena samotného produktu. - `catalog_unit_price` (Money, povinné): Cena za kus ze sortimentu – použité varianty (půlka, cena pro zaměstnance) nebo přílohy. - `charged_unit_price` (Money, povinné): Cena za kus, kterou poslala pokladna (`unit_price`). - `reason` (string, povinné): `manager` – schválil ji vedoucí pokladny (přihlášený, `manager_credential`, nebo `approved_by_id` offline účtenky, podepsané i nepodepsané); `offline` – bez vedoucího, u opožděné účtenky. Známé hodnoty (mohou přibýt další): `offline`, `manager` ### ReceiptEet Tržba evidovaná v EET 2.0, kterou odesílá server. `pending` se odešle znovu sama; `rejected` potřebuje člověka (certifikát, nastavení) v administraci; `test` – provozovna má testovací certifikát, tržba šla jen do testovacího prostředí a evidovaná není (neukazujte ji jako zaevidovanou). - `status` (string, povinné): `pending` – čeká na odeslání nebo se po chybě odesílá znovu (i když provozovna ještě nemá certifikát); `accepted` – finanční správa ji přijala (`pok`); `rejected` – odmítnuto (chyba finanční správy… Známé hodnoty (mohou přibýt další): `pending`, `accepted`, `rejected`, `skipped`, `test` - `total` (Money, povinné): Evidovaná částka (celk_trzba). - `prepaid_issued` (Money | null, povinné): Prodané vouchery (urceno_cerp_zuct). - `prepaid_used` (Money | null, povinné): Zaplaceno vouchery (cerp_zuct). - `register_id` (string, povinné): Označení pokladny poslané do EET (id_pokl). - `sequence` (string, povinné): Pořadové číslo poslané do EET (porad_cis). - `unit_id` (string, povinné): Evidenční jednotka z DIS+ (id_jednotky). - `sold_at` (string, povinné): Čas tržby přesně jak se poslal (dat_trzby). - `pok` (string | null, povinné): Potvrzovací kód od finanční správy; v testovacím prostředí končí `-ff`. - `environment` (string | null, povinné): `production` – ostré EET 2.0; `playground` – testovací prostředí (testovací certifikát); `null` před prvním pokusem o odeslání. Známé hodnoty (mohou přibýt další): `production`, `playground`, `None` - `error` (object | null, povinné) - `warnings` (object[], povinné): Varování finanční správy (tržba se i tak přijala). - `code` (integer, povinné) - `message` (string, povinné) - `deadline_at` (Timestamp, povinné): 48 hodin po tržbě – zákonná lhůta, když tržba nešla odeslat hned. ### ReceiptCancellationRef - `receipt_id` (string (uuid), povinné) - `issued_at` (Timestamp, povinné) - `reason` (string | null, povinné) ### Receipt Účtenka nebo storno doklad (`kind`), které přes toto API vystavila pokladna provozovny, tak, jak je server spočítal a uložil. Peníze jsou v nejmenších jednotkách; na storno dokladu jsou částky záporné. - `id` (string (uuid), povinné): Vaše UUID účtenky nebo storno dokladu, malými písmeny. - `restaurant_id` (Id, povinné) - `device_id` (Id, povinné): Spárované zařízení, které ji vystavilo (u storno dokladu zařízení, které stornovalo). - `number` (integer, povinné): Číslo z počítadla pokladny; účtenky a storno doklady se číslují zvlášť. - `kind` (string, povinné): `sale` – účtenka; `storno` – storno doklad se zápornými částkami. Známé hodnoty (mohou přibýt další): `sale`, `storno` - `status` (string, povinné): `issued` – platná; `cancelled` – účtenka stornovaná přes `cancelReceipt` (viz `cancelled_by`). Storno doklad je vždy `issued`. Storno v kuchyni nebo v administraci stav nemění. Známé hodnoty (mohou přibýt další): `issued`, `cancelled` - `issued_at` (Timestamp, povinné): Kdy byla zaplacena, podle hodin zařízení; u storno dokladu kdy ho vystavil server. - `received_at` (Timestamp, povinné): Kdy ji server poprvé přijal. - `offline` (boolean, povinné): Pořízena offline (`ReceiptCreate.offline`); na storno dokladu vždy `false`. - `issued_by` (EmployeeRef, povinné): Zaměstnanec, který ji vystavil – přihlášený, nebo `issued_by_id` offline účtenky. - `approved_by` (EmployeeRef | null, povinné): Vedoucí pokladny, který zaměstnanci schválil ruční slevu nebo cenu (`manager_credential`, nebo `approved_by_id` offline účtenky); `null`, když nikdo neschvaloval – i když účtenku vystavil vedoucí. - `table_name` (string | null, povinné): Stůl, jak přišel; `null`, když žádný. - `order_type` (string, povinné): Jako `ReceiptCreate.order_type` – `dine_in` nebo `takeaway`; storno doklad ho přebírá. Známé hodnoty (mohou přibýt další): `dine_in`, `takeaway` - `customer_id` (Id | null, povinné): Zákazník ze `searchCustomerDirectory`, který získal věrnostní body; `null`, když žádný. - `note` (string | null, povinné): Poznámka, jak přišla; `null`, když žádná. - `lines` (ReceiptLine[], povinné): Řádky tak, jak je server spočítal. - `discounts` (ReceiptDiscount[], povinné): Slevy položek (`line_id`) a celé účtenky. - `totals` (Totals, povinné): `items` – všechny řádky včetně prodaných voucherů; `charges` – na účtence vždy nula; `discounts` – záporné; `rounding` – zaokrouhlení části placené hotově; `total` – kolik se zaplatilo, bez dýška.… - `payments` (ReceiptPayment[], povinné): Platby, jak přišly, kódy voucherů maskovaně. - `tips` (Money, povinné): Všechna dýška; nejsou součástí `totals.total`. - `price_differences` (ReceiptPriceDifference[], povinné): Ceny, které se liší od sortimentu; na storno dokladu vždy prázdné. - `kitchen_number` (string | null, povinné): Číslo ve frontě kuchyně, když šla do kuchyně, na tři číslice jako na kuchyňském displeji (`027`), stejně jako `Order.kitchen_number`. - `cancels` (string (uuid) | null (uuid), povinné): U storno dokladu účtenka, kterou ruší. - `cancelled_by` (ReceiptCancellationRef | null, povinné): U stornované účtenky její storno doklad s důvodem (samotný storno doklad důvod nenese). - `eet` (ReceiptEet | null, povinné): `null`, když provozovna tržby v EET 2.0 neeviduje, nebylo co evidovat (třeba jen platby na firemní účet nebo fakturou) nebo jde o veřejný ukázkový účet. V události `receipt.created` je to stav před… - `shift_closed_at` (Timestamp | null, povinné): Kdy účtenku zahrnula uzávěrka zařízení; `null`, dokud je směna otevřená. ### ReceiptPage - `data` (Receipt[], povinné) - `next_cursor` (string | null, povinné) ### ReceiptPreview - `lines` (ReceiptLine[], povinné) - `discounts` (ReceiptDiscount[], povinné) - `totals` (Totals, povinné) - `price_differences` (ReceiptPriceDifference[], povinné) - `cash_amount_due` (Money, povinné): Kolik vybrat v hotovosti – `totals.total` zaokrouhlená na celé koruny. - `eet_recorded` (boolean, povinné): Provozovna eviduje tržby v EET 2.0. ### PosShiftSummary - `device_id` (Id, povinné) - `opened_at` (Timestamp | null, povinné): První účtenka směny; `null` bez účtenek. - `receipts` (object, povinné) - `sales` (integer, povinné) - `storno` (integer, povinné) - `totals` (object, povinné) - `sales` (Money, povinné) - `storno` (Money, povinné) - `net` (Money, povinné) - `payments` (object[], povinné): Čisté částky podle způsobu platby (včetně storen). - `method` (string, povinné): Známé hodnoty (mohou přibýt další): `cash`, `card`, `meal_voucher`, `company_account`, `invoice`, `voucher` - `amount` (Money, povinné) - `tips` (Money, povinné) - `count` (integer, povinné) - `tips` (Money, povinné) - `vat` (VatBreakdown[], povinné) - `vouchers` (object, povinné) - `sold` (Money, povinné) - `redeemed` (Money, povinné) - `eet` (object, povinné): Tržby směny, které EET 2.0 ještě nepřijalo. - `pending` (integer, povinné) - `rejected` (integer, povinné) - `open_tabs` (object, povinné): Účty stolů, které jsou v provozovně ještě otevřené (všech zařízení), a jejich součet. Uzávěrka je nezavírá – ukažte je před uzavřením, ať přes noc nezůstane nezaplacený stůl. - `count` (integer, povinné) - `total` (Money, povinné) - `cash_movements` (PosShiftCashMovements, povinné) - `device_ids` (Id[], povinné): Zařízení, která souhrn pokrývá – toto a ta z `devices` (nebo `device_ids` uzávěrky). - `by_device` (PosShiftDevicePart[], povinné): Po zařízeních, v pořadí `device_ids`. - `by_employee` (PosShiftEmployeePart[], povinné): Po zaměstnancích, kteří účtenky vystavili, od nejvyšší čisté částky – platby hotově a dýško v hotovosti jsou to, co zaměstnanec odvádí. ### PosShiftDevicePart Část směny vystavená na jednom zařízení. - `device_id` (Id, povinné) - `name` (string | null, povinné): Název zařízení ze spárování. - `receipts` (object, povinné) - `sales` (integer, povinné) - `storno` (integer, povinné) - `net` (Money, povinné) - `payments` (object[], povinné): Čisté částky podle způsobu platby (včetně storen), s dýškem. - `method` (string, povinné): Známé hodnoty (mohou přibýt další): `cash` (od 26.10.4), `card` (od 26.10.4), `meal_voucher` (od 26.10.4), `company_account` (od 26.10.4), `invoice` (od 26.10.4), `voucher` (od 26.10.4) - `amount` (Money, povinné) - `tips` (Money, povinné) - `count` (integer, povinné) ### PosShiftEmployeePart Část směny, kterou vystavil jeden zaměstnanec – jeho platby hotově a dýško v hotovosti odvádí. - `employee` (EmployeeRef | null, povinné): Kdo účtenky vystavil; `null` u účtenek bez zaměstnance. - `receipts` (object, povinné) - `sales` (integer, povinné) - `storno` (integer, povinné) - `net` (Money, povinné) - `payments` (object[], povinné): Čisté částky podle způsobu platby (včetně storen), s dýškem. - `method` (string, povinné): Známé hodnoty (mohou přibýt další): `cash` (od 26.10.4), `card` (od 26.10.4), `meal_voucher` (od 26.10.4), `company_account` (od 26.10.4), `invoice` (od 26.10.4), `voucher` (od 26.10.4) - `amount` (Money, povinné) - `tips` (Money, povinné) - `count` (integer, povinné) ### PosShiftCashMovements Pohyby hotovosti, které toto zařízení zapsalo od své poslední uzávěrky (`createCashMovement`), bez počátečního stavu a bez pohybů smazaných v administraci. - `count` (integer, povinné) - `deposits` (Money, povinné) - `incomes` (Money, povinné) - `withdrawals` (Money, povinné): Kladná vybraná částka. - `expenses` (Money, povinné): Kladná vydaná částka. - `net` (Money, povinné): Vklady a příjmy minus výběry a výdaje; část očekávané hotovosti uzávěrky. ### CashMovementInput - `id` (string (uuid), povinné): Vaše UUID pohybu, vytvořené na zařízení. - `kind` (string, povinné): `deposit` a `income` do kasy přidávají, `withdrawal` a `expense` z ní berou, `opening` začíná knihu stavem kasy (jednou). `withdrawal`, `expense` a `opening` potřebují vedoucího pokladny. Hodnoty: `opening`, `deposit`, `income`, `withdrawal`, `expense`. - `amount` (MoneyInput, povinné): Vždy kladná (nula jen u `opening`); směr dává druh. - `note` (string | null): O co šlo; povinné kromě `opening`. - `document` (string | null): Číslo papírového dokladu (paragon, faktura dodavatele); jde do Pohody jako číslo dokladu. - `occurred_at` (Timestamp | null): Kdy se peníze pohnuly; bez něj teď. Nejvýš 7 dní zpátky. - `manager_credential` (StaffCredential | null): PIN nebo čip vedoucího pokladny, který teď schvaluje výběr, výdaj nebo počáteční stav. ### CashMovement - `id` (string (uuid), povinné): Vaše UUID pohybu. - `number` (Id, povinné): Číslo pohybu v pokladní knize (`CashBookEntry.number`). - `kind` (string, povinné): Známé hodnoty (mohou přibýt další): `opening` (od 26.10.4), `deposit` (od 26.10.4), `income` (od 26.10.4), `withdrawal` (od 26.10.4), `expense` (od 26.10.4) - `amount` (Money, povinné): Jak se zapsala – vždy kladná; směr dává druh. - `note` (string, povinné) - `document` (string | null, povinné) - `occurred_at` (Timestamp, povinné) - `recorded_at` (Timestamp, povinné) - `recorded_by` (EmployeeRef, povinné) - `approved_by` (EmployeeRef | null, povinné): Vedoucí pokladny, který ho schválil (i přihlášený vedoucí); `null` bez schválení. - `device_id` (Id, povinné) ### CashBook - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `opening` (object | null, povinné): Počáteční stav, kterým kniha začala; `null`, dokud nezačala. - `balance_start` (Money | null, povinné): Hotovost na začátku `date_from`; `null` před počátečním stavem. - `balance_end` (Money | null, povinné): Hotovost na konci `date_to` (u dneška teď). - `balance_now` (Money | null, povinné): Hotovost, kterou kniha teď očekává v kase. - `days` (CashBookDay[], povinné): Každý den období, od nejstaršího. - `movements` (CashBookEntry[], povinné): Ručně zapsané pohyby v období, od nejstaršího, i smazané. ### CashBookDay - `date` (LocalDate, povinné) - `start` (Money | null, povinné): Hotovost na začátku dne; `null` před počátečním stavem. - `cash_receipts` (Money, povinné): Účtenky placené hotově (storna odečítají), od počátečního stavu. - `receipts_count` (integer, povinné) - `cash_tips` (Money, povinné) - `income` (Money, povinné): Vklady a jiné příjmy. - `outgoings` (Money, povinné): Výběry a výdaje, kladnou částkou. - `differences` (Money, povinné): Rozdíly zjištěné kontrolou pokladny (záporné = chyběla hotovost). - `end` (Money | null, povinné): Hotovost na konci dne; `null` před počátečním stavem. ### CashBookEntry - `number` (Id, povinné) - `kind` (string, povinné): Známé hodnoty (mohou přibýt další): `opening` (od 26.10.4), `deposit` (od 26.10.4), `income` (od 26.10.4), `withdrawal` (od 26.10.4), `expense` (od 26.10.4), `difference` (od 26.10.4) - `amount` (Money, povinné): Vliv na kasu – vklady a příjmy kladně, výběry a výdaje záporně, rozdíl se znaménkem; u `opening` hotovost v kase na začátku. - `note` (string, povinné) - `document` (string | null, povinné) - `occurred_at` (Timestamp, povinné) - `recorded_by` (string, povinné): Kdo ho zapsal – jméno v administraci, nebo zaměstnanec a zařízení pokladny. - `device_id` (Id | null, povinné): Pokladna, která ho zapsala přes toto API; `null` u administrace. - `pos_movement_id` (string (uuid) | null (uuid), povinné): `CashMovement.id` z pokladny; `null` u administrace. - `deleted_at` (Timestamp | null, povinné): Kdy byl v administraci smazán; smazaný pohyb se nepočítá. - `deleted_by` (string | null, povinné) ### PosShiftCloseRequest - `id` (string (uuid), povinné): Vaše UUID uzávěrky. - `counted_cash` (MoneyInput | null): Napočítaná hotovost v pokladně. - `note` (string | null) - `device_ids` (Id[]): Další zařízení provozovny, jejichž otevřené směny tato uzávěrka vezme také (nejdřív je ukáže `GET …/pos-shift?devices=all`). Potřebuje vedoucího pokladny. - `legacy_receipt_ids` (string (uuid)[]): Vlastní pokladna Profirestu po přechodu mezi API v1 a v2 uprostřed směny: UUID účtenek této směny, které vystavila v API v1. Uzávěrka je vezme také (každou jen jednou, i přes obě API). - `manager_credential` (StaffCredential | null): PIN nebo čip vedoucího pokladny, který teď schvaluje `device_ids` (není potřeba, když je vedoucí přihlášený). ### PosShiftClose - `id` (string (uuid), povinné) - `device_id` (Id, povinné) - `closed_at` (Timestamp, povinné) - `closed_by` (EmployeeRef, povinné) - `summary` (PosShiftSummary, povinné) - `cash_expected` (Money, povinné): Platby hotově a dýško v hotovosti za směnu plus `summary.cash_movements.net` – vklady a příjmy minus výběry a výdaje, které zařízení zapsalo (`createCashMovement`). Tolik má být v kase, když směna… - `counted_cash` (Money | null, povinné) - `cash_difference` (Money | null, povinné): napočítáno − očekáváno; záporné znamená chybějící hotovost. - `note` (string | null, povinné) ### PosShiftClosePage - `data` (PosShiftClose[], povinné) - `next_cursor` (string | null, povinné) ### Problem Popis chyby podle RFC 9457. - `type` (string (uri), povinné): Stálá adresa s popisem kódu chyby. - `title` (string, povinné): Krátký popis pro člověka v jazyce podle `Content-Language`. - `status` (integer, povinné) - `code` (string, povinné): Strojový kód chyby z katalogu. Nikdy se nemění. Co který kód znamená a co dělat, je v katalogu chyb (`x-error-catalog` v `openapi.json`, kapitola *Katalog chyb* dokumentace). Kódy mohou přibýt… Známé hodnoty (mohou přibýt další): `malformed_request`, `idempotency_key_missing`, `invalid_token`, `insufficient_scope`, `not_found`, `method_not_allowed`, `not_acceptable`, `conflict`, `idempotency_in_progress`, `external_id_conflict`, `cursor_expired`, `precondition_failed`, `payload_too_large`, `unsupported_media_type`, `validation_failed`, `idempotency_key_mismatch`, `precondition_required`, `rate_limited`, `internal_error`, `not_implemented`, `service_unavailable`, `restaurant_closed`, `ordering_disabled`, `delivery_unavailable`, `pickup_unavailable`, `outside_delivery_zone`… - `detail` (string | null, povinné): Co se stalo v tomto konkrétním případě. - `instance` (string | null, povinné): Cesta požadavku. - `request_id` (string, povinné) - `errors` (FieldError[], povinné): Problémy u jednotlivých polí u `validation_failed` a některých obchodních chyb; jinak prázdné. - `existing_id` (Id | null, povinné): U `external_id_conflict` a `quote_already_used` ID existujícího objektu, pokud ho vaše připojení vidí; u `receipt_number_conflict` účtenka, která už číslo má; u `conflict` z `POST /customers` a… - `candidates` (EmployeeRef[], povinné): U `staff_ambiguous` zaměstnanci, kteří mají stejný PIN; jinak prázdné. - `paid_by` (PaidBy | null, povinné): U `already_paid` čím a kdy se objednávka u dveří zaplatila – ukažte ji jako zaplacenou a platbu znovu neberte; jinak `null`. ### FieldError - `pointer` (string, povinné): JSON Pointer (RFC 6901) na pole v těle požadavku, například `/items/2/quantity`. - `code` (string, povinné): Co je s polem špatně: `required` – chybí; `unknown_field` – toto pole nebo parametr adresy API nezná; `invalid_type` – špatný typ JSON; `invalid_format` – text neodpovídá vzoru nebo formátu (i klíč… Známé hodnoty (mohou přibýt další): `required`, `unknown_field`, `invalid_type`, `invalid_format`, `invalid_value`, `too_small`, `too_large`, `too_short`, `too_long`, `not_found`, `duplicate`, `unsupported_characters`, `product_unavailable`, `not_allowed`, `too_many`, `currency_mismatch`, `price_changed`, `voucher_invalid`, `voucher_expired`, `voucher_used_up`, `voucher_blocked`, `voucher_not_accepted_here`, `voucher_not_for_sale`, `product_not_orderable` (od 26.10.4), `option_not_in_group` (od 26.10.9), `option_group_min` (od 26.10.9), `option_group_max` (od 26.10.9)… - `message` (string, povinné): Vysvětlení pro člověka v jazyce odpovědi. ### TokenRequestAuthorizationCode Neznámé parametry se ignorují (RFC 6749). - `grant_type` (string, povinné): `authorization_code` – výměna `code`, které dostala vaše adresa pro přesměrování ze souhlasové stránky. Hodnoty: `authorization_code`. - `code` (string, povinné) - `redirect_uri` (string (uri), povinné) - `code_verifier` (string, povinné) - `client_id` (string) - `client_secret` (string) ### TokenRequestRefreshToken Neznámé parametry se ignorují (RFC 6749). - `grant_type` (string, povinné): `refresh_token` – nový access token a nový refresh token za refresh token, který máte. Hodnoty: `refresh_token`. - `refresh_token` (string, povinné) - `scope` (string): Nepovinně užší sada oprávnění. - `client_id` (string) - `client_secret` (string) ### TokenRequestDeviceCode Neznámé parametry se ignorují (RFC 6749). - `grant_type` (string, povinné): Zařízení si vyzvedne tokeny poté, co vedoucí potvrdil jeho kód (RFC 8628). Hodnoty: `urn:ietf:params:oauth:grant-type:device_code`. - `device_code` (string, povinné) - `client_id` (string, povinné) ### TokenRequestV1Device Jen vlastní aplikace Profirestu pro pokladnu (`profirest-pos`), kuchyňský displej (`profirest-kds`) a kurýra (`profirest-kuryr`). Identita API v1, kterou si aplikace drží: pokladna aplikační klíč, login a ID zařízení; kuchyňský displej token API v1 a ID zařízení; kurýr login a heslo webové kuchyně a ID telefonu. Neznámé parametry se ignorují (RFC 6749). - `grant_type` (string, povinné): Identita API v1 za tokeny zařízení – zařízení přejde na API v2 bez nového párování. Hodnoty: `urn:profirest:params:oauth:grant-type:v1-device`. - `client_id` (string, povinné): Od verze 26.11.6: `profirest-pos`, `profirest-kds`, `profirest-kuryr`. Hodnoty: `profirest-pos`, `profirest-kds`, `profirest-kuryr`. - `v1_device_id` (string, povinné): `DEVICE_ID`, který aplikace posílá v API v1 (aplikace kurýra ID telefonu). - `v1_app_key` (string): Pokladna: `APP_KEY` z API v1. - `v1_login` (string): Pokladna a kurýr: `LOGIN` z API v1. - `v1_token` (string): Kuchyňský displej: jeho token API v1. - `v1_password` (string): Kurýr: `PASS` z API v1. - `scope` (string): Oprávnění, která zařízení potřebuje, oddělená mezerou; bez něj všechna, která aplikace mít smí. - `device_platform` (string) - `app_version` (string) ### DeviceAuthorizationRequest Neznámé parametry se ignorují (RFC 6749). - `client_id` (string, povinné) - `scope` (string, povinné): Oprávnění, která zařízení potřebuje, oddělená mezerou. Nejvýš ta, která Profirest povolil vaší aplikaci. - `device_name` (string): Navržený název, který uvidí vedoucí, například `Pokladna u baru`. Vedoucí ho může změnit. Emoji a jiné znaky mimo základní rovinu Unicode odmítne `invalid_request` (stejně u `device_platform` a… - `device_platform` (string): Operační systém nebo prohlížeč, například `Android 14`. - `app_version` (string) ### DeviceAuthorizationResponse - `device_code` (string, povinné): Tajný údaj zařízení pro dotazy na `POST /oauth/token`. Nikdy ho neukazujte. - `user_code` (string, povinné): Kód, který vedoucí zadá v Profirestu; ukažte ho velkým písmem, s pomlčkou. - `verification_uri` (string (uri), povinné) - `verification_uri_complete` (string (uri), povinné): Stejná stránka s vyplněným kódem – ukažte ji jako QR kód. - `expires_in` (integer, povinné) - `interval` (integer, povinné): Kolik sekund čekat mezi dotazy na `POST /oauth/token`. ### TokenResponse - `access_token` (string, povinné) - `token_type` (string, povinné): Vždy `Bearer`: access token posílejte jako `Authorization: Bearer `. Známé hodnoty (mohou přibýt další): `Bearer` - `expires_in` (integer, povinné) - `refresh_token` (string, povinné) - `refresh_token_expires_in` (integer, povinné): Kolik sekund refresh token platí, když se nepoužije. - `scope` (string, povinné) ### OAuthError - `error` (string, povinné): Kódy podle RFC 6749 a RFC 8628: `invalid_request` – chybí nebo je špatně parametr (i tělo, které není formulář, nebo dva způsoby ověření klienta naráz); `invalid_client` – ověření klienta selhalo… Známé hodnoty (mohou přibýt další): `invalid_request`, `invalid_client`, `invalid_grant`, `unauthorized_client`, `unsupported_grant_type`, `invalid_scope`, `authorization_pending`, `slow_down`, `access_denied`, `expired_token` - `error_description` (string, povinné): Věta pro vývojáře, anglicky. - `api_target` (string | null, povinné): `null`, jen u `invalid_grant` při obnově tokenu vlastní pokladny, kuchyňského displeje nebo kurýra Profirestu: zařízení se vrátilo na API v1 – přihlaste se tam identitou API v1, odpárované není. Hodnoty: `v1`, `None`. ### OAuthServerMetadata - `issuer` (string, povinné) - `authorization_endpoint` (string (uri), povinné) - `token_endpoint` (string (uri), povinné) - `revocation_endpoint` (string (uri), povinné) - `scopes_supported` (string[], povinné) - `response_types_supported` (string[], povinné) - `grant_types_supported` (string[], povinné) - `code_challenge_methods_supported` (string[], povinné) - `token_endpoint_auth_methods_supported` (string[], povinné) - `authorization_response_iss_parameter_supported` (boolean, povinné) - `device_authorization_endpoint` (string (uri), povinné) ### Address Adresa tak, jak ji Profirest ukládá a zobrazuje. - `street` (string | null, povinné) - `house_number` (string | null, povinné) - `city` (string | null, povinné) - `postal_code` (string | null, povinné) - `country` (string, povinné) - `note` (string | null, povinné): Patro, zvonek, kód od vchodu. - `formatted` (string, povinné): Celá adresa na jednom řádku, jak ji vidí kurýr. ### AddressInput Doručovací adresa. Pošlete `street`, `house_number` nebo obojí (v obcích bývá jen číslo popisné). `location` je povinná: použijte vlastní vyhledávání adres a pošlete souřadnice zvolené adresy. Rozvozovou zónu Profirest určí podle `location`. Varianty: any | any - `street` (string | null) - `house_number` (string | null) - `city` (string, povinné) - `postal_code` (string | null) - `country` (string) - `note` (string | null): Patro, zvonek, kód od vchodu. - `location` (GeoPointInput, povinné) ### Restaurant Provozovna, kterou vaše připojení smí vidět, s kontaktními údaji, jak jsou zadané v administraci, a s tím, co od vaší aplikace právě přijímá (`ordering`). - `id` (Id, povinné) - `name` (string, povinné): Název provozovny, jak je zadaný v administraci. - `is_test` (boolean, povinné): Testovací provozovna. Její objednávky nikdo nepřipravuje. - `address` (Address, povinné): Adresa provozovny. `street` obsahuje ulici i s číslem domu (`house_number` je `null`), `postal_code` je ve tvaru `NNN NN`, `country` je `CZ` a `note` je `null`. - `location` (GeoPoint | null, povinné): Souřadnice provozovny; `null`, když je administrace nemá. - `phone` (string | null, povinné): Jak ho zadala provozovna; ne vždy ve formátu E.164. - `website` (string | null, povinné): Web, jak ho zadala provozovna (nekontroluje se); `null`, když chybí. - `timezone` (string, povinné): Časová zóna časů a dat provozovny; dnes u všech provozoven `Europe/Prague`. - `currency` (string, povinné): Měna účtu – stejná pro všechny jeho provozovny; jsou v ní všechny ceny a částky. - `ordering` (RestaurantOrdering, povinné) - `portion_tracking` (boolean, povinné): Provozovna pro vaši aplikaci hlídá počty porcí; viz `GET /restaurants/{restaurant_id}/availability`. Pro aplikace personálu a kiosek i tehdy, když porce hlídá jen na pokladnách. - `external_id` (ExternalId | null, povinné): Vaše vlastní ID provozovny (`putExternalRef`); `null`, když žádné nenastavíte. - `metadata` (Metadata, povinné): Vaše vlastní dvojice klíč–hodnota u provozovny (`putExternalRef`). ### RestaurantOrdering Co provozovna přijímá od vaší aplikace, spočítáno v okamžiku požadavku. Časová pravidla jsou pravidla aplikací `web`: `open_now` se řídí příjmem objednávek (`getOrderHours`), `venue_open_now` otevírací dobou (`getOpeningHours`) – štítek „Otevřeno/Zavřeno“ pro hosty berte z `venue_open_now`, ne z `open_now`. U aplikace `staff` (`GET /connection`) se objednávky přijímají kdykoli: rozvoz i odběr jsou vždy k dispozici, objednávky na čas jsou zapnuté bez `max_days_ahead` a s `lead_minutes` 0… - `accepting_orders` (boolean, povinné): Objednávky přes API jsou vůbec možné (aktivní předplatné, nepozastaveno). - `open_now` (boolean, povinné): Podle času se teď objednávky přijímají – u `web` podle příjmu objednávek (`getOrderHours`). - `venue_open_now` (boolean, povinné): Provozovna má teď podle otevírací doby otevřeno (`getOpeningHours`). Jen pro zobrazení. - `next_change_at` (Timestamp | null, povinné): Nejbližší okamžik, kdy se kvůli času změní některá hodnota v `ordering`; `null`, když žádný není. - `delivery` (object, povinné) - `enabled` (boolean, povinné) - `available_now` (boolean, povinné): Aspoň jedna rozvozová zóna je právě teď v čase rozvozu. - `pickup` (object, povinné) - `enabled` (boolean, povinné) - `available_now` (boolean, povinné) - `scheduled_orders` (object, povinné): Objednávky na pozdější čas. Nastavuje je majitel u provozovny; přijímají se jen v době, kdy provozovna přijímá objednávky (`open_now`). - `enabled` (boolean, povinné) - `max_days_ahead` (integer | null, povinné) - `slot_minutes` (integer | null, povinné) - `lead_minutes` (integer | null, povinné): Nejkratší doba mezi odesláním objednávky a jejím časem. ### RestaurantPage - `data` (Restaurant[], povinné) - `next_cursor` (string | null, povinné) ### TimeInterval Oba konce včetně: objednávka přesně na `to` se ještě přijme. `to` může být `24:00`. Interval nikdy nepřekračuje půlnoc; noční provoz jsou dva intervaly ve dvou dnech. - `from` (LocalTime, povinné) - `to` (LocalTime, povinné) ### OpeningHoursInput - `weekly` (object[], povinné): Všech 7 dní, každý jednou. Den 1 = pondělí, 7 = neděle (ISO 8601). - `day` (integer, povinné) - `intervals` (TimeIntervalInput[], povinné): Popořadě, bez překryvu; prázdné = ten den zavřeno. ### TimeIntervalInput Oba konce včetně; `to` může být `24:00`, `from` ne. - `from` (LocalTime, povinné) - `to` (LocalTime, povinné) ### OpeningHours - `restaurant_id` (Id, povinné) - `timezone` (string, povinné) - `weekly` (object[], povinné): Běžný týden pro zobrazení, vždy 7 položek. Den 1 = pondělí, 7 = neděle (ISO 8601). - `day` (integer, povinné) - `intervals` (TimeInterval[], povinné) - `days` (object[], povinné): Skutečná doba po datech. V den bez intervalů je zavřeno. - `date` (LocalDate, povinné) - `intervals` (TimeInterval[], povinné) ### OrderHours Kdy se přijímají objednávky aplikací `web` (`getOrderHours`). Stejný tvar jako `OpeningHours`; den bez intervalů objednávky nepřijímá. - `restaurant_id` (Id, povinné) - `timezone` (string, povinné) - `same_as_opening_hours` (boolean, povinné): `true` – provozovna nemá vlastní příjem objednávek, objednávky se přijímají celou otevírací dobu a intervaly jsou stejné jako v `getOpeningHours`. - `weekly` (object[], povinné): Běžný týden pro zobrazení, vždy 7 položek. Den 1 = pondělí, 7 = neděle (ISO 8601). - `day` (integer, povinné) - `intervals` (TimeInterval[], povinné) - `days` (object[], povinné): Skutečný příjem objednávek po datech. V den bez intervalů se objednávky nepřijímají. - `date` (LocalDate, povinné) - `intervals` (TimeInterval[], povinné) ### GeoJsonPolygon Geometrie GeoJSON (RFC 7946). Souřadnice jsou `[zeměpisná délka, zeměpisná šířka]`. - `type` (string, povinné): `Polygon` – jedna oblast: `coordinates` je jeden uzavřený okruh, vnější okruh proti směru hodinových ručiček. Každá zóna je dnes jeden `Polygon`. `MultiPolygon` – více oddělených oblastí; vyhrazené… Známé hodnoty (mohou přibýt další): `Polygon`, `MultiPolygon` - `coordinates` (any[], povinné) ### DeliveryZone - `id` (Id, povinné) - `name` (string, povinné) - `fee` (Money, povinné) - `minimum_order` (Money, povinné) - `express_fee` (Money | null, povinné): Příplatek za expresní doručení (`FulfillmentInput.speed`); `null`, když ho zóna nenabízí. - `area` (GeoJsonPolygon, povinné) - `schedule` (object[], povinné): Kdy zóna rozváží. Prázdné znamená vždy během příjmu objednávek (`getOrderHours`). - `days` (integer[], povinné) - `from` (LocalTime, povinné) - `to` (LocalTime, povinné) - `available_now` (boolean, povinné) ### DeliveryZonePage - `data` (DeliveryZone[], povinné) - `next_cursor` (string | null, povinné) ### FulfillmentType `delivery` – rozvoz na adresu; `pickup` – zákazník si objednávku vyzvedne v provozovně; `dine_in` – jídlo na místě (volba „Tady“ na kiosku): bez obalu, se sazbou DPH na místě, kuchyně ji vidí jako na místě. `dine_in` jen pro kiosek a aplikace personálu (`Connection.client.order_channel`), ostatní dostanou `422` s `not_allowed`; časy má stejné jako `pickup`. Výdejna bez stolů (`getDeviceSettings`, `pos.takeaway_only`) z `dine_in` udělá `pickup` – s obalem, kalkulace i objednávka pak uvádějí… Typ: string. Hodnoty: `delivery`, `pickup`, `dine_in`. ### TimeSlots - `restaurant_id` (Id, povinné) - `type` (string, povinné): `type`, na který jste se ptali – `delivery` (kdy zákazník objednávku dostane), `pickup` nebo `dine_in` (kdy je připravená). Známé hodnoty (mohou přibýt další): `delivery`, `pickup`, `dine_in` (od 26.10.4) - `date` (LocalDate, povinné) - `asap` (object, povinné) - `available` (boolean, povinné) - `reason` (string | null, povinné): Kód chyby, který vysvětluje proč ne, například `restaurant_closed`. - `slots` (object[], povinné): Časy, které lze zvolit pro objednávku na později. - `time` (Timestamp, povinné) ### Catalog - `restaurant_id` (Id, povinné) - `currency` (string, povinné) - `at` (Timestamp, povinné): Okamžik, pro který sortiment platí. - `generated_at` (Timestamp, povinné) - `next_change_at` (Timestamp | null, povinné): Nejbližší okamžik po `at`, kdy se sortiment změní kvůli časovým pravidlům; `null`, když žádný není. - `categories` (Category[], povinné) - `products` (Product[], povinné) - `daily_menu` (DailyMenu | null, povinné) - `allergens` (Allergen[], povinné) ### Category - `id` (Id, povinné) - `name` (string, povinné) - `description` (string | null, povinné) - `image_url` (string (uri) | null (uri), povinné) - `color` (string | null, povinné): Barva tlačítek kategorie na pokladnách a v telefonické objednávce, `#rrggbb`; `null`, když není nastavená. - `icon` (string | null, povinné): Ikonka kategorie z Font Awesome 6, jak ji ukazují šablony e-shopu (třída `fa-solid` a tahle, třeba `fa-pizza-slice`); `null`, když není nastavená. Pokladny ani kuchyň ji nepoužívají. - `position` (integer, povinné): Pořadí v menu, vzestupně. - `external_id` (ExternalId | null, povinné) - `metadata` (Metadata, povinné) ### Product Produkt, který provozovna v kanálu sortimentu nabízí v okamžiku `at`, s cenou, která tehdy platí. - `id` (Id, povinné) - `category_id` (Id | null, povinné): `null`, když se produkt nabízí jen v denním menu. - `name` (string, povinné): Název, jak je zadaný v administraci. - `description` (string | null, povinné): Popis, jak je zadaný; `null`, když chybí. - `image_url` (string (uri) | null (uri), povinné): Obrázek produktu; `null`, když žádný nemá. - `price` (Money, povinné): Cena v okamžiku `at` včetně DPH. V okně denního menu je to cena z menu. - `vat_rate` (VatRate, povinné): Sazba DPH v tomto kanálu – v `kitchen` sazba produktu „s sebou“, ve `web` a `pos` běžná sazba. - `packaging_fee` (Money | null, povinné): Za kus, účtuje se u rozvozu i odběru, se sazbou DPH produktu. - `weight` (integer | null, povinné): Jak ji zadala provozovna; zvykem gramy u jídla a mililitry u nápojů. - `allergens` (string[], povinné): Kódy z `Catalog.allergens`. - `labels` (string[], povinné): Příznaky, které provozovna nastavila pro e-shop v administraci, jen pro zobrazení – nemění cenu ani nabídku: `new` – Novinka; `limited_edition` – Limitovaná edice; `seasonal` – Sezónní nabídka… - `age_restricted` (boolean, povinné): Prodej jen dospělým (18+). Ověření věku zákazníka je na vás. - `add_ons` (ProductAddOn[], povinné): Nepovinné přílohy a doplňky, které si zákazník může přidat, každý nejvýš jednou na položku s libovolným počtem porcí (`AddOnInput.quantity`). U produktu s `option_groups` prázdné – takový produkt se… - `option_groups` (ProductOptionGroup[], povinné): Skupiny voleb produktu, který si zákazník skládá – vlastní pizza, povinný výběr těsta nebo přílohy („Těsto: vyberte 1“, „Ingredience: 0 až 8, 4 v ceně“). Výběr pošlete v `QuoteItemInput.options`… - `removable_ingredients` (RemovableIngredient[], povinné): Složení jídla – suroviny, které si host smí odebrat („bez žampionů“), v pořadí, jak je provozovna zadala; prázdné, když je produkt nemá. Ve všech kanálech. Ukažte je zaškrtnuté a odškrtnuté pošlete… - `split` (ProductSplit | null, povinné): Produkt může být dílem pizzy z půlek nebo čtvrtek (`QuoteItemInput.type` `split`), s cenou jednoho dílu; `null`, když nemůže. Díly jedné pizzy musí být ze stejné `category_id` a stejné velikosti… - `half_price` (Money | null, povinné): Cena půl porce pro aplikace personálu provozovny (`QuoteItemInput.variant` `half`) z ceny v okamžiku `at`, zaokrouhlená nahoru na celé koruny – totéž co `pos.half_price`. Jen v sortimentu `kitchen`… - `position` (integer, povinné): Pořadí v kategorii, vzestupně od 1, jak produkty řadí daný kanál; u produktu jen v denním menu jeho místo v denním menu. - `ean` (string | null, povinné): Čárový kód, jak je zadaný (nekontroluje se); `null`, když chybí. - `kitchen_name` (string | null, povinné): Krátký název pro kuchyňské bony a displeje (`KitchenItem.kitchen_name`); `null`, když ho produkt nemá. - `size` (ProductSize | null, povinné): Velikost jídla, které se prodává ve více velikostech (pizza Ø28cm / Ø32cm / Ø42cm, steak 100 g / 200 g / 300 g); `null` u produktu bez velikostí. Každá velikost je samostatný produkt s vlastním… - `pos` (PosProductInfo | null, povinné): Údaje pro pokladnu, jen v kanálu `pos`; v ostatních `null`. - `external_id` (ExternalId | null, povinné): Vaše vlastní ID produktu (`putExternalRef`, jen u produktů na webu); `null`, když žádné nenastavíte. - `metadata` (Metadata, povinné): Vaše vlastní dvojice klíč–hodnota u produktu (`putExternalRef`). ### ProductSize Místo produktu mezi velikostmi jednoho jídla. Produkty se stejným `group_id` jsou velikosti jednoho jídla – ukažte je jako jednu položku s přepínačem velikostí (v pořadí `position`, předvolená `base`, na místě základní velikosti) a do kalkulace i objednávky dejte `id` zvolené velikosti; cena, porce i přílohy jsou toho produktu. Velikosti vznikají ze sad velikostí v administraci (Sortiment › Sady velikostí); e-shop provozovny je ukazuje stejně a půlky pizzy v něm skládá jen ze stejné velikosti. - `group_id` (Id, povinné): ID základní velikosti jídla – stejné u všech jeho velikostí včetně základní. Základní velikost v tomto sortimentu být nemusí (může se nabízet jen v jiném kanálu); seskupujte podle `group_id` i tak. - `name` (string, povinné): Jen velikost, jak ji pojmenuje sada („Ø42cm“, „300 g“, „0,5 l“). - `dish_name` (string, povinné): Název jídla bez velikosti („Margherita“) – pro položku s přepínačem. - `position` (integer, povinné): Pořadí mezi všemi velikostmi jídla, vzestupně od 1; počítá i velikosti, které v tomto sortimentu nejsou, takže se nemění s dostupností. - `base` (boolean, povinné): Základní velikost – produkt, kterému byla sada přiřazena; předvolte ji. ### PosProductInfo - `half_price` (Money | null, povinné): Cena půlky (`variant` `half`), zaokrouhlená nahoru na celé koruny; `null`, když se půlky neprodávají. - `employee_price` (Money | null, povinné): Cena pro zaměstnance (`at_employee_price` u položky účtenky); `null`, když ji produkt nemá. - `plu` (string | null, povinné): Krátký kód pro zadání na pokladně. - `station_id` (Id | null, povinné): Výrobní stanoviště, kde se produkt dělá (`DeviceSettings.kitchen_stations`). - `ticket` (string, povinné): Kam jde položka objednaná na pokladně: `kitchen` – na kuchyňský bon nebo do řízení výroby (v administraci „Automaticky odeslat na kuchyňský bon“), `bar` – zůstává na baru. Stejně dělí tržby i… Známé hodnoty (mohou přibýt další): `kitchen` (od 26.10.4), `bar` (od 26.10.4) ### ProductAddOn - `product_id` (Id, povinné) - `name` (string, povinné) - `price` (Money, povinné): Příplatek včetně DPH; může být záporný. - `vat_rate` (VatRate, povinné) - `allergens` (string[], povinné): Kódy z `Catalog.allergens` (nařízení EU 1169/2011). ### RemovableIngredient Surovina jídla, kterou si host smí odebrat („bez žampionů“). V sortimentu je to složení produktu; v řádku kalkulace, objednávky nebo účtu to, co host odebral, s názvem z té doby. Kuchyň ji ukáže u jídla („BEZ: ŽAMPIONY“) a sklad ji neodepíše. - `id` (Id, povinné): Zůstává stejné, když provozovna složení upraví (přejmenuje nebo přeřadí). - `name` (string, povinné): Název, jak ho uvidí host, s velikostí písmen, jak ho zadala provozovna („žampiony“). ### ProductOptionGroup Skupina voleb produktu. Meze i porce v ceně se počítají v porcích – součet `QuoteItemInput.options[].quantity` voleb skupiny (dvojitá šunka = 2). - `id` (Id, povinné) - `name` (string, povinné) - `min_quantity` (integer, povinné): Nejméně tolik porcí; `0` = skupina je nepovinná, `1` a víc = povinný výběr. - `max_quantity` (integer | null, povinné): Nejvýš tolik porcí; `null` = bez omezení. - `max_per_option` (integer, povinné): Nejvýš tolik porcí jedné volby (`1` = bez dvojitých porcí). - `included_quantity` (integer, povinné): Porcí v ceně produktu (nejlevnější, viz výše). - `options` (ProductOption[], povinné): V pořadí, které nastavila provozovna; tak je i ukažte. ### ProductOption Jedna volba skupiny – produkt sortimentu (jeho název, DPH, alergeny a porce) se svou cenou za porci. Stejný produkt může být ve více skupinách jako různé volby s různou cenou; volbu určuje `id`. - `id` (Id, povinné): Volba, stálá i po úpravách skupiny – posílejte ji jako `QuoteItemInput.options[].option_id`. - `product_id` (Id, povinné) - `name` (string, povinné) - `price` (Money, povinné): Cena jedné porce včetně DPH, pokud není v ceně (`ProductOptionGroup.included_quantity`); může být záporná i nulová. - `base_price` (Money | null, povinné): Prémiová volba: když je vybraná, cena základu produktu je tato částka (`OrderLine.unit_price`; z víc prémiových voleb nejvyšší) a volba sama nestojí nic (`reason` `in_base_price`). `null` u běžné… - `vat_rate` (VatRate, povinné) - `allergens` (string[], povinné): Kódy z `Catalog.allergens`. ### ProductSplit Ceny jednoho dílu pizzy z dílů včetně DPH; cena pizzy je součet jejích dílů, jejich příloh a jednoho obalu (nejvyššího z dílů). - `half_price` (Money, povinné): Cena půlky (2 díly). - `quarter_price` (Money | null, povinné): Cena čtvrtky (4 díly); `null`, když se produkt dělí jen na půlky. ### DailyMenu - `date` (LocalDate, povinné) - `available_from` (LocalTime | null, povinné) - `available_to` (LocalTime | null, povinné) - `items` (object[], povinné): Produkty denního menu. Jejich `price` v `products` je už cena z menu. - `product_id` (Id, povinné) - `position` (integer, povinné) ### DailyMenuWeek Denní menu jednoho týdne. - `restaurant_id` (Id, povinné) - `week` (string, povinné) - `enabled` (boolean, povinné) - `available_from` (LocalTime | null, povinné): Kdy menu každý den začíná; `null` = od otevření. - `available_to` (LocalTime | null, povinné) - `days` (object[], povinné) - `date` (LocalDate, povinné) - `items` (DailyMenuItem[], povinné) ### DailyMenuItem - `product_id` (Id, povinné) - `name` (string, povinné) - `description` (string | null, povinné) - `price` (Money, povinné): Cena z menu. - `vat_rate` (VatRate, povinné) - `allergens` (string[], povinné): Kódy alergenů jako v `GET …/catalog`. - `image_url` (string (uri) | null (uri), povinné) - `every_day` (boolean, povinné): Z nabídky na celý týden, ne jen na tento den. ### Allergen - `code` (string, povinné) - `name` (string, povinné) ### SalePage - `data` (Sale[], povinné) - `next_cursor` (string | null, povinné) ### Sale - `id` (Id, povinné) - `number` (string, povinné): Číslo dokladu, pod kterým ho zná pokladna nebo zákazník (u webu ID objednávky). - `kind` (string, povinné): `sale`, nebo `cancellation` – stornovací doklad se zápornými částkami (`cancels`). Známé hodnoty (mohou přibýt další): `sale` (od 26.10.4), `cancellation` (od 26.10.4) - `source` (string, povinné): `pos` – pokladna, `web` – e-shop, aplikace nebo rozvozová platforma, `kitchen` – kuchyňský displej nebo aplikace personálu. Známé hodnoty (mohou přibýt další): `pos` (od 26.10.4), `web` (od 26.10.4), `kitchen` (od 26.10.4) - `platform` (string | null, povinné): Rozvozová platforma podle začátku názvu objednávky, jako Statistiky v administraci. Známé hodnoty (mohou přibýt další): `wolt` (od 26.10.4), `bolt` (od 26.10.4), `foodora` (od 26.10.4), `choice` (od 26.10.4) - `table_name` (string | null, povinné): Stůl nebo účet pokladny; u ostatních zdrojů `null`. - `created_at` (Timestamp, povinné) - `closed_at` (Timestamp, povinné): Kdy se doklad uzavřel (zaplacení na pokladně, přijetí nebo uzavření objednávky). - `employee` (EmployeeRef | null, povinné): Kdo doklad uzavřel; `null`, když nikdo (třeba web). - `lines` (SaleLine[], povinné) - `items_total` (Money, povinné): Součet řádků (i s prodejem dárkových voucherů). - `discounts` (object[], povinné): Slevy na celý účet (kladné částky). - `name` (string, povinné) - `amount` (Money, povinné) - `delivery_fee` (Money, povinné) - `price_adjustment` (Money, povinné): Uložený součet, který se od řádků liší o víc než korunu (upravená cena). - `rounding` (Money, povinné) - `total` (Money, povinné): Celý účet – i s částí uhrazenou dárkovými vouchery. - `vat` (VatBreakdown[], povinné): Rozpis DPH od nejvyšší sazby, přesně jako kopie účtenky a účetní exporty. - `voucher_payments` (object[], povinné): Úhrady dárkovými vouchery (nejsou plnění, mimo DPH); kód je zamaskovaný. - `code` (string | null, povinné) - `amount` (Money, povinné) - `amount_paid` (Money, povinné): Co se zaplatilo jinak než dárkovými vouchery. - `payment_method` (string, povinné): Karta při převzetí jako `card`, stejně jako uzávěrky a exporty. Známé hodnoty (mohou přibýt další): `cash` (od 26.10.4), `card` (od 26.10.4), `meal_voucher` (od 26.10.4), `company_account` (od 26.10.4), `invoice` (od 26.10.4) - `card_at_handover` (boolean, povinné) - `tip` (Money, povinné) - `eet` (SaleEet | null, povinné): Evidence tržeb; `null`, když žádná není. - `shift_id` (Id | null, povinné): Uzávěrka dokladu (`getShiftClose`); před ní `null`. - `cancels` (Id | null, povinné): Stornovaný doklad, u `cancellation`. - `cancelled_by` (Id | null, povinné): Stornovací doklad k tomuto, když se stornoval. ### SaleLine - `type` (string, povinné): `product`; `voucher_sale` – prodaný dárkový voucher (mimo DPH); `minimum_order_surcharge` – doplatek do minimální objednávky rozvozové zóny; `express_delivery` – expresní doručení. Oba poplatky jsou… Známé hodnoty (mohou přibýt další): `product` (od 26.10.4), `voucher_sale` (od 26.10.4), `minimum_order_surcharge` (od 26.10.5), `express_delivery` (od 26.10.5) - `product_id` (Id | null, povinné): U řádku bez produktu `null`. - `name` (string, povinné) - `quantity` (number, povinné) - `unit_price` (Money, povinné): Cena kusu po slevě na položku, bez obalu. - `packaging_unit_price` (Money | null, povinné) - `discount_per_unit` (Money, povinné): Sleva na kus (už odečtená z `unit_price`). - `vat_rate` (VatRate, povinné) - `total` (Money, povinné): Počet × (cena kusu + obal). ### SaleEet - `fik` (string | null, povinné): FIK původní EET (pokladny na API v1). - `bkp` (string | null, povinné) - `status` (string | null, povinné): Stav záznamu EET 2.0, který odesílá Profirest; `null`, když doklad neeviduje. Známé hodnoty (mohou přibýt další): `pending` (od 26.10.4), `accepted` (od 26.10.4), `rejected` (od 26.10.4), `skipped` (od 26.10.4) - `pok` (string | null, povinné): Potvrzovací kód EET 2.0 po přijetí. ### SalesSummary - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `group_by` (string, povinné): Známé hodnoty (mohou přibýt další): `day` (od 26.10.4), `hour` (od 26.10.4), `weekday` (od 26.10.4), `payment` (od 26.10.4), `source` (od 26.10.4), `employee` (od 26.10.4), `table` (od 26.10.4), `segment` (od 26.11.19) - `segment` (string | null, povinné): Druh tržby z parametru `segment`; `null` = všechno. Známé hodnoty (mohou přibýt další): `food` (od 26.11.19), `lodging` (od 26.11.19), `tickets` (od 26.11.19) - `totals` (object, povinné) - `revenue` (Money, povinné): Objednávky i s dopravou. - `orders` (integer, povinné) - `average_order` (Money, povinné) - `tips` (Money, povinné) - `rows` (SalesSummaryRow[], povinné) ### SalesSummaryRow - `key` (string, povinné): `day` – datum; `hour` – 0–23; `weekday` – 1–7 (ISO, 1 = pondělí); `payment` – `cash`, `card`, `meal_voucher`, `company_account`, `invoice`; `source` – `pos`, `web`, `kitchen`, `wolt`, `bolt`… - `name` (string | null, povinné): Jméno zaměstnance nebo název účtu; u ostatních rozpadů a když není známé, `null`. - `revenue` (Money, povinné) - `orders` (integer, povinné) ### ProductSales - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `group_by` (string, povinné): Známé hodnoty (mohou přibýt další): `product` (od 26.10.4), `category` (od 26.10.4), `sortiment` (od 26.10.4), `station` (od 26.10.4) - `segment` (string | null, povinné): Druh tržby z parametru `segment`; `null` = všechno. Známé hodnoty (mohou přibýt další): `food` (od 26.11.19), `lodging` (od 26.11.19), `tickets` (od 26.11.19) - `totals` (object, povinné) - `quantity` (number, povinné) - `revenue` (Money, povinné) - `discounts` (Money, povinné) - `rows` (ProductSalesRow[], povinné): Od nejvyšší tržby. ### ProductSalesRow - `key` (Id | null, povinné): ID produktu, kategorie, sortimentu nebo výrobního stanoviště; `null` u položek bez kategorie, sortimentu nebo stanoviště. Produkt `0` je řádek bez produktu (třeba doplatek do minimální objednávky)… - `name` (string | null, povinné) - `quantity` (number, povinné) - `revenue` (Money, povinné) - `discounts` (Money, povinné) ### ChargesReport - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `rows` (ChargesReportRow[], povinné) ### ChargesReportRow - `type` (string, povinné): Poplatek, jako `Charge.type`. Známé hodnoty (mohou přibýt další): `delivery_fee` (od 26.10.5), `minimum_order_surcharge` (od 26.10.5), `express_delivery` (od 26.10.5) - `name` (string, povinné): Název česky, jako na účtence. - `orders` (integer, povinné): Objednávky s poplatkem; storna protidokladem se odečítají, proto může být i záporné. - `amount` (Money, povinné): Součet poplatku včetně DPH. ### TipsReport - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `totals` (object, povinné) - `tips` (Money, povinné) - `orders_with_tip` (integer, povinné) - `orders` (integer, povinné) - `revenue` (Money, povinné) - `by_payment` (object[], povinné) - `method` (string, povinné): Známé hodnoty (mohou přibýt další): `cash` (od 26.10.4), `card` (od 26.10.4), `meal_voucher` (od 26.10.4), `company_account` (od 26.10.4), `invoice` (od 26.10.4) - `tips` (Money, povinné) - `orders` (integer, povinné) - `by_employee` (TipsByEmployee[], povinné): Podle zaměstnance, který objednávku uzavřel. - `by_courier` (TipsByEmployee[], povinné): Podle kurýra rozvozu. ### TipsByEmployee - `employee` (EmployeeRef, povinné) - `tips` (Money, povinné) - `orders` (integer, povinné) ### VatReport - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `rates` (VatBreakdown[], povinné): Od nejvyšší sazby; sazba bez prodeje chybí. - `vouchers_sold` (Money, povinné): Prodané dárkové vouchery – nepodléhají DPH, v `rates` nejsou. ### ShiftClosePage - `data` (ShiftClose[], povinné) - `next_cursor` (string | null, povinné): Kurzor další stránky; `null` na poslední. ### ShiftClose Uzávěrka se součty z detailu uzávěrky v administraci. - `id` (Id, povinné) - `restaurant_id` (Id, povinné) - `closed_at` (Timestamp, povinné) - `closed_by` (EmployeeRef | null, povinné): Zaměstnanec, který směnu uzavřel; `null`, když není zapsaný. - `source` (string, povinné): Odkud byly objednávky uzávěrky: `pos` – pokladny, `kitchen` – kuchyň (e-shop, telefonické objednávky, aplikace), `mixed` – obojí, `empty` – žádná objednávka (třeba se počítaly jen otevřené účty). Známé hodnoty (mohou přibýt další): `pos` (od 26.10.4), `kitchen` (od 26.10.4), `mixed` (od 26.10.4), `empty` (od 26.10.4) - `device_id` (Id | null, povinné): Pokladna na API v2, která směnu uzavřela (`pos_shift.closed`); u jiných uzávěrek `null`. - `orders` (integer, povinné): Objednávky v uzávěrce (smazané se nepočítají). - `totals` (ShiftCloseTotals, povinné) ### ShiftCloseTotals - `completed` (Money, povinné): Tržba uzávěrky. - `by_payment` (object, povinné): Tržba podle způsobu platby, jak ji uzávěrka zapsala. - `cash` (Money, povinné) - `card` (Money, povinné) - `meal_voucher` (Money, povinné) - `company_account` (Money, povinné) - `invoice` (Money, povinné) - `not_completed` (Money, povinné): Nezaplaceno při uzávěrce – objednávky ve frontě, nebo otevřené účty stolů. - `cancelled_orders` (Money, povinné): Objednávky stornované stornodokladem. - `cancelled_items` (Money, povinné): Položky odebrané poté, co šly do kuchyně (storna položek u stolů). - `tips` (object, povinné): Spropitné; karta při převzetí se počítá jako karta. - `total` (Money, povinné) - `cash` (Money, povinné) - `card` (Money, povinné) - `discounts` (object, povinné): `order` – slevy na celou objednávku, `items` – slevy na položky. - `order` (Money, povinné) - `items` (Money, povinné) - `eet_registered` (Money, povinné): Objednávky zaevidované v EET (s FIK). - `by_ticket` (object, povinné): Tržba položek podle `PosProductInfo.ticket` – kuchyň a bar, jak je počítá detail uzávěrky a Statistiky v administraci: cena s obalem po poměrné části slevy na celý účet. Doprava položka není; prodej… - `kitchen` (Money, povinné) - `bar` (Money, povinné) ### ProductAvailabilityInput - `remaining` (integer | null, povinné): Zbývající porce; `0` = vyprodáno, `null` = bez omezení. ### ProductAvailability - `product_id` (Id, povinné) - `remaining` (integer | null, povinné): Zbývající porce; `null` = bez omezení. - `sold_out` (boolean, povinné) - `source` (string, povinné): Kde číslo je: `daily_menu` – dnešní denní menu (prodej bere porce nejdřív odtud), `restaurant` – porce produktu v provozovně, `none` – bez omezení. Známé hodnoty (mohou přibýt další): `daily_menu` (od 26.10.4), `restaurant` (od 26.10.4), `none` (od 26.10.4) ### Availability - `restaurant_id` (Id, povinné) - `tracking` (boolean, povinné): `false` znamená, že pro vaši aplikaci žádný produkt omezený není; `items` je pak prázdné. - `generated_at` (Timestamp, povinné) - `items` (object[], povinné) - `product_id` (Id, povinné) - `remaining` (integer, povinné) - `sold_out` (boolean, povinné) ### QuoteRequest - `fulfillment` (FulfillmentInput, povinné) - `delivery_address` (AddressInput | null): Povinná pro `delivery`; u `pickup` musí být `null` nebo chybět. - `items` (QuoteItemInput[], povinné) - `customer_id` (Id | null): Propojení zákazníka z `POST /customers`, pokud ho máte. Objednávka ho převezme z kalkulace. Věrnostní body dostane propojený zákazník. Kuchyň a kurýr vidí kontakt objednávky (`customer` z… - `vouchers` (VoucherInput[]) - `promo_codes` (PromoCodeInput[]): Slevový kód, který zákazník zadal – nejvýš jeden: sdílený kód akce nebo jeden z jejích jednorázových kódů (`Promotion.code_type`). Akce bez kódu se uplatní samy. Kód se uplatní, když splňuje své… - `end_user_id` (ExternalId | null): Vaše stálé anonymní ID nakupujícího. Slouží k limitům pokusů o vouchery a slevové kódy. - `channel` (string | null): Sortiment, ze kterého položky jsou, stejně jako `GET …/catalog?channel=`. Když chybí, `web`. `kitchen` a `pos` jen pro aplikace personálu provozovny a kiosek nastavený jako obsluha. Hodnoty: `web`, `kitchen`, `pos`, `None`. ### FulfillmentInput - `type` (FulfillmentType, povinné) - `speed` (string): `standard` – běžný rozvoz; `express` – expresní doručení za příplatek provozovny (`delivery.express_fee`): kuchyně a kurýr vidí objednávku označenou EXPRES a dají jí přednost, bez slíbeného času.… Hodnoty: `standard`, `express`. - `time` (Timestamp | null): Požadovaný čas; `null` nebo chybějící znamená co nejdřív. U `delivery` čas, kdy zákazník objednávku dostane, u `pickup` a `dine_in` čas, kdy je připravená. ### QuoteItemInput Jedna položka košíku. - `type` (string): Druh položky: `product` – produkt ze sortimentu; `split` – pizza z půlek nebo čtvrtek (`parts`). Hodnoty: `product`, `split`. - `product_id` (Id): Produkt; povinný u `product`, u `split` nepatří. - `variant` (string): `full` (výchozí) – celá porce; `half` – poloviční porce za `Product.half_price`, obal a přílohy celé. Jen u `product` s `Product.half_price` – tedy v sortimentu `kitchen` a `pos` personálu… Hodnoty: `full`, `half`. - `quantity` (integer, povinné) - `add_ons` (AddOnInput[]): Přílohy a doplňky z `Product.add_ons`, každý nejvýš jednou (víc porcí přes `quantity`). Počet mají podle položky. Jen u `product` bez skupin voleb. - `options` (OptionInput[]): Výběr u produktu s `Product.option_groups`: volby jeho skupin, každá nejvýš jednou (víc porcí přes `quantity`). Kalkulace zkontroluje `min_quantity`, `max_quantity` a `max_per_option` každé skupiny… - `removed_ingredient_ids` (Id[]): Suroviny, které host z jídla odebral – `Product.removable_ingredients… - `parts` (SplitPartInput[]): Díly pizzy u `split` – právě 2 (půlky) nebo 4 (čtvrtky). - `note` (string | null): Poznámka pro kuchyň, zobrazí se na kuchyňském displeji. ### OptionInput - `option_id` (Id, povinné): `ProductOption.id` volby produktu položky. - `quantity` (integer): Porcí volby na jeden kus položky, nejvýš `ProductOptionGroup.max_per_option`. ### SplitPartInput - `product_id` (Id, povinné): Produkt s `Product.split`. - `add_ons` (AddOnInput[]): Přílohy tohoto dílu z `Product.add_ons` jeho produktu, za plnou cenu přílohy. - `removed_ingredient_ids` (Id[]): Suroviny odebrané z tohoto dílu – `Product.removable_ingredients… ### AddOnInput - `product_id` (Id, povinné) - `quantity` (integer): Porcí přílohy na jeden kus položky (dvojitý sýr = 2). ### VoucherCode Kód voucheru, 6 znaků; pomlčka je nepovinná a na velikosti písmen nezáleží. Typ: string ### VoucherInput - `code` (VoucherCode, povinné) ### PromoCode Slevový kód provozovny – 3 až 32 písmen, číslic a pomlček; na velikosti písmen nezáleží a mezery se vynechají. Typ: string ### PromoCodeInput - `code` (PromoCode, povinné) ### PromotionList - `restaurant_id` (Id, povinné) - `at` (Timestamp, povinné): Okamžik, pro který seznam platí. - `promotions` (Promotion[], povinné) ### Promotion Akce provozovny pro objednávky z aplikací hostů. Ukažte ji zákazníkům; jestli se uplatní a kolik dá, rozhodne kalkulace. - `id` (Id, povinné) - `name` (string, povinné): Název pro zákazníka, jak ho provozovna zadala. - `description` (string | null, povinné): Podrobnosti pro zákazníka; `null`, když chybí. - `requires_code` (boolean, povinné): Platí jen se slevovým kódem (`QuoteRequest.promo_codes`) – sdíleným nebo jednorázovým, viz `code_type`; jinak se uplatní sama. - `code_type` (string | null, povinné): `shared` – jeden kód pro všechny (třeba z letáku); `single_use` – série jedinečných kódů, které provozovna rozdává, každý platí na jednu objednávku; `null`, když je `requires_code` `false`. Kód… Známé hodnoty (mohou přibýt další): `shared` (od 26.10.8), `single_use` (od 26.10.8) - `effect` (PromotionEffect, povinné) - `conditions` (PromotionConditions, povinné) - `combinable` (boolean, povinné): Jde použít spolu s jinými akcemi, které jdou kombinovat. U věrnostní karty vždy `true` – sčítá se se vším. ### PromotionEffect Co zákazník dostane. Vyplněné je jen pole podle `type`; ostatní jsou `null`. - `type` (string, povinné): `percent` – procento z ceny položek (celé objednávky, nebo položek z `conditions.scope`); `amount` – pevná částka z ceny položek (na položky rozsahu se rozdělí poměrem jejich cen); `free_delivery`… Známé hodnoty (mohou přibýt další): `percent` (od 26.10.4), `amount` (od 26.10.4), `free_delivery` (od 26.10.4), `nth_item` (od 26.10.8), `gift` (od 26.10.8), `bundle` (od 26.10.8) - `percent` (integer | null, povinné): Procento u `percent`; jinak `null`. - `amount` (Money | null, povinné): Částka u `amount`; jinak `null`. - `max_discount` (Money | null, povinné): Nejvyšší sleva u `percent`; `null` bez stropu. - `nth_item` (PromotionNthItem | null, povinné): Každý N-tý kus u `nth_item`; jinak `null`. - `gift` (PromotionGift | null, povinné): Dárek u `gift`; jinak `null` – a také když produkt dárku už neexistuje (pak akce nic nedá). - `bundle` (PromotionBundle | null, povinné): Sada u `bundle`; jinak `null`. ### PromotionNthItem Každý `every`-tý kus z položek `conditions.scope` má slevu `percent` (100 = zdarma); zlevní se nejlevnější kusy. Třeba 2+1 zdarma je `every` 3 a `percent` 100, druhý za polovic `every` 2 a `percent` 50. Bez `loyalty` musí mít objednávka aspoň `every` kusů z rozsahu. - `every` (integer, povinné): Kolikátý kus je se slevou – každý 2., 3., … kus. - `percent` (integer, povinné): Sleva toho kusu v procentech; 100 = zdarma. - `loyalty` (boolean, povinné): Věrnostní karta: kusy se počítají napříč objednávkami zákazníka – kusy z rozsahu v jeho dřívějších objednávkách od vzniku akce plus tato objednávka –, takže kus se slevou může přijít v pozdější… ### PromotionGift Produkt, který zákazník dostane zdarma, jeden kus. Kalkulace ho přidá jako řádek s `gift_of` a plnou cenou a slevu `applies_to: line` ve stejné výši. Když produkt v čase objednávky v sortimentu není (skrytý, vyprodaný), dárek se nepřidá. - `product_id` (Id, povinné) - `name` (string, povinné): Název produktu. ### PromotionBundle Pevná cena za sadu: jeden kus z každé skupiny v `groups` stojí dohromady `price`. Kalkulace složí tolik sad, kolik košík dovolí, vezme nejdražší kusy každé skupiny a sadu použije, jen když je levnější než její kusy; rozdíl je sleva na řádky sady (`applies_to: line`). - `price` (Money, povinné): Cena jedné sady včetně DPH. - `groups` (PromotionBundleGroup[], povinné): Části sady, aspoň dvě. ### PromotionBundleGroup Jedna část sady – kus z kterékoli z těchto kategorií nebo produktů. - `category_ids` (Id[], povinné) - `product_ids` (Id[], povinné) ### PromotionScope Položky, které akce počítá a zlevňuje: produkty z kategorií `category_ids` a produkty `product_ids`, kromě produktů v `exclude_product_ids`. - `category_ids` (Id[], povinné) - `product_ids` (Id[], povinné) - `exclude_product_ids` (Id[], povinné) ### PromotionTimeWindow Denní doba, kdy akce platí, od `from` (včetně) do `to` (bez), v časové zóně provozovny. `to` může být `24:00`. Okno nikdy nepřekračuje půlnoc – noční okno jsou dvě okna (`22:00`–`24:00` a `00:00`–`02:00`). - `from` (LocalTime, povinné) - `to` (LocalTime, povinné) ### PromotionConditions - `min_order` (Money | null, povinné): Nejnižší cena položek před slevou – položek z `scope`, když je vyplněný; `null` bez minima. - `min_items` (integer | null, povinné): Nejmenší počet kusů – z položek `scope`, když je vyplněný, jinak z celé objednávky; `null` bez minima. - `scope` (PromotionScope | null, povinné): Položky, na které akce platí (kategorie a produkty); `null` = celá objednávka. U `nth_item` vždy vyplněný; `bundle` má místo toho své části v `effect.bundle.groups`. - `fulfillment` (string, povinné): `any`, `delivery` – jen rozvoz, `pickup` – jen osobní odběr. Známé hodnoty (mohou přibýt další): `any` (od 26.10.4), `delivery` (od 26.10.4), `pickup` (od 26.10.4) - `valid_from` (Timestamp | null, povinné): Platí od (včetně), podle okamžiku odeslání objednávky; `null` = už platí. - `valid_until` (Timestamp | null, povinné): Platí do (bez), podle okamžiku odeslání objednávky; `null` = bez konce. - `days` (integer[], povinné): Dny v týdnu, kdy akce platí, podle okamžiku odeslání objednávky – čísla ISO, 1 = pondělí … 7 = neděle, vzestupně. Všech sedm = každý den. - `time_windows` (PromotionTimeWindow[], povinné): Denní doba, kdy akce platí (třeba happy hour), podle okamžiku odeslání objednávky, vzestupně; prázdné = kdykoli během dne. - `customer` (string, povinné): Pro koho akce je: `any` – pro všechny; `registered` – jen registrovaný zákazník (propojený zákazník s ověřeným telefonem, `QuoteRequest.customer_id`); `first_order` – jen první objednávka… Známé hodnoty (mohou přibýt další): `any` (od 26.10.8), `registered` (od 26.10.8), `first_order` (od 26.10.8) - `max_per_customer` (integer | null, povinné): Kolik objednávek jednoho registrovaného zákazníka může akci použít (počítá se podle telefonu v celém účtu; zrušené objednávky se nepočítají); `null` = bez omezení. Jen u `customer` jiného než `any`. - `uses_left` (integer | null, povinné): Kolik objednávek ještě akci může použít; `null` = bez omezení. ### OrderCreate - `quote_id` (Id, povinné) - `customer` (OrderCustomerInput): Povinný, s `phone`. Vynechat ho smí jen kiosek (`Connection.client.order_channel` `kiosk`) – host čeká v provozovně na číslo objednávky – kromě `delivery`. Bez něj má objednávka jméno `Kiosek` a… - `payments` (PaymentInput[], povinné): Jak se zaplatí `amount_due` kalkulace; částky ho musí přesně dát dohromady. Prázdné, když vše pokryjí vouchery. Nejvýš jedna platba `pending`. Jen jeden způsob – online, hotově, nebo kartou… - `note` (string | null): Poznámka pro kuchyň a kurýra. - `external_id` (ExternalId | null) - `metadata` (MetadataInput | null) - `eet` (EetRecordedInput | null): Vynechte – tržbu do EET 2.0 eviduje Profirest sám. Pošlete jen tehdy, když tuto tržbu už do EET 2.0 zaevidoval jiný systém provozovny (její vlastní pokladna nebo kiosek): Profirest ji pak nikdy… ### EetRecordedInput Tržba tak, jak ji do EET 2.0 zaevidoval jiný systém provozovny. - `pok` (string, povinné): Potvrzovací kód finanční správy (POK). - `recorded_at` (Timestamp, povinné): Čas tržby tak, jak se evidoval (dat_trzby); ne v budoucnosti. - `total` (MoneyInput, povinné): Evidovaná částka (celk_trzba). - `register_id` (string | null): Označení pokladny v evidenci (id_pokl). - `sequence` (string | null): Pořadové číslo v evidenci (porad_cis). ### OrderEet Tržba objednávky, kterou do EET 2.0 zaevidoval jiný systém provozovny (poslaná jako `OrderCreate.eet`). - `recorded_by` (string, povinné): `other_system` – tržbu zaevidoval jiný systém provozovny (dnes jediná hodnota). Známé hodnoty (mohou přibýt další): `other_system` - `pok` (string, povinné): Potvrzovací kód (POK), jak přišel, malými písmeny. - `recorded_at` (Timestamp, povinné): Čas tržby, jak přišel, s jeho posunem. - `total` (Money, povinné): Evidovaná částka, jak přišla; s objednávkou se neporovnává. - `register_id` (string | null, povinné): Označení pokladny v evidenci (id_pokl), jak přišlo. - `sequence` (string | null, povinné): Pořadové číslo v evidenci (porad_cis), jak přišlo. ### OrderCustomerInput Kontakt pro tuto objednávku, uvidí ho kuchyně a kurýr. - `name` (string, povinné) - `phone` (Phone): Povinný, kromě kiosku bez `delivery` (viz `OrderCreate.customer`). - `email` (Email | null) ### PaymentInput `online` + `paid` – už jste ji vybrali; `online` + `pending` – vyberete ji po vytvoření objednávky a pak zavoláte `confirm-payment`; `cash` nebo `card` + `unpaid` – zákazník zaplatí kurýrovi nebo při odběru; `card` + `paid` – jen kiosek (`Connection.client.order_channel` `kiosk`): host zaplatil na vlastním platebním terminálu kiosku. Musí pokrýt celou částku (ne spolu s `unpaid`); kuchyň vidí objednávku jako zaplacenou a Profirest tržbu do pár minut zaeviduje v EET 2.0, když ho má provozovna… - `method` (string, povinné): `online` – zaplaceno vám přes internet; `cash` – hotově kurýrovi nebo při odběru; `card` – kartou kurýrovi nebo při odběru, případně na terminálu kiosku. Hodnoty: `online`, `cash`, `card`. - `status` (string, povinné): `paid` – už vybráno (`online`; `card` jen kiosek); `pending` – vyberete po vytvoření objednávky a potvrdíte (jen `online`); `unpaid` – vybere se při doručení nebo odběru (jen `cash` a `card`). Jiné… Hodnoty: `paid`, `pending`, `unpaid`. - `amount` (MoneyInput, povinné) - `provider` (string | null): Váš poskytovatel plateb, například `gopay`. - `reference` (string | null): ID platby u vašeho poskytovatele. ### PaymentConfirmation - `provider` (string | null) - `reference` (string | null): ID platby u vašeho poskytovatele, pokud jste ho při vytvoření objednávky neznali. ### OrderCancel - `reason` (string | null) ### Fulfillment - `type` (string, povinné): `delivery` – rozvoz na adresu v `delivery`; `pickup` – zákazník si objednávku vyzvedne v provozovně; `dine_in` – jídlo na místě (viz `FulfillmentType`). Známé hodnoty (mohou přibýt další): `delivery`, `pickup`, `dine_in` (od 26.10.4) - `speed` (string, povinné): `standard` – běžný rozvoz; `express` – expresní doručení s předností v kuchyni a u kurýra, bez slíbeného času (viz `FulfillmentInput.speed`). Známé hodnoty (mohou přibýt další): `standard` (od 26.10.5), `express` (od 26.10.5) - `asap` (boolean, povinné): Co nejdřív (bez `time`); také po online platbě potvrzené až po zvoleném čase. - `time` (Timestamp | null, povinné): Požadovaný čas; `null` pro co nejdřív. U `delivery` kdy zákazník objednávku dostane, u `pickup` kdy je připravená. - `estimated_at` (Timestamp | null, povinné): Odhad Profirestu pro stejný okamžik; `null`, dokud odhad není k dispozici. Profirest zatím neodhaduje: dnes je to přímo požadovaný `time`, u co nejdřív `null`. ### DeliveryInfo - `zone` (object, povinné) - `id` (Id, povinné) - `name` (string, povinné) - `address` (Address, povinné) - `location` (GeoPoint, povinné) - `fee` (Money, povinné) - `minimum_order` (Money, povinné) - `express_fee` (Money | null, povinné): Příplatek za expresní doručení do této zóny; `null`, když ho zóna nenabízí. Je i v kalkulaci bez expresu, abyste ho mohli zákazníkovi nabídnout a spočítat košík znovu s `fulfillment.speed` `express`. ### OrderLine - `id` (Id, povinné) - `type` (string, povinné): `product` – produkt ze sortimentu; `split` – pizza z dílů (`parts`), jako `QuoteItemInput.type`. Známé hodnoty (mohou přibýt další): `product`, `split` (od 26.10.9) - `variant` (string | null, povinné): `full` – celá porce, `half` – poloviční porce (`QuoteItemInput.variant`) u `product`; u `split` `null`. Známé hodnoty (mohou přibýt další): `full` (od 26.11.1), `half` (od 26.11.1) - `product_id` (Id | null, povinné): Produkt řádku; `null` u `split` (produkty jsou v `parts`) a u řádků bez produktu. - `name` (string, povinné): Název produktu v okamžiku kalkulace; u `split` díly („½ Margherita + ½ Hawaii“). - `quantity` (number, povinné): U objednávek tohoto API dnes celé číslo (`QuoteItemInput.quantity`); u položek prodávaných na váhu může být desetinné. - `base_unit_price` (Money, povinné): Ceníková cena produktu za kus; u `split` součet dílů. Od `unit_price` se liší, jen když základ zvedla prémiová volba (`OrderLineOption.reason` `in_base_price`). - `unit_price` (Money, povinné): Účtovaná cena produktu za kus bez obalu, příloh a voleb; u `split` součet dílů. Slevy na položky se berou jen z této ceny. - `packaging_unit_price` (Money | null, povinné): Obal za kus; u `split` jednou za pizzu – nejvyšší z dílů. - `vat_rate` (VatRate, povinné): Sazba produktu; u `split` sazba prvního dílu (každý díl má svou `vat_rate`). - `add_ons` (object[], povinné): Přílohy u `product`; u `split` prázdné (přílohy dílů jsou v `parts`). - `product_id` (Id | null, povinné) - `name` (string, povinné) - `quantity` (integer, povinné): Porcí na jeden kus řádku (`AddOnInput.quantity`). - `unit_price` (Money, povinné): Cena jedné porce. - `vat_rate` (VatRate, povinné): Sazba přílohy; záporná příloha má sazbu svého produktu. - `options` (OrderLineOption[], povinné): Vybrané volby produktu se skupinami voleb v pořadí skupin a jejich voleb; jinak prázdné. - `parts` (OrderLinePart[] | null, povinné): Díly pizzy `split` v jejich pořadí; u ostatních řádků `null`. - `removed_ingredients` (RemovableIngredient[], povinné): Suroviny, které host z jídla odebral (`QuoteItemInput.removed_ingredient_ids`), s názvy z okamžiku kalkulace, v pořadí složení; ukažte je jako „Bez: žampiony, cibule“. Prázdné, když host nic… - `note` (string | null, povinné) - `total` (Money, povinné): počet × (jednotková cena + obal + jednotkové ceny × porce příloh a doplňků + `total` voleb), u `split` s díly a jejich přílohami, před slevou – slevy řádku jsou v `discounts` (`applies_to: line`… - `gift_of` (Id | null, povinné): Akce (`Promotion.id`), která řádek přidala jako dárek (`effect.type` `gift`): řádek má plnou cenu a sleva `applies_to: line` téže akce ji vrací. Ukažte ho jako dárek a nedovolte zákazníkovi ho měnit… ### OrderLineOption Vybraná volba na jeden kus řádku: `total` = `charged_quantity` × `unit_price`. Název a cena jsou ty z okamžiku kalkulace. - `option_id` (Id, povinné) - `group_id` (Id, povinné) - `group_name` (string, povinné) - `product_id` (Id, povinné) - `name` (string, povinné) - `quantity` (integer, povinné): Vybraných porcí. - `included_quantity` (integer, povinné): Porcí v ceně produktu. - `charged_quantity` (integer, povinné): Účtovaných porcí (`quantity` − `included_quantity`). - `list_unit_price` (Money, povinné): Cena jedné porce ze sortimentu (`ProductOption.price`). - `unit_price` (Money, povinné): Účtovaná cena jedné porce; u prémiové volby (`in_base_price`) `0`. - `total` (Money, povinné) - `vat_rate` (VatRate, povinné): Sazba volby; záporná volba má sazbu svého produktu. - `reason` (string | null, povinné): Proč stojí míň než `quantity` × `list_unit_price`: `included` – všechny porce v ceně; `partly_included` – část z nich; `in_base_price` – prémiová volba zaplacená v `OrderLine.unit_price`; `null`… Známé hodnoty (mohou přibýt další): `included` (od 26.10.9), `partly_included` (od 26.10.9), `in_base_price` (od 26.10.9), `None` ### OrderLinePart - `position` (integer, povinné): Pořadí dílu na pizze od 1 (jako `QuoteItemInput.parts`). - `fraction` (string, povinné): `1/2` – půlka; `1/4` – čtvrtka. Známé hodnoty (mohou přibýt další): `1/2` (od 26.10.9), `1/4` (od 26.10.9) - `product_id` (Id, povinné) - `name` (string, povinné): Název produktu v okamžiku kalkulace. - `unit_price` (Money, povinné): Cena dílu (`Product.split`). - `vat_rate` (VatRate, povinné) - `add_ons` (object[], povinné): Přílohy tohoto dílu. - `product_id` (Id | null, povinné) - `name` (string, povinné) - `quantity` (integer, povinné): Porcí na jeden kus řádku (`AddOnInput.quantity`). - `unit_price` (Money, povinné): Cena jedné porce. - `vat_rate` (VatRate, povinné): Sazba přílohy; záporná příloha má sazbu svého produktu. - `removed_ingredients` (RemovableIngredient[], povinné): Suroviny odebrané z tohoto dílu (`SplitPartInput.removed_ingredient_ids`), jako `OrderLine.removed_ingredients`. ### Charge Poplatek navíc k položkám. Doprava a podobné poplatky jsou vedlejší výdaje podle § 36 odst. 3 zákona č. 235/2004 Sb.: daní se sazbou položek, a když mají položky více sazeb, rozdělí se v poměru jejich částek s DPH jako na účtence (viz *Peníze a DPH*); rozdělení ukazuje `vat`. - `type` (string, povinné): `delivery_fee` – cena dopravy zóny; `minimum_order_surcharge` doplácí objednávku do minimální objednávky rozvozové zóny; `express_delivery` – příplatek zóny za expresní doručení (`fulfillment.speed`… Známé hodnoty (mohou přibýt další): `delivery_fee`, `minimum_order_surcharge`, `express_delivery` (od 26.10.5) - `name` (string, povinné): Název pro zákazníka, vždy česky („Doprava“, „Doplatek do minimální objednávky“, „Expresní doručení“). - `amount` (Money, povinné) - `vat` (VatBreakdown[], povinné): Poplatek rozdělený podle sazeb DPH. Části dávají dohromady `amount`. ### Discount Sleva z akce provozovny (`GET …/promotions`). Snižuje cenu i základ daně a do sazeb DPH se dělí přesně jako na účtence. - `type` (string, povinné): `restaurant` – od provozovny. Známé hodnoty (mohou přibýt další): `restaurant` - `name` (string, povinné): Název akce pro zákazníka. - `amount` (Money, povinné): Záporná částka. - `vat` (VatBreakdown[], povinné): Rozdělení do sazeb DPH, záporně. - `promotion` (DiscountPromotion | null, povinné): Akce, která slevu dala; `null` u slevy bez akce (dnes žádná). - `applies_to` (string, povinné): `order` – cena položek celé objednávky; `delivery_fee` – doprava zdarma; `line` – cena jednoho řádku (`line_id`). Známé hodnoty (mohou přibýt další): `order` (od 26.10.4), `delivery_fee` (od 26.10.4), `line` (od 26.10.8) - `line_id` (Id | null, povinné): Zlevněný řádek (`OrderLine.id`) u `applies_to: line`; `null` u slevy celé objednávky a dopravy zdarma. ### DiscountPromotion - `id` (Id, povinné) - `name` (string, povinné) - `code` (string | null, povinné): Slevový kód maskovaně (`LET***`); `null` u akce bez kódu. ### Totals `total = items + charges + discounts + rounding` (slevy jsou záporné). V kalkulacích a objednávkách je `rounding` nulové; na účtenkách je `charges` vždy nula. - `items` (Money, povinné): Součet řádků (`total` každého řádku, před slevou – řádky dárků s plnou cenou). - `charges` (Money, povinné): Součet poplatků (doprava, doplatek do minima, expresní doručení). - `discounts` (Money, povinné): Součet slev, záporný nebo nula. - `rounding` (Money, povinné): Zaokrouhlení platby v hotovosti na celé koruny – na účtence; jinak nula (v kalkulacích a objednávkách vždy). - `total` (Money, povinné): Cena objednávky včetně DPH, před vouchery. - `vat` (VatBreakdown[], povinné) ### Payment Jeden způsob, jak se objednávka platí. Vouchery jsou také platby: snižují, kolik zbývá zaplatit, ne cenu ani DPH. V kalkulaci jsou platby vouchery `pending`, dokud objednávka nevznikne. - `id` (Id, povinné) - `method` (string, povinné): `online` – zaplaceno vám přes internet (`provider`, `reference`); `cash`, `card` – vybírá se při doručení nebo odběru; `voucher` – dárkový voucher (`voucher_code`, `forfeited`). Známé hodnoty (mohou přibýt další): `online`, `cash`, `card`, `voucher` - `status` (string, povinné): `pending` – online platba čekající na `confirm-payment`, nebo voucher v kalkulaci; `paid` – vybráno (vybraná nebo potvrzená online platba, použitý voucher; hotově a kartou, jakmile je objednávka… Známé hodnoty (mohou přibýt další): `pending`, `paid`, `unpaid`, `voided` - `amount` (Money, povinné) - `provider` (string | null, povinné) - `reference` (string | null, povinné) - `voucher_code` (string | null, povinné): Maskovaný kód voucheru, například `ABC-***`. - `forfeited` (Money | null, povinné): U jednorázového voucheru nevyužitý zbytek, který propadne. Upozorněte zákazníka před objednáním. ### Quote - `id` (Id, povinné) - `restaurant_id` (Id, povinné) - `created_at` (Timestamp, povinné) - `expires_at` (Timestamp, povinné): Do té doby jsou ceny zaručené a lze vytvořit objednávku. - `customer_id` (Id | null, povinné) - `fulfillment` (Fulfillment, povinné) - `delivery` (DeliveryInfo | null, povinné) - `lines` (OrderLine[], povinné) - `charges` (Charge[], povinné) - `discounts` (Discount[], povinné): Slevy z akcí provozovny (viz `Discount`). - `totals` (Totals, povinné) - `payments` (Payment[], povinné): Vouchery, které se použijí, jako platby `pending`. - `amount_due` (Money, povinné): Kolik zaplatí zákazník vám nebo kurýrovi. `totals.total` minus platby vouchery. ### Order Objednávka, kterou vaše připojení vytvořilo přes toto API, s cenami své kalkulace a stavem v kuchyni. Peníze jsou v nejmenších jednotkách. - `id` (Id, povinné): Naše ID objednávky (`order_id` v adresách); liší se od `KitchenTicket.order_id`. - `restaurant_id` (Id, povinné) - `kitchen_number` (string | null, povinné): Krátké číslo pro kuchyň a zákazníka. Začíná znovu každou směnu, proto ho nikdy nepoužívejte jako ID. - `status` (string, povinné): `awaiting_payment` – čeká na `confirm-payment`, v kuchyni ještě není; `received` – ve frontě kuchyně, nezačatá; `preparing` – kuchyně ji začala připravovat (vzal ji kuchař nebo výroba, nebo je něco… Známé hodnoty (mohou přibýt další): `awaiting_payment`, `received`, `preparing`, `ready`, `out_for_delivery`, `delivered`, `not_delivered` (od 26.11.2), `cancelled` - `status_changed_at` (Timestamp, povinné): Kdy objednávka dostala aktuální stav. Kuchyň své kroky nehlásí, proto je u změn v kuchyni okamžikem, kdy si jich Profirest všiml – obvykle do minuty. - `created_at` (Timestamp, povinné): Kdy objednávka vznikla. - `payment_deadline` (Timestamp | null, povinné): Ve stavu `awaiting_payment` okamžik, kdy se objednávka bez `confirm-payment` zruší; jinak `null`. - `fulfillment` (Fulfillment, povinné) - `customer` (object, povinné): Kontakt objednávky, jak jste ho poslali (`OrderCustomerInput`), a propojený zákazník z kalkulace (`customer_id`). Když provozovna tohoto zákazníka v administraci smaže, jméno se změní na… - `customer_id` (Id | null, povinné) - `name` (string, povinné) - `phone` (string, povinné): Telefon ve formátu E.164; po výmazu zákazníka a u objednávky z kiosku bez telefonu prázdný řetězec. - `email` (Email | null, povinné) - `delivery` (DeliveryInfo | null, povinné): Zóna, adresa, poloha, cena dopravy a minimální objednávka u `delivery`; u `pickup` a `dine_in` `null`. - `lines` (OrderLine[], povinné): Položky s cenami kalkulace; položky přidané později v kuchyni (`addKitchenTicketItems`) se připojí na konec. - `charges` (Charge[], povinné): Doprava, doplatek do minimální objednávky zóny a expresní doručení. - `discounts` (Discount[], povinné): Slevy z akcí provozovny (viz `Discount`). - `totals` (Totals, povinné) - `payments` (Payment[], povinné): Platby včetně plateb dárkovými vouchery (kódy maskovaně). - `amount_to_collect` (Money, povinné): Kolik ještě vybere kurýr nebo provozovna při doručení či odběru. Nula, když je předplaceno. - `loyalty_points_earned` (integer | null, povinné): Body připsané propojenému zákazníkovi za tuto objednávku; `null` bez propojeného zákazníka. - `note` (string | null, povinné): Vaše `note` pro kuchyň a kurýra; `null`, když je prázdná. - `cancellation` (object | null, povinné): Kdo objednávku zrušil, kdy a proč; `null`, pokud `status` není `cancelled`. - `eet` (OrderEet | null, povinné): Tržba, jak ji do EET 2.0 zaevidoval jiný systém provozovny; `null` – eviduje ji Profirest. - `external_id` (ExternalId | null, povinné): Vaše vlastní ID objednávky (`OrderCreate.external_id` nebo `putExternalRef`); `null`, když žádné nenastavíte. - `metadata` (Metadata, povinné): Vaše vlastní dvojice klíč–hodnota u objednávky. ### OrderPage - `data` (Order[], povinné) - `next_cursor` (string | null, povinné) ### CustomerCreate - `phone` (Phone, povinné) - `name` (string | null) - `email` (Email | null) - `external_id` (ExternalId | null) - `metadata` (MetadataInput | null) ### CustomerUpdate - `phone` (Phone) - `name` (string | null) - `email` (Email | null) - `external_id` (ExternalId | null) - `metadata` (MetadataPatch) ### Customer Váš zákazník propojený s databází klientů účtu. Obsahuje jen údaje, které jste poslali. - `id` (Id, povinné): Naše ID propojení zákazníka (`customer_id` v adresách); každé připojení má svá propojení. - `phone` (Phone, povinné): Telefonní číslo, jak jste ho poslali. - `name` (string | null, povinné): Jméno, jak jste ho poslali; `null`, když žádné. - `email` (Email | null, povinné): E-mail, jak jste ho poslali; `null`, když žádný. - `phone_verified` (boolean, povinné): Telefon je ověřený kódem z SMS (`confirmPhoneVerification`); změna telefonu ho vrátí na `false`. - `created_at` (Timestamp, povinné): Kdy vaše připojení zákazníka propojilo. - `external_id` (ExternalId | null, povinné): Vaše vlastní ID zákazníka; `null`, když žádné nenastavíte. - `metadata` (Metadata, povinné): Vaše vlastní dvojice klíč–hodnota u zákazníka. ### CustomerPage - `data` (Customer[], povinné) - `next_cursor` (string | null, povinné) ### PhoneVerification - `id` (Id, povinné) - `expires_at` (Timestamp, povinné) - `resend_after` (Timestamp, povinné) ### PhoneVerificationConfirm - `code` (string, povinné) ### Loyalty - `customer_id` (Id, povinné) - `points` (integer, povinné) - `points_value` (Money, povinné): Hodnota bodů. 1 bod = 1 Kč. - `redeemable` (boolean, povinné): Body lze uplatnit přes API. `false`, dokud se uplatňování nespustí. ### VoucherCheck - `code` (VoucherCode, povinné) - `end_user_id` (ExternalId | null): Vaše stálé anonymní ID nakupujícího. Slouží k limitům pokusů. ### Voucher - `code` (string, povinné): Maskovaný kód. - `status` (string, povinné): `active` – lze použít; `expired` – vypršel; `used` – bez zůstatku; `blocked` – zablokovaný provozovnou; `for_sale` – zatím neprodaný, jde prodat za `value` (jen pro spárovanou pokladnu, od 26.11.26). Známé hodnoty (mohou přibýt další): `active`, `expired`, `used`, `blocked`, `for_sale` (od 26.11.26) - `value` (Money, povinné): Původní hodnota. - `balance` (Money, povinné) - `valid_until` (LocalDate | null, povinné): Poslední den platnosti včetně. - `partial_redemption` (boolean, povinné): `true` – lze čerpat postupně; `false` – použije se najednou a zbytek propadne (viz `Payment.forfeited`). - `accepted_here` (boolean, povinné): Voucher lze použít na této provozovně. ### ExternalRef - `object_type` (string, povinné): Typ objektu jako v adrese: `restaurant` (`Restaurant.id`), `category` (`Category.id`), `product` (`Product.id`), `order` (`Order.id` vašeho připojení), `customer` (`Customer.id` vašeho připojení). Známé hodnoty (mohou přibýt další): `restaurant`, `category`, `product`, `order`, `customer` - `object_id` (Id, povinné) - `external_id` (ExternalId | null, povinné) - `metadata` (Metadata, povinné) - `updated_at` (Timestamp | null, povinné) ### ExternalRefUpdate - `external_id` (ExternalId | null, povinné) - `metadata` (MetadataInput, povinné) ### ExternalRefPage - `data` (ExternalRef[], povinné) - `next_cursor` (string | null, povinné) ### Event Jedna změna. Stejný objekt přichází z `GET /events` i z webhooků. `data` závisí na `type`: `order.created`, `order.updated`, `order.status_changed` – celá `Order` tak, jak byla v `occurred_at`; `catalog.changed`, `availability.changed`, `restaurant.changed` – `EventRestaurantData`, načtěte zdroj znovu (server porovnává sortiment a zbývající porce každé provozovny, kterou nějaká aplikace čte, zhruba jednou za minutu, takže tyto dvě přijdou nejpozději asi dvě minuty po změně, ať ji udělal… - `id` (Id, povinné) - `api_version` (string, povinné): Verze formátu obsahu. V API v2 vždy `2`. - `sequence` (integer, povinné): Roste v pořadí zápisu událostí; proud ani webhooky nevydají vyšší dřív než nižší z vašeho připojení. Mezery jsou možné. Podle něj řaďte doručené webhooky. - `type` (string, povinné): Co se stalo; popis `Event` říká, co který typ znamená a jaká `data` nese. Známé hodnoty (mohou přibýt další): `order.created`, `order.updated`, `order.status_changed`, `catalog.changed`, `availability.changed`, `promotions.changed` (od 26.10.4), `restaurant.changed`, `grant.changed`, `grant.revoked`, `attendance.updated`, `kitchen.ticket_created` (od 26.10.4), `kitchen.ticket_updated`, `kitchen.shift_closed`, `call.received`, `receipt.created`, `receipt.cancelled`, `receipt.updated` (od 26.11.28), `pos_shift.closed`, `tab.updated`, `tab.closed`, `sale.created` (od 26.10.4), `sale.cancelled` (od 26.10.4), `shift.closed` (od 26.10.4), `table.inbox_received` (od… - `occurred_at` (Timestamp, povinné) - `connection_id` (Id, povinné) - `account_id` (Id, povinné) - `restaurant_id` (Id | null, povinné): Provozovna, ke které událost patří; `null` u událostí celého připojení. - `data` (object, povinné): Viz popis události. ### Reservation Rezervace stolu (`kind=table`), nebo služby u pracovníka (`kind=service`). Stavy: `requested` (čeká na potvrzení provozovnou nebo na zálohu), `confirmed`, `seated` (hosté jsou tu), `completed` (odešli), `cancelled`, `rejected`, `no_show`, `expired` (nikdo ji včas nepotvrdil ani nezaplatil). Rezervace ve stavu `requested`, `confirmed` nebo `seated` drží stoly, pracovníka a místnost do `blocked_until`. - `id` (Id, povinné) - `uuid` (string (uuid), povinné): UUID rezervace – vaše, pokud jste ho poslali do `createReservation`. Adresa ho přijme také. - `restaurant_id` (Id, povinné) - `kind` (string, povinné): Známé hodnoty (mohou přibýt další): `table` (od 26.11.9), `service` (od 26.11.9) - `status` (string, povinné): Známé hodnoty (mohou přibýt další): `requested` (od 26.11.9), `confirmed` (od 26.11.9), `seated` (od 26.11.9), `completed` (od 26.11.9), `cancelled` (od 26.11.9), `rejected` (od 26.11.9), `no_show` (od 26.11.9), `expired` (od 26.11.9) - `source` (string, povinné): Odkud přišla – `admin` (administrace), `pos` (pokladna), `phone` (po telefonu), `online` (host rezervuje online), `api` (aplikace obsluhy). Známé hodnoty (mohou přibýt další): `admin` (od 26.11.9), `pos` (od 26.11.9), `phone` (od 26.11.9), `online` (od 26.11.9), `api` (od 26.11.9) - `party_size` (integer, povinné) - `starts_at` (Timestamp, povinné) - `ends_at` (Timestamp, povinné): Konec návštěvy nebo služby. - `blocked_until` (Timestamp, povinné): Konec plus úklid nebo příprava – do té doby jsou stoly, pracovník a místnost obsazené. - `table_ids` (Id[], povinné): Stoly z mapy (`Room.tables[].id`); víc, když se stoly spojí. U služby prázdné. - `service_id` (Id | null, povinné) - `employee_id` (Id | null, povinné): Pracovník, který službu dělá; u stolu `null`. - `employee_any` (boolean, povinné): Host chtěl kohokoli volného; server vybral. - `resource_id` (Id | null, povinné): Místnost nebo zařízení, které služba potřebuje. - `guest` (ReservationGuest, povinné) - `note_guest` (string | null, povinné): Přání hosta (dětská židlička, bezlepkové). - `note_internal` (string | null, povinné): Poznámka jen pro obsluhu; v událostech `null`. - `tags` (string[], povinné): Štítky obsluhy (narozeniny, VIP, alergie). - `deposit` (ReservationDeposit, povinné) - `confirm_due_at` (Timestamp | null, povinné): Rezervace `requested` v tuto chvíli propadne, když ji nikdo nepotvrdí ani nezaplatí. - `tab_id` (string (uuid) | null (uuid), povinné): Účet stolu po usazení (`Tab.id`), když ho pokladna poslala. - `cancel_reason` (string | null, povinné): Proč byla zrušena nebo odmítnuta. - `version` (integer, povinné): Roste s každou změnou; nese ji `ETag`. - `created_at` (Timestamp, povinné) - `updated_at` (Timestamp, povinné) ### ReservationGuest Host. V událostech jsou `phone` a `email` `null` – načtěte je přes `getReservation`. - `name` (string, povinné) - `phone` (string | null, povinné) - `email` (string (email) | null (email), povinné) - `customer_id` (Id | null, povinné): Zákazník účtu (`Customer.id`), je-li propojený. ### ReservationDeposit Záloha podle pravidel – `none`, `pending` (čeká na zaplacení), `paid`, `refunded`, `forfeited` (nepřišli). - `amount` (Money, povinné) - `status` (string, povinné): Známé hodnoty (mohou přibýt další): `none` (od 26.11.9), `pending` (od 26.11.9), `paid` (od 26.11.9), `refunded` (od 26.11.9), `forfeited` (od 26.11.9) - `due_at` (Timestamp | null, povinné): Nezaplacená záloha v tuto chvíli nechá rezervaci propadnout. ### ReservationGuestInput - `name` (string, povinné) - `phone` (string | null): Povinný u `channel=online`. - `email` (string | null): Povinný u `channel=online`. - `customer_id` (Id | null) ### ReservationCreate - `uuid` (string (uuid)): Vaše vlastní UUID rezervace; druhé založení s ním vrátí existující. - `channel` (string): `online` (výchozí) – host rezervuje přes vaši aplikaci; `staff` – aplikace obsluhy. Hodnoty: `online`, `staff`. - `kind` (string): `table` (výchozí), nebo `service`. Hodnoty: `table`, `service`. - `party_size` (integer) - `starts_at` (string, povinné): Začátek – RFC 3339 (`2026-11-10T19:00:00+01:00`), nebo místní čas provozovny bez zóny (`2026-11-10T19:00`). Sekundy se zahodí. Online musí být jedním z volných časů. - `service_id` (Id) - `employee_id` (Id): Jen tento pracovník; bez něj kdokoli volný. - `table_ids` (Id[]): Stoly (jen `channel=staff`); bez nich je vybere server. - `guest` (ReservationGuestInput, povinné) - `note_guest` (string) - `note_internal` (string) - `tags` (string[]) - `duration_minutes` (integer): Jen `channel=staff`, stoly – délka návštěvy místo pravidel (podle počtu osob). - `walk_in` (boolean): Jen `channel=staff` – hosté bez rezervace jsou tady; rezervace se rovnou usadí. - `deposit` (boolean): Jen `channel=staff` – `false` = bez zálohy, i když ji pravidla chtějí. Výchozí `true`. ### ReservationUpdate Jen pole, která se mění. - `party_size` (integer) - `starts_at` (string): Jako v `ReservationCreate`. - `service_id` (Id) - `employee_id` (Id | null): Jiný pracovník; `null` = kdokoli volný. - `table_ids` (Id[]) - `guest` (object) - `name` (string) - `phone` (string | null) - `email` (string | null) - `customer_id` (Id | null) - `note_guest` (string | null) - `note_internal` (string | null) - `tags` (string[]) - `duration_minutes` (integer): Stoly – nová délka návštěvy; znovu se porovná s kapacitou. ### ReservationPaymentLink - `url` (string (uri), povinné): Stránka rezervace pro hosta – tam zálohu zaplatí kartou (a může rezervaci zrušit). Pošlete ji SMS nebo zprávou; starší odkaz rezervace přestane platit. - `emailed` (boolean, povinné): `true` = Profirest odkaz poslal na e-mail hosta. - `due_at` (Timestamp | null, povinné): Nezaplacená do této doby rezervace propadne. ### ReservationGuestHistory Co provozovna ví o hostovi z dřívějších rezervací všech provozoven účtu. - `known` (boolean, povinné): `false` = nový host. - `name` (string | null, povinné): Poslední jméno. - `phone` (string | null, povinné) - `email` (string | null, povinné) - `visits` (integer, povinné): Přišel (usazen nebo odešel). - `no_shows` (integer, povinné): Nepřišel bez zrušení. - `cancelled` (integer, povinné) - `upcoming` (integer, povinné): Platné rezervace v budoucnu. - `last_visit_at` (Timestamp | null, povinné) - `tags` (string[], povinné): Štítky z dřívějších rezervací (alergie, VIP …). ### WaitlistEntry - `id` (Id, povinné) - `name` (string, povinné) - `phone` (string | null, povinné) - `party_size` (integer, povinné) - `note` (string | null, povinné) - `status` (string, povinné): `notified` = odešla SMS, že je stůl připravený. Známé hodnoty (mohou přibýt další): `waiting` (od 26.11.11), `notified` (od 26.11.11) - `created_at` (Timestamp, povinné) - `notified_at` (Timestamp | null, povinné) - `can_sms` (boolean, povinné): Host má české mobilní číslo pro `notifyWaitlistEntry`. ### WaitlistList - `data` (WaitlistEntry[], povinné) ### WaitlistEntryCreate - `name` (string) - `phone` (string) - `party_size` (integer, povinné) - `note` (string) ### WaitlistClose - `status` (string, povinné): Od verze 26.11.11: `seated`, `left`. Hodnoty: `seated`, `left`. - `reservation_id` (Id): U `seated` – rezervace hosta. ### ReservationFeedback - `reservation_id` (Id, povinné) - `starts_at` (Timestamp, povinné) - `guest_name` (string, povinné) - `rating` (integer, povinné) - `comment` (string | null, povinné) - `rated_at` (Timestamp, povinné) ### ReservationFeedbackList - `data` (ReservationFeedback[], povinné) - `count` (integer, povinné) - `average` (number | null, povinné): Průměrné hodnocení na jedno desetinné místo; bez hodnocení `null`. ### ReservationAction - `reason` (string): Proč se ruší nebo odmítá – uvidí to host. - `tab_id` (string (uuid)): `seatReservation`: účet, který hostům otevřela vaše pokladna. ### ReservationList - `data` (Reservation[], povinné) ### ReservationSettings - `slot_step_minutes` (integer, povinné): Časy se nabízejí po tomto kroku (5–60 minut). - `table_durations` (object[], povinné): Jak dlouho hosté sedí u stolu podle velikosti skupiny, vzestupně; větší skupina sedí jako poslední řádek. - `up_to_party_size` (integer, povinné) - `minutes` (integer, povinné) - `table_buffer_minutes` (integer, povinné): Úklid stolu po odchodu hostů. - `last_seating_before_close_minutes` (integer, povinné): Poslední rezervace stolu začíná tolik minut před zavřením. - `use_opening_hours` (boolean, povinné): Stoly se rezervují jen v otevírací době (`getOpeningHours`). - `max_guests_per_slot` (integer | null, povinné): Nejvýš tolik hostů smí přijít v jednom kroku; `null` = bez omezení. - `closed_dates` (LocalDate[], povinné): Dny bez rezervací. - `online` (object, povinné) - `enabled` (boolean, povinné): Provozovna přijímá rezervace hostů online. - `confirmation` (string, povinné): `auto` – hned potvrzená, když je volno; `manual` – čeká na provozovnu (`requested`). Známé hodnoty (mohou přibýt další): `auto` (od 26.11.9), `manual` (od 26.11.9) - `confirm_within_minutes` (integer, povinné): Nepotvrzená rezervace po této době propadne. - `lead_minutes` (integer, povinné): Ne dřív než za tolik minut od teď. - `horizon_days` (integer, povinné): Nejvýš tolik dní dopředu. - `max_party_size` (integer, povinné): Větší skupiny rezervují telefonicky. - `guest_cancel_hours` (integer, povinné): Host smí zrušit nejpozději tolik hodin před začátkem. - `services_enabled` (boolean, povinné): Licence zahrnuje rezervace služeb u pracovníků. - `deposit` (object, povinné): Pravidla záloh. Záloha se vybírá jen při `available` (zapnutá platební brána e-shopu provozovny). Částku konkrétní rezervace nese `ReservationDeposit`, jakmile rezervace vznikne. - `mode` (string, povinné): `none`; `from_party` – stoly od `from_party_size` osob a každá služba; `always`. Známé hodnoty (mohou přibýt další): `none` (od 26.11.12), `from_party` (od 26.11.12), `always` (od 26.11.12) - `available` (boolean, povinné): Platební brána je zapnutá, zálohy jde zaplatit. - `from_party_size` (integer, povinné) - `per_person` (Money, povinné): Záloha stolu za osobu; nula, když je za rezervaci. - `per_reservation` (Money, povinné): Záloha stolu za rezervaci; nula, když je za osobu. - `service_percent` (integer, povinné): Záloha služby v procentech ceny, na celé koruny; 0 = celá cena. - `pay_within_minutes` (integer, povinné): Nezaplacená rezervace po této době propadne. - `refund_until_hours` (integer, povinné): Zruší-li host aspoň tolik hodin před začátkem, záloha se vrací. - `no_show_guests` (boolean, povinné): Online zaplatí zálohu host, který má v účtu rezervaci `no_show` (podle telefonu nebo e-mailu), i když by ji `mode` nechtěl. - `reminders` (object, povinné) - `email_hours` (integer, povinné): Připomínka e-mailem online hostům tolik hodin předem; 0 = vypnutá. - `sms_hours` (integer, povinné): SMS připomínka potvrzeným rezervacím s českým mobilem tolik hodin předem; 0 = vypnutá. - `feedback_enabled` (boolean, povinné): Hosté jsou po návštěvě požádáni o hodnocení (`listReservationFeedback`). - `guest_max_moves` (integer, povinné): Kolikrát smí host rezervaci přesunout online odkazem z e-mailu; pak telefonicky. ### ReservationStats - `from` (LocalDate, povinné) - `to` (LocalDate, povinné) - `reservations` (integer, povinné): Rezervace začínající v období, bez blokací stolů. - `guests` (integer, povinné): Hosté rezervací, které přišly, přijdou, nebo nepřišly. - `arrived` (integer, povinné) - `arrived_guests` (integer, povinné) - `no_show` (integer, povinné) - `no_show_rate` (number, povinné): `no_show` z (`arrived` + `no_show`) v procentech, na jedno desetinné místo. - `cancelled` (integer, povinné) - `rejected` (integer, povinné) - `expired` (integer, povinné) - `upcoming` (integer, povinné) - `unresolved` (integer, povinné): Minulé rezervace, které nikdo neoznačil jako usazené, odešlé ani nepřišlé. - `avg_party_size` (number, povinné) - `avg_lead_days` (number, povinné): Kolik dní dopředu se v průměru rezervuje. - `returning_guests` (integer, povinné): Hosté (podle telefonu nebo e-mailu) s víc než jednou rezervací v období. - `sources` (object[], povinné) - `source` (string, povinné): Známé hodnoty (mohou přibýt další): `admin` (od 26.11.12), `pos` (od 26.11.12), `online` (od 26.11.12), `phone` (od 26.11.12), `api` (od 26.11.12) - `count` (integer, povinné) - `weekdays` (integer[], povinné): Hosté podle dne v týdnu od pondělí (7 položek). - `hours` (object[], povinné): Hosté podle hodiny příchodu. - `hour` (integer, povinné) - `guests` (integer, povinné) - `deposits` (object, povinné) - `paid` (Money, povinné) - `refunded` (Money, povinné) - `forfeited` (Money, povinné) - `ratings` (object, povinné) - `count` (integer, povinné) - `average` (number | null, povinné) - `low` (integer, povinné): Hodnocení 1–3 hvězdičky. - `services` (object[], povinné) - `service_id` (Id, povinné) - `name` (string, povinné) - `count` (integer, povinné) - `employees` (object[], povinné) - `employee_id` (Id, povinné) - `name` (string, povinné) - `count` (integer, povinné) - `table_turn` (object, povinné): Skutečná doba u stolu – od usazení do odchodu, 10 až 600 minut. - `measured` (integer, povinné) - `groups` (object[], povinné): Jedna na řádek `ReservationSettings.table_durations`. - `up_to_party_size` (integer, povinné) - `planned_minutes` (integer, povinné) - `measured` (integer, povinné) - `median_minutes` (integer | null, povinné) - `suggestions` (object[], povinné) - `up_to_party_size` (integer, povinné) - `planned_minutes` (integer, povinné) - `median_minutes` (integer, povinné) - `suggested_minutes` (integer, povinné): Medián zaokrouhlený na 15 minut. - `measured` (integer, povinné) ### ReservationServiceList - `data` (ReservationService[], povinné) ### ReservationService - `id` (Id, povinné) - `name` (string, povinné) - `category` (string | null, povinné) - `description` (string | null, povinné) - `duration_minutes` (integer, povinné) - `buffer_minutes` (integer, povinné): Příprava po službě – do té doby má pracovník obsazeno. - `price` (Money, povinné) - `max_party_size` (integer, povinné) - `online` (boolean, povinné): Hosté si ji mohou rezervovat online. - `staff` (object[], povinné): Pracovníci, kteří ji dělají. - `id` (Id, povinné) - `name` (string, povinné) ### ReservationAvailability - `date` (LocalDate, povinné) - `slots` (object[], povinné) - `starts_at` (Timestamp, povinné) - `available` (boolean, povinné) - `reason` (string | null, povinné): Proč ne – `no_table`, `table_unavailable`, `employee_unavailable`, `resource_unavailable`, `pacing` (v tu dobu přichází příliš hostů), `outside_hours`, `closed`. - `table_ids` (Id[], povinné): Stoly, které by rezervace dostala. - `employee_id` (Id | null, povinné): Pracovník, který by službu dostal. ### TableStatus - `at` (Timestamp, povinné) - `tables` (object[], povinné) - `id` (Id, povinné) - `name` (string, povinné) - `room` (string, povinné) - `seats_min` (integer | null, povinné): `null` – stůl se nerezervuje. - `seats_max` (integer | null, povinné) - `state` (string, povinné): Známé hodnoty (mohou přibýt další): `free` (od 26.11.9), `reserved` (od 26.11.9), `occupied` (od 26.11.9) - `tab_id` (string | null, povinné): Otevřený účet stolu (`Tab.id`). - `reservation_id` (Id | null, povinné): Rezervace, která stůl teď drží. - `next_reservation` (object | null, povinné): Další rezervace dne. ### LodgingStats - `from` (string (date), povinné) - `to` (string (date), povinné) - `kpi` (LodgingStatsKpi, povinné) - `previous` (LodgingStatsKpi | null, povinné): Stejné období o rok dřív. - `days` (object[], povinné) - `date` (string (date), povinné) - `sold` (integer, povinné) - `tentative` (integer, povinné) - `occupancy` (number, povinné) - `arrivals` (integer, povinné) - `departures` (integer, povinné) - `revenue` (Money, povinné) - `room_types` (object[], povinné) - `id` (Id, povinné) - `name` (string, povinné) - `rooms` (integer, povinné) - `nights` (integer, povinné) - `occupancy` (number, povinné) - `adr` (Money, povinné) - `revenue` (Money, povinné) - `sources` (object[], povinné) - `source` (string, povinné): Známé hodnoty (mohou přibýt další): `admin` (od 26.11.17), `phone` (od 26.11.17), `email` (od 26.11.17), `online` (od 26.11.17), `api` (od 26.11.17), `channel` (od 26.11.17) - `stays` (integer, povinné) - `nights` (integer, povinné) - `revenue` (Money, povinné) - `countries` (object[], povinné): Podle přenocování; `country` `null` – hosté nejsou v evidenci. - `country` (string | null, povinné) - `guests` (integer, povinné) - `nights` (integer, povinné) - `ages` (object[], povinné) - `group` (string | null, povinné): `0-17`, `18-29`, `30-44`, `45-59`, `60+`; `null` – neuvedeno. - `guests` (integer, povinné) - `nights` (integer, povinné) - `services` (object[], povinné): Služby a útraty na účtech pokojů podle druhu, stejným dílem jako ubytování. - `category` (string, povinné): Známé hodnoty (mohou přibýt další): `breakfast` (od 26.11.17), `board` (od 26.11.17), `extra_bed` (od 26.11.17), `drink` (od 26.11.17), `food` (od 26.11.17), `wellness` (od 26.11.17), `parking` (od 26.11.17), `other` (od 26.11.17) - `revenue` (Money, povinné) - `packages` (object[], povinné) - `id` (Id, povinné) - `name` (string, povinné) - `stays` (integer, povinné) - `revenue` (Money, povinné) - `guest_pass_entries` (object[], povinné): Vstupy zapsané přes QR kód hosta. - `place` (string, povinné): Známé hodnoty (mohou přibýt další): `wellness` (od 26.11.17), `breakfast` (od 26.11.17), `board` (od 26.11.17), `parking` (od 26.11.17) - `entries` (integer, povinné) - `reviews` (object | null, povinné) ### LodgingStatsKpi - `rooms` (integer, povinné) - `days` (integer, povinné) - `available_nights` (integer, povinné) - `sold_nights` (integer, povinné) - `tentative_nights` (integer, povinné) - `occupancy` (number, povinné): Procenta. - `revenue` (Money, povinné): Tržba za ubytování nocí v období. - `services_revenue` (Money, povinné) - `adr` (Money, povinné): Průměrná cena za prodanou noc. - `revpar` (Money, povinné): Tržba na dostupnou noc pokoje. - `guest_nights` (integer, povinné) - `guests` (integer, povinné) - `stays` (integer, povinné) - `avg_length` (number, povinné) - `avg_lead_days` (number, povinné) - `cancelled` (integer, povinné) - `no_show` (integer, povinné) - `cancel_rate` (number, povinné): Zrušené a nepřijeté pobyty v procentech rezervovaných s příjezdem v období. ### LodgingReviewList - `summary` (object, povinné) - `count` (integer, povinné) - `average` (number | null, povinné): 1–5; `null` bez recenzí. - `unanswered` (integer, povinné) - `low_unanswered` (integer, povinné): Do 3 hvězdiček bez odpovědi. - `distribution` (integer[], povinné): Počty 1 až 5 hvězdiček (zaokrouhleně), index 0 = 1 hvězdička. - `sources` (object[], povinné) - `source` (string, povinné) - `count` (integer, povinné) - `average` (number, povinné) - `categories` (object[], povinné) - `key` (string, povinné): Známé hodnoty (mohou přibýt další): `cleanliness` (od 26.11.16), `staff` (od 26.11.16), `comfort` (od 26.11.16), `location` (od 26.11.16), `breakfast` (od 26.11.16), `value` (od 26.11.16) - `average` (number, povinné) - `count` (integer, povinné) - `data` (LodgingReview[], povinné) ### LodgingReview - `id` (Id, povinné) - `stay_id` (Id | null, povinné): Pobyt u hodnocení hosta; `null` u portálů. - `source` (string, povinné): Známé hodnoty (mohou přibýt další): `direct` (od 26.11.16), `booking` (od 26.11.16), `google` (od 26.11.16), `airbnb` (od 26.11.16), `tripadvisor` (od 26.11.16), `other` (od 26.11.16) - `rating` (number, povinné): 1–5 (Booking 1–10 se dělí dvěma). - `categories` (object, povinné): Dílčí hodnocení 1–5 – `cleanliness`, `staff`, `comfort`, `location`, `breakfast`, `value`. - `comment` (string | null, povinné) - `guest_name` (string | null, povinné) - `country` (string | null, povinné) - `date` (string (date) | null (date), povinné): Den odjezdu / datum recenze na portálu. - `public` (boolean, povinné): Ukazuje se na stránce rezervace (host souhlasil a provozovna ji neskryla). - `reply` (string | null, povinné) - `replied_at` (Timestamp | null, povinné) - `reply_sent` (boolean, povinné): Odpověď odešla hostovi e-mailem. - `link` (string | null, povinné): Recenze na portálu. ### LodgingReviewReplyInput - `reply` (string, povinné) - `send_to_guest` (boolean): Poslat ji i hostovi e-mailem (jen u hodnocení hostů). ### LodgingPackageList - `data` (LodgingPackage[], povinné) ### LodgingPackage - `id` (Id, povinné) - `name` (string, povinné) - `description` (string | null, povinné) - `room_type_ids` (Id[], povinné): Typy pokojů, pro které balíček je; prázdné – všechny. - `min_nights` (integer, povinné) - `pay_nights` (integer, povinné): Placené noci pravidla „X placených, Y zdarma“; 0 – bez nocí zdarma. - `free_nights` (integer, povinné) - `discount_percent` (number, povinné) - `price_extra` (Money, povinné): Příplatek za pobyt. - `services` (object[], povinné): Služby v ceně (jdou na účet pokoje za 0). - `id` (Id, povinné) - `name` (string, povinné) - `category` (string, povinné): Známé hodnoty (mohou přibýt další): `breakfast` (od 26.11.15), `board` (od 26.11.15), `extra_bed` (od 26.11.15), `drink` (od 26.11.15), `food` (od 26.11.15), `wellness` (od 26.11.15), `parking` (od 26.11.15), `other` (od 26.11.15) - `valid_from` (string (date) | null (date), povinné): Pro příjezdy od. - `valid_to` (string (date) | null (date), povinné) - `online` (boolean, povinné) ### GuestPassCheckInput - `code` (string, povinné): Text QR kódu (`PRU-{pobyt}-{podpis}`). - `place` (string, povinné): Od verze 26.11.15: `wellness`, `breakfast`, `board`, `parking`. Hodnoty: `wellness`, `breakfast`, `board`, `parking`. - `persons` (integer): Kolik osob vstupuje najednou. - `record` (boolean): `false` – jen ověřit, vstup nezapsat. - `device` (string): Kde se četlo. ### GuestPassCheck - `result` (string, povinné): Známé hodnoty (mohou přibýt další): `ok` (od 26.11.15), `denied` (od 26.11.15) - `title` (string, povinné): Krátký nadpis pro displej čtečky. - `text` (string, povinné) - `check_id` (Id | null, povinné): Zapsaný vstup (pro `undoGuestPassCheck`); `null`, když se nic nezapsalo. - `stay` (object | null, povinné): Pobyt kódu; `null` u neznámého kódu. - `used_today` (integer, povinné) - `allowed_today` (integer | null, povinné): Limit dne; `null` – neomezeně nebo za celý pobyt. ### LodgingRooms - `room_types` (LodgingRoomType[], povinné) - `rooms` (LodgingRoom[], povinné): V pořadí plánu obsazenosti – podle typu (`sort`), pak podle pokoje (`sort`, název). ### LodgingRoomType - `id` (Id, povinné) - `name` (string, povinné) - `description` (string | null, povinné) - `beds` (integer, povinné): Pevná lůžka. - `extra_beds` (integer, povinné): Kolik přistýlek se vejde nad `beds`. - `price_night` (Money, povinné) - `price_extra_bed` (Money, povinné) - `min_nights` (integer, povinné) - `online` (boolean, povinné): Typ jde rezervovat online. - `sort` (integer, povinné) ### LodgingRoom - `id` (Id, povinné) - `type_id` (Id, povinné) - `name` (string, povinné) - `floor` (string | null, povinné) - `sort` (integer, povinné) - `status` (string, povinné): `clean` uklizený, `dirty` k úklidu, `inspected` zkontrolovaný, `out_of_order` mimo provoz (nejde rezervovat). Známé hodnoty (mohou přibýt další): `clean` (od 26.11.21), `dirty` (od 26.11.21), `inspected` (od 26.11.21), `out_of_order` (od 26.11.21) - `note` (string | null, povinné) - `open_issues` (integer, povinné): Neopravené závady pokoje (`listRoomIssues`). ### LodgingStayList - `data` (LodgingStay[], povinné) ### LodgingStay - `id` (Id, povinné) - `uuid` (string (uuid), povinné) - `status` (string, povinné): `tentative` předběžný (nepotvrzený), `confirmed` potvrzený, `checked_in` ubytovaný, `checked_out` odjel, `cancelled` zrušený, `no_show` nepřijel. Známé hodnoty (mohou přibýt další): `tentative` (od 26.11.21), `confirmed` (od 26.11.21), `checked_in` (od 26.11.21), `checked_out` (od 26.11.21), `cancelled` (od 26.11.21), `no_show` (od 26.11.21) - `source` (string, povinné): Odkud pobyt přišel: `admin` (recepce), `phone` telefon, `email` e-mail, `online` (rezervační stránka provozovny), `api` (aplikace), `channel` (portál jako Booking.com nebo Airbnb – viz `channel`). Známé hodnoty (mohou přibýt další): `admin` (od 26.11.21), `phone` (od 26.11.21), `email` (od 26.11.21), `online` (od 26.11.21), `api` (od 26.11.21), `channel` (od 26.11.21) - `arrival` (LocalDate, povinné) - `departure` (LocalDate, povinné) - `nights` (integer, povinné) - `adults` (integer, povinné) - `children` (integer, povinné) - `rooms` (object[], povinné): Úseky pobytu po pokojích podle data (host, který se stěhuje, jich má víc). `date_to` je ráno, kdy host pokoj opouští. - `room_id` (Id, povinné) - `room` (string, povinné) - `type_id` (Id, povinné) - `type` (string, povinné) - `date_from` (LocalDate, povinné) - `date_to` (LocalDate, povinné) - `price_total` (Money, povinné) - `price_manual` (boolean, povinné): Cenu zadala recepce ručně – server ji po změnách znovu nepočítá. - `package` (object | null, povinné) - `guest` (object, povinné): Host, který rezervoval (kontakt pobytu); zapsaní hosté jsou v `getStay`. - `name` (string, povinné) - `phone` (string | null, povinné) - `email` (string | null, povinné) - `lang` (string, povinné) - `company` (string | null, povinné) - `note_guest` (string | null, povinné): Poznámka hosta. - `note_internal` (string | null, povinné): Poznámka recepce – host ji nikdy neuvidí. - `tags` (string[], povinné) - `registered_guests` (integer, povinné): Hosté zapsaní s doklady (`getStay` je vypíše). - `deposit` (object, povinné) - `amount` (Money, povinné) - `status` (string, povinné): `none` bez zálohy, `pending` čeká na zaplacení, `paid` zaplacená, `refunded` vrácená, `forfeited` propadla. Známé hodnoty (mohou přibýt další): `none` (od 26.11.21), `pending` (od 26.11.21), `paid` (od 26.11.21), `refunded` (od 26.11.21), `forfeited` (od 26.11.21) - `due_at` (Timestamp | null, povinné) - `channel` (object | null, povinné): Portál pobytu se `source` `channel` a číslo rezervace na něm. - `cancel_reason` (string | null, povinné) - `checked_in_at` (Timestamp | null, povinné) - `checked_out_at` (Timestamp | null, povinné) - `actions` (string[], povinné): Kroky, které server teď dovolí: `confirm` potvrdit, `check_in` ubytovat (ode dne příjezdu), `check_out` odhlásit, `cancel` zrušit, `no_show` nepřijel (ode dne příjezdu). Jiné kroky vrátí… - `balance` (Money | null, povinné): Co zbývá zaplatit na účtu pokoje (od 26.11.22; záporné při přeplatku); u zrušeného pobytu a nepřijetí `null`. - `version` (integer, povinné): Roste s každou změnou; z ní je `ETag` u `getStay`. - `created_at` (Timestamp, povinné) - `updated_at` (Timestamp, povinné) ### LodgingStayDetail - `stay` (LodgingStay, povinné) - `balance` (Money, povinné) - `guests` (LodgingGuest[], povinné) - `receipt` (LodgingReceipt | null, povinné): Doklad za pobyt (vzniká při odjezdu z vyrovnaného účtu); předtím `null`. Stornovaný doklad tu není. - `history` (object[], povinné): Změny pobytu od nejstarší. - `at` (Timestamp, povinné) - `actor` (string, povinné): `owner` majitel, `employee` zaměstnanec, `guest` host, `api` aplikace, `system` systém, `channel` portál. Známé hodnoty (mohou přibýt další): `owner` (od 26.11.21), `employee` (od 26.11.21), `guest` (od 26.11.21), `api` (od 26.11.21), `system` (od 26.11.21), `channel` (od 26.11.21) - `employee_id` (Id | null, povinné) - `action` (string, povinné): Známé hodnoty (mohou přibýt další): `created` (od 26.11.21), `updated` (od 26.11.21), `moved` (od 26.11.21), `confirmed` (od 26.11.21), `checked_in` (od 26.11.21), `checked_out` (od 26.11.21), `cancelled` (od 26.11.21), `no_show` (od 26.11.21) - `from_status` (string | null, povinné) - `to_status` (string | null, povinné) ### LodgingGuest Host zapsaný k pobytu (domovní kniha, poplatek z pobytu, Ubyport u cizinců). - `id` (Id, povinné) - `first_name` (string, povinné) - `last_name` (string, povinné) - `birth_date` (LocalDate | null, povinné) - `nationality` (string, povinné): ISO 3166-1 alpha-2. - `nationality_name` (string, povinné) - `foreigner` (boolean, povinné): Není občan ČR – hlásí se cizinecké policii (Ubyport). - `document_type` (string | null, povinné): `id` občanský průkaz, `passport` pas, `visa` vízum, `residence` povolení k pobytu, `other` jiný. Známé hodnoty (mohou přibýt další): `id` (od 26.11.21), `passport` (od 26.11.21), `visa` (od 26.11.21), `residence` (od 26.11.21), `other` (od 26.11.21) - `document_no` (string | null, povinné) - `visa_no` (string | null, povinné) - `address` (string | null, povinné) - `purpose` (string | null, povinné): Účel pobytu (kód číselníku Ubyportu). - `arrival` (LocalDate, povinné) - `departure` (LocalDate, povinné) - `fee_exempt` (string | null, povinné): Proč host neplatí poplatek z pobytu; `null` platí. - `note` (string | null, povinné) - `ubyport` (object, povinné) - `state` (string, povinné): `none` nehlásí se (občan ČR), `pending` čeká na odeslání, `sent` odesláno, `error` chyba. Známé hodnoty (mohou přibýt další): `none` (od 26.11.21), `pending` (od 26.11.21), `sent` (od 26.11.21), `error` (od 26.11.21) - `sent_at` (Timestamp | null, povinné) - `error` (string | null, povinné) ### LodgingAvailability - `arrival` (LocalDate, povinné) - `departure` (LocalDate, povinné) - `nights` (integer, povinné) - `adults` (integer, povinné) - `children` (integer, povinné) - `room_types` (object[], povinné) - `type_id` (Id, povinné) - `name` (string, povinné) - `free_rooms` (object[], povinné): Volné pokoje typu v pořadí plánu; jeden pošlete jako `room_id`, nebo pošlete `room_type_id` a server vybere první. - `id` (Id, povinné) - `name` (string, povinné) - `quote` (LodgingQuote | null, povinné): Cena pobytu; `null`, když se hosté do typu nevejdou. - `unavailable` (string | null, povinné): Proč typ rezervovat nejde: `no_room` (všechny pokoje obsazené nebo mimo provoz), `too_many_guests` (hosté se nevejdou), `package_not_applicable` (balíček na typ nebo termín nejde); `null` = jde. Známé hodnoty (mohou přibýt další): `no_room` (od 26.11.21), `too_many_guests` (od 26.11.21), `package_not_applicable` (od 26.11.21) - `message` (string | null, povinné): Věta pro recepci, když je `unavailable` vyplněné. ### LodgingQuote - `total` (Money, povinné) - `list_total` (Money, povinné): Cena podle ceníku před balíčkem. - `nights` (integer, povinné) - `extra_persons` (integer, povinné): Hostů na přistýlce. - `per_night` (object[], povinné) - `date` (LocalDate, povinné) - `price` (Money, povinné) - `rate` (string | null, povinné): Sezóna ceníku; `null` = základní cena typu. - `package` (object | null, povinné) ### LodgingRegistrationLists - `countries` (object[], povinné) - `code` (string, povinné) - `name` (string, povinné) - `document_types` (object[], povinné) - `code` (string, povinné): Známé hodnoty (mohou přibýt další): `id` (od 26.11.21), `passport` (od 26.11.21), `residence` (od 26.11.21), `visa` (od 26.11.21), `other` (od 26.11.21) - `name` (string, povinné) - `purposes` (object[], povinné): Účely pobytu cizinecké policie (Ubyport); prázdné, dokud provozovna Ubyport nenastaví. - `code` (string, povinné) - `name` (string, povinné) - `city_tax` (object, povinné) - `enabled` (boolean, povinné) - `exempt_under_age` (integer, povinné): Mladší hosté neplatí (ze zákona). ### LodgingStayCreate - `room_id` (Id): Pokoj (`getLodgingAvailability`); nebo pošlete `room_type_id`. - `room_type_id` (Id): Server vybere první volný pokoj typu. - `arrival` (LocalDate, povinné) - `departure` (LocalDate, povinné) - `adults` (integer) - `children` (integer) - `guest` (LodgingStayGuestInput, povinné) - `company` (string) - `note_guest` (string) - `note_internal` (string) - `tags` (string[]) - `status` (string): `confirmed` potvrzený (výchozí), nebo `tentative` předběžný (drží pokoj, dokud ho nepotvrdíte nebo nezrušíte). Hodnoty: `confirmed`, `tentative`. - `source` (string): Jak host rezervoval na recepci. Hodnoty: `admin`, `phone`, `email`. - `price_total` (MoneyInput): Cena zadaná ručně – server ji znovu nepočítá; bez ní počítá ceník. - `package_id` (Id) - `uuid` (string (uuid)): Vaše ID pobytu; druhé založení s ním vrátí existující pobyt. ### LodgingStayGuestInput - `name` (string, povinné) - `phone` (string | null) - `email` (string | null) - `lang` (string): Od verze 26.11.21: `cs`, `en`. Hodnoty: `cs`, `en`. ### LodgingStayUpdate Jen to, co se mění. Termín a pokoj mění `moveStay`. - `guest` (object) - `name` (string) - `phone` (string | null) - `email` (string | null) - `lang` (string): Od verze 26.11.21: `cs`, `en`. Hodnoty: `cs`, `en`. - `adults` (integer) - `children` (integer) - `company` (string | null) - `note_guest` (string | null) - `note_internal` (string | null) - `tags` (string[]) - `price_total` (MoneyInput | null): Cena ručně; `null` = znovu podle ceníku. - `package_id` (Id | null): Pobytový balíček; `null` = bez balíčku. ### LodgingStayMove - `room_id` (Id, povinné) - `arrival` (LocalDate, povinné) - `departure` (LocalDate, povinné) ### LodgingStayCancel - `reason` (string) - `keep_deposit` (boolean): Ponechat zaplacenou zálohu jako storno poplatek; bez toho se záloha hostovi vrátí. ### LodgingGuestInput Cizinec (ne `CZ`) potřebuje `birth_date` a `document_no` (server je hlásí do Ubyportu). Dítě zapsané v pasu rodiče má `document_no` `INPASS` a doklad rodiče v `note`. - `first_name` (string, povinné) - `last_name` (string, povinné) - `birth_date` (LocalDate) - `nationality` (string, povinné) - `document_type` (string): Od verze 26.11.21: `id`, `passport`, `residence`, `visa`, `other`. Hodnoty: `id`, `passport`, `residence`, `visa`, `other`. - `document_no` (string) - `visa_no` (string) - `address` (string) - `purpose` (string) - `arrival` (LocalDate): Výchozí příjezd pobytu. - `departure` (LocalDate): Výchozí odjezd pobytu. - `fee_exempt` (string): Proč host neplatí poplatek z pobytu (prázdné = platí); hosté pod `exempt_under_age` neplatí sami od sebe. - `note` (string) ### LodgingReceipt - `id` (Id, povinné) - `kind` (string, povinné): `sale` doklad, `storno` protidoklad (záporný). Známé hodnoty (mohou přibýt další): `sale` (od 26.11.22), `storno` (od 26.11.22) - `number` (integer, povinné) - `total` (Money, povinné) - `invoice` (boolean, povinné): Faktura pro firmu (převodem). - `eet` (boolean, povinné): Hotovostní nebo kartová část je evidovaná v EET. - `issued_at` (Timestamp, povinné) ### LodgingServiceList - `data` (object[], povinné) - `id` (Id, povinné) - `name` (string, povinné) - `category` (string, povinné): Známé hodnoty (mohou přibýt další): `breakfast` (od 26.11.22), `board` (od 26.11.22), `extra_bed` (od 26.11.22), `pet` (od 26.11.22), `drink` (od 26.11.22), `food` (od 26.11.22), `wellness` (od 26.11.22), `parking` (od 26.11.22), `other` (od 26.11.22) - `unit` (string, povinné): `stay` za pobyt, `night` za noc, `person_night` za osobu a noc, `item` za kus. Známé hodnoty (mohou přibýt další): `stay` (od 26.11.22), `night` (od 26.11.22), `person_night` (od 26.11.22), `item` (od 26.11.22) - `price` (Money, povinné) - `vat_rate` (number, povinné) - `online` (boolean, povinné): Hosté si ji mohou objednat na stránce pobytu. ### StayServiceInput - `service_id` (Id, povinné) - `quantity` (integer) - `persons` (integer) - `date_from` (LocalDate) - `date_to` (LocalDate) - `note` (string) ### StayChargeInput - `name` (string, povinné): Za co útrata je, jak ji host uvidí na účtu. - `amount` (MoneyInput, povinné): Celková částka útraty s DPH. Záporná při vrácení. - `vat_rate` (number, povinné): Jedna sazba pro celou útratu; účet s více sazbami pošlete jako více útrat. Hodnoty: `0`, `12`, `21`. - `reference` (string): Vaše ID útraty; stejná `reference` se nikdy nezapíše dvakrát. ### StayPaymentInput - `amount` (MoneyInput, povinné) - `method` (string, povinné): `cash` hotově, `card` kartou (terminál recepce), `transfer` převodem, `invoice` fakturou (platí firma), `voucher` voucherem, `other` jinak. Hodnoty: `cash`, `card`, `transfer`, `invoice`, `voucher`, `other`. - `note` (string) ### StayReceiptCancel - `reason` (string, povinné) ### StayGuestPass - `code` (string, povinné): Obsah QR kódu. Dejte ho jen hostovi – otevírá wellness i snídaně. - `places` (object[], povinné) - `place` (string, povinné): Známé hodnoty (mohou přibýt další): `wellness` (od 26.11.22), `breakfast` (od 26.11.22), `board` (od 26.11.22), `parking` (od 26.11.22) - `label` (string, povinné) - `text` (string, povinné): Co host smí, větou. - `from` (LocalDate | null, povinné) - `to` (LocalDate | null, povinné) ### UbyportStatus - `configured` (boolean, povinné): Hlášení je zapnuté a účet webové služby vyplněný (Ubytování › Nastavení). - `test` (boolean, povinné): Hlášení jdou do Ubyport-TEST, ne policii. - `pending` (object[], povinné) - `guest_id` (Id, povinné) - `stay_id` (Id, povinné) - `name` (string, povinné) - `nationality` (string, povinné) - `arrival` (LocalDate, povinné) - `deadline` (LocalDate, povinné) - `late` (boolean, povinné) - `state` (string, povinné): Známé hodnoty (mohou přibýt další): `pending` (od 26.11.22), `error` (od 26.11.22) - `error` (string | null, povinné) ### UbyportSendResult - `sent` (integer, povinné) - `errors` (integer, povinné): Hosté, které policie odmítla – opravte je (`updateStayGuest`), půjdou znovu. - `failure` (string | null, povinné): Služba policie neodpovídá; další hodinový běh to zkusí znovu. ### InHouseStays - `stays` (InHouseStay[], povinné) ### InHouseStay - `id` (Id, povinné) - `room` (string, povinné): Pokoj, ve kterém hosté právě bydlí. - `guest_name` (string, povinné) - `arrival` (string (date), povinné) - `departure` (string (date), povinné) - `guests` (integer, povinné): Dospělí a děti. - `balance` (Money, povinné) - `package` (object | null, povinné): Pobytový balíček (od 26.11.15). ### StayFolio - `stay_id` (Id, povinné) - `status` (string, povinné): Známé hodnoty (mohou přibýt další): `tentative` (od 26.11.13), `confirmed` (od 26.11.13), `checked_in` (od 26.11.13), `checked_out` (od 26.11.13), `cancelled` (od 26.11.13), `no_show` (od 26.11.13) - `package` (object | null, povinné): Pobytový balíček (od 26.11.15); jeho služby jsou položky s `total` 0. - `room` (string, povinné) - `guest_name` (string, povinné) - `arrival` (string (date), povinné) - `departure` (string (date), povinné) - `accommodation` (Money, povinné): Cena ubytování (DPH 12 %). - `city_tax` (object | null, povinné): Poplatek z pobytu (bez DPH); `null` – provozovna ho nevybírá. - `lines` (FolioLine[], povinné) - `total` (Money, povinné) - `payments` (FolioPayment[], povinné) - `paid` (Money, povinné) - `balance` (Money, povinné): Zbývá zaplatit; záporný při přeplatku. ### FolioLine - `id` (Id, povinné) - `kind` (string, povinné): `service` z ceníku služeb, `pos` útrata z pokladny, `manual` zapsaná recepcí. Známé hodnoty (mohou přibýt další): `service` (od 26.11.13), `pos` (od 26.11.13), `manual` (od 26.11.13) - `name` (string, povinné) - `quantity` (number, povinné) - `unit_price` (Money, povinné) - `total` (Money, povinné) - `vat_rate` (number, povinné) - `date_from` (string (date) | null (date), povinné): První noc služby účtované za noc. - `date_to` (string (date) | null (date), povinné): Den po poslední noci. - `reference` (string | null, povinné): Vaše `reference` z `chargeToStay`. - `created_at` (Timestamp, povinné) ### FolioPayment - `id` (Id, povinné) - `amount` (Money, povinné) - `method` (string, povinné): Známé hodnoty (mohou přibýt další): `cash` (od 26.11.13), `card` (od 26.11.13), `transfer` (od 26.11.13), `invoice` (od 26.11.13), `voucher` (od 26.11.13), `other` (od 26.11.13) - `note` (string | null, povinné) - `paid_at` (Timestamp, povinné) ### HousekeepingDay - `date` (string (date), povinné) - `inspection` (boolean, povinné): Provozovna pokoje po úklidu kontroluje (úkol `inspect`). - `summary` (object, povinné) - `tasks` (integer, povinné) - `done` (integer, povinné) - `rooms` (integer, povinné): Pokoje aspoň s jedním úkolem. - `arrivals` (integer, povinné) - `waiting` (integer, povinné): Úkoly, které ještě nejde udělat. - `rooms` (HousekeepingRoom[], povinné) ### HousekeepingRoom - `id` (Id, povinné) - `name` (string, povinné) - `floor` (string, povinné) - `type` (string, povinné) - `status` (string, povinné): `clean` uklizený, `dirty` k úklidu, `inspected` zkontrolovaný, `out_of_order` mimo provoz. Známé hodnoty (mohou přibýt další): `clean` (od 26.11.14), `dirty` (od 26.11.14), `inspected` (od 26.11.14), `out_of_order` (od 26.11.14) - `occupied` (boolean, povinné): V pokoji bydlí hosté (i host, který dnes odjíždí a ještě neodjel). - `arrival` (object | null, povinné): Hosté, kteří do pokoje ten den přijíždějí. - `departure` (object | null, povinné): Hosté, kteří ten den z pokoje odjíždějí; `left` – už odjeli. - `tasks` (HousekeepingTask[], povinné) - `assigned_employee_id` (Id | null, povinné): Pokojská, které je pokoj ten den přidělený. - `issues` (RoomIssue[], povinné): Otevřené závady pokoje. ### HousekeepingTask - `key` (string, povinné): `checkout`, `inspect`, `stay`, `extra_bed`, `rule:{id}` nebo `task:{id}`. - `name` (string, povinné) - `done` (boolean, povinné) - `done_at` (Timestamp | null, povinné) - `done_by_employee_id` (Id | null, povinné) - `waiting` (boolean, povinné): Ještě nejde udělat – proč, říká `note`. - `note` (string | null, povinné) - `manual` (boolean, povinné): Jednorázový úkol od recepce. ### HousekeepingTaskInput - `task` (string, povinné): `HousekeepingTask.key`. - `date` (string (date)): Den úkolu; bez něj dnešek. ### RoomIssue - `id` (Id, povinné) - `room_id` (Id, povinné) - `room` (string, povinné) - `text` (string, povinné) - `blocks_room` (boolean, povinné): Pokoj je kvůli závadě mimo provoz. - `status` (string, povinné): Známé hodnoty (mohou přibýt další): `open` (od 26.11.14), `fixed` (od 26.11.14) - `created_at` (Timestamp, povinné) - `created_by_employee_id` (Id | null, povinné) - `fixed_at` (Timestamp | null, povinné) - `fix_note` (string | null, povinné) ### RoomIssueList - `data` (RoomIssue[], povinné) ### RoomIssueInput - `room_id` (Id, povinné) - `text` (string, povinné) - `blocks_room` (boolean): Pokoj nejde prodat, dokud se závada neopraví. ### RoomIssueReported - `issue` (RoomIssue, povinné) - `warning` (string | null, povinné): Pokoj mimo provoz má ještě pobyty – přesuňte je. ### RoomIssueFixInput - `note` (string): Co se udělalo. ### EventRestaurantData - `restaurant_id` (Id, povinné) ### EventGrantData - `restaurant_ids` (Id[], povinné): Provozovny, ke kterým má připojení přístup po změně (po `grant.revoked` prázdné). - `scopes` (string[], povinné) ### EventPage - `data` (Event[], povinné) - `next_cursor` (string, povinné): Vždy vyplněný. Pošlete ho v dalším požadavku. ### StreamReady Data první zprávy `ready` proudu `streamEvents`. Její `id` je kurzor aktuálního místa. - `connection_id` (Id, povinné) - `restaurant_ids` (Id[], povinné): Provozovny, jejichž události proud dává (jen ta z `restaurant_id`, když jste o ni požádali). - `expires_at` (Timestamp, povinné): Tehdy vyprší access token a proud skončí zprávou `closing` `token_expired`. - `keepalive_interval` (integer, povinné): Po kolika sekundách bez zprávy přijde komentář `: ping`. ### StreamClosing Data poslední zprávy `closing` proudu `streamEvents` – proč proud končí a co udělat. - `reason` (string, povinné): `max_age` – připojit se hned znovu; `token_expired`, `token_revoked` – obnovit access token a pak se připojit; `restart` – znovu za 1–10 sekund náhodně; `forbidden` – provozovna z `restaurant_id` už… Známé hodnoty (mohou přibýt další): `max_age` (od 26.11.3), `token_expired` (od 26.11.3), `token_revoked` (od 26.11.3), `restart` (od 26.11.3), `forbidden` (od 26.11.3) ### TableGuestEvent Data jedné zprávy `streamTableEvents` – jen co se změnilo, ne jak (stejně jako na hlavní kase). `event:` zprávy je stejné jako `type`. - `type` (string, povinné): Co si načíst znovu – `getTableSession`, `listTableOrders`, `getTableSession` (volání), `getTableTab`; `visit_ended` je poslední zpráva. Známé hodnoty (mohou přibýt další): `session` (od 26.11.3), `orders` (od 26.11.3), `calls` (od 26.11.3), `tab` (od 26.11.3), `visit_ended` (od 26.11.3) - `id` (string | null, povinné): Objednávka (`orders`) nebo volání (`calls`), jinak `null`. ### TableSessionStart - `table_code` (string, povinné): Kód stolu z jeho QR kódu – 8 znaků, jak je vytištěný (`K7M2 Q9XB`). Mezery a pomlčky se nečtou, malá písmena se berou jako velká, `O` jako `0`, `I` a `L` jako `1`. ### TableSessionCreated - `token` (string, povinné): Token tohoto telefonu u tohoto stolu. Držte ho v prohlížeči hosta (pod kódem stolu) a posílejte jako `Authorization: Bearer …`; nikdy ho nedávejte do adresy. - `expires_at` (Timestamp, povinné): Kdy token nejpozději skončí; konec návštěvy ho ukončí dřív. - `session` (TableSession, povinné) ### TableSession Pohled jednoho telefonu na jeho stůl. - `path` (string, povinné): `cloud` – toto je záložní cesta přes cloud (místní API hlavní kasy říká `local`). Známé hodnoty (mohou přibýt další): `local` (od 26.10.4), `cloud` (od 26.10.4) - `restaurant` (object, povinné) - `name` (string, povinné) - `table` (object, povinné) - `id` (Id, povinné) - `name` (string, povinné) - `room` (string | null, povinné): Místnost mapy; `null` bez názvu. - `visit` (TableVisit | null, povinné): Návštěva stolu na hlavní kase; `null`, dokud si kasa tento telefon nepřevezme. - `device` (TableDevice, povinné) - `ordering` (TableOrderingState, povinné) - `join` (object, povinné) - `enabled` (boolean, povinné): Podnik používá kód od kamaráda. - `code` (string | null, povinné): Kód pro kamarády u stolu – jen pro ověřený telefon otevřené návštěvy, jinak `null`. - `calls` (TableCall[], povinné): Otevřená volání tohoto telefonu (`submitted`, `open`, `acknowledged`). ### TableVisit Jedna skupina u stolu, od prvního telefonu nebo účtu po zaplacení. Skončí zaplacením účtu nebo ji ukončí obsluha; tokeny jejích telefonů skončí s ní. - `id` (string (uuid), povinné) - `state` (string, povinné): Známé hodnoty (mohou přibýt další): `open` (od 26.10.4), `closed` (od 26.10.4) - `tab_open` (boolean, povinné): Stůl má na kase otevřený účet. - `opened_at` (Timestamp, povinné) - `closed_at` (Timestamp | null, povinné) ### TableDevice - `id` (string (uuid), povinné) - `nickname` (string, povinné): Jméno telefonu, které vidí obsluha (`Host 2`); dává ho kasa. - `verified` (boolean, povinné): Telefon patří ke skupině u stolu – vidí účet a kód pro kamarády. - `verified_by` (string | null, povinné): `join_code` – zadal kód od kamaráda; `staff_accept` – obsluha přijala jeho první objednávku; `staff` – obsluha ho ověřila ručně; `null`, když ověřený není. Známé hodnoty (mohou přibýt další): `join_code` (od 26.10.4), `staff_accept` (od 26.10.4), `staff` (od 26.10.4) - `join_locked` (boolean, povinné): Příliš mnoho špatných kódů od kamaráda; odemkne ho obsluha. - `join_attempts_left` (integer, povinné) ### TableOrderingState Jestli a jak tento telefon teď může objednat. Aplikace podle toho ukáže větu a povolí tlačítka. - `enabled` (boolean, povinné): Podnik objednávky od stolu bere. - `paused` (boolean, povinné): Obsluha na chvíli pozastavila nové objednávky; zavolat obsluhu jde. - `can_order` (boolean, povinné) - `blocked_reason` (string | null, povinné): Proč teď objednat nejde, `null`, když jde: `ordering_disabled`, `ordering_paused`, `restaurant_offline` (hlavní kasa není připojená – jen na záložní cestě), `connecting` (kasa si telefon ještě… Známé hodnoty (mohou přibýt další): `ordering_disabled` (od 26.10.4), `ordering_paused` (od 26.10.4), `restaurant_offline` (od 26.10.4), `connecting` (od 26.10.4), `visit_closed` (od 26.10.4), `restaurant_closed` (od 26.10.4), `table_not_open` (od 26.10.4) - `confirm_mode` (string, povinné): `each` – obsluha potvrzuje každou objednávku; `first` – jen první objednávku telefonu, který ještě není ověřený; `none` – žádná objednávka na obsluhu nečeká. Známé hodnoty (mohou přibýt další): `each` (od 26.10.4), `first` (od 26.10.4), `none` (od 26.10.4) - `needs_confirmation` (boolean, povinné): Další objednávka tohoto telefonu bude čekat na obsluhu. - `max_quantity` (integer, povinné): Nejvýš tolik kusů jednoho produktu v jedné objednávce. - `note_max_length` (integer, povinné) - `empty_table` (string, povinné): `staff` – objednávky jdou jen na účet, který otevřela obsluha; `guest` – první přijatá objednávka ho otevře. Známé hodnoty (mohou přibýt další): `staff` (od 26.10.4), `guest` (od 26.10.4) ### TableJoinInput - `code` (string, povinné) ### TableRequest Žádost telefonu, o které rozhoduje hlavní kasa přes cloud. - `id` (Id, povinné) - `kind` (string, povinné): Známé hodnoty (mohou přibýt další): `join_requested` (od 26.10.4), `order_cancel_requested` (od 26.10.4), `call_cancel_requested` (od 26.10.4) - `status` (string, povinné): `queued` – čeká na hlavní kasu; `done`, `failed` – rozhodnuto. Známé hodnoty (mohou přibýt další): `queued` (od 26.10.4), `done` (od 26.10.4), `failed` (od 26.10.4) - `result` (object | null, povinné): Co kasa odpověděla s `done` (`{}`, nebo `order` / `call`, jak je teď); jinak `null`. - `error` (object | null, povinné): Proč kasa odmítla; `null`, pokud není `failed`. ### TableMenu - `currency` (string, povinné) - `generated_at` (Timestamp, povinné) - `categories` (TableMenuCategory[], povinné) - `products` (TableMenuProduct[], povinné) - `allergens` (Allergen[], povinné): Alergeny, které produkty používají, s jejich názvy. ### TableMenuCategory - `id` (Id, povinné) - `name` (string, povinné) - `position` (integer, povinné) ### TableMenuProduct - `id` (Id, povinné) - `category_id` (Id, povinné) - `name` (string, povinné) - `description` (string | null, povinné) - `image_url` (string (uri) | null (uri), povinné) - `price` (Money, povinné) - `weight` (integer | null, povinné): Gramy u jídla, mililitry u nápoje, jak je v sortimentu. - `allergens` (string[], povinné) - `add_ons` (object[], povinné) - `id` (Id, povinné): Produkt přílohy (`ProductAddOn.product_id` ze sortimentu). - `name` (string, povinné) - `price` (Money, povinné) - `removable_ingredients` (RemovableIngredient[], povinné): Suroviny, které si host smí odebrat („bez cibule“), jako `Product.removable_ingredients`; odškrtnuté pošlete v `TableOrderLineInput.removed_ingredient_ids`. Cena se nemění. Prázdné, když je produkt… - `available` (boolean, povinné): `false` – teď vyprodané: ukažte ho, ale nedovolte ho přidat. - `age_restricted` (boolean, povinné): Jen pro dospělé (18+); věk kontroluje obsluha při podání. - `position` (integer, povinné) ### TableOrderCreate - `id` (string (uuid), povinné): UUID, které aplikace vytvoří, když host klepne na „objednat“ (doporučeně verze 7); při opakování ho zachovejte. - `lines` (TableOrderLineInput[], povinné) - `note` (string | null): Poznámka pro bar, nejvýš `note_max_length` znaků, bez řídicích znaků a bez emoji. ### TableOrderLineInput - `product_id` (Id, povinné) - `quantity` (integer, povinné): Nejvýš `TableOrderingState.max_quantity`. - `add_on_ids` (Id[]): `TableMenuProduct.add_ons[].id` tohoto produktu. - `removed_ingredient_ids` (Id[]): `TableMenuProduct.removable_ingredients[].id` tohoto produktu, které host odškrtl, každé nejvýš jednou (jinak `ingredient_not_removable`). Hlavní kasa je dostane v objednávce. ### TableOrder Objednávka od stolu, jak o ní rozhodla hlavní kasa. Dokud si ji kasa nepřevezme (`submitted`), jsou názvy a ceny ze sortimentu; platí to, co spočítá kasa. - `id` (string (uuid), povinné) - `visit_id` (string (uuid) | null, povinné): Návštěva stolu; `null`, dokud si kasa objednávku nepřevzala. - `device_id` (string (uuid), povinné) - `device_nickname` (string, povinné) - `from_verified_device` (boolean, povinné): Telefon byl ověřený, když objednával; obsluha vidí „telefon stolu“, nebo „nový telefon“. - `status` (string, povinné): `submitted` – jen na záložní cestě: čeká, až si ji hlavní kasa převezme; `pending_confirmation` – čeká na obsluhu; `accepted` – na účtu stolu a poslaná k přípravě; `preparing`, `ready` – z kuchyně… Známé hodnoty (mohou přibýt další): `submitted` (od 26.10.4), `pending_confirmation` (od 26.10.4), `accepted` (od 26.10.4), `preparing` (od 26.10.4), `ready` (od 26.10.4), `served` (od 26.10.4), `rejected` (od 26.10.4), `cancelled` (od 26.10.4), `expired` (od 26.10.4) - `reason_code` (string | null, povinné): Proč je `rejected`, `cancelled` nebo `expired`, pro aplikaci: `staff_rejected`, `guest_cancelled`, `staff_cancelled`, `visit_ended`, `expired`, `tab_closed` nebo kód z katalogu chyb (například… Známé hodnoty (mohou přibýt další): `staff_rejected` (od 26.10.4), `guest_cancelled` (od 26.10.4), `staff_cancelled` (od 26.10.4), `visit_ended` (od 26.10.4), `expired` (od 26.10.4), `tab_closed` (od 26.10.4), `ordering_disabled` (od 26.10.4), `ordering_paused` (od 26.10.4), `table_not_open` (od 26.10.4), `restaurant_closed` (od 26.10.4), `product_unavailable` (od 26.10.4), `product_not_orderable` (od 26.10.4), `device_not_verified` (od 26.10.4) - `reason` (string | null, povinné): Věta pro hosta k `reason_code`. - `lines` (TableOrderLine[], povinné) - `note` (string | null, povinné) - `total` (Money, povinné) - `created_at` (Timestamp, povinné) - `decided_at` (Timestamp | null, povinné): Kdy rozhodla obsluha nebo pravidla; předtím `null`. ### TableOrderLine - `product_id` (Id, povinné) - `name` (string, povinné) - `quantity` (integer, povinné) - `add_ons` (object[], povinné) - `id` (Id, povinné) - `name` (string, povinné) - `price` (Money, povinné) - `removed_ingredients` (RemovableIngredient[], povinné): Suroviny, které host odebral („Bez: cibule“); prázdné, když nic neodebral, nebo když je hlavní kasa neposlala. - `unit_price` (Money, povinné): Cena jednoho kusu i s přílohami. - `total` (Money, povinné) ### TableOrderList - `data` (TableOrder[], povinné) ### TableCallCreate - `kind` (string, povinné): `waiter` – přijďte ke stolu; `bill` – host chce platit u obsluhy. Hodnoty: `waiter`, `bill`. ### TableCall - `id` (string (uuid), povinné) - `kind` (string, povinné): Známé hodnoty (mohou přibýt další): `waiter` (od 26.10.4), `bill` (od 26.10.4) - `status` (string, povinné): `submitted` – jen na záložní cestě, dokud si ho hlavní kasa nepřevezme; `open` – čeká na obsluhu; `acknowledged` – obsluha jde; `cancelled`; `closed` – návštěva skončila. Známé hodnoty (mohou přibýt další): `submitted` (od 26.10.4), `open` (od 26.10.4), `acknowledged` (od 26.10.4), `cancelled` (od 26.10.4), `closed` (od 26.10.4) - `created_at` (Timestamp, povinné) - `acknowledged_at` (Timestamp | null, povinné) ### TableTab Účet stolu, jak ho naposledy poslala hlavní kasa. - `visit_id` (string (uuid), povinné) - `items` (object[], povinné) - `name` (string, povinné) - `quantity` (number, povinné): Může být desetinné (půlky, prodej na váhu). - `total` (Money, povinné) - `by` (string | null, povinné): Jméno telefonu, který ji objednal; `null` – namarkovala ji obsluha. - `total` (Money, povinné) - `updated_at` (Timestamp, povinné) ### TableHeartbeatInput - `paused` (boolean, povinné): Obsluha pozastavila nové objednávky od stolu. - `local` (object | null): Místní API kasy, jak se k němu dostanou hosté (pro podporu a administraci). - `app_version` (string | null) - `guest_app_version` (string | null) ### TableHeartbeat - `server_time` (Timestamp, povinné) - `inbox_pending` (integer, povinné): Žádosti hostů čekající ve schránce (`listTableInbox`). - `online_seconds` (integer, povinné): Jak dlouho po posledním heartbeatu se kasa počítá jako online. ### TableInboxPage - `data` (TableInboxItem[], povinné) ### TableInboxItem Žádost hosta ze záložní cesty; co nese `payload` u kterého `kind`, říká `listTableInbox`. - `id` (Id, povinné) - `kind` (string, povinné): Známé hodnoty (mohou přibýt další): `session_started` (od 26.10.4), `join_requested` (od 26.10.4), `order_submitted` (od 26.10.4), `order_cancel_requested` (od 26.10.4), `call_requested` (od 26.10.4), `call_cancel_requested` (od 26.10.4), `staff_action` (od 26.10.4) - `created_at` (Timestamp, povinné) - `device_id` (string (uuid) | null, povinné): Telefon, který žádost poslal; `null` u `staff_action`. - `ref_id` (string (uuid) | null, povinné): Objednávka nebo volání, kterého se žádost týká; jinak `null`. - `payload` (object, povinné) ### TableInboxResultInput - `status` (string, povinné): Od verze 26.10.4: `done`, `failed`. Hodnoty: `done`, `failed`. - `result` (object | null): U `done`; viz `listTableInbox`. - `error` (object | null): U `failed` – kód a věta pro hosta. ### TableInboxCompletion - `id` (Id, povinné) - `kind` (string, povinné) - `status` (string, povinné): Známé hodnoty (mohou přibýt další): `done` (od 26.10.4), `failed` (od 26.10.4) - `error_code` (string | null, povinné) - `done_at` (Timestamp, povinné) ### TableStateInput - `visits` (TableVisitState[]) - `devices` (TableDeviceState[]) - `orders` (TableOrderState[]) - `calls` (TableCallState[]) ### TableVisitState - `id` (string (uuid), povinné) - `table_id` (Id, povinné) - `state` (string, povinné): Od verze 26.10.4: `open`, `closed`. Hodnoty: `open`, `closed`. - `tab_open` (boolean, povinné) - `join_code` (string | null) - `opened_at` (Timestamp, povinné) - `closed_at` (Timestamp | null) - `tab` (TableTabState | null): Účet stolu pro ověřené telefony; `null`, dokud ho stůl nemá. - `version` (integer, povinné) ### TableTabState - `items` (object[], povinné) - `name` (string, povinné) - `quantity` (number, povinné) - `total` (MoneyInput, povinné) - `by` (string | null) - `total` (MoneyInput, povinné) - `updated_at` (Timestamp, povinné) ### TableDeviceState - `id` (string (uuid), povinné) - `table_id` (Id, povinné) - `visit_id` (string (uuid) | null) - `path` (string, povinné): Od verze 26.10.4: `local`, `cloud`. Hodnoty: `local`, `cloud`. - `nickname` (string, povinné) - `verified` (boolean, povinné) - `verified_by` (string | null): Od verze 26.10.4: `join_code`, `staff_accept`, `staff`. Hodnoty: `join_code`, `staff_accept`, `staff`, `None`. - `join_locked` (boolean) - `join_attempts_left` (integer) - `last_seen_at` (Timestamp | null) - `revoked` (boolean): Obsluha telefon od stolu odebrala; jeho token na záložní cestě skončí. - `version` (integer, povinné) ### TableOrderState - `id` (string (uuid), povinné) - `table_id` (Id, povinné) - `visit_id` (string (uuid) | null) - `device_id` (string (uuid), povinné) - `device_nickname` (string, povinné) - `from_verified_device` (boolean, povinné) - `status` (string, povinné): Od verze 26.10.4: `pending_confirmation`, `accepted`, `preparing`, `ready`, `served`, `rejected`, `cancelled`, `expired`. Hodnoty: `pending_confirmation`, `accepted`, `preparing`, `ready`, `served`, `rejected`, `cancelled`, `expired`. - `reason_code` (string | null) - `reason` (string | null) - `lines` (TableOrderLineState[], povinné) - `note` (string | null) - `total` (MoneyInput, povinné) - `created_at` (Timestamp, povinné) - `decided_at` (Timestamp | null) - `version` (integer, povinné) ### TableOrderLineState - `product_id` (Id, povinné) - `name` (string, povinné) - `quantity` (integer, povinné) - `add_ons` (object[]) - `id` (Id, povinné) - `name` (string, povinné) - `price` (MoneyInput, povinné) - `removed_ingredients` (object[]): Suroviny, které host odebral, pro `TableOrderLine.removed_ingredients`. - `id` (Id, povinné) - `name` (string, povinné) - `unit_price` (MoneyInput, povinné) - `total` (MoneyInput, povinné) ### TableCallState - `id` (string (uuid), povinné) - `table_id` (Id, povinné) - `visit_id` (string (uuid) | null) - `device_id` (string (uuid), povinné) - `kind` (string, povinné): Od verze 26.10.4: `waiter`, `bill`. Hodnoty: `waiter`, `bill`. - `status` (string, povinné): Od verze 26.10.4: `open`, `acknowledged`, `cancelled`, `closed`. Hodnoty: `open`, `acknowledged`, `cancelled`, `closed`. - `created_at` (Timestamp, povinné) - `acknowledged_at` (Timestamp | null) - `version` (integer, povinné) ### TableStateResult - `applied` (integer, povinné): Zapsané objekty. - `skipped` (integer, povinné): Přeskočené objekty – starší nebo stejná `version`, nebo stůl jiné provozovny. ### TableOrderApplyInput - `tab_id` (string (uuid), povinné): Účet návštěvy; nové UUID otevře nový účet. - `table_name` (string, povinné): Stůl nového účtu, jak je na kase. - `accepted_by_id` (Id | null): Zaměstnanec, který objednávku přijal; `null` – přijala ji pravidla podniku. - `device_nickname` (string, povinné): Jméno telefonu do logu stolu. - `lines` (object[], povinné) - `id` (string, povinné): ID nového řádku na účtu (`TabLine.id`). - `product_id` (Id, povinné) - `quantity` (integer, povinné) - `add_ons` (object[]) - `product_id` (Id, povinné) - `removed_ingredient_ids` (Id[]): Suroviny, které host odebral – `Product.removable_ingredients[].id` produktu v sortimentu `pos` (jinak `ingredient_not_removable`); jdou na řádek účtu i na kuchyňský bon. - `note` (string | null) - `course` (integer) - `kitchen` (object | null): Udělat i kuchyňský bon těchto řádků; `null` – do kuchyně je pošle kasa sama. ### TableOrderApplied - `tab` (Tab, povinné) - `kitchen_ticket` (KitchenTicket | null, povinné): Kuchyňský bon udělaný s `kitchen`; bez něj `null`. ### TableOrderingSettings Pravidla objednávání od stolu nastavená v administraci. Hlavní kasa je vynucuje na místní cestě i u žádostí ze záložní cesty. - `enabled` (boolean, povinné) - `confirm_mode` (string, povinné): `each`, `first` nebo `none` – viz `TableOrderingState.confirm_mode`. Známé hodnoty (mohou přibýt další): `each` (od 26.10.4), `first` (od 26.10.4), `none` (od 26.10.4) - `empty_table` (string, povinné): `staff` nebo `guest` – viz `TableOrderingState.empty_table`. Známé hodnoty (mohou přibýt další): `staff` (od 26.10.4), `guest` (od 26.10.4) - `join_code_enabled` (boolean, povinné): Ověřený telefon ukazuje čtyřmístný kód pro kamarády u stolu. - `max_quantity` (integer, povinné) - `expire_minutes` (integer, povinné): Jak dlouho objednávka čeká na obsluhu, než skončí jako `expired`. - `respect_opening_hours` (boolean, povinné): Objednávky jen v otevírací době (zavolat obsluhu jde vždy). - `category_ids` (Id[], povinné): Kategorie sortimentu, ze kterých hosté mohou objednat; prázdné – nic. - `note_max_length` (integer, povinné) - `wifi_ssid` (string | null, povinné): Název Wi-Fi pro hosty k vytištění vedle QR kódu; `null`, když není nastavený. ### EventTableInboxData - `item_id` (Id, povinné): `TableInboxItem.id`. - `kind` (string, povinné)