Diese Dokumentation ist die verbindliche Referenz für das gesamte System (Desktop-App, PWA, API, Sicherheit, Betrieb).
Hinweis: Alle Demo-spezifischen Inhalte sind zentral in /docs/DEMO.md dokumentiert (inkl. separater Mindmap).
EquipTrackr ist eine produktionsreife Ausleih- und Inventar-Webapp für Geräteparks mit klar getrennter Bedienlogik:
- Desktop-Hauptsystem für Verwaltung, Planung, Ausleih-Setup, Reporting und Administration
- Touch-optimierte PWA für operative Prozesse (QR-Scan, Signatur, Rückgabe)
Kernziele:
- Revisionssichere Ausleihen mit Dokumentation
- Schneller operativer Checkout per Mobilgerät
- Nachvollziehbarkeit je Einzelgerät (unique InventoryTag/Seriennummer)
- Rollenbasiertes Sicherheitsmodell
- Frontend Desktop: Next.js App Router + Bootstrap 5
- Frontend PWA: eigene Route-Gruppe
/(pwa)/pwa/*, touch-optimiert - Backend: Next.js Route Handler (TypeScript)
- Datenbank: PostgreSQL + Prisma ORM
- Authentifizierung:
- intern (Benutzername/Passwort)
- OIDC/LDAP/SAML optional konfigurierbar
- Dokumentengenerierung: serverseitig (PDF)
- Dokumentenspeicher:
- lokal (
/data/documents) oder - S3-kompatibel
- lokal (
Das Desktop-System ist fachlich führend:
- Ausleihrahmen wird dort erstellt (Kunde, Zeitraum, geplanter Inhalt)
- PWA arbeitet auf tokenbasierter Session gegen dieselben Serverdaten
flowchart LR
subgraph Clients["Clients / UIs"]
D1["Desktop Backoffice<br/>Dashboard, Inventar, Kunden, Reservierungen, Ausleihen"]
D2["Super-Admin<br/>SMTP, Templates, Auth-Provider, Security, Jobs"]
D3["Account Security<br/>2FA E-Mail/TOTP, Passkeys, Session-Management"]
M1["PWA Ausleihe<br/>Setup-QR, Artikelscan, Signatur, Abschluss"]
M2["PWA Rückgabe<br/>Rückgabe-QR, Scan, Teil-/Vollrückgabe"]
S1["Interner/Öffentlicher Shop<br/>Katalog, Verfügbarkeit, Reservierungsanfrage"]
end
subgraph Backend["Next.js Backend (API + Business-Logik)"]
A1["Auth Layer<br/>Internal + OIDC/LDAP/SAML + RBAC + 2FA"]
A2["Loan Engine<br/>Verfügbarkeit, Session-Token, Konfliktprüfung"]
A3["Reservation Engine<br/>Pending/Confirmed/PickedUp + Pickup-Start"]
A4["Scan Engine<br/>QR Parse, Dedup, Not-Available Handling, Spontan-Add Confirm"]
A5["Signature + PDF Engine<br/>Signatur, Vertragsdaten, PDF Generierung"]
A6["Document Access<br/>Hash Verify, ACL, Download/Preview"]
A7["Mail Engine<br/>Reminder, Mahnung, Reservierung, Rückgabe, Vertragsmail"]
A8["Cron Jobs<br/>Reminder 48h/24h, Dunning, Cleanup, Morning Digest"]
A9["Audit + Security<br/>Audit Hash-Chain, Rate Limit, RBAC"]
end
subgraph Storage["Persistenz / Storage"]
P1["PostgreSQL + Prisma<br/>Users, Sessions, Loans, Reservations, Policies, Logs"]
P2["Dokumentenspeicher<br/>local /data/documents oder S3"]
end
D1 --> A1
D1 --> A2
D1 --> A3
D1 --> A6
D2 --> A1
D2 --> A7
D2 --> A8
D3 --> A1
M1 --> A4
M1 --> A2
M1 --> A5
M2 --> A4
M2 --> A2
S1 --> A3
S1 --> A2
A1 --> P1
A2 --> P1
A3 --> P1
A4 --> P1
A5 --> P1
A5 --> P2
A6 --> P1
A6 --> P2
A7 --> P1
A8 --> P1
A9 --> P1
flowchart TD
START["Start"] --> RES["Reservierung oder Ausleihe anlegen (Desktop)"]
RES --> AV["Verfügbarkeit im Zeitraum prüfen (Kalender + Regeln)"]
AV -->|nicht verfügbar| BLOCK["Blocker anzeigen, keine Überbuchung"]
BLOCK --> RES
AV -->|verfügbar| PICK["Pickup-Modus wählen: PWA oder Desktop-only"]
PICK -->|PWA| QRS["Setup-QR / Deep-Link für Session"]
QRS --> PWALOG["PWA Session Start"]
PWALOG --> SCAN["Artikel scannen (inkl. Dedup + Not-Available Feedback)"]
SCAN --> LIVE["Live-Sync mit Desktop (SSE/Poll)"]
LIVE --> SIGN["AGB lesen + digitale Signatur"]
SIGN --> PDF["PDF Vertrag erzeugen + speichern + Audit"]
PDF --> MAIL["Optional Vertrag per E-Mail"]
MAIL --> ACTIVE["Ausleihe aktiv"]
PICK -->|Desktop-only| DSCAN["Desktop Checkout + optional Printout"]
DSCAN --> DPDF["PDF/Vertragsübersicht erzeugen"]
DPDF --> ACTIVE
ACTIVE --> EXT["Verlängerung prüfen (Live-Verfügbarkeit)"]
EXT -->|ok| ACTIVE
EXT -->|nicht möglich| ACTIVE
ACTIVE --> RETURN["Rückgabe starten (PWA oder Desktop)"]
RETURN --> RSCAN["Rückgabe-Scan (Teil-/Vollrückgabe)"]
RSCAN --> DONE{"Alles retourniert?"}
DONE -->|Nein| PART["Teilrückgabe abschliessen"]
PART --> ACTIVE
DONE -->|Ja| CLOSE["Rückgabe final + optional Rückgabe-Mail"]
CLOSE --> END["Abgeschlossen"]
ACTIVE --> JOBS["Automationen parallel: Reminder, Mahnung, Cleanup, Morning Digest"]
JOBS --> ACTIVE
flowchart LR
U["Request"] --> AUTH["AuthN/AuthZ<br/>Role + Token + 2FA/Passkey"]
AUTH --> VALID["Server Validation (Zod)"]
VALID --> RL["Rate Limiting"]
RL --> BIZ["Business Rules<br/>No overlap / No unavailable scan / Policy checks"]
BIZ --> AUD["Audit Log (Hash-Chain)"]
BIZ --> DB["DB Write"]
DB --> DOC["PDF/Document Store"]
DOC --> VERIFY["Hash Verify on read"]
VERIFY --> OUT["Response"]
Systemrollen:
ADMIN: volle FachverwaltungMANAGER: operative Verwaltung (ohne globale Admin/Super-Admin-Einstellungen)OPERATOR: operative Ausleihe/Rückgabe (Desktop + PWA-Flow)USER: interner Shop-Zugriff für Reservierungsanfragen + Kontosicherheit
Hinweis SUPER_ADMIN:
- Es gibt keine separate DB-Rolle
SUPER_ADMIN. - Super-Admin ist eine erweiterte Fähigkeit für bestimmte
ADMIN-Konten (z. B. definierte Usernamen), geprüft überisSuperAdminUser.
| Bereich | ADMIN | MANAGER | OPERATOR | USER |
|---|---|---|---|---|
| Dashboard | Ja | Ja | Ja | Nein |
| Ausleihe erstellen | Ja | Ja | Ja | Nein |
| Reservierungen | Ja | Ja | Ja | Nein |
| Ausleihen | Ja | Ja | Ja | Nein |
| Dokumente | Ja | Ja | Ja | Nein |
| Stammdaten (Kategorien, Artikel, Kunden) | Ja | Ja | Nein | Nein |
| Einstellungen | Ja | Ja | Nein | Nein |
| Self-Service intern | Ja | Ja | Nein | Nein |
| Shop (intern) | Ja | Ja | Ja | Ja |
| Konto-Sicherheit | Ja | Ja | Ja | Ja |
| Super-Admin | Optional (nur freigeschaltete Admins) | Nein | Nein | Nein |
ADMIN/MANAGER/OPERATOR: operative Ausleih- und Dokument-APIs.ADMIN/MANAGER: Stammdaten-Mutationen und erweiterte Verwaltung.USER: kein Zugriff auf interne Loan-/Document-/Self-Service-Backoffice-APIs.USERdarf intern den Shop nutzen (Session-Bootstrap), Reservierungen anfragen und Kontosicherheit nutzen.
- Eingeloggte interne Nutzer: Shop ohne OTP (serverseitiger Session-Bootstrap).
- Öffentlicher Shop-Zugang: OTP-Verifikation weiterhin aktiv.
Die Berechtigungen werden mehrfach durchgesetzt:
- Navigation pro Rolle (sichtbare Menüs)
- zentrale Routenprüfung in
src/proxy.ts(kein URL-Bypass) - serverseitige API-Autorisierung über
requireRole(...) - tokenisierte PWA-Endpunkte mit eigener Token-/Statusprüfung
Pfad: /dashboard
Enthält u. a.:
- aktive Ausleihen
- überfällige Ausleihen
- operative Kennzahlen
- Statuskarten und Schnellnavigation
Pfade:
/categories/article-categories/articles/customers
Funktionen:
- vollständige CRUD-Operationen
- Filter-/Suchfunktionen für größere Datenmengen
- automatische Generierung eindeutiger Inventar-Tags bei Neuerfassung
- artikelbezogene Detailseite pro Objekt (
/articles/[id]) für erweitertes Editing - technischer Lifecycle-Status je Gerät:
VerfügbarDefektIn ReparaturAusgemustert
- Lifecycle-Status steuert die Ausleihbarkeit serverseitig:
- nicht
Verfügbar=> automatisch nicht ausleihbar/reservierbar/scannbar
- nicht
- Bildgalerie je Artikel (mehrere Bilder), inkl. web-optimiertem Upload
Pfade:
/loan-create(Ausleihe anlegen/planen)/loans(Ausleihübersicht)/loans/[id](Ausleih-Details)
Wichtige Funktionen:
- Ausleihzeitraum mit Von/Bis
- Verfügbarkeitsprüfung im Zeitraum
- Gerätekalender pro Artikel (Detailansicht) mit Tagesmarkierung:
- grün = frei
- rot = belegt/nicht verfügbar
- inkl. belegender Zeiträume aus Ausleihen, aktiven Ausleih-Sessions und Reservierungen
- Artikelplanung und Session-QR für PWA
- Desktop-only Abschluss als Alternative möglich
- In der Detailansicht von
/loans/[id]:- Verlängerung per interaktivem Kalenderfeld (
datetime-local) mit Live-Verfügbarkeitsprüfung - Sofortige Blockeranzeige, wenn Verlängerung im Zielzeitraum nicht möglich ist (inkl. betroffener Artikel)
- Teilrückgabe per Desktop (einzelne Artikel entfernen) oder per PWA-Rückgabe-Session mit Partial-Return
- Verlängerung per interaktivem Kalenderfeld (
Pfad: /documents
Funktionen:
- Abruf der erzeugten Vertrags-/Ausleih-PDFs
- Berechtigungsprüfung beim Zugriff
- Integritätsprüfung (Hash-Verify)
Pfad: /settings
Typische Bereiche:
- Leihdauer/Verlängerungsregeln
- Signatur- und Dokumentoptionen
- Reminder-/E-Mail-bezogenes Verhalten
Pfad: /super-admin
Umfasst u. a.:
- SMTP-Konfiguration + Testversand
- E-Mail-Templates
- Auth-Provider-Konfiguration (OIDC/LDAP/SAML)
- Sicherheitsrichtlinien (inkl. 2FA-Pflicht je Rolle)
- erweitertes User-Management
- Jobs & Cron-Transparenz:
- Laufhistorie für Reminder-/Cleanup-Jobs
- inkl. detaillierter Ergebnisdaten pro Lauf (JSON)
- manuelles Triggern mit Rollen- und Sicherheitsprüfung
Pfad: /account-security
Funktionen:
- aktive Sessions/Geräte einsehen
- einzelne Sessions widerrufen
- 2FA (TOTP, E-Mail) und Passkey-Funktionen
- minimale Reibung im operativen Prozess
- kamera-zentrierte Bedienung
- klare visuelle Rückmeldung bei erfolgreichem/fehlgeschlagenem Scan
/pwa/pwa/login/pwa/start/[token]/pwa/session/pwa/scan/pwa/signature/pwa/return/*
- Desktop erstellt Ausleih-Session und zeigt QR/Deep-Link
- Mobilgerät öffnet Session direkt via Token-Link oder QR
- Scan der Geräte in die laufende Session
- Validierung (existiert, verfügbar, nicht doppelt)
- Signatur durch ausleihende Person
- Finalisierung inkl. PDF-Erstellung und optional E-Mail-Versand
Hinweis:
- Der E-Mail-Versand aus der PWA funktioniert ohne separates PWA-Login über den aktiven Session-Token (serverseitig validiert gegen die zugehörige Ausleih-Session).
- Rückgabe-Session starten
- Artikel scannen
- Vollständigkeitsprüfung
- Abschluss + optionale Bestätigungsmail
Funktion vorhanden, um lokale Session-/Cache-Zustände zurückzusetzen und neuen Vorgang sauber zu starten.
- Jeder physische Artikel besitzt eindeutigen
inventoryTag - Seriennummern sind ebenfalls eindeutig/validiert
- QR-Codes referenzieren eindeutig auf Einzelobjekte oder Session-Token
- kryptografisch starke, nicht erratbare Tokens
- zeitlich begrenzt
- serverseitig gegen Status/Gültigkeit geprüft
- nach Abschluss/Abbruch invalidierbar
- Ausleihkonflikte werden anhand Zeitraum geprüft
- nicht finalisierte/abgebrochene Sessions dürfen Verfügbarkeit nicht dauerhaft blockieren
Bei Signatur werden u. a. erfasst:
- Zeitstempel (UTC)
- ausführender Nutzer (Operator/abwickelnde Person)
- ausleihende Person (Kunde)
- Artikelkontext
- User-Agent
- IP (falls verfügbar)
- serverseitige PDF-Generierung
- Vertragstext/AGB-Bereich (anpassbar)
- Darstellung von Kunde, Zeitraum, Artikel, abwickelnde Person
- Signaturabbild wird in Dokument eingebettet
- Dokumenthash wird gespeichert
- Dokumentpfad und Metadaten werden mit Loan verknüpft
- Audit-Event
documentCreated/documentViewed
Hinweis: Technische Hash-Details müssen nicht zwingend im sichtbaren Kundentext erscheinen, bleiben aber systemseitig für Revisionszwecke vorhanden.
Funktionen:
- Reminder vor Fälligkeit (48h/24h)
- Mehrstufiger Mahnlauf bei Überfälligkeit (Stufe 1/2/3)
- Schwellwerte (Tage überfällig) zentral in
Policykonfigurierbar - Mahngebühren für Stufe 2/3 zentral in
Policykonfigurierbar - Cooldown zwischen Mahnstufen-Mails (Stunden) konfigurierbar
- Schwellwerte (Tage überfällig) zentral in
- Versand von Vertrags-/Ausleihdokumenten
- Rückgabe-Bestätigung optional
- Reservierungsbestätigung (bei Anlage)
- Abhol-Erinnerung 24h vor Reservierungsstart
- 07:00 Dienst-Übersicht an definierte Dienstperson + Vertretung
- SMTP-Test im Adminbereich
- Logging mit Retry-Informationen
Ziel:
- regelmäßige Bereinigung von kurzlebigen und veralteten Datensätzen
- stabile Performance bei langen Laufzeiten
- klare Aufbewahrungsfenster statt unbegrenztem Wachstum
Implementierung:
- zentraler Cleanup-Job:
runCleanupinsrc/lib/jobs/run-cleanup.ts - API-Trigger:
POST /api/cron/cleanup - CLI-Trigger:
npm run cron:cleanup(optional-- --dry-run) - parallele Ausführungen werden via PostgreSQL Advisory Lock verhindert
Aufräumregeln (konfigurierbar per ENV):
- Auth-Login-Tokens (abgelaufen/alt)
- User-Sessions (abgelaufen oder widerrufen, älter als Retention)
- Shop-Sessions und OTP-Challenges (abgelaufen/alt)
- Loan-/Return-Sessions (abgelaufen oder abgeschlossen/storniert und alt)
- alte stornierte/abgelehnte Reservierungen ohne aktive Pickup-Verknüpfung
- alte
EmailLog- undAuditLog-Einträge - verwaiste Dokumente (
Documentohne Loan-Referenz) inkl. File-Delete im Storage
Empfohlene Job-Frequenz:
- Produktion: alle 6h (
0 */6 * * *) - für dry-run Monitoring zusätzlich täglich ein Reportlauf
Sicherheit beim Trigger:
- entweder als eingeloggter
ADMIN - oder per
Authorization: Bearer <CRON_TOKEN>(für externe Scheduler)
Der interne Self-Service-Bereich (/self-service) ist für ADMIN und MANAGER verfügbar.
Funktionen:
- Einsicht laufender Ausleihen aus interner Perspektive
- Verlängerung im Rahmen der Policy
Für USER gilt stattdessen:
- Zugriff auf den internen Shop (
/shop) für Reservierungsanfragen - Zugriff auf Kontosicherheit (
/account-security)
- Öffentliche Detailseite pro Artikel:
/shop/articles/[id] - Enthalten: Stammdaten, Beschreibung, technische Kategorie, Galerie
- Shop-Listenansicht verlinkt direkt auf die jeweilige Detailseite
- Bilder werden über öffentliche, cachebare Bildroute ausgeliefert
Wichtige Entitäten:
Category,ArticleCategory,Article,CustomerLoan,LoanItemLoanSession,LoanSessionItemReturnSessionDocument(bzw. Dokumentbezug auf Loan)AuditLogEmailLogPolicy,SettingUser,Session, 2FA/Passkey-bezogene Daten
Loan-relevante Felder (erweitert):
signedAtsignatureImagePathdocumentPathdocumentHashsigningMetadatadunningLeveldunningFeeCentslastDunningAt
Audit-Aktionen (u. a.):
documentCreateddocumentViewed
Referenz: prisma/schema.prisma
- serverseitige Zod-Validierung
- rollenbasiertes Authorization-Mapping pro Endpoint
- Rate-Limiting für kritische Pfade (Auth, OTP, Scan, Finalize, Public Reservation-Endpunkte)
- Passwort-Hashing mit
argon2id(inkl. Legacy-Migration) - 2FA (E-Mail/TOTP) + Passkey-Unterstützung
- 2FA-Pflicht je Rolle durch Super-Admin konfigurierbar
- Verschlüsselung sensibler Felder at-rest
- Audit-Log mit Hash-Chain zur Manipulationserkennung
- geschützter Zugriff auf Dokumente
- tokenisierte PWA-Endpunkte mit Ablauf- und Statusprüfung
- Request-Body-Limit für JSON-Payloads (
MAX_JSON_BODY_BYTES) - lokale Dokumentzugriffe auf
LOCAL_DOCUMENT_DIRbegrenzt - Secrets in Super-Admin-GETs maskiert; Speicherung von SMTP/OIDC/SAML/LDAP-Secrets verschlüsselt
Empfohlene laufende Härtung:
- strikte Secret-Rotation
- Monitoring/Alerting für Security-Events
- regelmäßige Restore-Tests (DB + Dokumente)
- SAST/Dependency-Scanning in CI
/api/auth/[...nextauth]- Passkey/TOTP-bezogene Endpunkte unter
/api/auth/passkey/*und/api/user/security/*
/api/categories/api/article-categories/api/articles/api/customers
/api/loan-sessions/api/loan-sessions/[id]/qr/api/loan-sessions/by-token/[token]/*/api/scan/api/checkout/api/checkout/desktop/api/loans
/api/return-sessions/*
/api/documents/api/documents/[id]
/api/admin/system-config/api/admin/email-templates/api/admin/smtp-test/api/admin/auth/test/api/admin/users/api/admin/job-runs
/api/self-service/*/api/cron/reminders/api/cron/cleanup
NODE_ENVNEXTAUTH_URLNEXTAUTH_SECRETDATABASE_URL
STORAGE_MODE=local|s3LOCAL_DOCUMENT_DIRS3_ENDPOINTS3_REGIONS3_BUCKETS3_ACCESS_KEY_IDS3_SECRET_ACCESS_KEY
DATA_ENCRYPTION_KEYSUPER_ADMIN_USERNAMESRATE_LIMIT_POINTSRATE_LIMIT_DURATIONLOAN_SESSION_TTL_HOURSMAX_JSON_BODY_BYTESCRON_TOKEN
CLEANUP_EMAIL_LOG_RETENTION_DAYSCLEANUP_AUDIT_LOG_RETENTION_DAYSCLEANUP_AUTH_TOKEN_RETENTION_DAYSCLEANUP_USER_SESSION_RETENTION_DAYSCLEANUP_SHOP_SESSION_RETENTION_DAYSCLEANUP_SHOP_OTP_RETENTION_DAYSCLEANUP_LOAN_SESSION_RETENTION_DAYSCLEANUP_RETURN_SESSION_RETENTION_DAYSCLEANUP_RESERVATION_RETENTION_DAYSCLEANUP_ORPHAN_DOCUMENT_RETENTION_DAYSCLEANUP_DEMO_MAPPING_RETENTION_DAYS
SMTP_HOSTSMTP_PORTSMTP_SECURESMTP_USERSMTP_PASSWORDSMTP_FROM
Alle Demo-ENVs und Demo-Betriebsregeln sind separat dokumentiert in:
/docs/DEMO.md
Referenzdateien:
.env.exampledemo.env.example
docker compose --env-file demo.env.example down -v --remove-orphans
docker compose --env-file demo.env.example up --build -d- HTTPS lokal (Proxy):
https://<LAN-IP>:3443 - App intern: Port 3001
- PostgreSQL: Port 5432
- Mobilgerät im gleichen Netzwerk
- URL mit LAN-IP verwenden
- bei Self-Signed Zertifikat Zertifikat vertrauen
- Kamera benötigt HTTPS-Kontext
Demo-spezifische Architektur, Sicherheit, ENVs und Betriebsabläufe sind vollständig in
/docs/DEMO.md ausgelagert.
- Nach
NEXTAUTH_SECRET-Änderung alte Browser-Sessions löschen (sonst JWT-Fehler möglich) - Bei massiven Datenmengen auf Indizes, Pagination und serverseitiges Filtering achten
- QR-/Kamera-Funktionen nur mit stabilem HTTPS und Berechtigungen nutzen
- feinere BI-Statistiken (Nutzungsmuster, Auslastung, Engpassprognosen)
- erweiterte Reporting-Exporte
- Mandantenfähigkeit (falls benötigt)
- revisionssichere Dokumentensignierung mit externer Signaturinfrastruktur (optional)
Optional kann das private Hauptrepo die Doku automatisch in ein separates, öffentliches Repo publizieren:
- Workflow:
.github/workflows/publish-public-docs.yml - Trigger: Push auf
mainbei Änderungen unterdocs/** - Zielrepo (Default):
bjoernch/EquipTrackr-docs
Erforderlich:
- Secret
DOCS_PUBLISH_TOKEN(PAT mit Schreibrecht auf das Public-Docs-Repo) - Variable
DOCS_PUBLISH_REPO(optional, z. B.owner/repo)
Verhalten:
- Inhalt von
docs/wird in das Public-Repo gespiegelt docs/README.mdwird alsREADME.mdim Public-Repo bereitgestellt- Push erfolgt nur bei tatsächlichen Dateiänderungen
Jede Ausleihe besitzt eine kurze, eindeutige Referenz (Loan.loanNo), z. B. L26-AB12CD3.
- technisch eindeutig über Unique-Constraint
- in UI/E-Mail/PDF als primäre Referenz verwendet
- interne CUID bleibt als technische Primär-ID erhalten
Für hohe Datenvolumina unterstützen Kernendpunkte Cursor-Pagination:
GET /api/customers?cursor=<id>&pageSize=50GET /api/articles?paginate=1&cursor=<id>&pageSize=60GET /api/loans?paginate=1&cursor=<id>&pageSize=50
Neue Endpunkte:
GET /api/loans/:id/extend?dueDate=<iso>- prüft live, ob Verlängerung im gewünschten Zeitraum möglich ist
- berücksichtigt laufende Ausleihen, aktive Ausleih-Sessions und Reservierungen
- liefert bei Blockierung die konkreten blockierenden Artikel
POST /api/loans/:id/extend- führt Verlängerung nur aus, wenn der Live-Check erfolgreich ist
- schreibt Audit-Log
loanUpdatedmitoperation=extendLoan
Alle Demo-spezifischen Betriebsregeln, Endpunkte und Konfigurationsdetails sind zentral
in /docs/DEMO.md dokumentiert.
Im Desktop-Flow /loan-create bleibt der Abschnitt mit Kundenzuordnung und Zeitraum (Von/Bis) in Schritt 2 bewusst editierbar.
Neu:
- Änderungen an Kunde, Start und Ende werden serverseitig synchronisiert, bevor Artikelzuweisungen final übernommen werden.
- Nicht gespeicherte Änderungen blockieren den nächsten Schritt, bis die Synchronisierung erfolgreich ist.
- Die Verfügbarkeitsprüfung arbeitet damit immer gegen den aktuellen Zeitrahmen.
Neue API:
PUT /api/loan-sessions/:id- aktualisiert
customerId,startsAt,dueDate - vollständig serverseitig validiert (Zod)
- mit Rollenprüfung (
ADMIN,MANAGER,OPERATOR)
- aktualisiert
Der Setup-QR im Desktop ist als vollwertiger HTTPS-Deep-Link nutzbar.
- Scan mit normaler Kamera-App oder beliebiger QR-Scanner-App öffnet direkt die PWA-Session.
- Kein erzwungener manueller URL-Einstieg in der PWA nötig.
- Danach erfolgt direkt der Geräte-Scanflow.
Vor produktivem Betrieb:
DEMO_MODE=falsesicherstellen- starke Secrets setzen (
NEXTAUTH_SECRET,DATA_ENCRYPTION_KEY, SMTP-Creds) - TLS-Zertifikat + Reverse-Proxy (Nginx/Caddy) aktivieren
- DB-Backups + Restore-Test (
scripts/backup.sh,scripts/restore-test.sh) einplanen - Cron-Jobs aktivieren:
- Reminder/Mahnlauf
- Cleanup
- morgendliche Dienstübersicht
- Rollenmodell und 2FA-Pflicht je Rolle prüfen
- Dokument-Storage (local/S3) inkl. Zugriffsrechten verifizieren
- Monitoring/Alerts für Mailfehler, Jobfehler und Login-Anomalien einschalten
Endpoint:
GET /api/loan-sessions/by-token/:token/events
Die PWA konsumiert diesen Stream via EventSource.
- Session-Änderungen erscheinen ohne aggressives Polling
- Fallback-Polling bleibt aktiv für robuste Netze
Neue ENV:
ADMIN_IP_ALLOWLIST(CSV, optional)
Verhalten:
- gilt für
ADMIN/Super-Admin-Routen - wenn gesetzt, ist Zugriff nur von erlaubten Quell-IPs möglich
Neue Felder:
Loan.documentTemplateVersionDocument.templateVersion
Aktuelle Version: loan-v3.
Damit ist bei zukünftigen PDF-Änderungen nachvollziehbar, welche Dokumentversion erzeugt wurde.
Neuer Endpoint:
GET /api/admin/metrics
Liefert kompakte Betriebsmetriken:
- aktive/überfällige Ausleihen
- offene Reservierungen
- E-Mail-Fehler 24h/7d
- erfolgreiche Reminder-/Cleanup-Runs (7d)
Super-Admin API:
GET /api/admin/backups(Liste)POST /api/admin/backups(Backup erstellen)GET /api/admin/backups/[fileName](Download)DELETE /api/admin/backups/[fileName](Löschen)
Super-Admin UI:
- Bereich
Backupsin/super-admin - Erstellung, Download und Löschung lokaler Backups
Format:
- Dateiendung:
.etbk - Inhalt: konsistenter
pg_dump+ lokales Storage-Archiv (LOCAL_DOCUMENT_DIR) +manifest.json - gesamte Payload wird verschlüsselt gespeichert
Verschlüsselung:
- Algorithmus:
AES-256-GCM - Schlüsselableitung:
scryptausBACKUP_ENCRYPTION_PASSPHRASE - pro Backup zufällige
salt(16 Byte) undiv(12 Byte) - Authentizität über GCM-Tag
Wichtige ENV:
BACKUP_LOCAL_DIR(Default/data/backups)BACKUP_ENCRYPTION_PASSPHRASE(min. 16 Zeichen, Pflicht für Backup-Erstellung)
Hinweis:
- In
DEMO_MODE=truesind Backup-Schreibaktionen gesperrt (read-only).