Přeskočit na hlavní obsah

P5 — Objednávka & Platba

Screen IDP5
Typ Primární
FázeMVP
Účel obrazovky

Jediný scrollovatelný krok mezi výběrem míst a potvrzením: uživatel zkontroluje vstupenky, doplní nebo potvrdí osobní údaje, zvolí způsob platby a dokončí objednávku. Countdown timer z P4 — Seat map nadále běží — urgency zůstává kritická.


Content Priority

Obrazovka má čtyři scrollovatelné sekce pod jednou hlavičkou stepperu (aktuální krok Objednávka & Platba).

Struktura kroků (stepper 5 → 3)

  1. StepperVýběrObjednávka & Platba (aktuální) → Hotovo (po úspěšné platbě / rezervaci) Stepper / Progress Indicator
  2. Countdown timer — pokračuje z P4, progress bar s časem, červený při < 2 min Countdown Timer

Sekce 1 — Vstupenky (per-seat)

  1. Per-seat řádky — každá vstupenka: název akce, datum, sedadlo (řada + číslo u adresného), kategorie, výběr typu vstupenky (Dospělý / Student / Senior / Dítě — bottom sheet), cena; jednotné pole „Zadejte slevový kód nebo dárkový poukaz" + tlačítko Uplatnit (backend rozpozná typ: per-ticket / košík / platba); po uplatnění inline badge „Sleva -X Kč (kód)" s × pro odebrání; u per-ticket slevy a více vstupenek → bottom sheet „Na kterou vstupenku?" List Item Text InputPrimary Button
  2. Odebrání řádkuiOS: swipe-to-delete (nativní gesto); Android: trailing ikona smazání; bez potvrzovacího dialogu — po akci toast s undo (3 s): „Vstupenka odebrána — Vrátit zpět" Icon Button
  3. Odkaz „Přidat další vstupenky" — secondary, návrat na P4 / S1 se zachováním stavu košíku Ghost/Text Button

Sekce 2 — Osobní údaje (dříve samostatná S2)

  1. Collapsible sekce Osobní údaje — při přihlášení s kompletním profilem automaticky sbalená / přeskočená vnímáním flow (předvyplněno); pro hosta nebo neúplný profil: jméno, příjmení, e-mail, telefon (povinné), ISIC (volitelné, pokud akce podporuje), volitelná fakturační adresa (accordion); GDPR souhlas se zpracováním osobních údajů (povinný před dokončením, pokud platí právní požadavek). Po blur e-mailu → kontrola, zda účet existuje → banner nebo inline: „Tento e-mail je registrovaný — Přihlásit se?" (odkaz na S4 — Přihlášení). Text Input Text Input Accordion / ExpandableText Input Checkbox Ghost/Text Button

Sekce 3 — Platba (dříve samostatná P6)

  1. Platební metodyApple Pay první na iOS, Google Pay první na Androidu, dále platební karta (brána, např. Comgate), hotovost (rezervace na pokladně), dárkový poukaz jako platební metoda (pokud relevantní). U hotovosti zobrazit informační banner s lhůtou vyzvednutí / zaplacení na pokladně (stejný záměr jako dříve u P6). Payment Method Card

Sekce 4 — Souhrn a dokončení

  1. Cenový souhrn — mezisoučet, slevy (řádky per voucher), servisní poplatky, celkem (zvýrazněné) Price Summary
  2. Licenční / obchodní podmínkyne jako checkbox, ale text pod primárním CTA (např.): „Kliknutím na ‚Zaplatit‘ souhlasíte s obchodními podmínkami" s odkazem na plné znění (in-app browser nebo modal).
  3. Primární CTA„Zaplatit X Kč" / u hotovosti „Rezervovat"; zobrazuje konečnou částku; u karty může vést do brány po vytvoření platby
Primary Button

Interakce

