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. Stepper — Výběr → Objedná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í řádku — iOS: 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í metody — Apple 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ínky — ne 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).