đŸŽ« Lizzy — OTRS Dashboard

Konzept, Herleitung und Designentscheidungen · Stand Mai 2026

Dieses Dokument ist die fortgeschriebene Version des v1-Konzepts (April 2026). Es beschreibt den aktuellen Stand und die Entscheidungen die zur heutigen Architektur gefĂŒhrt haben.

Warum dieses Tool?

Es geht nicht darum, die letzte Minute aus jedem Mitarbeiter herauszuholen. Es geht darum, Frust zu vermeiden — auf beiden Seiten.

Mitarbeiter die nicht wissen welches Ticket als nĂ€chstes dran ist, die mitten in einer Aufgabe unterbrochen werden weil unklar ist wer wofĂŒr zustĂ€ndig ist, die Hilfe brauchen aber nicht wissen wie sie sie koordinieren sollen — das kostet Energie, die dann fĂŒr die eigentliche Arbeit fehlt.

Kunden die lange warten, keine RĂŒckmeldung bekommen oder das GefĂŒhl haben ihr Anliegen geht unter — das kostet Vertrauen.

Wenn beides besser lĂ€uft — das Team arbeitet strukturierter, Kunden bekommen schnellere und verlĂ€sslichere Antworten — dann ist das der eigentliche Gewinn. Dass dabei auch die Effizienz steigt und am Ende mehr Spielraum bleibt, ist eine Konsequenz davon, nicht das Ziel.

Das Dashboard ist ein Werkzeug fĂŒr das Team, nicht zur Kontrolle des Teams.

Ausgangslage

OTRS 5 ist das eingesetzte Ticketsystem. Es bietet keine Ansicht, die zeigt, wer gerade woran arbeitet, wie hoch die Auslastung des Teams ist, oder in welcher Reihenfolge Tickets abgearbeitet werden sollen. Das System verwaltet Tickets — aber kein Dispatching.

Das Dashboard entstand aus dem Wunsch, genau diese LĂŒcke zu schließen: Wer macht was, in welcher Reihenfolge, und wieviel KapazitĂ€t ist noch frei?

v1 (April 2026) war ein Browser-Prototyp in einer einzigen HTML-Datei mit localStorage. Er hat bewiesen, welche Features sinnvoll sind und wie der Workflow funktioniert. v2 (Lizzy, ab Mai 2026) ist die produktive Server-Version — alle Mitarbeiter sehen denselben Zustand, OTRS wird auch beschrieben, und KI unterstĂŒtzt aktiv beim Dispatching.

Technische Grundentscheidungen

PHP + MySQL statt Flask/Python

Der Stack ist bewusst gewĂ€hlt. PHP lĂ€uft direkt unter Apache ohne separate Prozesse, MySQL ist fĂŒr das Team vertraut. Kein Build-Schritt, kein Node.js, keine Containerisierung. Das Ziel war eine Architektur die jemand mit Standard-Hosting-Erfahrung warten kann.

Zentrale Datenbank statt localStorage

Das grĂ¶ĂŸte Limit von v1 war der browserspezifische Zustand — zwei Personen sahen zwei unabhĂ€ngige Welten. Lizzy hat eine zentrale MariaDB auf einem separaten Server (ĂŒberlebt Server-Neuaufbau). Alle Dispatch-ZustĂ€nde, Zeitfenster, SchĂ€tzungen und KI-Caches liegen dort. Alle Mitarbeiter sehen denselben Stand.

OTRS wird auch beschrieben

v1 hat OTRS nur gelesen. Lizzy schreibt aktiv zurĂŒck: Tickets zuweisen (Owner Ă€ndern), Tickets schließen, interne Notizen posten, Zeiteinheiten buchen. Das erforderte einen eigenen OTRS-API-User mit entsprechenden Rechten. Alle Aktionen laufen ĂŒber den GenericTicketConnector.

Sync-Daemon statt Live-Abfragen