TriggerAkceCíl
Změna typu vstupenkyPřepočet ceny řádku + celkuOkamžitá aktualizace souhrnu
Swipe-to-delete (iOS) / ikona smazání (Android)Odebrání řádku + undo toast 3 sObnovení řádku při „Vrátit zpět"
Zadání kódu + „Uplatnit"Jedno API; backend typ slevy/poukazuBadge slevy nebo sheet výběru vstupenky
Tap × u badge slevyOdebrání voucheruPřepočet celku
Blur e-mailu (host)Kontrola existence účtuHint + přihlášení (S4)
Změna ceny ze serveru během sessionBlokující dialog (viz níže)Primární CTA v dialogu disabled, dokud uživatel nepotvrdí
Tap Apple Pay / Google PayNativní platební sheetX1 — Zaplaceno nebo X3 — Chyba platby
Tap KartaOtevření platební brányWebView / in-app browser → X1 / X3
Tap HotovostRezervace (po potvrzení rizik v banneru / copy)X2 — Rezervováno
Tap „Zaplatit" / „Rezervovat"order + payment dle metodyÚspěch / chyba / timeout
Tap „Přidat další vstupenky"Návrat na výběrP4 nebo S1
Timer < 2 minEskalace urgencyX5 — Warning timer
Timer vypršelUvolnění sedadelX4 — Timeout

Stavy

StavPopisVizuální chování
LoadedKošík načtenSekce 1–4, aktivní ovládací prvky dle role (host × přihlášený)
Voucher appliedPlatný kódBadge „Sleva -X Kč (kód)" u pole nebo u řádku
Voucher errorNeplatný kódInline chyba pod vstupním polem
Guest — formulářNepřihlášenSekce 2 rozbalená, CTA přihlášení u registrovaného e-mailu
Logged-in — kompletní profilPředvyplněnoSekce 2 sbalená / minimalizovaná, auto-skip vnímání kroku
Platební metoda vybranáPřed dokončenímZvýrazněná karta metody, CTA aktivní (po GDPR, pokud je vyžadováno)
ProcessingPlatba probíháOverlay „Zpracováváme platbu…"
Timer critical< 2 minČervený pulzující timer
Empty košíkVše odebránoEmpty state + návrat na výběr akcí

Edge Cases a Error States

ScénářŘešení
Per-ticket voucher a více vstupenekBottom sheet „Na kterou vstupenku?" před aplikací slevy
Neplatný nebo expirovaný kódInline chyba pod jednotným polem
Minimální hodnota objednávky pro kuponChybová hláška z API, CTA dokončení disabled nebo s upozorněním
Změna ceny oproti zobrazenéModal / fullscreen dialog: „Cena se změnila z [stará] Kč na [nová] Kč" + rozpad po sedadlech; primární „Pokračovat s novou cenou", sekundární destruktivní „Zrušit objednávku"; primární disabled, dokud uživatel explicitně nepotvrdí (např. přepínač / checkbox „Beru na vědomí novou cenu")
Ticket type nedostupný pro akciDisabled varianta v sheetu s vysvětlením
Apple Pay / Google Pay nedostupnéSkrýt danou dlaždici, zůstat karta a hotovost
OfflineBanner: dokončení objednávky vyžaduje připojení
Timer během vyplňováníX4 — uvolnění rezervace
HotovostBanner s deadline vyzvednutí / platby na pokladně (konzistentní s dřívějším P6)

Mobilní patterny a odlišení od webu

Sloučení obrazovek (dříve samostatné kroky)

  • S2 — Osobní údaje jako samostatná obrazovka je ZASTARALÁ — obsah žije ve sekci 2 na P5 (collapsible, stejné komponenty a validace jako dříve S2).
  • P6 — Checkout / Platba jako samostatná obrazovka je ZASTARALÁ — výběr plateb a rekapitulace před zaplacením jsou sekce 3 a 4 na této obrazovce.

Dokumentace S2 a P6 zůstává jako reference pro komponenty (ComponentRef výše) a pro srovnání s historickým flow; zdroj pravdy pro MA checkout je tento P5.

Co děláme jinak než web

  • Tříkrokový stepper místo pěti kroků — méně přeskakování, jedna dlouhá obrazovka se sekcemi.
  • Jedno pole voucheru — uživatel neřeší typ; backend vrátí kam sleva spadá.
  • Odebrání vstupenky — nativní gesto (iOS) vs. ikona (Android), undo místo „Opravdu smazat?".
  • Souhlas s podmínkami u CTA jako text, ne checkbox (stále musí být jasné právní krytí copy).
  • Apple Pay / Google Pay prominentně podle platformy — na webu typicky chybí nebo je jinak.

