feat: úhrada za všechny jednou osobou (issue #29, SINGLE_PAYMENT)

Přidává možnost, aby jeden strávník zaplatil celý účet v restauraci a ostatní
obdrželi QR kód pro refundaci.

Prerekvizita — podpora více QR kódů na (příjemce, den):
- PendingQr.id (UUID) nahrazuje deduplikaci podle data; každý QR má vlastní klíč
- QR obrázky uloženy do Redis/storage (base64) místo tmpdir — přežijí redeploy
- GET /api/qr vyžaduje ?id= parametr; dismissQr přijímá {id} místo {date}

Feature:
- Ikona 'Zaplatit za všechny' v choices-table pro každou LunchChoice (kromě
  PIZZA/NEOBEDVAM/ROZHODUJI); viditelná jen při ≥2 strávnících a vyplněném účtu
- PayForAllModal: tabulka strávníků s prefillovanými cenami z menu, příplatky
  per-diner, celkové dýško rozpočtené rovnoměrně, generování QR přes POST /api/qr/generate
- parsePriceCzk() helper pro parsing 'N Kč' → number

Co se nemění: POST /api/qr/generate API kontrakt, PizzaOrder.hasQr boolean

Co se mění v OpenAPI: PendingQr.id (required), getPizzaQr ?id param, dismissQr body

Co-Authored-By: opmrdkazkrtkaus <opmrdkazkrtkaus@melancholik.eu>
This commit is contained in:
2026-04-28 22:35:15 +02:00
parent a1b1eed86d
commit 2e8db88f07
11 changed files with 428 additions and 64 deletions
+7 -1
View File
@@ -1,6 +1,6 @@
get:
operationId: getPizzaQr
summary: Získání QR kódu pro platbu za Pizza day
summary: Získání QR kódu pro platbu
security: [] # Nevyžaduje autentizaci
parameters:
- in: query
@@ -9,6 +9,12 @@ get:
type: string
required: true
description: Přihlašovací jméno uživatele, pro kterého bude vrácen QR kód
- in: query
name: id
schema:
type: string
required: true
description: Unikátní identifikátor QR kódu (z PendingQr.id)
responses:
"200":
description: Vygenerovaný QR kód pro platbu
+4 -4
View File
@@ -1,17 +1,17 @@
post:
operationId: dismissQr
summary: Označí QR kód pro daný den jako uhrazený (odstraní ho ze seznamu nevyřízených).
summary: Označí QR kód jako uhrazený (odstraní ho ze seznamu nevyřízených).
requestBody:
required: true
content:
application/json:
schema:
properties:
date:
description: Datum Pizza day, ke kterému se QR kód vztahuje
id:
description: Unikátní identifikátor QR kódu (z PendingQr.id)
type: string
required:
- date
- id
responses:
"200":
description: QR kód byl označen jako uhrazený.