Ein Python-Daemon (otrs_sync.py) synchronisiert OTRS jede Minute in einen lokalen Cache. Der Browser fragt nie direkt OTRS — er liest aus dem lokalen Cache. Das hĂ€lt OTRS-Last niedrig und Antwortzeiten schnell. Der Kompromiss: Änderungen aus OTRS sind erst nach bis zu 60 Sekunden sichtbar. Aktionen aus dem Dashboard (Zuweisen, Schließen) aktualisieren den Cache sofort lokal.

Lokale KI — kein Cloud-LLM

Alle KI-Funktionen laufen ĂŒber Ollama lokal auf dem Server. Kein OpenAI, kein Anthropic, keine externen Dienste. Modell fĂŒr Text: qwen3:14b. Modell fĂŒr Embeddings: nomic-embed-text. Das war eine bewusste Entscheidung: Ticket-Inhalte verlassen das Netzwerk nicht. Konsequenz: Die QualitĂ€t ist etwas schlechter als GPT-4, dafĂŒr kein Datenschutzproblem und keine laufenden API-Kosten.

Deployment via Gitea CI/CD

Jeder Push auf einen Branch mit offenem Pull Request löst automatisch ein Deployment aus. Gitea Actions baut ein Artifact, lĂ€dt es in die Package Registry und ruft per Webhook einen CI/CD-Controller auf, der das Artifact auf dem Dev-Server auspackt und setup.sh ausfĂŒhrt. Kein manuelles Eingreifen nötig.

Das Dispatching-Konzept

Der zentrale Gedanke aus v1 ist unverÀndert: Ein Mitarbeiter kann immer nur eine Sache gleichzeitig tun. Das Dashboard macht das sichtbar und planbar.

Dispatch-Tab (Dispatcher-Ansicht)

Jeder aktive Mitarbeiter hat eine Karte mit seinem aktuellen Ticket ("Aktuell in Bearbeitung") und seiner Queue (priorisierte Liste, Drag & Drop). Der Dispatcher weist Tickets per Drag zu. Tickets können auch zwischen Mitarbeitern gezogen werden. Sortierung: Anwesend → Helpdesk → Pause → Vor Ort → Abwesend → Urlaub.

Zeitfenster-Tab (Tages- und Wochenplanung)

Neben der tagesaktuellen Queue gibt es Zeitfenster: geplante Arbeitsblöcke pro Mitarbeiter und Tag. Der Dispatcher plant dort Tickets mit ZeitschĂ€tzung ein. Vor dem Einplanen muss eine SchĂ€tzung gesetzt sein — sonst Fehlermeldung ("Bitte erst SchĂ€tzung setzen"). KapazitĂ€tsprĂŒfung: Wenn die Summe der SchĂ€tzungen die Fensterdauer ĂŒberschreitet, wird gewarnt. Die 300-Minuten-Annahme aus v1 ist damit teilweise abgelöst — durch echte Zeitfenster statt eines pauschalen Limits.

Ticket Pool

Neben der Dispatcher-gesteuerten Zuweisung gibt es den Ticket-Pool-Ansatz: Mitarbeiter wĂ€hlen selbst aus einem Pool offener Tickets. Das passt zu Teams die eigenverantwortlich arbeiten und keinen dedizierten Dispatcher haben. Im Lizzy-Modell ist das eine ergĂ€nzende Option — die KI-VorschlĂ€ge dienen als Orientierung, der Mitarbeiter trifft die endgĂŒltige Wahl. Ticket Pool und Dispatcher-Zuweisung schließen sich nicht aus; manche Tickets werden aktiv zugewiesen, andere landen im Pool fĂŒr Selbstselektion.

Abrechnung beim Schließen

