Přeskočit na hlavní obsah

P5 — Košík / Objednávka

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

Přehled vybraných vstupenek před platbou. Uživatel kontroluje výběr, může změnit typ vstupného, uplatnit kupón a pokračovat k platbě. Countdown timer pokračuje z P4 — urgency je klíčová.


Content Priority

  1. Stepper progress — vizuální indikátor: Místa → Objednávka → Údaje → Platba → Potvrzení (aktuální krok zvýrazněn) Stepper / Progress Indicator
  2. Countdown timer — pokračuje z P4, progress bar s časem, červený při < 2 min Countdown Timer
  3. Per-seat řádky — každá vstupenka jako řádek: event název, datum, sedadlo (řada + číslo, pokud adresné), cenová kategorie, ticket type selector (Dospělý / Student / Senior / Dítě — dropdown nebo bottom sheet), cena List Item
  4. Akce na řádku — swipe-to-delete nebo delete ikona pro odebrání vstupenky Icon Button
  5. Voucher/kupón input — textové pole + „Uplatnit" CTA, inline validace Text InputPrimary Button
  6. Cenový souhrn — subtotal, slevy (pokud kupón), poplatky (servisní poplatek), celkem (bold, větší font) Price Summary
  7. CTA „Pokračovat k platbě" — primary button, zobrazuje celkovou částku Primary Button
  8. Odkaz „Přidat další vstupenky" — secondary link, návrat na P4/S1 Ghost/Text Button

Interakce

TriggerAkceCíl
Změna ticket type (dropdown)Přepočet ceny per řádek + celkemReal-time update souhrnu
Swipe-to-delete vstupenkyOdebrání ze seznamuAnimované zmizení řádku, přepočet ceny
Tap na delete ikonuPotvrzovací dialog → odebrání„Opravdu odebrat vstupenku?"
Zadání kupónu + „Uplatnit"API validace kupónuSuccess toast + recalc ceny / error inline
Tap „Pokračovat k platbě"Přechod na další krokS2 — Osobní údaje (nepřihlášen) nebo P6 — Checkout (přihlášen)
Tap „Přidat další vstupenky"Návrat na výběrP4 nebo S1 (zachovány stávající vstupenky)
Timer warning < 2 minPulsující timerX5 — Warning
Timer expiryTimeout errorX4 — Timeout

Stavy

StavPopisVizuální chování
LoadedVstupenky v košíkuSeznam řádků, aktivní CTA
Voucher appliedPlatný kupón uplatněnZelený badge u kupónu, sleva viditelná v souhrnu
Voucher errorNeplatný kupónČervený inline error „Neplatný kupón" pod inputem
EmptyVšechny vstupenky odebrány„Košík je prázdný" + CTA zpět na výběr
Timer criticalZbývá < 2 minTimer pulsuje červeně, warning banner
Price changedCena se změnila od výběruInfo banner „Ceny se mohly změnit", refresh z API

Edge Cases a Error States

ScénářŘešení
Uživatel odebere všechny vstupenkyEmpty state „Košík je prázdný" + CTA zpět na výběr akcí
Voucher neplatný / expirovanýInline error pod inputem „Kupón není platný nebo vypršel"
Voucher platný ale nedosahuje min. objednávkyError „Kupón je platný od X Kč"
Změna ceny na serveru během sessionUpozornění v banneru, refresh cen z API, tlačítko „Aktualizovat ceny"
Ticket type nemá dostupnou variantu (např. student pro danou akci)Disabled option v dropdown s popiskem „Nedostupné pro tuto akci"
Servisní poplatekZobrazit jako samostatný řádek v souhrnu, ne skrytě v ceně
Timer vypršel během zadávání kupónuX4 timeout — sedadla uvolněna, i kupón resetován
Ztráta připojeníKošík zůstává v lokálním stavu, zobrazit „Bez připojení nelze dokončit objednávku"

Mobilní patterny a odlišení od webu

Co děláme jinak

  • Stepper progress — web má single-page checkout, MA má multi-step stepper (méně cognitive load per krok)
  • Swipe-to-delete — nativní iOS/Android gesto pro odebrání, web má jen delete ikonu
  • Ticket type selector — bottom sheet na mobilu (místo dropdown), lépe zobrazí popisky „Student (do 26 let s průkazem)"
  • Sticky bottom bar s celkovou cenou a CTA — vždy viditelné, web má CTA uprostřed formuláře

Aplikované patterny

  • iOS: UISwipeActionsConfiguration pro swipe-to-delete, .sheet() pro ticket type picker
  • Android: SwipeToDismiss (Material 3), ModalBottomSheet pro výběr typu vstupného

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
OperaceEndpointTriggerPoznámka
Načtení košíkuGET /cartOtevření obrazovkyVrací tickets, packages, vouchers, credits, services, fees, validity (countdown)
Odebrání vstupenkyPOST /cart/ticket/removeSwipe-to-delete / ikona
Změna zákaznické kategoriePUT /cart/ticket/set-customer-categoryTicket type selectorStudent, senior, ZTP — s discount_type a discount_value
Per-ticket voucherPOST /cart/ticket/set-voucherUplatnění kupónu na vstupenkuTyp 1 ze 3 voucher typologií
Cart-level voucherPOST /cart/voucher/addUplatnění kupónu na celou objednávkuTyp 2 ze 3
Odebrání voucheruDELETE /cart/voucher/remove/{id}Tap odstranit
Dostupné voucheryGET /cashdesk/vouchersOtevření voucher sekceSeznam povolených voucherů
Přidání službyPOST /cart/service/setVýběr doplňku[F1] upsell
CoreAPI poznatek — Trojí voucher typologie

API rozlišuje tři úrovně voucherů: per-ticket (/cart/ticket/set-voucher), cart-level (/cart/voucher/add) a platební (/cart/voucher-payment/add — v P6). Kupóny JSOU kumulativní — uživatel může mít per-ticket slevu + cart-level kupón + platební voucher na jedné objednávce. 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 dialog 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).