Klientský portál
Cesta: /client
Komponenta: src/pages/ClientPortal.jsx
Role: Veřejné (bez admin přihlášení)
Samostatné rozhraní pro klienty kliniky. Dostupné na stejné doméně jako admin část, ale bez horní navigace.
Režimy portálu
ClientPortal řídí zobrazení stavem mode (nikoliv routami). Výchozí režim bez přihlášení je veřejný rezervační portál (viz Veřejný rezervační portál).
mode |
Kdy | Zobrazí |
|---|---|---|
public |
výchozí, nepřihlášen | PublicBookingPortal — procházení služeb a start rezervace |
login |
vyžádáno z veřejného portálu | ClientLogin (OTP) |
dashboard |
přihlášený klient | ClientDashboard |
onboarding |
odkaz ?action=onboarding&client_id=… |
ClientOnboarding (viz On-boarding) |
| — (payment) | ?payment=1&… |
PaymentLanding (bez přihlášení) |
graph TD
ENTRY["/client"] --> PUB[Veřejný rezervační portál]
ENTRY --> PAY["/client?payment=1 — Platební odkaz"]
ENTRY --> ONB["/client?action=onboarding — On-boarding z e-mailu"]
PUB --> OTP[OTP přihlášení]
OTP --> DASH[Dashboard klienta]
DASH --> BOOK[Rezervace termínu]
DASH --> HIST[Historie termínů]
DASH --> CRED[Kreditní účet]
DASH --> CANCEL[Storno termínu]
PAY --> OTP
Přihlášení klientů (OTP)
flowchart TD
A[Klient zadá e-mail nebo telefon] --> B[Backend vygeneruje 6-místný kód]
B --> C[Kód odeslán e-mailem přes Resend]
C --> D[Klient zadá kód]
D --> E{Ověření}
E -- platný --> F{Počet klientů?}
E -- neplatný / expirovaný --> G[Chyba — zkus znovu]
F -- jeden --> H[Přihlášení]
F -- více se stejným kontaktem --> I[Výběr profilu]
F -- žádný --> J[Automatické vytvoření nového klienta]
I & J --> H
Session je uložena v localStorage. Platnost kódu je 10 minut.
Funkce portálu
Rezervace termínu
- Výběr výkonu
- Výběr terapeuta (zobrazí jen ty s volnými sloty v příštích 42 dnech)
- Výběr data (zvýrazněna jen data s dostupnými sloty)
- Výběr konkrétního časového slotu
- Potvrzení → vytvoření
Booking+CalendarEvent+ odeslání platební výzvy e-mailem
Rezervace přes portál mají příznak is_online_booking: true — admin pak nemůže měnit klienta.
Platba
Klient může zaplatit:
- Kreditem (pokud má dostatečný zůstatek)
- Balíčkem sezení (pokud má aktivní)
- Platební bránou (gateway — stav integrace nezjištěn)
- Voucherem
Změna logiky (export 19. 8. 2026): po úhradě vzniká doklad a klientovi chodí odkaz na jeho zobrazení (/invoice?token=…). Kromě e-mailu může výzva k platbě i potvrzení dorazit SMS. U výkonů hrazených pojišťovnou se platební krok přeskočí úplně.
Přehled termínů
- Nadcházející termíny s možností storna
- Storno klientem respektuje lhůtu (
cancellation_free_hours) - Historie minulých termínů
Kreditní účet
- Aktuální zůstatek
- Výpis transakcí (dobití, platby, vratky, převody mezi klienty)
- Dobití kreditu je vedeno jako přijatá záloha s nedaňovým potvrzením — viz Klienti
Platební flow (příchozí odkaz)
Klient může přijít na portál přímo přes platební odkaz z e-mailu:
/client?payment=1&booking_id=...&date=...&start=...&service=...
Po OTP přihlášení se zobrazí konkrétní rezervace k zaplacení.
Další veřejné stránky (nové)
| Cesta | Účel |
|---|---|
/invoice?token=… |
Zobrazení dokladu — bez přihlášení, výhradně přes token z e-mailu (backend getPublicInvoice) |
/storno?token=… |
Úhrada storno poplatku u stavu „Nedostavil se – storno pojišťovna" (StornoLanding) |
Poznámka k bezpečnosti: oba odkazy stojí jen na neuhodnutelnosti tokenu a nemají expiraci — viz R20.