Wenn ein Ticket geschlossen wird, können Zeiteinheiten (Minuten) und ein Abrechnungstext erfasst werden. Der Abrechnungstext (Lazy Text) wird als !B{Inhalt} in die OTRS-Notiz geschrieben — ein Format das das interne Abrechnungssystem von inmedias.it erkennt und extrahiert. ZusĂ€tzlich gibt es einen Lazy Notiz-Felder (!N{Inhalt}) fĂŒr interne Anmerkungen. Bei Icinga-Update-Tickets wird "Updates installiert" + 5 Minuten automatisch vorausgefĂŒllt.

Zwei Betriebsmodi: Live und Zeitfenster

Lizzy unterstĂŒtzt zwei grundlegend verschiedene Arbeitsweisen. Ein Mitarbeiter kann einen oder beide Modi verwenden.

⚡ Live-Modus

Zeigt was gerade jetzt passiert. Der Dispatcher sieht in Echtzeit: wer arbeitet an welchem Ticket, wer ist anwesend, wie viele Tickets warten in jeder Queue.

  • Aktuell in Bearbeitung pro Mitarbeiter
  • Priorisierte Queue (Drag & Drop)
  • Anwesenheits- und Statusanzeige
  • Sofortzuweisung per Drag oder Klick
📅 Zeitfenster-Modus

Explizite Tages- und Wochenplanung. Tickets werden festen Zeitblöcken zugeordnet — der Mitarbeiter sieht in seiner Ansicht genau sein Zeitfenster fĂŒr den Tag.

  • Zeitblöcke mit Dauer (z.B. 3h Technik)
  • Tickets mit SchĂ€tzung einplanen
  • KapazitĂ€tsprĂŒfung verhindert Überbuchung
  • Supporter sieht nur das eigene Fenster

Die Modi schließen sich nicht aus. Der Dispatcher nutzt typischerweise den Live-Modus fĂŒr die tagesaktuelle Steuerung; die Zeitfenster-Planung dient dem Vorausplanen von Kundenterminen und grĂ¶ĂŸeren Aufgaben.

SLA & Dringlichkeit

Nicht alle Tickets sind gleich dringend. Lizzy kennt mehrere Dringlichkeitssignale und kombiniert sie fĂŒr den Dispatcher sichtbar.

OTRS-PrioritÀt und Icinga-Schweregrad

Tickets mit hoher OTRS-PrioritÀt oder Icinga-Severity CRITICAL werden farbig hervorgehoben (rot). Monitor-Tickets werden im Dashboard mit einem eigenen Status-Panel dargestellt.

Fester Termin → Kalender-VerknĂŒpfung

Manche Tickets haben einen fixen Außendiensttermin oder Kundentermin. Diese sollen — wenn die Kalender-Integration umgesetzt ist — automatisch als Zeitblock im Zeitfenster erscheinen, sodass der Mitarbeiter und der Dispatcher sehen: "Dieses Ticket ist am Dienstag 14 Uhr, nicht verschiebbar." Aktuell ist das ein manueller Schritt (Zeitfenster hĂ€ndisch anlegen). Die VerknĂŒpfung Ticket ↔ Kalender-Eintrag ist eine der offenen Fragen.

Queue-Lastgewichtung

Der KI-Score berĂŒcksichtigt bereits die Summe der Minuten-SchĂ€tzungen in einer Queue. Das ist kein formales SLA — aber ein FrĂŒhwarnsignal: Wenn ein Mitarbeiter 400 Minuten SchĂ€tzungen hat und nur ein 3h-Fenster, sieht der Dispatcher das sofort als KapazitĂ€tsproblem.

KI-UnterstĂŒtzung

Die KI in Lizzy ist kein Ersatz fĂŒr menschliches Urteilsvermögen — sie ist ein Vorschlag der ĂŒberstimmt werden kann und soll. Jede Zuweisung die der Dispatcher anders trifft als vorgeschlagen, wird gespeichert und fließt in kĂŒnftige VorschlĂ€ge ein.

Zuweisung-Vorschlag (Scoring)

