Legt den kompletten Unterbau an, auf dem die Fachmodule aufsetzen. Betrieb: - docker-compose.yml mit Traefik, App, Worker, PostgreSQL 17 + PostGIS, Redis, MinIO und Gotenberg; Entwicklungs-Override ohne Traefik, dafuer mit Mailpit und Adminer - Mehrstufiges Dockerfile: eigener Benutzer, tini als PID 1, Healthcheck - .env.example mit einem Kommentar zu jeder Variable Mandantentrennung: - Row Level Security auf allen mandantenpflichtigen Tabellen - Zwei getrennte Datenbankverbindungen: florian_app mit aktiver RLS fuer die Anwendung, Eigentuemer-Zugang nur fuer Migration, Seed und Anmeldung - fuerOrganisation() als einziger Weg zu Fachdaten Nachvollziehbarkeit: - AuditLog append-only per Trigger; UPDATE ist dauerhaft gesperrt, DELETE nur im gekennzeichneten Aufbewahrungslauf - Geheimnisse werden vor dem Schreiben entfernt Anmeldung: - OIDC gegen ein extern betriebenes authentik, Rollen aus Gruppen nur als Vorbelegung beim ersten Login - Lokaler E-Mail/Passwort-Login als Rueckfallweg - Terminal per PIN und RFID mit zwei Schranken (Geraet, dann Person) Weiteres: - lib/authz.ts mit 9 Rollen und 38 Einzelrechten - lib/storage.ts (MinIO), lib/audit.ts, lib/warteschlange.ts (BullMQ) - Integrationen fuer Mail, Telegram und LLM hinter abschaltbaren Interfaces - tRPC v11, Basis-Layout mit Seitenleiste und dunkler Darstellung - Seed mit einer Beispielwehr: 16 Personen, 3 Fahrzeuge, 40 Geraete - 32 Vitest-Tests (davon 8 gegen eine echte Datenbank), 10 Playwright-Tests - README, Anleitung mit Screenshots, Roadmap, Aufwandsschaetzung, Devlog, Versionierungsregeln und Changelog Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
21 lines
1.2 KiB
Markdown
21 lines
1.2 KiB
Markdown
Phase 4: Kiosk-Oberfläche als PWA für Wandtablets in der Fahrzeughalle.
|
|
|
|
Anforderungen:
|
|
- Eigene Route /kiosk mit eigenem Layout: große Kacheln, mindestens 64px
|
|
Touchziele, hoher Kontrast, mit Handschuhen bedienbar, kein Hover-Zwang
|
|
- Login: RFID (WebHID/Tastaturemulation des Lesers), 6-stellige PIN,
|
|
QR-Code vom Handy. Auto-Logout nach 90 Sekunden Inaktivität.
|
|
- Rollenabhängige Kachelauswahl
|
|
- Wizards: Wartung durchführen, Fahrtenbuch eintragen, Mangel melden
|
|
(QR scannen → Foto → fertig in unter 30 Sekunden), Inventur scannen,
|
|
Wäsche abgeben, Anwesenheit ein-/auschecken
|
|
- Hallen-Monitor-Modus (/kiosk/monitor): Vollbild ohne Interaktion, zeigt
|
|
nächste Termine, überfällige Prüfungen, Fahrzeugstatus, Wetterwarnung
|
|
(DWD Open Data), Uhrzeit
|
|
- Offline: Service Worker cached App-Shell und Stammdaten. Schreibende
|
|
Aktionen gehen in eine IndexedDB-Outbox (Dexie) mit UUID als Idempotenzschlüssel
|
|
und werden bei Reconnect synchronisiert. Sichtbare Statusanzeige
|
|
"offline / N Änderungen ausstehend". Konflikte: Server gewinnt bei
|
|
Stammdaten, Client gewinnt bei neuen Datensätzen, Konfliktliste für Admin.
|
|
|
|
Schreibe Playwright-Tests, die den Offline-Fall simulieren. |