Konzept: Kunde kauft eine Lizenz -> Admin legt einen Kunden an (oder nutzt
einen bestehenden) und weist ihm ein TICKET fuer eine Lizenz mit festen
Eckdaten (Typ/Module/Laufzeit) zu -- das Ticket ist die dauerhafte,
dem Kunden gehoerende Berechtigung, unabhaengig von der konkreten
signierten Lizenzdatei darunter. Admin ODER Kunde (per Self-Service-Link,
kein Login noetig) koennen aus einem offenen Ticket jederzeit eine Lizenz
erstellen, widerrufen und erneut erstellen -- ein Kunde kann mehrere
Tickets haben (z.B. mehrere Systeme).
Neu:
- license_tickets-Tabelle (id = unerratbares Token, customer_id, Typ/
Module/Laufzeit, status 'open'/'blocked'), licenses.ticket_id-Spalte.
Rueckwirkende Migration erzeugt fuer jede bereits VOR diesem Feature
direkt ausgestellte Lizenz automatisch ein passendes Ticket (sonst
waeren z.B. POETESTs bereits aktivierte Produktivlizenz oder die
Demo-Lizenzen im neuen, rein ticket-basierten Dashboard verschwunden) --
gegen eine echte Kopie der Live-Datenbank getestet.
- /tickets/new (Ticket anlegen, admin), /tickets/<id> (Details, Lizenz
aus Ticket erstellen -- reguraer laut Ticket-Typ ODER als Trial mit
vollem Modulumfang unabhaengig vom Ticket-Typ --, Ticket sperren/
entsperren).
- /self-service/<ticket_id>: oeffentlich erreichbar (kein Login), Zugriff
ueber Besitz des unerratbaren Ticket-Tokens (192 Bit Zufall) als 'Magic
Link' -- Kunde kann eigene Lizenz herunterladen, widerrufen und (mit den
Ticket-Eckdaten) neu erstellen. Link wird auf der Ticket-Seite angezeigt
und in die 'Lizenz per E-Mail senden'-Nachricht aufgenommen.
- /licenses/<id>/delete (admin): raeumt widerrufene oder nie aktivierte
Lizenzen auf, OHNE das zugehoerige Ticket anzutasten -- der Kunde (oder
Admin) kann sich ueber das Ticket jederzeit eine neue mit denselben
Eckdaten erzeugen.
- Bugfix: wird fuer einen Fingerprint eine neue Lizenz aktiviert (z.B.
Trial durch Enterprise ersetzt), werden jetzt automatisch alle ANDEREN
fuer denselben Fingerprint noch 'active' vermerkten Lizenzen auf
'deactivated' gesetzt -- vorher blieben beide faelschlich gleichzeitig
aktiv in der Uebersicht stehen. Bewusst nach Fingerprint gefiltert (ein
Kunde darf mehrere Systeme mit je eigener Lizenz betreiben).
- Dashboard zeigt jetzt Tickets statt roher Lizenzzeilen (inkl. aktueller
Lizenz je Ticket), Kunden-Seite zeigt Ticket-Anzahl statt Lizenz-Anzahl
mit Filter-Link aufs Dashboard.
SCHEMA_VERSION 1 -> 2 (neue Tabelle + Spalte, ueber install.sh-
Sicherheitsnetz mit Backup+Health-Check abgesichert).
Verifiziert: Migration gegen eine echte Kopie der Live-Datenbank
(POETESTs aktive Produktivlizenz + 3 Demo-Lizenzen) durchlaufen lassen --
alle 8 bestehenden Lizenzen haben danach ein Ticket, keine verwaist.
Anschliessend alle neuen Seiten (Dashboard, Ticket-Anlage, Ticket-Detail,
Self-Service) per Playwright gegen diese migrierte Kopie auf einem
isolierten Scratch-Port durchgeklickt, keine Fehler.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>