FĂŒr jedes nicht zugeordnete Ticket berechnet Lizzy einen Score pro Mitarbeiter:

  • Firmenerfahrung: Wie viele Tickets dieser Firma hat der Mitarbeiter schon abgeschlossen? (gewichtet nach AktualitĂ€t — Erfahrung von vor 2+ Jahren zĂ€hlt weniger)
  • Kontakt-Bonus: Hat der Mitarbeiter speziell diesen Ansprechpartner schon betreut? (+5 pro Ticket, max +15)
  • Follow-Rate: Wie oft wird dieser Mitarbeiter vorgeschlagen und tatsĂ€chlich gewĂ€hlt? (±10 Punkte, ab 3 Entscheidungen aktiv)
  • Queue-Last: Wie viele Tickets und Minuten liegen schon in seiner Queue? (Abzug)
  • Anwesenheit & Status: Nicht anwesend: kein Bonus. Helpdesk: −3. Vor Ort: −8.
  • KI-Gewichtung: Im Admin einstellbar pro Mitarbeiter (0.0–1.0) um z.B. Dispatcher aus den VorschlĂ€gen herauszuhalten.

Danach bewertet ein lokales LLM (qwen3:14b) die Top-Kandidaten textlich und ergĂ€nzt FAQ-VorschlĂ€ge per Embedding-Ähnlichkeit.

Ticket-Zusammenfassung

Das LLM erstellt im Hintergrund Zusammenfassungen aller Tickets (gecacht, kein erneuter LLM-Aufruf beim Öffnen). Ähnliche bereits gelöste Tickets werden per Embedding-Vergleich gesucht und angezeigt.

FAQ-VorschlÀge

FAQs aus OTRS werden importiert, per LLM zusammengefasst und mit nomic-embed-text eingebettet. Bei jedem Zuweisung-Vorschlag werden semantisch Ă€hnliche FAQs mitgeliefert. Mitarbeiter können FAQs als hilfreich/nicht hilfreich bewerten — das beeinflusst kĂŒnftige VorschlĂ€ge.

Kunden-Profile & Wiki

Das LLM generiert aus der Ticket-Historie und EintrĂ€gen aus dem internen Wiki (MediaWiki, Kunde:-Namespace) automatisch ein Profil pro Firma. Dieses Profil fließt in den Zuweisung-Prompt ein: "Was macht dieser Kunde, welche Systeme hat er, welche Erfahrungen haben wir mit ihm?"

Vorlagen: Playbooks & Checklisten

Playbooks

Ein Playbook beschreibt einen wiederkehrenden Prozess als Folge von Schritten — zum Beispiel "Onboarding Neukunde" mit 5 Tickets von ErstgesprĂ€ch bis Abnahme. Mit einem Klick (und Eingabe des Kundennamens) werden alle Tickets auf einmal in OTRS angelegt, fertig betextet, der richtigen Queue zugewiesen. Variablen wie {kunde} werden ersetzt.

Jeder Schritt kann einem festen Mitarbeiter vorbelegt werden (Owner Default). Das ermöglicht komplexe wiederkehrende Aufgaben die immer gleich verteilt werden — z.B. "Carbonio-Schritt 1 geht immer an Technik-Queue, Schritt 5 (Abnahme) geht immer an jhs". Der Dispatcher kann beim Auslösen noch ĂŒbersteuern, hat aber sofort eine sinnvolle Vorbelegung.

Checklisten-Vorlagen

FĂŒr Projekte mit fester PrĂŒfliste (z.B. Carbonio Setup mit 20 Punkten) gibt es Checklisten-Vorlagen. Das TicketChecklist-Plugin von OTRS hat keine REST-API — Lizzy schreibt die EintrĂ€ge daher direkt in die OTRS-Datenbank (Tabelle ps_ticketchecklist). Da Lizzy Zugriff auf dieselbe Datenbank hat, ist das die vollstĂ€ndige Lösung — kein manueller Schritt, kein Workaround.