Aplikované patterny

  • iOS: UISwipeActionsConfiguration (swipe-to-delete), .sheet() pro typ vstupenky a pro výběr vstupenky u per-ticket voucheru, PKPaymentAuthorizationViewController pro Apple Pay
  • Android: trailing delete v řádku (IconButton), ModalBottomSheet pro výběry, Google Pay API, CustomTabsIntent pro platební bránu

API Data

GET/cartPOST/cart/ticket/removePUT/cart/ticket/set-customer-categoryDELETE/cart/ticket/remove-customer-category/{ticketId}POST/cart/ticket/set-voucherDELETE/cart/ticket/remove-voucher/{ticketId}POST/cart/voucher/addPOST/cart/voucher/add/numberedDELETE/cart/voucher/remove/{voucherId}POST/cart/service/setDELETE/cart/service/remove/{serviceId}GET/cashdesk/vouchers GET/cartPOST/cart/set-personPOST/cart/voucher-payment/addDELETE/cart/voucher-payment/remove/{paymentId}POST/order/createPOST/payment/createGET/codebook/countries
OperaceEndpointTriggerPoznámka
Košík / rekapitulaceGET /cartOtevření P5, po změnáchVčetně fees, countdown validity
Odebrání vstupenkyPOST /cart/ticket/removeSmazání řádku (případně revert z undo)
Změna kategorie vstupenkyPUT /cart/ticket/set-customer-categoryTicket typeStudent, senior, ZTP…
Jednotný voucherPOST /cart/... (per-ticket / cart / payment dle backendu)UplatnitAuto-detekce typu na serveru; klient může posílat jeden kód
Odebrání voucheruDELETE /cart/voucher/remove/{id} nebo ekvivalent× u badge
Osoba k objednávcePOST /cart/set-personSekce 2 — uložení / přechod k platběHost + doplnění profilu
Platební poukazPOST /cart/voucher-payment/addVýběr poukazu jako platbyTyp 3 z voucher modelu
ObjednávkaPOST /order/createTap Zaplatit / Rezervovat
PlatbaPOST /payment/createPo vytvoření objednávkyURL / token pro bránu
Země (adresa)GET /codebook/countriesRozšířená fakturace
Dostupné voucheryGET /cashdesk/vouchersNápověda / seznam[F1] rozšíření služeb v košíku dle PRD
CoreAPI — voucher typologie (stále platí)

Backend rozlišuje per-ticket, cart-level a platební voucher; uživatelsky jde o jedno vstupní pole. Klient po úspěchu zobrazí badge a případně sheet výběru vstupenky. Kumulace slev dle pravidel API (DiscountType: Percent, ByAmount, ToAmount).


Reference — Aktuální web

SCR-WEB-31: Košík — countdown timer, ticket řádek, upsell pojištění
Web ColosseumSCR-WEB-31Košík — countdown timer, ticket řádek, upsell pojištění
SCR-WEB-36: Multi-event košík — per-seat řádky z dvou různých akcí
Web ColosseumSCR-WEB-36Multi-event košík — per-seat řádky z dvou různých akcí

Reference — CineStar benchmark

SCR-CS-11: Objednávka — per-seat řádky, ticket type dropdown, upsell občerstvení, celková cena
CineStar benchmarkSCR-CS-11Objednávka — per-seat řádky, ticket type dropdown, upsell občerstvení, celková cena
SCR-CS-12: Typ vstupenky — bottom sheet s variantami (dítě, student, senior, ZTP)
CineStar benchmarkSCR-CS-12Typ vstupenky — bottom sheet s variantami (dítě, student, senior, ZTP)
Inspirace z CineStar

CineStar má výborný ticket type selector jako bottom sheet s vysvětlením podmínek (Student = „do 26 let s průkazem"). Přebíráme tento pattern. CineStar navíc má upsell občerstvení přímo v košíku — v MA bude až ve fázi F2+ (S23).