Drei Bugfixes: Das strichfrei-Logo im Lade-Screen ist jetzt auf allen Geräten korrekt horizontal zentriert. Social-Media-Vorschaubilder (Open Graph / Twitter) warfen bei jedem neuen Deployment einen 500-Fehler — behoben. Einzahlungsanfragen werden jetzt client- und serverseitig gegen das Guthaben-Limit der Organisation geprüft — bisher ließ sich ein beliebig hoher Betrag eingeben.
BehobenLade-Screen: Logo jetzt auf allen Geräten korrekt horizontal zentriert — vorher war das strichfrei-Logo in Browser und PWA zu weit links. Ursache war überschüssiger Whitespace im SVG-Viewport; behoben durch eine Flex-Zeile aus Icon-SVG und HTML-Text statt einem einzelnen SVG-Element
BehobenMiddleware: /opengraph-image- und /twitter-image-Routen scheiterten bei jedem neuen Deployment mit HTTP 500, weil die Middleware versuchte einen Supabase-Client zu erstellen. Die Routen werden jetzt frühzeitig durchgeleitet, bevor die Session-Prüfung greift
VerbessertEinzahlungsanfrage: Das Guthaben-Limit der Organisation (allow_credit / max_credit_cents) wird jetzt client- und serverseitig geprüft. Bisher konnten Mitglieder beliebige Beträge eingeben. Jetzt gilt: Maximalbetrag = offener Saldo + erlaubtes Guthaben; bei unbegrenztem Guthaben bleibt der Betrag frei wählbar
Performance & Ladeerlebnis: Kiosk und Verkaufstresen öffnen beim Wiederaufruf praktisch sofort (Oberfläche aus dem lokalen Cache, Aktualisierung im Hintergrund). Der Lade-Screen mit Logo ist jetzt in allen Geräte-Apps verfügbar und sauber zentriert. Dazu ein schnellerer Seitenaufbau im eingeloggten Bereich.
VerbessertKiosk & Verkaufstresen öffnen beim Wiederaufruf praktisch sofort: Die Oberfläche kommt aus dem lokalen Gerätespeicher und wird im Hintergrund aktualisiert. Die Daten (Saldo, Bestellungen, Runden) sind dabei wie gewohnt immer live
VerbessertLade-Screen mit strichfrei-Logo jetzt in allen Geräte-Apps (Mitglieder, Kiosk, Verkaufstresen) — und korrekt in der Bildschirmmitte zentriert (vorher im Kiosk nach oben verschoben)
VerbessertSchnellerer Seitenaufbau im eingeloggten Bereich (Dashboard und Org-Seiten): eine blockierende Server-Abfrage für die Theme-Einstellung wurde entfernt — das Theme wird jetzt im Hintergrund abgeglichen
VerbessertVerkaufstresen: interner Datenabruf verschlankt (zusammengeführte Datenbankabfragen)
Datenschutz im Fokus: Mitglieder können ihre gespeicherten Daten als PDF exportieren (DSGVO-Datenauskunft) und ihr Konto selbst löschen; Admins können Mitgliedsdaten anonymisieren. Dazu automatische Bildverkleinerung beim Upload, der Hinweis „in Anspruch genommen von" bei gesponserten Runden, Tarif-Ablauf-Warnungen, Org-Lebenszyklus-Verwaltung im Superadmin sowie ein deutlich schnellerer Kiosk-Ladevorgang mit Lade-Screen.
NeuDatenauskunft (DSGVO Art. 15): Unter Profil → „Meine Daten exportieren" gibt es alle zu deinem Konto gespeicherten Daten als strukturiertes PDF — Profil, Mitgliedschaften, Bestellungen, Zahlungen und ausgegebene Runden
NeuKonto löschen (Selbst-Service) im Profil: personenbezogene Daten werden entfernt und der Zugang dauerhaft gesperrt. Bereits erfasste Buchungen bleiben aus buchhalterischen Gründen anonymisiert in der jeweiligen Vereinskasse erhalten. Voraussetzung: kein offener Saldo und nicht alleiniger Admin einer Org. Die E-Mail-Adresse kann danach für ein neues Konto wiederverwendet werden
NeuMitglied-Daten anonymisieren (Admin → Mitglied verwalten): Name, E-Mail, Geburtsdatum und PIN werden dauerhaft entfernt — Bestellhistorie und Saldo bleiben anonymisiert für die Vereinskasse erhalten
NeuBilder werden vor dem Upload automatisch verkleinert (Profilbilder und Produktbilder, als WebP) — große Handyfotos lassen sich jetzt zuverlässig hochladen; der gelegentliche Fehler „unerwartete Server-Antwort" beim Profilbild-Upload ist damit behoben
NeuAdmin → Transaktionen: Bei gesponserten Runden wird jetzt angezeigt, wer die Runde in Anspruch genommen hat („🍻 In Anspruch genommen von: …") — die Buchung beim Sponsor ist damit eindeutig zuordenbar
NeuTarif-Ablauf-Hinweis: Läuft das Abo einer Organisation ab, sehen Admins und Kassierer einen Hinweis mit Ablauf- und Sperrdatum, solange noch nicht pausiert wurde
NeuSuperadmin: Org-Lebenszyklus — Organisationen pausieren (Daten bleiben vollständig erhalten, Mitglieder sehen nur eine Sperrseite, Admins können weiter exportieren), jederzeit wieder reaktivieren sowie archivierte Organisationen reaktivieren oder endgültig löschen (mit Slug-Bestätigung)
NeuKiosk-Ladescreen: Beim Öffnen erscheint sofort ein Wartescreen mit strichfrei-Logo und „Lädt…" statt einer leeren Seite — die wahrgenommene Ladezeit verbessert sich spürbar, besonders beim ersten Start
VerbessertKiosk lädt spürbar schneller: Der serverseitige Datenabruf wurde verschlankt (zusammengeführte und parallelisierte Datenbankabfragen). Zusätzlich wurde die rein dekorative „Bierkönig"-Krone samt teurer Monatsauswertung aus dem Kiosk entfernt — der Bierkönig bleibt in der Rangliste erhalten
VerbessertSchnellere monatliche Auswertungen (Rangliste, Statistiken) durch zusätzliche Datenbank-Indizes
VerbessertMitglieder-Limit berücksichtigt jetzt auch offene Direkteinladungen — es lassen sich nicht mehr Einladungen verschicken als freie Plätze im Tarif vorhanden sind (keine Absage mehr erst beim Beitritt)
BehobenDialoge, die in bestimmten Bereichen (z. B. Superadmin-Org-Liste) halbtransparent oder abgeschnitten erschienen und den Hintergrund mitscrollen ließen, werden jetzt korrekt und vollflächig dargestellt
Automatische Echtzeit-Aktualisierung überall: Saldo, Rangliste und Verlauf werden jetzt aktualisiert, wenn jemand anderes bestellt oder ein Admin Mitgliedsdaten ändert — ohne manuellen Reload. Neue ↻-Schaltfläche in UserApp und Rangliste, Pull-to-Refresh auf Mobile. Kiosk und Tresen haben ebenfalls einen Aktualisierungsbutton. Dazu Finanz-Chart auf Nettoumsatz, mehrere Bugfixes an Gastkonto, Statistiken und Security-Härtung.
NeuAutomatische Echtzeit-Aktualisierung für Saldo, Rangliste und Verlauf: Neue Bestellungen anderer Mitglieder (Kiosk, Tresen, Self-Order) und Mitgliedsänderungen (Bans, Namen, PINs) propagieren sofort auf alle aktiven Tabs — kein manueller Reload mehr nötig
Neu↻-Schaltfläche in UserApp-Nav und Rangliste: Klick aktualisiert die Seite sofort (Desktop und Mobile). Auf Mobile zusätzlich als Pull-to-Refresh-Geste: Seite nach unten ziehen wenn ganz oben → Spinner → Refresh
Neu↻-Button im Kiosk: Kleines Icon neben dem Realtime-Statusindikator lädt Mitglieder, Produkte und Runden parallel neu
Neu↻-Button im Tresen: Icon links im Header (Mitglieder-Screen) mit demselben Verhalten
VerbessertFinanz-Chart (Admin → Statistiken → Finanzen): Amber-Balken zeigt jetzt den Nettoumsatz (Bruttoumsatz abzgl. Gastkonto-Ausbuchungen) statt Bruttoumsatz — Chart-Titel und Legende aktualisiert
BehobenEinzahlungsquote in der Finanztabelle rechnete pro Zeile auf Bruttoumsatz, die Kopf-KPI aber auf Netto — bei voll ausgebuchten Zeiträumen zeigte die Zeile 0 %, die KPI aber „—". Jetzt konsistent Netto in beiden Ansichten
BehobenKiosk: 8 Stellen mit try/finally ohne catch führten bei Netzwerkunterbrechung zu unhandled rejections (Sentry-Fehler). Alle Realtime-Callbacks und Poller fangen Netzwerkfehler jetzt sauber ab
BehobenTresen: Gleicher Bug wie Kiosk — 8 Stellen try/finally ohne catch in Realtime-Callbacks und Pollern gefixt
BehobenGastkonto reaktivieren: Saldo-Ausgleich und Reaktivierung laufen jetzt atomar — schlägt die Reaktivierung fehl, wird die Ausgleichs-Zahlung automatisch rückgängig gemacht (kein verwaister Saldo-Ausgleich mehr möglich)
BehobenGastkonto reaktivieren: Gültigkeitsdatum wird serverseitig auf Zukunft geprüft — ein sofort ablaufendes Gastkonto durch Umgehung des Client-Mindestdatums ist nicht mehr möglich
BehobenGastkonto-Modal auf iOS: das Datum-Eingabefeld ragte in schmalen Modals aus dem sichtbaren Bereich — wird jetzt auf Containerbreite begrenzt
VerbessertSecurity: anon-EXECUTE-Härtung in der Datenbank — REVOKE EXECUTE direkt von der anon-Rolle für alle SECURITY DEFINER RPCs und Avatar-Bucket-Listing-Policy. Schließt alle verbleibenden Supabase-Linter-Warnings
BehobenSuperadmin: Einladungslink-URL lief auf Mobile aus dem Karten-Rahmen heraus — wird jetzt korrekt abgeschnitten (truncate) und bleibt innerhalb der Karte
Superadmin-Erweiterungen: Tarif-Management mit MRR/ARR-Kennzahlen und Benutzersuche direkt im Plattform-Dashboard. Org-Admins sehen ihren aktuellen Tarif in den Einstellungen. Dazu mehrere Bugfixes: Org-Reset wieder funktionsfähig, Beta-Vorteil korrekt eingeschränkt und mobile Eingabefelder verbessert.
NeuSuperadmin: Tarif-Management pro Organisation — effektiver Tarif (Free/Basis/Premium/Pro), maximale Mitgliederzahl (auto-befüllt, überschreibbar), Gültigkeitsdatum und interne Notiz in einem Modal direkt aus der Org-Liste
NeuSuperadmin: Abrechnung-Tracking — welchen Tarif zahlt die Org wirklich? Getrennte Erfassung von effektivem Tarif (was sie bekommen) und Abrechnungsplan (was sie zahlen) mit monatlich/jährlich-Auswahl und Individualbetrag
NeuSuperadmin: MRR/ARR-Kacheln — Monthly Recurring Revenue und Annual Run Rate werden live aus den gespeicherten Abrechnungsdaten berechnet (ARR direkt aus Jahresbeträgen, keine Rundungsdifferenzen durch MRR×12)
NeuSuperadmin: Benutzersuche — Name oder E-Mail eingeben, Org-Mitgliedschaften als Chips, platform_role (Super Admin) per Klick umstellen mit Zwei-Schritt-Bestätigung
NeuSuperadmin: Tab-Navigation Orgs | Benutzer — beide Bereiche in einem Dashboard, kein Seitenreload
NeuTarif-Infokarte in Org-Einstellungen: Admins sehen ihren aktuellen Tarif, Mitgliederzahl/-limit und Gültigkeitsdatum auf einen Blick — Ablaufwarnung bei < 30 Tagen, roter Hinweis bei Ablauf
VerbessertSuperadmin: Info-Tooltips (ⓘ) auf den Stats-Kacheln öffnen jetzt per Klick statt Hover — auch auf dem Handy bedienbar
VerbessertSecurity: Eingabelängenbeschränkungen in allen Formularen ergänzt (Namen, Notizen, Pins, Betragsfelder) — überlange Eingaben werden server- und clientseitig blockiert
BehobenOrg-Daten-Reset im Superadmin war komplett kaputt: reset_org_data referenzierte drei Tabellen (notifications, kiosk_devices, audit_log), die seit v0.34.0 nicht mehr existieren — Referenzen entfernt, Reset funktioniert wieder
BehobenBeta-Vorteil-Anzeige im Tarif-Modal erschien fälschlicherweise auch wenn effektiver Tarif und Abrechnungstarif identisch sind — jetzt nur noch sichtbar wenn der Org ein höherer Tarif gewährt wird als sie zahlt
BehobenIcon-Editor: borderRadius aus dem Icon-Canvas entfernt — Balken wurden irrtümlich abgerundet dargestellt
BehobenTarif-Modal: Pfeiltasten (▲▼) aus Zahlen-Inputs entfernt und negative Werte blockiert — mobile Eingabe der Mitglieder-Anzahl damit deutlich besser bedienbar
Technische Wartung: Alle ESLint-Warnungen behoben — ungenutzte Variablen entfernt, React-Hooks-Abhängigkeiten vervollständigt, Code-Qualität verbessert. Keine nutzbaren Änderungen, aber eine stabilere Codebasis für kommende Features.
VerbessertCode-Qualität: 37 ESLint-Warnungen auf 0 reduziert — ungenutzte Imports und Variablen entfernt, ternäre Ausdrücke als Statements durch if/else-Blöcke ersetzt
VerbessertReact-Hooks: Fehlende Abhängigkeiten im Snapshot-Effekt des Tresen-Modus ergänzt (activePinHash, counterToken) — der Snapshot wird nun korrekt bei allen relevanten State-Änderungen aktualisiert
VerbessertStornieren-Dialog: State-Reset beim Öffnen direkt im Click-Handler statt in einem separaten useEffect — weniger überflüssige Re-Renders
Drei Bugfixes und einheitliche Betragseingabe: Mail-Großschreibung korrigiert, Transaktionsverlauf entzerrt mit Bestellinhalt-Anzeige, iOS-sicherer Scroll-Lock für alle Modals sowie Vorzeichen-Umschalter (Einzahlung/Auszahlung, Lastschrift/Gutschrift) statt getipptem Minus — damit sind Auszahlung und Lastschrift jetzt auch auf der Handy-Zahlentastatur erreichbar.
NeuBestellinhalt in Admin → Transaktionen: Bestellte Produkte werden jetzt direkt im Eintrag angezeigt (z. B. „2× Pils (0,5 l), 1× Wasser") — eine Bestellung über mehrere Positionen ist jetzt lückenlos nachvollziehbar
NeuKontostand verwalten: Umschalter Einzahlung/Auszahlung statt getipptem Minus — Auszahlung ist jetzt auch auf der Handy-Zahlentastatur ohne Minus-Taste erreichbar
NeuUmlage: Umschalter Lastschrift/Gutschrift statt getipptem Minus — Lastschrift ist jetzt auch auf der Handy-Zahlentastatur erreichbar
VerbessertEinheitliche Betragseingabe: gemeinsamer Sanitizer in allen Payment-Feldern (Kontostand, Umlage, Zahlungsanfrage, Kiosk, Tresen) — keine Buchstaben oder Sonderzeichen möglich, max. 2 Nachkommastellen, Punkt und Komma gleichwertig
BehobenZahlungsanfrage-Mail: Typ wurde klein geschrieben („einzahlungsanfrage" / „auszahlungsanfrage") — toLowerCase() entfernt, korrekte Großschreibung wiederhergestellt
BehobenTransaktionsverlauf (Admin): Auf Mobile lagen zu viele Elemente in einer Flex-Zeile und überlappten sich. Neu: zwei Spalten — links Badges, Name, Bestellinhalt und Datum; rechts Betrag und Stornieren-Button gestapelt
BehobenModal-Scroll-Lock: iOS Safari ignorierte overflow:hidden am Body beim Touch-Scrollen. Alle Modals nutzen jetzt position:fixed mit gespeichertem Scroll-Offset — Hintergrund scrollt nicht mehr mit
Verkaufstresen-Modus: Eine neue eigenständige App-Ansicht für den Tresen ermöglicht Bestellungen, Runden und Kontoverwaltung für beliebige Mitglieder — mit vollständigem Offline-Betrieb, HMAC-gesichertem PIN-Schutz und Brute-Force-Härtung.
NeuVerkaufstresen-Modus (/counter): Eigene PWA für das Tresen-Gerät — Bestellungen für beliebige Mitglieder aufgeben, Runden erstellen/annehmen/schließen und Mitgliederkonten einsehen (Saldo, QR-Code, PayPal, Zahlungsanfrage)
NeuTresen-Login (/counter-login): Eigene Anmeldeseite mit Kiosk-Passwort — Session ist 30 Minuten gültig und unabhängig vom Kiosk-Login
NeuTresen-PIN-Schutz: Admins legen unter Admin → Einstellungen → Tresen einen PIN fest — 5 Fehlversuche sperren den PIN für 1 Minute, Sperrdaten sind HMAC-signiert und können nicht clientseitig manipuliert werden
NeuOffline-Betrieb am Tresen: Bestellungen werden bei fehlender Verbindung lokal in IndexedDB zwischengespeichert und beim Reconnect automatisch synchronisiert — identisches Verhalten wie der Kiosk-Offline-Modus
NeuTresen-Konto-Tab: Mitglied am Tresen auswählen → Saldo, SEPA-QR-Code, PayPal-Link und Zahlungsanfrage stellen — identisch zum Kiosk-Konto-Tab
NeuUndo am Tresen: Jede Tresen-Buchung kann innerhalb von 10 Sekunden rückgängig gemacht werden
VerbessertTresen-Einrichtung für Admins: Kiosk-Account-Panel in Admin → Einstellungen um Tresen-PIN-Verwaltung erweitert
BehobenSecurity: Saldo-IDOR geschlossen — Saldoabfragen sind jetzt auf das eigene Mitglied beschränkt und nicht mehr für beliebige Membership-IDs abrufbar
BehobenSecurity: Cron-Auth gehärtet — interne Cronjob-Routen prüfen jetzt einen signierten Token statt nur einer einfachen Passwortprüfung
BehobenSecurity: Kiosk-Token prüft zusätzlich die Org-Zugehörigkeit des Aufrufers — Cross-Org-Zugriff über fremde Kiosk-Tokens ist nicht mehr möglich
BehobenKiosk: Netzwerkfehler in Server-Action-Transitions führen nicht mehr zu unhandled rejections — Fehler werden sauber abgefangen
BehobenProdukte: Bildgröße wird jetzt clientseitig vor dem Upload geprüft (max. 4 MB) — kein unnötiger Upload-Versuch bei zu großen Dateien mehr
Begriffsschärfung und Sicherheits-Härtung: Der „Kassenbericht" heißt jetzt korrekt „Monatsbericht" — er zeigt Saldobewegungen der Mitglieder und ist kein buchhalterisch konformer Kassenbericht. Der Export-Bereich „Inventar" wurde in „Bestandsverwaltung" umbenannt. Im Hintergrund: ein Content-Security-Policy-Header, eine gehärtete Excel-Bibliothek und automatische Qualitätsprüfungen bei jedem Commit.
Verbessert„Kassenbericht" in „Monatsbericht" umbenannt: Der Bericht zeigt Saldobewegungen der Mitglieder, ist aber kein buchhalterisch konformer Kassenbericht — die neue Bezeichnung greift überall (Export-Seite, Automationen, Statistiken, PDF-Titel, Mail-Betreff und Dateinamen)
VerbessertExport-Bereich „Inventar" in „Bestandsverwaltung" umbenannt — konsistent zur Bezeichnung an anderen Stellen der App
VerbessertSicherheit: Content-Security-Policy-Header ergänzt — begrenzt erlaubte Verbindungsziele und schützt zusätzlich gegen Clickjacking und Formular-Hijacking
VerbessertSicherheit: Excel-Export-Bibliothek auf eine gepatchte Version aktualisiert (bekannte Schwachstelle der alten Version beseitigt)
VerbessertQualitätssicherung: Typprüfung, Linting und Build laufen jetzt automatisch bei jedem Commit — Fehler werden früher erkannt, bevor sie live gehen
Statistiken V2: Die Admin-Statistiken-Seite wurde komplett neu aufgebaut. Ein dynamischer Zeitraum-Selector (Diese Woche / Dieser Monat / Letzter Monat / Dieses Jahr / Alle / Benutzerdefiniert) filtert alle KPIs server-seitig. Vier neue Detailseiten bieten Drill-Down für Finanzen, Produkte, Mitglieder und Runden. Ein täglicher Cron-Job bereinigt automatisch abgelaufene Runden. Eine „Wissenswert"-Sektion zeigt Gesamtstatistiken aller Zeiten.
NeuZeitraum-Selector auf der Statistiken-Übersicht: 6 Chips (Diese Woche, Dieser Monat, Letzter Monat, Dieses Jahr, Alle, Benutzerdefiniert) — alle KPIs und Charts passen sich dynamisch an; Von/Bis-Eingabe für individuelle Zeiträume mit hellem Kalender und ohne Spinner-Pfeile
NeuNeue KPI-Reihen auf der Übersicht: 8 Kacheln in zwei Gruppen — zeitraum-sensitiv (Umsatz, Bestellungen, Ø Bestellwert, Einzahlungsquote) und Stand-jetzt (Offene Schulden, Ø Schulden/Mitglied, Mitglieder, Neue Mitglieder)
NeuDetailseite Finanzen (/admin/stats/finanzen): 5 KPIs, Doppel-Balkendiagramm (Umsatz und Einzahlungen im gleichen Slot), Breakdown-Tabelle mit Zeitraum-Zeilen und Gesamt-Footer
NeuDetailseite Produkte (/admin/stats/produkte): Top-20 nach Menge oder Umsatz (Tab-Switcher), Kategorie-Chips zum Filtern, Kategorien-Breakdown — Tab/Filter wechseln client-seitig ohne Seiten-Reload
NeuDetailseite Mitglieder (/admin/stats/mitglieder): Aktivste Mitglieder im Zeitraum, Höchste Schulden mit approximierter Schuldendauer, Inaktive Mitglieder (>90 Tage keine Bestellung), Mitglieder ohne Bestellungen als Chips
NeuDetailseite Runden (/admin/stats/runden): KPIs nach Modus getrennt (Drinks-Runden mit Sentinel-Erkennung, Kiste/Pool mit echten Einheiten), Status-Verteilung mit effektivem Status (abgelaufene Runden gelten als Abgeschlossen), Top-Rundenspender mit Einlösungen
NeuInventar-Kachel auf der Übersicht: Zeigt Anzahl getrackte Produkte und Anzahl unter Mindestbestand — nur sichtbar wenn Bestandsverwaltung für die Organisation aktiviert ist
NeuWissenswert-Sektion: Gesamtumsatz aller Zeiten, Gesamtanzahl Bestellungen, Runden gesamt mit Einlösungen, Lieblings-Produkt (meistbestelltes nach Stückzahl), Datum der ersten Bestellung
NeuCron-Job close-expired-rounds (täglich 01:00 UTC): Bereinigt automatisch alle aktiven Runden, deren Gültigkeit abgelaufen ist — Status wird von „active" auf „closed" gesetzt
VerbessertZurück-Button in allen Statistik-Unterseiten führt sauber zur Übersicht, von der Übersicht ins Admin-Dashboard — kein History-Stack durch Zeitraum-Chip-Klicks dank router.replace()
VerbessertDetails-Links auf der Übersicht: Umsatz-Trend → Finanzen, Top Produkte → Produkte, Höchste Schulden → Mitglieder, Runden → Runden
BehobenRundenstatistik zeigte falsche Einheitenzahlen: Drinks-Runden nutzen intern qty_total=9999 als Platzhalter — dieser Sentinel-Wert wird nun herausgefiltert; nur tatsächliche Claims werden als „Getränke eingelöst" gezählt
BehobenStatus-Label „closed" wurde roh angezeigt statt „Abgeschlossen"
Export-Zentrale, E-Mail-Versand und automatische Jobs: Eine neue Export-Seite bündelt 6 Exportfunktionen (PDF/CSV/XLSX), Mahnmails, Kassenbericht und Getränkebestellung können direkt per Klick versendet werden, und unter Automationen lassen sich alle drei Versandtypen als monatliche Cronjobs einrichten — mit Empfänger-Konfiguration, Zeitplanung und Ausführungsprotokoll.
NeuExport-Seite (/admin/exporte): Alle Exportfunktionen an einem Ort — Mitgliederliste, Anwesenheitsliste, Kontoauszug, Kassenbericht, Mahnliste und Getränkebestellung jeweils als PDF und CSV herunterladbar
NeuKassenbericht als XLSX: Monatlicher Finanzbericht mit allen Kontobewegungen und Kontoständen aller Mitglieder — als Excel-Tabelle mit separaten Reitern
NeuGetränkebestellung-Export: Vorschlagsliste der nachzubestellenden Produkte auf Basis von Mindestbestand und Zielbestand — als PDF und CSV
NeuMahnmails direkt versenden: Empfänger-Vorschau zeigt Name und Saldo aller betroffenen Mitglieder vorab; „Jetzt mahnen"-Button ist deaktiviert wenn keine Mitglieder mit E-Mail-Adresse vorhanden sind
NeuKassenbericht per Mail: Monatsbericht als XLSX-Anhang direkt aus der Export-Seite an ausgewählte Rollen versenden
NeuGetränkebestellung per Mail: Bestellvorschlag als PDF-Anhang direkt aus der Export-Seite versenden (nur wenn Bestandsverwaltung aktiv)
NeuAutomationen (/admin/automationen): Neuer Admin-Bereich für monatliche Cronjobs — Mahnmail, Kassenbericht und Getränkebestellung können als geplante Aufgabe eingerichtet werden mit Tag des Monats, Uhrzeit (Europe/Berlin, DST-sicher) und Empfänger-Rollenwahl
NeuEmpfänger-Vorschau in Automationen: Jede Job-Konfigurationskarte zeigt live, welche Mitglieder bei Ausführung eine Mail erhalten würden
NeuJob-Ausführungsprotokoll: Tabelle aller bisherigen Ausführungen mit Status (Erfolg / Übersprungen / Fehler), Anzahl Empfänger und Detailinfo
NeuAutomationen-Kachel im Admin-Dashboard: Schnellzugriff auf die neue Automationen-Seite direkt aus dem Dashboard
VerbessertGetränkebestellung-Job deaktiviert wenn Bestandsverwaltung ausgeschaltet ist — keine sinnlosen Leerbestellungen mehr
BehobenZurück-Button Navigation: Aus Export-Seite und Automationen gelangt man korrekt ins Admin-Dashboard, von dort immer in die Usersicht — keine History-Loop mehr
Offline-Modus für den Kiosk: Die Kiosk-PWA funktioniert jetzt auch ohne Internetverbindung. Mitglieder werden lokal per bcrypt-PIN authentifiziert, Bestellungen landen in einer lokalen Queue und werden beim Reconnect automatisch übertragen. Admins sehen offline erfasste Transaktionen transparent im Admin-Dashboard.
NeuKiosk-PWA offline nutzbar: Die Kiosk-Seite wird nach dem ersten Online-Start lokal gecacht (Service Worker, network-first) — bei Verbindungsunterbrechung bleibt die App vollständig bedienbar
NeuOffline-Bestellungen mit lokaler Queue: Bestellungen während einer Offline-Phase landen in einer lokalen Warteschlange (IndexedDB) mit Client-UUID — beim Reconnect werden sie automatisch und idempotent (ohne Doppelbuchung) übertragen
NeuLokaler PIN-Check ohne Server: PINs werden offline gegen den gecachten bcrypt-Hash geprüft — identisch sicher wie der serverseitige Check; 5 Fehlversuche sperren den PIN für 1 Minute
NeuDatenstand-Anzeige im Offline-Modus: Der Banner zeigt den Zeitpunkt des letzten Online-Stands; nach 24 h erscheint ein Hinweis. Ein vollständiger Datenstand bleibt offline nutzbar und wird beim Reconnect übertragen.
NeuGastkonto offline prüfbar: guest_valid_until aus dem Snapshot wird gegen den Bestellzeitpunkt geprüft — abgelaufene Gastkonten werden direkt offline erkannt und blockiert
NeuReconnect-Flush: Bei Wiederverbindung überträgt der Kiosk automatisch alle wartenden Bestellungen — grüner Toast „Wieder online — X Bestellungen übertragen ✓" oder roter Hinweis bei Fehler
NeuAdmin-Transparenz: Offline erfasste Bestellungen sind in Admin → Transaktionen mit ⚡-Badge sowie Info-Block (Bestellzeitpunkt, Sync-Zeitpunkt, Limit-Hinweis) gekennzeichnet — Admins sehen jederzeit ob und warum ein Saldolimit offline überschritten wurde
VerbessertKonto-Tab wird offline automatisch gesperrt (🔒): Saldo, SEPA-QR-Code und Zahlungsanfragen benötigen aktuelle Serverdaten und sind offline bewusst deaktiviert
VerbessertOnline-Detection zuverlässiger: Kombiniert navigator.onLine-Events mit einem echten HEAD-Ping auf /api/health (15 s Recovery, 45 s Heartbeat) — kein falsches „online" bei gefangenem WLAN mehr
VerbessertLagerbestand beim Sync: Bestand wird ohne Gate abgebucht (min. 0) — akzeptierter Inventur-Drift wird im Buchungskommentar dokumentiert
Kiosk Konto-Tab: Mitglieder sehen direkt am Kiosk ihren aktuellen Saldo, können per SEPA-QR-Code überweisen und eine Einzahlungsanfrage stellen — mit Echtzeit-Sync zwischen Kiosk und User-Modal. Dazu Kiosk-Seite als org-spezifische PWA speicherbar, Gastkonto-Fixes und Korrekturen an Stornofenster und Rundenlogik.
NeuKiosk Konto-Tab: Nach PIN-Eingabe erscheint neben „Bestellen" ein Tab „Konto" — zeigt den aktuellen Saldo (farbcodiert: rot = Schulden, grün = Guthaben), einen SEPA-EPC-QR-Code zum Scannen mit der Banking-App, IBAN/BIC/Kontoinhaber sowie ein vorausgefülltes Betrag-Feld und ein optionales Hinweis-Feld
NeuEinzahlungsanfrage direkt am Kiosk stellen: „Anfrage senden"-Button übermittelt die Anfrage an Admins — identische Logik wie im User-Modal (nur eine offene Anfrage möglich, bei offener Anfrage wird das Formular komplett ausgeblendet und nur ein amber Hinweis-Banner angezeigt)
NeuKiosk als org-spezifische PWA speicherbar: „Zum Homebildschirm hinzufügen" speichert jetzt die korrekte org-spezifische Kiosk-URL — jede Organisation hat ihr eigenes App-Icon und ihren eigenen Start-Link
VerbessertEchtzeit-Sync für Zahlungsanfragen: User-Modal aktualisiert sich sofort wenn am Kiosk eine Anfrage gestellt wird (neues INSERT-Abonnement); Kiosk Konto-Tab nutzt Supabase Realtime statt Polling — möglich durch erweiterte RLS-Policy, die Kiosk-Accounts das Lesen org-eigener Anfragen erlaubt
BehobenStornofenster „heute": Die Grenze für dasselbe Bestelldatum berechnete sich in UTC statt Europe/Berlin — Bestellungen kurz vor Mitternacht konnten am nächsten Morgen fälschlicherweise nicht mehr storniert werden
BehobenStornierung öffnet abgelaufene Runden nicht mehr: Wurde eine bereits automatisch geschlossene Runde (valid_until abgelaufen) durch eine Stornierung wieder rückabgewickelt, erschien sie irrtümlich als „aktiv" — Runden werden jetzt nur zurückgeöffnet wenn valid_until noch nicht abgelaufen ist
BehobenGastkonto erscheint nach Aktivierung automatisch in der Kiosk-Mitgliederliste — ein 15s-Poller sorgt dafür, dass kein manueller Browser-Reload mehr nötig ist
BehobenGastkonto kann bestellen: Server-seitige PIN-Prüfung lehnte Gastkonten ab, weil kein PIN hinterlegt ist — Gastkonten erhalten jetzt automatisch ein signiertes Token ohne PIN-Eingabe
Transparenz bei Stornierungen: Jede Stornierung verlangt jetzt einen Pflichtgrund und protokolliert wer storniert hat — sichtbar im User-Verlauf und im Admin-Dashboard. Admins können Bestellungen direkt aus der Transaktionen-Ansicht stornieren. Dazu Zeitraum-Filter in der Bestandshistorie und mehrere Korrekturen.
NeuStornierungsgrund als Pflichtfeld: beim Stornieren einer Bestellung (User, Kiosk, Admin) öffnet sich ein Modal mit Pflichtfeld — der Grund wird gespeichert und ist im Verlauf für alle Beteiligten einsehbar
Neu„Storniert durch" Protokollierung: jede Stornierung speichert wer sie durchgeführt hat — Name und Grund erscheinen im User-Verlauf und in Admin → Transaktionen
NeuAdmin-Stornierung in Transaktionen: Admins und Kassierer können aktive Bestellungen direkt aus der Transaktionen-Ansicht heraus stornieren (mit Pflichtgrund, kein Zeitfenster)
NeuZeitraum-Filter in Bestandshistorie: Von/Bis-Datumseingaben filtern die Buchungshistorie auf einen beliebigen Zeitraum — Einstellung bleibt beim Blättern erhalten
VerbessertAktive Runden erscheinen auf der Startseite jetzt zwischen Monatsranking und den Buttons „Bestellung aufgeben" / „Runde ausgeben" — logischere Positionierung
BehobenKisten-Sortierung in Bestellung und Kiosk folgt jetzt der Kategorie- und Produktreihenfolge (wie Einzelprodukte) — keine zufällige Vermischung mehr
BehobenKiosk QR-Code und generierte Links zeigten fälschlicherweise strichfrei.app statt strichfrei.de — Domain ist jetzt zentral hinterlegt
BehobenRückgängig-Aktion (10-Sekunden-Fenster) protokolliert automatisch „Fehlbuchung/Rückgängig" als Stornierungsgrund
Runde ausgeben im Kiosk: Mitglieder können nach PIN-Eingabe direkt am Kiosk eine Runde ausgeben — mit demselben 3-Modus-Modal wie in der App (Getränke / Kiste / Pool). Karten zeigen jetzt vollständige Details, eigene Runden sind claimbar und Echtzeit-Synchronisation sorgt dafür, dass Kiosk und App immer denselben Stand zeigen.
NeuRunde ausgeben im Kiosk: nach PIN-Eingabe erscheint links neben „Bestellen" ein kompakter „Runde ausgeben"-Button — öffnet das vollständige Runden-Modal mit allen 3 Modi
Neu3-Modus Runden-Modal überarbeitet: Getränke-Runde (Kontingent pro Person), Kisten-Runde (Gesamtmenge), Getränke-Pool (freies Kontingent für beliebige Getränke) als drei klare Tabs
NeuKiosk-Rundenkarten mit vollständigen Details wie in der App: Modus-Badge, Status-Zeile mit verbleibender Menge und Gültigkeit, Mengen-Input für Kisten, Schließen-Button für eigene Runden, Gesamtbeanspruchungen
VerbessertEigene Runden im Kiosk claimbar: Sponsoren können ihre eigene Runde jetzt auch am Kiosk selbst annehmen — identisches Verhalten wie in der App
BehobenRunde erscheint sofort nach dem Erstellen in der Kiosk-Liste — kein Warten auf Realtime-Verzögerung mehr
BehobenBereits beanspruchte Runden werden beim Kiosk-Login vorbelegt — kein erneutes „Annehmen" nach erneuter PIN-Eingabe möglich
BehobenMengen-Input für Kisten-Runden im Kiosk: Eingabefeld neben „Annehmen" für die gewünschte Stückanzahl (Standard 1, max. qty_remaining)
BehobenKisten-Runde aktualisiert sich nach dem Claim sofort: 2 Sekunden „✓ Prost!" dann zurück zum Annehmen-Button mit aktualisierten Zahlen — bei weiterer Restmenge weiterhin claimbar
BehobenKiosk-Runden bleiben für alle Mitglieder zuverlässig aktuell: round_claims-Realtime-Subscription, 30-Sekunden-Polling und Tab-Visibility-Refresh als dreischichtiger Fallback
BehobenUsersicht aktualisiert sich sofort wenn jemand im Kiosk eine Runde annimmt — fehlender revalidatePath-Aufruf in claimRoundViaKiosk ergänzt
BehobenPreise aus aktiven Runden entfernt: Kiosk-Karten und Einheiten-Dropdown in der Usersicht zeigen keine Preise mehr — für Annehmende ist der Preis nicht relevant
Kisten, Suche & Realtime: Kistenpreis in Runden, Produkt- und Kategorie-Suche im Kiosk und SelfOrder, sortierbare Kisten-Reihenfolge und durchgängige Echtzeit-Updates in Verlauf, Kontostand und aktiven Runden.
NeuAnteiliger Kistenpreis bei Kisten-Runden: wird beim Annehmen anteilig pro beanspruchter Einheit berechnet und korrekt abgebucht
NeuKistenpreis direkt bei Einsorten-Vollkisten in Kiosk und SelfOrder: Gesamtpreis pro Kiste erscheint automatisch wenn eine Kiste nur ein Produkt enthält
NeuSuche + Kategorie-Filter in Kiosk und SelfOrder: Produktsuche und Kategorie-Tabs sind kombinierbar; Kisten erscheinen inline in der Produktliste und haben einen eigenen Tab
NeuKisten-Reihenfolge sortierbar: Admin kann Kisten-Produkte im Reihenfolge-Manager per Drag & Drop und ▲▼-Buttons anordnen
NeuAktive Runden in der App aktualisieren sich live: neuer RoundsRefresher hört auf rounds- und round_claims-Änderungen — neue Runden erscheinen sofort, Mengen nach Claims werden sofort aktualisiert
VerbessertKiste bestellen überarbeitet: Counter-Flow statt Modal, Produktbilder sichtbar, gesamte Kisten-Zeile ist klickbar (+1)
VerbessertKisten-Sektion folgt aktivem Kategorie-Filter — nur Kisten der gewählten Kategorie erscheinen, kein Mischen mehr
VerbessertSession-TTLs explizit gesetzt: reguläre Session = 1 Tag, „Angemeldet bleiben" = 30 Tage, Superadmin = 1 Jahr
BehobenBestellverlauf und Kontostand aktualisieren sich nach Kiosk-Buchungen sofort via Realtime — kein manueller Seitenrefresh mehr nötig
BehobenBestandshistorie zeigte Uhrzeiten in UTC statt Europe/Berlin — Zeitstempel sind jetzt korrekt lokalisiert
BehobenRealtime-Refresher stabiler: automatischer Reconnect bei Channel-Fehler, visibilitychange-Refresh wenn Tab wieder aktiv wird
Kiosk-Accounts ohne E-Mail-Adresse: Admins legen ein gemeinsames Tablet-Konto direkt in den Org-Einstellungen an — nur ein Passwort, kein echtes E-Mail-Konto nötig. Dazu QR-Code für schnelles Einrichten, dedizierte Login-Seite und mehrere Sicherheits-Fixes.
NeuKiosk-Account pro Organisation: Admin vergibt in den Org-Einstellungen ein Passwort — ein gemeinsames Tablet-Konto ohne echte E-Mail-Adresse, das direkt in den Kiosk der Org einloggt
NeuQR-Code & Login-Link: Nach dem Anlegen zeigt das Panel einen kopierbaren Link sowie einen QR-Code zum Scannen mit dem Tablet
NeuDedizierte Kiosk-Login-Seite (/kiosk-login?org=…): nur Org-Slug und Passwort — keine sichtbare E-Mail-Adresse
NeuAdmin-Exit-Button im Kiosk: Admins die versehentlich im Kiosk landen sehen oben rechts „← Admin-Dashboard" und kommen sofort wieder raus, ohne in einer Redirect-Schleife zu landen
VerbessertKiosk-Verwaltung aus der Mitgliederliste herausgelöst: Kiosk-Accounts erscheinen nicht mehr in der Mitgliederliste und werden nicht über die Rollenzuweisung verwaltet, sondern über einen eigenen Bereich in den Einstellungen
BehobenKiosk-Route war für alle eingeloggten Mitglieder zugänglich — Zugriff ist jetzt auf Admins und den dedizierten Kiosk-Account beschränkt
BehobenKiosk-Login überschreibt jetzt keine bestehende Admin-Session mehr — verhindert die Redirect-Schleife bei der ein Admin im Kiosk gefangen war
EntferntTote Datenbanktabellen entfernt: kiosk_devices, audit_log, notifications, notification_preferences, price_history sowie nie befüllte Spalten payments.period_start / period_end
Alle Geldbuchungen laufen jetzt über atomare PostgreSQL-Funktionen — kein inkonsistenter Zustand bei Fehlern mehr. Dazu Sofort-Rückgängig nach jeder Bestellung, überarbeitetes Undo-UI und umfangreiche Code-Qualitätsverbesserungen.
NeuAtomare Geldbuchungen: place_order, claim_round, cancel_order und undo_order als PostgreSQL SECURITY DEFINER Funktionen — alle Schreibvorgänge (Bestellung, Bestand, Runden-Kontingent, Storno-Rückbuchung) laufen in einer einzigen Transaktion; kein inkonsistenter Zustand bei Fehlern mehr möglich
NeuSofort-Rückgängig: Direkt nach jeder Buchung (Kiosk + Self-Order) erscheint ~10 Sekunden lang eine „Rückgängig"-Kachel — ein Tap macht die Buchung vollständig rückgängig, unabhängig von der Org-Storno-Einstellung (Fehlklick-Korrektur durch dieselbe Person)
Neuorders.source: Jede Buchung merkt sich die Herkunft (self / kiosk / counter) — Basis für künftigen Verkaufstresen-Modus
NeuProd-Asserts: Beim Start in Produktion werden fehlende Pflicht-Umgebungsvariablen sofort gemeldet statt still zu scheitern
VerbessertRückgängig-UI überarbeitet: „Weiter/Fertig" ist jetzt der große primäre Button, Rückgängig eine kleinere rote Kachel darunter — verhindert versehentliche Taps auf Mobile und Tablet
VerbessertOrg-Checks zentralisiert: requireOrgAdmin-Helper und userId direkt aus requireOrgAccess — redundante Auth-Aufrufe in payments.ts, payment-requests.ts und inviteMember entfernt
BehobenEigene Runde beanspruchen war nach dem RPC-Refactoring fälschlicherweise gesperrt — Sponsoren können ihre eigene Runde jetzt wieder selbst beanspruchen
Entferntinventory-utils.ts entfernt: Komplette Inventar-Logik läuft jetzt in den Postgres-RPCs — der doppelte clientseitige Code war toter Ballast
Personalisierte Mitgliedereinladungen via E-Mail, überarbeitetes Einladungs-Dashboard mit Statusfiltern und neue Admin-Rankings mit Zeitraumfilter.
NeuMitglied direkt per E-Mail einladen: personalisierter Einladungslink (einmalig verwendbar, 7 Tage gültig) wird automatisch per E-Mail von noreply@strichfrei.de verschickt — kein Supabase-Umweg mehr, vollständige Kontrolle über Absender und Inhalt
NeuAdmin-Rankings mit Zeitraumfilter: Von/Bis frei wählbar, Award-Tabellen (Bierkönig, Spender des Monats) zeigen die Rangliste für den gewählten Zeitraum
NeuEinladungs-Dashboard neu gestaltet: eine Kachel, zwei Rubriken — allgemeiner Einladungslink und direkte personalisierte Einladungen mit Statusfilter (Ausstehend / Angenommen / Widerrufen / Abgelaufen). Kachel und Direkteinladungen-Bereich sind je separat ein-/ausklappbar
VerbessertBenachrichtigungseinstellungen im Profil: alle Orgs sind einzeln ein-/ausklappbar — übersichtlicher bei mehreren Organisationen, standardmäßig alles zugeklappt
BehobenDatumsfilter in den Rankings: Zukunftsdaten waren fälschlicherweise gesperrt; Dark-Mode-Kalender (nativer Datepicker-Popup) war kaum lesbar — beides behoben
BehobenNavigation: Zurück-Button landete nach einer Mitglieder-Einladung auf der Erfolgsseite (?invited=1) — Erfolgsanzeige ist jetzt reiner UI-State ohne URL-Manipulation, Browser-Verlauf bleibt sauber
BehobeniOS PWA: stummer „Connection closed"-Fehler nach dem Login verhinderte die Weiterleitung ins Dashboard — Fehler wird jetzt abgefangen
BehobeniOS WKWebView: Doppelter Trigger beim Registrierungs-Bestätigungslink verhindert — Bestätigung läuft jetzt über eine eigene, einmalig ausführbare Route
BehobenReihenfolge-Panel öffnete sich leer wenn eine Org nur 1 Produkt in 1 Kategorie hat — erklärender Hinweis zeigt jetzt, ab wann Sortieroptionen erscheinen
BehobenEinladungslink in der E-Mail zeigte fälschlicherweise app.strichfrei.de statt strichfrei.de als Domain
Bestandsverwaltung live: Produkte mit leerem Lager sperren sich automatisch und zeigen sofort „Nicht vorrätig" — Bestandsänderungen wirken in Echtzeit ohne Seitenreload. Dazu dreifache Absicherung gegen doppelte Einheitstypen und ein verbessertes Superadmin-Dashboard.
NeuNicht-vorrätig-Anzeige: Produkte mit leerem Lagerbestand werden im Kiosk und Self-Order automatisch gesperrt — rot markiert mit „Nicht vorrätig"-Badge, Bestellung nicht mehr möglich
NeuEchtzeit-Bestandsänderungen: Zu- und Abgänge (Lieferung, Inventur, Bestellung) wirken sofort auf Kiosk und App — ohne Seitenreload dank Supabase Realtime
VerbessertBestandssemantik: Bestand nie eingepflegt (NULL) wird wie Bestand = 0 behandelt — ein Produkt ist nicht bestellbar, bis ein realer Bestand erfasst wurde
BehobenEinheitstyp-Duplikate pro Produkt verhindert: DB-Unique-Constraint, Server-seitige Prüfung vor dem INSERT und UI-Filterung (bereits verwendete Typen sind nicht mehr auswählbar) sichern gemeinsam ab, dass kein Typ doppelt zugewiesen werden kann
VerbessertSuperadmin-Dashboard: Volltextsuche über alle Organisationen (Name, Slug, Eigentümer-E-Mail) und einklappbare Archiv-Rubrik für inaktive Organisationen
Stabilität und Datenkonsistenz: atomare Produktanlage, einheitliche Produktreihenfolge, Echtzeit-Saldo-Anzeige und mehrere Superadmin-Bugfixes.
NeuEchtzeit-Saldo: Bestellungen aus dem Kiosk aktualisieren den Kontostand des Mitglieds unmittelbar — kein Seitenreload mehr nötig, um den aktuellen Saldo zu sehen
BehobenSuperadmin-Dashboard: Einheitentypen und Produktpreise waren im Superadmin-Modus unsichtbar — RLS-Policies der Tabellen org_unit_types und product_units nutzten rohe Subqueries ohne Superadmin-Bypass und wurden auf die bewährten is_org_member() / is_org_admin()-Hilfsfunktionen umgestellt
BehobenQR-Code Verwendungszweck enthielt bisher auch den Hinweistext aus den Zahlungseinstellungen — im Verwendungszweck steht jetzt ausschließlich Vor- und Nachname des Mitglieds
BehobenNeues Produkt konnte ohne Einheiten in der Datenbank landen, wenn der Insert der Einheiten scheiterte und der anschließende Cleanup-Delete ebenfalls fehlschlug — Produktanlage ist jetzt atomar: eine PostgreSQL-Funktion legt Produkt und Einheiten in einer einzigen Transaktion an, bei Fehler rollt alles automatisch zurück
BehobenProduktreihenfolge war in Admin-Dashboard, Kiosk und SelfOrder-Ansicht unterschiedlich, weil alle neuen Produkte denselben sort_order (0) erhielten und die drei Ansichten den Gleichstand unterschiedlich auflösten — alle Ansichten nutzen jetzt einheitlich sort_order → Name als Tiebreaker
VerbessertNeue Produkte werden automatisch ans Ende ihrer Kategorie einsortiert (sort_order = max + 10) statt alle auf 0 zu landen — die manuell eingestellte Reihenfolge bleibt dadurch stabil
VerbessertOrganisation anlegen (Superadmin): scheitert das Anlegen der Standard-Einheitentypen, wird die Organisation sofort wieder gelöscht (Rollback) statt einen inkonsistenten Zustand zu hinterlassen
VerbessertBestehende Organisationen ohne Einheitentypen erhalten automatisch „Stück" und „Kiste" nachträglich — Nachrüstmigration stellt sicher, dass Produkte in allen Orgs sofort bearbeitbar sind
Entfernt„Stornierungen bei Guthaben" wurde als Admin-Option entfernt — die Einstellung hatte in der Praxis keinen Nutzen und erzeugte Verwirrung
Bestandsmanagement grundlegend erweitert: lückenlose Bestandshistorie (inkl. Bestellungen), Schwellwerte für Mindest- und Zielbestand je Produkt sowie eine komplett überarbeitete Tab-Navigation.
NeuBestandshistorie: vollständige, paginierte Bewegungsliste — Zugänge (Lieferung, Inventur, Korrekturen), Abgänge aus Bestellungen und Stornierungen sind lückenlos mit Zeitstempel, Buchungsgrund und ausführendem Mitglied dokumentiert
NeuBestandshistorie je Produkt: Produkt in der Bestandspflege aufklappen → direkt gefilterte Historie nur für diesen Artikel
NeuSchwellwerte je Produkt: Mindestbestand (ab wann bestellen) und Zielbestand (wie viel auffüllen) — Grundlage für die spätere automatische Bestellmail an den Getränkehändler
NeuErklär-Icons (ⓘ) bei Mindestbestand und Zielbestand: Hover (Desktop) oder Antippen (Mobile) zeigt eine kompakte Erklärung was der jeweilige Wert bedeutet und wie er bei Bestellungen wirkt
NeuBestandsstatus-Badges: visueller Ampelstatus direkt auf der Produktkachel — „⚠ Mindestbestand" (rot) wenn der Bestand den Schwellwert erreicht oder unterschreitet
VerbessertInventar-Navigation: Bestandspflege und Bestandshistorie sind jetzt als klare Tabreiter oben getrennt — kein endloses Scrollen mehr an 86+ Produkten vorbei, um zur Historie zu kommen
VerbessertBestandshistorie: Filter (Produkt, Buchungsgrund, Zeitraum) und Paginierung nutzen URL-Parameter — alle Links verwenden „replace" statt „push", d. h. der Browser-Zurück-Button führt immer zurück ins Admin-Dashboard, nicht durch einzelne Filterzustände
BehobenBestellungen reduzierten den Lagerbestand, tauchten aber nie in der Bestandshistorie auf — alle drei Abzugspfade (Kiosk-Bestellung, Self-Order, Runden-Claim) schreiben jetzt einen Eintrag mit Grund „Bestellung" und Referenz auf das Mitglied
BehobenStornierungen wurden ebenfalls nicht protokolliert — auch Stornobuchungen erscheinen jetzt mit eigenem Eintrag (Grund „Stornierung") in der Historie
BehobenMobile UX: Spinner-Pfeile (▲▼) aus Mengen-Inputs in der Bestandspflege entfernt — Eingabefelder verwenden jetzt type="text" + inputMode="numeric" statt type="number"
Dark- und Light-Mode wählbar: Die App startet standardmäßig im dunklen Design, kann aber im Profil dauerhaft auf Hell oder System umgestellt werden.
NeuDark-/Light-Mode-Umschalter im Profil: Dunkel (Standard), Hell oder Systemeinstellung — Auswahl wird lokal gespeichert und sofort ohne Seitenreload übernommen
VerbessertAlle Seiten und Komponenten (Admin, Kiosk, Profil, Marketing) sind vollständig auf beide Modi ausgelegt — kein Flackern beim ersten Laden dank SSR-sicherem Script-Inject
Umfangreiche Security-Härtung nach internem Audit: Tenant-Isolation für alle Geldbuchungen, serverseitige Kiosk-PIN-Prüfung, CSV-Injection-Schutz und weitere Schließungen.
BehobenSecurity: Geldbuchungen (Einzahlung, Auszahlung, Umlage) werden jetzt immer gegen die verifizierte Organisation des aufrufenden Nutzers geprüft — ein Admin konnte theoretisch Mitglieder einer fremden Organisation buchen (Tenant-Isolation)
BehobenSecurity: Kiosk-PIN-Validierung erfolgt vollständig serverseitig und ist an das Org-Token gebunden — clientseitige Umgehung ist nicht mehr möglich
BehobenSecurity: verify_kiosk_pin ist jetzt an die Organisation des Aufrufers gebunden — ein Kiosk-Token einer anderen Org konnte PINs gegen eine fremde Org prüfen
BehobenSecurity: CSV-Exporte (Mitglieder, Inventur) sind gegen Formula- und Quote-Injection gehärtet — Felder mit =, +, -, @ oder Anführungszeichen werden korrekt escaped
BehobenSecurity: Open-Redirect in Auth-Callbacks und Zahlungsanfragen-Weiterleitungen geschlossen — only-relative-path-Prüfung verhindert Weiterleitungen auf externe Domains
BehobenSecurity: Org-Scoping in mehreren weiteren Server Actions lückenhaft — alle betroffenen Endpunkte prüfen jetzt membership.organization_id gegen die angefragte Org
VerbessertCode-Qualität: ESLint-Warnungen von 58 auf 13 reduziert, React-Rules-of-Hooks-Fehler behoben, Sentry-Demo-Seite entfernt
Produkteinheiten abgesichert, abgelehnte Zahlungsanfragen im Verlauf sichtbar und zahlreiche UX-Verbesserungen für Mobile.
NeuAbgelehnte Ein- und Auszahlungsanfragen erscheinen jetzt im Transaktionsverlauf des Mitglieds — mit „Abgelehnt"-Badge und durchgestrichenem Betrag
NeuAbgelehnte Zahlungsanfragen sind auch in der Admin-Transaktionssuche (Zahlungen-Filter) sichtbar
NeuZahlungs- und Auszahlungs-Modal öffnet auf Mobile jetzt als Bottom-Sheet von unten — ergonomischer auf dem Smartphone
NeuBeim Anlegen einer neuen Organisation werden automatisch die Einheitentypen „Stück" und „Kiste" erstellt — Produkte können sofort angelegt werden
VerbessertEinheitentyp löschen: Wird ein Typ noch von Produkten verwendet, erscheint eine verständliche Fehlermeldung statt eines rohen Datenbankfehlers
VerbessertLetzte aktive Einheit eines Produkts kann nicht mehr deaktiviert werden — ein Produkt hat immer mindestens eine aktive Einheit
VerbessertIBAN-Feld in den Zahlungseinstellungen ist auf Mobile jetzt volles Feld (kein Zwei-Spalten-Layout mehr auf kleinen Screens)
VerbessertBestätigen/Ablehnen-Buttons bei offenen Zahlungsanfragen (Admin) haben jetzt iOS-konforme Touch-Target-Größe (min. 44 px)
VerbessertZahlungsdetails im Einzahlungs-Modal: QR-Code und IBAN-Angaben stapeln sich auf Mobile übereinander statt abgeschnitten nebeneinander
BehobenEinheitentyp-Fremdschlüssel auf RESTRICT geändert — Löschen eines Typs, der noch von Produkten genutzt wird, ist jetzt sicher blockiert
BehobenIrrtümlicher Hinweis „Reihenfolge bestimmt Darstellung im Kiosk" bei Einheitentypen entfernt
Zahlungsintegration: Mitglieder können ihren Saldo direkt über die App ausgleichen oder eine Auszahlung anfragen — mit SEPA-QR-Code, Admin-Bestätigungsflow und E-Mail-Benachrichtigungen.
NeuZahlungsanfragen: Mitglieder mit offenem Saldo sehen direkt in der Saldo-Kachel einen „Saldo ausgleichen"-Button — inkl. IBAN, BIC, Kontoinhaber und scannem SEPA-QR-Code für Banking-Apps
NeuAuszahlungsanfragen: Mitglieder mit Guthaben können eine Rückzahlung anfragen — der beantragte Betrag wird sofort als gesperrt angezeigt und vom verfügbaren Guthaben abgezogen
NeuAdmin-Dashboard: Offene Zahlungsanfragen erscheinen als einklappbares Panel — Admins und Kassierer können Anfragen mit einem Klick bestätigen oder ablehnen
NeuE-Mail-Benachrichtigungen: Admins und Kassierer erhalten eine E-Mail bei neuen Zahlungsanfragen (von noreply@strichfrei.de, im gleichen Design wie die Auth-Mails)
NeuBenachrichtigungseinstellungen im Profil: Admins, Kassierer und Bestandsmanager können E-Mail-Benachrichtigungen pro Org individuell aktivieren oder deaktivieren
NeuZahlungseinstellungen (Admin): IBAN, BIC, Kontoinhaber, optionaler PayPal.me-Link und Hinweistext für Mitglieder — mit IBAN Mod-97 und BIC ISO-9362-Validierung
NeuSEPA-QR-Code im Einzahlungs-Modal: Betrag passt sich live an, QR-Code ist als PNG speicherbar oder per Web Share (iOS/Android) teilbar
VerbessertSaldo-Anzeige berücksichtigt ausstehende Auszahlungsanfragen — angezeigter Saldo entspricht dem tatsächlich verfügbaren Betrag
VerbessertRangliste und Leaderboard werden nach Profilbild- und Namensänderungen sofort aktualisiert
BehobenAuszahlungsanfrage kann nicht mehr über das verfügbare Guthaben hinausgehen — sowohl client- als auch serverseitig geprüft
Superadmins können jetzt direkt in das Admin-Dashboard jeder Organisation springen — ohne Mitgliedschaft.
NeuSuperadmin-Dashboard: „Als Admin öffnen"-Button pro Organisation — direkte Weiterleitung ins Org-Admin-Dashboard mit vollen Admin-Rechten, ohne der Org beizutreten
VerbessertSuperadmin-Zugriff auf Org-Seiten wird in der Navigation kenntlich gemacht — kein Verwechslungsrisiko mit echten Mitgliedsrechten
Superadmins können Organisationen jetzt vollständig per Einladungslink bootstrappen — der erste Beitretende wird automatisch Admin.
NeuSuperadmin-Dashboard: Einladungslink pro Organisation generieren — Link erscheint direkt im Dashboard und kann per Klick kopiert werden
VerbessertErster User einer neu angelegten Organisation tritt automatisch als Admin bei, nicht als einfaches Mitglied — kein manueller DB-Eingriff mehr nötig
VerbessertOrg-Anlegen: Slug wird automatisch aus dem Namen abgeleitet (Umlaute korrekt umgeschrieben), Name und Slug bleiben nach einem Validierungsfehler erhalten
BehobenDoppelter Org-Slug zeigt jetzt eine verständliche deutsche Fehlermeldung statt einem rohen Datenbankfehler
BehobenFehlgeschlagene Beitrittsversuche über Einladungslinks werden jetzt mit dem genauen Fehlergrund geloggt (erleichtert Fehlersuche)
Deutlich schnellere App, überarbeitete PDF-Exporte mit Logo, AGB-Zustimmung bei der Registrierung und eine Rangliste, die sich sofort und konsistent aktualisiert.
NeuAGB-Zustimmung bei der Registrierung: neue Nutzer akzeptieren die AGB und bestätigen die Kenntnisnahme der Datenschutzerklärung aktiv per Pflicht-Checkbox — rechtlich sauber dokumentiert
VerbessertSpürbar schnellere App: Server nach Frankfurt verlagert (direkt neben der Datenbank), Anmelde-Prüfung läuft jetzt lokal statt über einen Server-Umweg, und die App-Hülle wird zwischengespeichert — Dashboard, Org-Wechsel und Rangliste öffnen deutlich flotter, besonders als Home-Screen-App
VerbessertPDF-Exporte überarbeitet: strichfrei-Logo in Kopf- und Fußzeile, Mitgliederliste reduziert auf Name + Saldo (nur aktive Mitglieder, sortiert wie im Kiosk: Nachname zuerst), gepunktete Leitlinien gegen Verrutschen in der Zeile
VerbessertInventurliste als Zähl-Vordruck: eine Zeile je Produkt mit eigener Spalte je Mengeneinheit (z. B. Stück und Kiste nebeneinander zum Eintragen), Produkte in der im Admin festgelegten Reihenfolge
VerbessertDatenschutz & Impressum aktualisiert: Sentry und Vercel Analytics als Auftragsverarbeiter ergänzt, Hinweis zur EU-Streitschlichtung im Impressum
BehobenRangliste & Monats-Awards aktualisieren sich jetzt sofort nach jeder Buchung — und Dashboard und Ranglisten-Seite zeigen garantiert dieselben Zahlen (vorher konnten sie veralten und auseinanderlaufen)
SEO-Update: Favicon erscheint jetzt zuverlässig in Google-Suchergebnissen, strukturierte Daten für bessere Markenerkennung.
BehobenFavicon in Google-Suchergebnissen: strichfrei-Logo wird jetzt stabil indexiert — bisher änderte sich die Favicon-URL bei jedem Deployment, was Google daran hinderte das Logo zu cachen
VerbessertStrukturierte Daten (JSON-LD): Organisation mit Logo, E-Mail und Instagram-Link angereichert — verbessert die Markenerkennung in Google
Qualitäts-Update: Absturz der Rangliste behoben, „Angemeldet bleiben" funktioniert jetzt zuverlässig, gelöschte Profilbilder werden wirklich entfernt und der Kiosk zeigt Avatar-Änderungen sofort.
BehobenRangliste: Absturz behoben, wenn nur Gast-Konten diesen Monat aktiv waren — Gast- und Kiosk-Konten werden jetzt vollständig aus allen Ranglisten-Berechnungen ausgeschlossen
Behoben„Angemeldet bleiben" deaktiviert: Session endet jetzt auch nach mehr als einer Stunde zuverlässig beim Schließen des Browsers (Token-Refresh hat die Einstellung zuvor überschrieben)
BehobenProfilbild löschen entfernt das Bild jetzt wirklich aus dem Speicher — bisher blieb die Datei öffentlich erreichbar. Gleiches gilt beim Bildtausch: die alte Datei wird aufgeräumt
VerbessertKiosk: Avatar-Änderungen werden jetzt per Echtzeit-Update sofort in der Mitgliederliste angezeigt, ohne manuellen Reload
VerbessertRangliste: Daten werden 5 Minuten gecacht — deutlich schnellere Ladezeit beim Aufruf der Detailseite
Profilbilder, polierter Login, Kiosk-Redesign mit Foto & Sortierfixes, neue Ranglisten-Detailseite mit Bierkönig und Spender des Monats.
NeuProfilbild: Jeder Nutzer kann ein Foto in seinem Profil hinterlegen — erscheint dann direkt in der Kiosk-Mitgliederliste
NeuRangliste: neue Detail-Seite mit Bierkönig (meiste Getränke) und Spender des Monats (meiste Runden) als Award-Karten, darunter die vollständige Monats-Tabelle
NeuLogin: Eingabefelder mit Icons (Briefumschlag / Schloss), Passwort-Sichtbarkeits-Toggle und „Angemeldet bleiben"-Checkbox — nicht angemeldet bleiben löscht die Session beim Schließen des Browsers
NeuPWA: Home-Screen-App öffnet jetzt direkt das Dashboard statt die Marketing-Seite — bei fehlender Session automatisch zum Login
VerbessertKiosk-Mitgliederliste: Kacheldesign mit Profilfoto / Initialen-Avatar und Chevron-Pfeil, sortiert nach Nachname (Gäste immer oben), Anzeige als „Nachname Vorname"
VerbessertMonatsranking-Teaser auf der Startseite ist jetzt anklickbar und führt zur neuen Detailseite
BehobenKiosk: Produkt-Dropdown bei Runden folgt jetzt der Admin-Sortierreihenfolge (Kategorie → Produkt → Einheit)
BehobenRangliste: Gast- und Kiosk-Konten erscheinen nicht mehr in den Ranglisten-Tabellen
Runden verbessert: Sponsor kann eigene Runde selbst beanspruchen, Kisten-Mengenauswahl per Eingabefeld, Verlauf aktualisiert sich sofort nach jeder Buchung und die Produktliste folgt der Admin-Reihenfolge.
NeuEigene Runde beanspruchen: Wer eine Runde ausgibt, kann sie jetzt auch selbst annehmen — mit denselben Regeln wie andere Mitglieder (qty_per_person-Limit bei Getränke-Runden)
NeuKisten-Mengenauswahl: Eingabefeld neben „Annehmen" — Standard 1, editierbar bis zur Restmenge. Auf Mobile öffnet automatisch die Zifferntastatur, kein Scrollen nötig
BehobenVerlauf aktualisiert sich nach jeder Buchung (Runde annehmen, Self-Order) sofort — kein manueller Seitenrefresh mehr nötig
BehobenProdukt-Dropdown bei Runden folgt jetzt der im Admin eingestellten Reihenfolge (Kategorie → Produkt → Einheit) statt zufälliger Datenbank-Reihenfolge
Kontakt-Sektion auf der Startseite, professionelle Transaktions-E-Mails über Resend, einheitliches schwarzgrünes E-Mail-Design und automatisiertes Fehler-Monitoring über Sentry.
NeuKontakt-Sektion auf der Startseite: schnell erreichbar über die Navigation — E-Mail (hallo@strichfrei.de) und Instagram direkt verlinkt
NeuFehler-Monitoring via Sentry: unerwartete Fehler werden automatisch gemeldet — Nutzer sehen eine klare Fehlermeldung mit „Nochmal versuchen"-Button statt einem leeren Bildschirm
VerbessertE-Mail-Versand: Supabase-Auth-Mails (Registrierung, Passwort zurücksetzen, Magic Link, Einladung) werden jetzt über Resend verschickt — zuverlässigere Zustellung, weniger Spam-Ordner
VerbessertE-Mail-Templates: alle 5 Transaktions-E-Mails im einheitlichen strichfrei-Design (schwarz/grün, SVG-Logo, BETA-Badge) — mit Hinweis, dass Antworten auf noreply@ nicht gelesen werden
VerbessertTechnisch: 168 automatisierte Tests + GitHub Actions CI — alle Kernfunktionen (Zahlungen, Umlage, Jugendschutz, Icons, Stornofenster, Inventar) werden bei jedem Push geprüft
Produkt-Icons mit automatischer Erkennung und manuellem Picker, vollflächig klickbare Kiosk-Kacheln und Instagram-Präsenz.
NeuProdukt-Icons: Automatische Emoji-Erkennung aus dem Produktnamen — Pils → 🍺, Cola → 🥤, Mineralwasser → 💧, Wein → 🍷 und weitere (30+ Regeln)
NeuIcon-Picker im Produkt-Formular: Emoji aus 5 Gruppen (Bier & Wein, Cocktails, Alkoholfrei, Essen, Sonstiges) manuell wählbar — oder auf automatische Erkennung zurücksetzen
BehobenKiosk: Produktkachel ist jetzt vollflächig klickbar (+1) — vorher musste man genau den + Button treffen. Identisches Verhalten wie im Self-Order-Modal
VerbessertKiosk: Leichtes Tap-Feedback (scale-Animation) beim Antippen einer Produktkachel
NeuInstagram-Link im Footer der Startseite (@strichfrei)
Technische Bereinigung: ESLint-Fehler behoben, veraltete Datenbankfunktionen entfernt, mobile Navigation stabilisiert und SEO-Verifikation ergänzt.
BehobenMobil: Langer Organisationsname in der Admin-Kopfzeile wird jetzt abgeschnitten (…) statt umzubrechen — Rolle (Admin/Kassierer) bleibt immer sichtbar
BehobenInternes Qualitätswerkzeug (ESLint) wieder funktionsfähig — Monorepo-Konfiguration korrigiert, alle Fehler behoben
EntferntVeraltete Datenbankfunktion place_kiosk_order entfernt — wurde durch das aktuelle Bestellsystem mit Produkteinheiten ersetzt und war nirgends mehr im Einsatz
EntferntAutomatischen RLS-Event-Trigger (rls_auto_enable) entfernt — alle Tabellen haben RLS explizit gesetzt, der Trigger war redundant
VerbessertSEO: Google Search Console Verifikation hinterlegt — Suchergebnisse können jetzt überwacht werden
VerbessertFehlende Datenbankfunktionen (create_organization, set_member_pin, reset_member_pin, verify_kiosk_pin) in die Versionsverwaltung aufgenommen — Staging und Produktion sind jetzt schema-identisch
Code-Review-Runde: bessere Nutzung großer Bildschirme, bereinigter Routenbaum und interne Verbesserungen an Wartbarkeit und Struktur.
VerbessertDesktop & Tablet: Admin-Dashboard, Produktverwaltung und Mitglieder-Ansicht nutzen jetzt mehr Bildschirmbreite (max-w-5xl statt max-w-4xl) — weniger ungenutzter Weißraum auf großen Monitoren
VerbessertAdmin-Dashboard: Statistik-Kacheln zeigen auf breiten Screens bis zu 4 Spalten nebeneinander
VerbessertAdmin-Produkte: Produktkacheln nutzen auf sehr breiten Screens eine vierte Spalte (xl:)
VerbessertKiosk-Produktgrid: stufenweise Spaltenanzahl — 2 (Handy) → 3 (Handy quer) → 4 (Tablet) → 5 (Desktop) für optimale Bildschirmauslastung
BehobenVeraltete Weiterleitungs-Routen /changelog und /handbuch entfernt — die URLs waren nie öffentlich erreichbar und sind jetzt vollständig aus dem Routenbaum bereinigt
VerbessertTechnisch: gemeinsamer Auth-Helper requireOrgMember zentral in lib/org statt in jeder Datei einzeln — weniger Duplikatcode, einfachere Pflege
VerbessertTechnisch: KioskProductCard als eigene Komponente extrahiert — Kiosk-Hauptdatei um ~115 Zeilen Duplikatcode reduziert
Produkt- und Kategorien-Reihenfolge per Drag & Drop, vollständige Kategorienverwaltung direkt in der Liste, kategorielose Produkte klar gekennzeichnet und SEO-Verbesserungen auf der Startseite.
NeuReihenfolge anpassen: Kategorien und Produkte per Drag & Drop oder ▲▼-Buttons sortieren — Reihenfolge gilt im Kiosk, Self-Order und der Produktliste
NeuKategorie löschen: rotes X direkt in der Kategorieliste — mit Doppelklick-Bestätigung (kein Browser-Dialog), Produkte werden vor dem Löschen abgefragt
NeuFSK je Kategorie: direkt in der Kategorieliste auswählen und sofort ohne Bestätigung gespeichert
NeuKategoriename inline umbenennen: Bleistift-Icon in der Kategorieliste — Enter zum Speichern, Escape zum Abbrechen
NeuKategorielose Produkte: amber Badge „⚠ Kategorie fehlt" auf der Produktkarte im Admin-Bereich als visueller Hinweis
NeuKiosk & Self-Order: Produkte ohne Kategorie erscheinen jetzt unter der Gruppe „Sonstige" statt unsichtbar zu sein
NeuReihenfolge-Modul: „Sonstige (keiner Kategorie zugeordnet)" zeigt kategorielose Produkte auch im Sortier-Manager, sortierbar ab 2 Produkten
NeuStartseite: App-Teaser-Leiste für iOS & Android (in Kürze verfügbar)
VerbessertStartseite: kurzer Erklärungstext ergänzt — beschreibt den eigenen Account und den gemeinsamen Kiosk-Tablet-Zugang
VerbessertReihenfolge-Modul: Refresh-Button (⟳) aktualisiert die Liste ohne kompletten Seiten-Reload
BehobenFavicon: Größe von 32 px auf 64 px erhöht — Google benötigt mindestens 48 px für die Darstellung des Logos in Suchergebnissen