Features im Überblick

✅ Umgesetzt

  • Dispatch-Tab: Queue, Aktuell in Bearbeitung, Drag & Drop, Cross-User
  • Zeitfenster-Tab: Planung, KapazitĂ€tsprĂŒfung, SchĂ€tzungspflicht, In-Ticket-Posten
  • Ticket-Aktionen: Zuweisen, Schließen, Notiz posten, Merge, Lazy Text/Notiz/Zeit
  • Benutzerrollen: Dispatcher / Supporter (+ Impersonation fĂŒr Testansicht)
  • Status-Anzeige: Normal / Pause / Helpdesk / Vor Ort / Urlaub
  • KI-Zuweisung: deterministischer Score + LLM-Bewertung + FAQ-VorschlĂ€ge
  • KI-Zusammenfassung: gecacht, Ă€hnliche gelöste Tickets
  • Kunden-Profile aus Ticket-Historie + Wiki (LLM-generiert)
  • Icinga-Integration: Monitor-Tickets farbig markiert, Status-Panel
  • Vorlagen: Playbook-Editor, Checklisten-Vorlagen, SQL-Snippet-Generierung
  • Admin: Benutzerverwaltung, FAQ-Import, Statistiken, Sync-Steuerung
  • Mobile Ansicht: Ticket-Tab als Karten-Layout auf Smartphones
  • 30s-Hintergrundrefresh ohne Overlay, Filter bleibt erhalten
  • CI/CD: Gitea Actions → Artifact → Webhook → Dev-Server

🔧 Offen / Geplant

  • Icinga-Auswertung (wöchentlich): LLM analysiert Muster in Monitor-Tickets und macht OptimierungsvorschlĂ€ge
  • Supporter-Aktions-Panel: Erweitertes Panel mit LLM-Abrechnungstext-Vorschlag direkt beim Schließen
  • Pascom-Integration: Status aus Dashboard ↔ Pascom synchronisieren
  • Abwesenheits-Workflows: Schnellansicht welche Tickets bei Krankheit delegiert werden mĂŒssen; Übergabeliste vor Urlaub
  • Kalender-Integration: Meetings und feste Termine automatisch als Zeitblöcke; VerknĂŒpfung Ticket ↔ Kalendereintrag (war schon in v1 offen, konkrete Umsetzung noch unklar)
  • Drag auf "Aktuell in Bearbeitung": In manchen Browsern instabil (Kind-Element blockiert Drop-Events)

❌ Bewusst nicht ĂŒbernommen aus v1

  • Meeting-Verwaltung im Dashboard: Wird ĂŒber Kalender-Tools abgebildet, nicht hier
  • Hilfe-Anfragen als Queue-Eintrag: Zu komplex fĂŒr den tatsĂ€chlichen Nutzen — stattdessen einfach per Kommentar/Notiz
  • Timer-Countdown pro Ticket: Zeitfenster-Planung löst das KapazitĂ€tsproblem besser als ein laufender Timer
  • Kanboard-VerknĂŒpfung: Weiterhin offen, noch kein konkreter Bedarf entstanden

Benutzerrollen

🎯 Dispatcher
  • Sieht alle Tabs
  • Weist Tickets zu und verwaltet Queues
  • Verwaltet Zeitfenster fĂŒr alle
  • Zugriff auf Admin, Statistik, Status
  • Kann KI-Sync manuell anstoßen
  • Kann andere User impersonieren (Testansicht)
đŸ‘€ Supporter
  • Sieht Übersicht, Tickets, Zeitfenster
  • Kann eigene Tickets kommentieren, schließen
  • Sieht KI-Zusammenfassungen und FAQ-VorschlĂ€ge
  • Kein Zugriff auf Dispatch, Admin, Statistik

Das Prinzip aus v1 gilt: Supporter mĂŒssen nicht entscheiden, sie arbeiten was oben liegt. Die kognitive Last des Priorisierens liegt beim Dispatcher.

Arbeitszeit und KapazitÀt

Die 300-Minuten-Annahme aus v1 (38h/Woche, abzĂŒglich Overhead) ist weiterhin der Orientierungswert — es gibt keine automatische Kalender-Integration. Reale KapazitĂ€t ergibt sich aus:

Offene Frage (aus v1, noch ungelöst): Meetings und andere nicht-OTRS-Aufgaben erzeugen blinde Flecken. Ein Mitarbeiter der gerade in einem 2-Stunden-Meeting sitzt, erscheint im Dashboard als verfĂŒgbar. Eine Kalender-Integration wĂŒrde das lösen — ist aber noch nicht umgesetzt.

Offene Fragen

Ist jede Aufgabe ein Ticket?

Aus v1 unverĂ€ndert offen. Einkauf, Terminvorbereitung, interne Abstimmungen — diese Aufgaben erscheinen weder in OTRS noch im Dashboard. Die Entscheidung war: nicht zu erzwingen. Ein Mitarbeiter der "frei" erscheint aber gerade eine interne Aufgabe erledigt, ist eine bekannte und akzeptierte UnschĂ€rfe.

Wo leben interne Aufgaben?

Kanboard war als geplante ErgĂ€nzung vorgesehen. Noch nicht integriert, kein konkreter Zeitplan. Solange interne Aufgaben klein und kurzlebig sind, wird das Dashboard als Dispatching-Tool fĂŒr OTRS-Tickets betrieben — bewusst ohne Anspruch auf vollstĂ€ndige Aufgaben-Erfassung.

Kalender-Integration: konkrete Umsetzung unklar

Die Integration eines Kalenders (z.B. Carbonio) ist seit v1 als Idee vorhanden, aber noch nicht ausgearbeitet. Offen sind mehrere Teilfragen:

  • Wie werden Meetings angelegt? Im Dashboard direkt, oder nur im Kalender-Tool mit Einspiegelung?
  • Wie erscheinen sie im Dashboard? Als Zeitblock im Zeitfenster-Tab, als eigene Kachel auf der Übersicht, oder nur als Warnung beim Dispatch?
  • Fester Termin → Ticket: Wenn ein Außendienst-Ticket einen fixen Termin hat, soll dieser als Kalender-Eintrag erscheinen — und umgekehrt. Die bidirektionale VerknĂŒpfung ist technisch offen.
  • Schreibzugriff auf Carbonio CalDAV? Technisch möglich, aber bisher kein Bedarf entstanden der den Aufwand rechtfertigt.

Code-Struktur: dashboard.js

Die gesamte Frontend-Logik liegt in einer einzigen Datei mit 3700+ Zeilen. Das ist wartbar solange man das Projekt kennt — fĂŒr einen Neuen ohne EinfĂŒhrung schwer. Geplant ist ein schrittweiser Modul-Split (tickets.js, dispatch.js, ki.js etc.) beim nĂ€chsten grĂ¶ĂŸeren Feature.

Versionsverlauf

v1 — April 2026 Browser-Prototyp

Eine einzelne HTML-Datei, localStorage, lokaler Python-Proxy. Konzept-Validierung. Hat bewiesen: welche Features sinnvoll sind, wie der Workflow funktioniert. Code bewusst weggeworfen, Konzept ĂŒbernommen.

v2 — Mai 2026 Lizzy (produktiv)

PHP + MariaDB + Apache. Geteilter Zustand, OTRS-Schreibzugriff, KI-UnterstĂŒtzung, CI/CD. In produktivem Einsatz bei inmedias.it.

Aus v1 ĂŒbernommen: Konzept, Feature-Definitionen, Workflows. Nicht ĂŒbernommen: Code, Timer, Meeting-Verwaltung, Hilfe-Anfragen als Queue-Eintrag.