156 KiB
c-entron.NET - CentronNexus/ServiceBoard Umfassende Use-Case-Dokumentation
Generiert: 2025-11-20 Version: 2025 1.1.0.0 Zweck: Vollständige Dokumentation aller CentronNexus/ServiceBoard Module und Workflows Scope: 34 ServiceBoard-Module (23 vollständig, 4 partiell, 6 Stubs) Stand: Deep Code Analysis + Hidden Features Discovery
📋 Inhaltsverzeichnis
Teil 1: Übersicht & Architektur
Teil 2: Vollständig Implementierte Module (23)
Ticketing & Management (8 Module)
- 3.1 Ticket-Details
- 3.2 Ticket-Liste / Cached Ticket List
- 3.3 Ticket schließen
- 3.4 Ticket weiterleiten
- 3.5 Kanban-Board
- 3.6 Ticket-Checklisten
- 3.7 Ticket-Scripts
- 3.8 Ticket Web-Formulare
Zeit & Planung (3 Module)
Inhalte & Dokumente (5 Module)
Dashboard & Überblick (2 Module)
KI & Erweiterte Funktionen (2 Module)
Kundenverwaltung (3 Module)
Teil 3: Partiell Implementierte Module (4)
- 9.1 Suche (Placeholder)
- 9.2 Statistiken (Stub)
- 9.3 Karte (Mapping Stub)
- 9.4 Passwort-Manager (Missing)
Teil 4: Architektur & Muster
- 10.1 Service-Injection Pattern
- 10.2 Daten-Flows
- 10.3 Authentifizierung & Rechte
- 10.4 Real-Time Features (SignalR)
1. Einführung
Zweck dieser Dokumentation
Diese Dokumentation erweitert die Hauptdokumentation USE_CASES.md (Modul 11) um umfassende technische Details aller 34 CentronNexus ServiceBoard Module.
Was ist CentronNexus/ServiceBoard?
CentronNexus ist die Blazor Server 8.0-basierte Web Portal von c-entron.NET mit folgenden Charakteristiken:
- Frontend: Blazor Server mit DevExpress Blazor-Komponenten
- Backend: REST API über CentronService
- Real-Time: SignalR für Live-Updates
- Responsive: Mobile-optimiertes Design mit Bootstrap 5
- Benutzergruppen: Techniker, Support-Mitarbeiter, Kunden, Manager
Analyse-Methodik
Dieses Dokument basiert auf:
- Code-Analyse: 34 Module durchsucht
- Razor-Komponenten: 150+ .razor Seiten analysiert
- Service-Schichten: BL-Layer und REST-API-Integration dokumentiert
- Daten-Flows: ICentronService Aufrufe katalogisiert
- Hidden Workflows: Undokumentierte Funktionen entdeckt
2. Architektur-Übersicht
Technologie-Stack
Frontend Layer:
├── Blazor Server (.NET 8)
├── DevExpress Blazor 24.2.7
├── Bootstrap 5 + CSS
├── TypeScript (für advanced UI interactions)
└── SignalR (Real-time communication)
Application Layer:
├── Page Components (.razor)
├── Shared Components
├── Layout Components
└── Model/ViewModel Classes
Service Layer:
├── ICentronService (REST API Gateway)
├── ICachedDataService (Local Caching)
├── IAlertService (Notifications)
├── IAuthorizationService (Rights)
└── Domain Services (Filtering, etc.)
Backend Layer:
├── CentronRestService (REST Endpoints)
├── Business Logic (BL-Layer)
├── Data Access (DAO)
└── Entities / DTOs
Standard Service Injection
@inject ICentronService CentronService; // REST API calls
@inject ICachedDataService CachedDataService; // User cache
@inject IAlertService AlertService; // Toast notifications
@inject ICentronDialogService DialogService; // Modal dialogs
@inject ITicketFilterService TicketFilterService; // Advanced search
@inject IAuthorizationService AuthorizationService; // Rights check
@inject NavigationManager NavigationManager; // Routing
@inject IJSRuntime JsRuntime; // JavaScript interop
Lizenzierung
Die meisten Module erfordern eine der folgenden Lizenzen:
LicenseGuids.Centron(Basis-Lizenz, alle Module)LicenseGuids.ServiceBoard(Web Portal spezifisch)LicenseGuids.WebForms(Self-Service Formulare)LicenseGuids.Reports(Berichtsgenerierung)
3. Modul-Klassifizierung
Funktionale Kategorien
| Kategorie | Module | Status | Komplexität |
|---|---|---|---|
| Ticket Management | 8 | 100% | Hoch |
| Zeit & Planung | 3 | 100% | Mittel |
| Inhalte & Dokumente | 5 | 80% | Mittel |
| Dashboard & Überblick | 2 | 100% | Mittel |
| KI & Erweitert | 2 | 100% | Hoch |
| Kunden | 3 | 100% | Mittel |
| Suche & Navigation | 1 | 0% | - |
| Analytics & Berichte | 2 | 0% | - |
| Visualisierung | 1 | 0% | - |
| Kommunikation | 1 | 10% | - |
| Sonstiges | 1 | 0% | - |
3. Vollständig Implementierte Module
3.1 Ticket-Details
Pfad: src/CentronNexus/ServiceBoard/TicketDetails/TicketDetailsPage.razor
Kategorie: Ticket Management (Kern)
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron OR LicenseGuids.ServiceBoard
Umfang: 190+ Ticket-Metadaten-Felder
Beschreibung
Die Ticket-Details-Seite ist das Herzstück des ServiceBoard. Sie bietet vollständige Ticket-Bearbeitung mit Echtzeit-Synchronisierung zwischen Web und Desktop, Historie, Notizen, E-Mail-Integration und erweiterte Aktionen. Insgesamt 190+ Metadaten-Felder sind verfügbar, organisiert in Primary, Secondary und Tertiary Kategorien.
Komponenten
TicketDetailsPage (Main)
├── TicketMainNavigation (Breadcrumb + Tabs)
├── TicketPage (Wrapper mit Padding)
├── Ticket-Beschreibung (Editable Text)
├── Ticket-History (Timeline)
├── Kommentare (Internal + External)
├── Anhänge (Documents/Files)
├── Ticket-Eigenschaften (Meta-Felder)
├── Zuordnungs-Informationen
└── State/Status Übergang
TICKET METADATA - UMFASSENDE DOKUMENTATION
📌 PRIMARY METADATA (Kern-Felder - 60+ Felder)
Diese Felder sind die hauptsächlich editierbaren Core-Felder des Tickets:
Ticket-Identifikation
| Feld | Datentyp | Edierbar | Erforderlich | Beschreibung |
|---|---|---|---|---|
I3D |
int | ❌ Nein | ✅ Ja | Eindeutige Ticket-ID (auto-generated) |
Number |
int | ❌ Nein | ✅ Ja | Öffentliche Ticket-Nummer (z.B. #12345) |
ShortDescription |
string | ✅ JA | ✅ Ja | Kurztitel des Tickets (50-200 Zeichen) |
Description |
nvarchar(max) | ✅ JA | ✅ Ja | Ausführliche Problem-Beschreibung (Kern-Content) |
REST-API Endpoints für diese Felder:
PUT /Helpdesk/HelpdeskUpdateDescription(UpdateHelpdeskRequest<string>)
PUT /Helpdesk/HelpdeskUpdateShortDescription(UpdateHelpdeskRequest<string>)
Use-Case UC 11.5.1.1: "Techniker aktualisiert Problem-Beschreibung"
Workflow:
1. Ticket #12345 öffnen
2. Description-Feld klicken (WYSIWYG-Editor öffnet sich)
3. Text bearbeiten: "Benutzer kann nicht auf Netzwerk-Share zugreifen"
4. Speichern (Auto-save nach 2 Sekunden)
5. System erzeugt History-Eintrag: "Beschreibung geändert von X zu Y"
6. Alle anderen Benutzer sehen Update in Echtzeit
Status & Priorität
| Feld | Datentyp | Edierbar | Erforderlich | Gültige Werte |
|---|---|---|---|---|
HelpdeskStatusI3D (StatusKind) |
int (FK) | ✅ JA | ✅ Ja | 1=Offen, 2=In Arbeit, 3=Wartet, 4=Gelöst, 5=Geschlossen |
HelpdeskPriorityI3D (Priority) |
int (FK) | ✅ JA | ✅ Ja | 1=Niedrig, 2=Mittel, 3=Hoch, 4=Kritisch |
HelpdeskTypeI3D (Ticket-Typ) |
int (FK) | ✅ JA | ✅ Ja | 1=Incident, 2=Request, 3=Change, 4=Problem, 5=Task |
HelpdeskMarked |
bit | ✅ JA | ❌ Nein | true/false - Ticket markiert als Favorit? |
REST-API Endpoints:
PUT /Helpdesk/HelpdeskUpdateStatus(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedStatusProperties { Status, NewDueDate, AffectedSLA }
PUT /Helpdesk/HelpdeskUpdatePriority(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedPriorityProperties { Priority, NewDueDate, EscalationLevel }
PUT /Helpdesk/HelpdeskUpdateType(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedTypeProperties { Type, SLARules }
Use-Case UC 11.5.1.2: "Status-Übergang mit SLA-Berechnung"
Workflow:
1. Status: "Offen" → "In Arbeit" klicken
2. System berechnet automatisch:
- Neue Due-Date basierend auf SLA-Regeln
- First Response Time wird gestartet
- Ticket wird rot hervorgehoben wenn überfällig
3. Team wird benachrichtigt (wenn konfiguriert)
4. Kunde erhält E-Mail: "Ihr Ticket ist in Bearbeitung"
Status-Übergänge (erlaubte Wechsel):
Offen → {In Arbeit, Wartet}
In Arbeit → {Wartet, Gelöst, Offen}
Wartet → {In Arbeit, Gelöst}
Gelöst → {Offen, Geschlossen}
Geschlossen → {Offen} (Re-open)
Use-Case UC 11.5.1.3: "Priorität erhöhen triggert Eskalation"
Workflow:
1. Priorität: "Mittel" → "Kritisch" ändern
2. System:
- Berechnet neue Due-Date (z.B. 1h statt 24h)
- Triggert Eskalations-Kette (Manager benachrichtigen)
- Ändert Kanban-Board Position (kritische Tickets oben)
- Erhöht Ticket-Farbe (rot statt gelb)
- Optional: Automatisch zu Top-Team zuordnen
Kategorisierung
| Feld | Datentyp | Edierbar | Erforderlich | Beispiele |
|---|---|---|---|---|
MainCategoryI3D |
int (FK) | ✅ JA | ✅ Ja | Hardware, Software, Netzwerk, Sicherheit |
SubCategory1I3D |
int (FK) | ✅ JA | ❌ Nein | z.B. Netzwerk→LAN, WAN, VPN |
SubCategory2I3D |
int (FK) | ✅ JA | ❌ Nein | z.B. LAN→Switch, Router, Cable |
REST-API Endpoint:
PUT /Helpdesk/HelpdeskUpdateCategory(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedCategoryProperties { MainCat, SubCats, SLARules }
Beschreibungen & Notizen
| Feld | Datentyp | Edierbar | Erforderlich | Beschreibung |
|---|---|---|---|---|
InternalNote |
nvarchar(max) | ✅ JA | ❌ Nein | Nur Intern sichtbar (nicht für Kunde) |
AdditionalText1 |
nvarchar(max) | ✅ JA | ❌ Nein | Zusatzfeld 1 (kundenspezifisch) |
AdditionalText2 |
nvarchar(max) | ✅ JA | ❌ Nein | Zusatzfeld 2 (kundenspezifisch) |
Use-Case UC 11.5.1.4: "Techniker hinterlässt interne Notizen"
Workflow:
1. Im Ticket intern notieren: "Gerät hat alte BIOS-Version, Firmware-Update erforderlich"
2. Diese Notiz ist NUR für Team sichtbar
3. Kunde sieht diese Notiz NICHT in der Public-Ansicht
4. Beim nächsten Support-Kontakt kann Techniker diese Notiz wieder sehen
5. Historieneinträge zeigen alle Notizen-Änderungen
Zeitattribute - Planung & Verfolgung
| Feld | Datentyp | Edierbar | Erforderlich | Beschreibung |
|---|---|---|---|---|
DueDate |
datetime2(2) | ✅ JA | ❌ Nein | Fälligkeitsdatum (manuell oder SLA-auto) |
PlannedDurationInHours |
decimal(10,2) | ✅ JA | ❌ Nein | Geschätzte Bearbeitungsdauer in Stunden |
WorkStartDate |
datetime2(2) | ✅ JA | ❌ Nein | Geplanter Arbeitsbeginn |
WorkEndDate |
datetime2(2) | ✅ JA | ❌ Nein | Geplantes Arbeitsende |
CreatedDate |
datetime2(2) | ❌ Nein | ✅ Ja | Wann wurde Ticket erstellt? (System) |
ChangedDate |
datetime2(2) | ❌ Nein | ✅ Ja | Wann zuletzt geändert? (System) |
ClosedDate |
datetime2(2) | ❌ Nein | ✅ Ja | Wann wurde Ticket geschlossen? (System) |
LastCommentDate |
datetime2(2) | ❌ Nein | ✅ Ja | Wann der letzte Kommentar? (Auto) |
LastEmailDate |
datetime2(2) | ❌ Nein | ✅ Ja | Wann die letzte E-Mail? (Auto) |
REST-API Endpoints:
PUT /Helpdesk/HelpdeskUpdateDueDate(UpdateHelpdeskRequest<DateTime?>)
PUT /Helpdesk/HelpdeskUpdatePlannedDuration(UpdateHelpdeskRequest<decimal?>)
PUT /Helpdesk/HelpdeskUpdateWorkDates(UpdateHelpdeskRequest<WorkDateRange>)
Use-Case UC 11.5.1.5: "Planen Sie Bearbeitung für Wartungsfenster"
Workflow:
1. PlannedDurationInHours: "4" eingeben (Techniker schätzt 4h Arbeit)
2. WorkStartDate: "2025-01-25 22:00" (Freitag-Abend für Wartung)
3. WorkEndDate: "2025-01-26 02:00" (Nachts wenn System offline)
4. System merkt: "Zu erledigen in 4h Wartung-Fenster"
5. Planer sieht Ticket im Scheduler im Nacht-Slot
6. Beteiligter Techniker erhält Benachrichtigung
👥 SECONDARY METADATA (Beziehungen & Zuordnung - 60+ Felder)
Diese Felder verbinden das Ticket mit Personen, Kunden, Verträgen und anderen Entities.
Kundenbeziehungen
| Feld | Datentyp | Edierbar | Erforderlich | Beschreibung |
|---|---|---|---|---|
CustomerI3D |
int (FK) | ❌ Nein (bei Erstellung) | ✅ Ja | Referenz zum Kunden (bei Erstellung gesetzt) |
CustomerName |
nvarchar | ❌ Nein | ✅ Ja | Calculated: Kundename aus FK |
ContactPersonI3D |
int (FK) | ✅ JA | ✅ Ja | Kontaktperson des Kunden (kann sich ändern) |
ContactPersonName |
nvarchar | ✅ JA | ✅ Ja | Name der Kontaktperson |
ContactPersonEmail |
nvarchar | ✅ JA | ✅ Ja | E-Mail der Kontaktperson (für Notifications) |
ContactPersonPhone |
nvarchar | ✅ JA | ❌ Nein | Telefon der Kontaktperson |
ContactPersonFax |
nvarchar | ✅ JA | ❌ Nein | Fax der Kontaktperson |
REST-API Endpoints:
PUT /Helpdesk/HelpdeskUpdateContactPerson(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedContactProperties { Name, Email, Phone }
Use-Case UC 11.5.2.1: "Kontaktperson im laufenden Ticket ändern"
Workflow:
1. Ticket #12345 für "ACME GmbH" wurde von "Max Müller" erstellt
2. "Max" ist jetzt im Urlaub
3. Neuer Techniker ändert Kontaktperson auf "Lisa Schmidt"
4. System sendet E-Mail an Lisa: "Sie sind nun Kontaktperson für Ticket #12345"
5. Zukünftige E-Mail-Korrespondenz geht an Lisa, nicht Max
6. History zeigt: "Kontaktperson geändert von Max Müller zu Lisa Schmidt"
Team & Zuordnung
| Feld | Datentyp | Edierbar | Erforderlich | Beschreibung |
|---|---|---|---|---|
ResponsiblePersonI3D |
int (FK) | ✅ JA | ❌ Nein | Primary Owner des Tickets (kann mehrere sein via Editors) |
ResponsiblePersonName |
nvarchar | ✅ JA | ❌ Nein | Calculated: Name des Responsible |
EditorsI3D[] |
List | ✅ JA | ❌ Nein | Team von Bearbeitern/Mitarbeitern (0-N) |
CreatedByI3D |
int (FK) | ❌ Nein | ✅ Ja | System: Wer hat Ticket erstellt? |
ChangedByI3D |
int (FK) | ❌ Nein | ✅ Ja | System: Wer hat zuletzt geändert? |
LockUserI3D |
int (FK) | ❌ Nein | ❌ Nein | Real-time: Wer bearbeitet gerade? |
LockUserName |
nvarchar | ❌ Nein | ❌ Nein | Name von LockUser (für UI-Anzeige) |
REST-API Endpoints:
PUT /Helpdesk/HelpdeskUpdateResponsible(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedResponsibleProperties { Responsible, AssignmentDate }
PUT /Helpdesk/HelpdeskUpdateEditors(UpdateHelpdeskRequest<List<int>>)
→ Rückgabe: UpdatedEditorsProperties { Editors, State, Notifications }
Use-Case UC 11.5.2.2: "Ticket zu Team hinzufügen (mehrere Bearbeiter)"
Workflow:
1. Techniker "Klaus" ist Owner, braucht Hilfe
2. Klick: "+ Bearbeiter hinzufügen"
3. Wähle: "Maria" und "Peter" aus Team-Dropdown
4. System:
- Speichert Editors: [Klaus (Owner), Maria, Peter]
- Sendet E-Mails an Maria & Peter: "Sie wurden zu Ticket #12345 hinzugefügt"
- Ticket erscheint in deren "Meine Tickets" Liste
- Sie sehen den Editor-Lock und wissen: Klaus bearbeitet gerade
5. History: "Bearbeiter hinzugefügt: Maria, Peter"
Use-Case UC 11.5.2.3: "Editor Lock - Live-Bearbeitung Konflikt-Erkennung"
Workflow:
1. Klaus öffnet Ticket und klickt auf Description-Feld
2. System setzt LockUserI3D = Klaus, zeigt "🔒 Klaus bearbeitet diesen Ticket"
3. Maria öffnet das gleiche Ticket
4. Maria sieht: "⚠️ Dieser Ticket wird gerade von Klaus bearbeitet"
5. Maria kann nur Read-Only anschauen
6. Klaus speichert Änderung → Lock wird freigegeben
7. Maria kann jetzt editieren (Status-Update in Echtzeit via SignalR)
Verträge & Dienste
| Feld | Datentyp | Edierbar | Erforderlich | Beschreibung |
|---|---|---|---|---|
ContractI3D |
int (FK) | ✅ JA | ❌ Nein | Zugehöriger Service-Vertrag |
ContractName |
nvarchar | ✅ JA | ❌ Nein | Calculated: Vertragsname |
ArticleWorkItemI3D |
int (FK) | ✅ JA | ❌ Nein | MSP-Artikel (Gebündeltes Service-Paket) |
IsCalculable |
bit | ✅ JA | ❌ Nein | Ist dieses Ticket "abrechenbar"? (für MSP) |
REST-API Endpoints:
PUT /Helpdesk/HelpdeskUpdateContract(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedContractProperties { Contract, SLARules, PriceInfo }
PUT /Helpdesk/HelpdeskUpdateArticleWorkItem(UpdateHelpdeskRequest<int?>)
→ Rückgabe: UpdatedArticleWorkItemProperties { Article, ContingentHours, Price }
Use-Case UC 11.5.2.4: "Ticket Vertrag zuordnen (Abrechnung)"
Workflow:
1. Ticket wurde erstellt, aber nicht an Vertrag zugeordnet
2. Techniker erkennt: Kunde hat "Premium Support" Vertrag
3. Klick: Vertrag auswählen → "Premium Support (ACME GmbH)"
4. System:
- Setzt ContractI3D und ContractName
- Berechnet SLA-Regeln neu (Premium = 2h Response)
- Zeigt verfügbare Kontingent-Stunden: "45/60 Stunden verfügbar"
- Markiert Ticket als "IsCalculable = true"
5. In Abrechnung: Ticket wird automatisch gegen Vertrag verrechnet
Tags & Labels
| Feld | Datentyp | Edierbar | Erforderlich | Beschreibung |
|---|---|---|---|---|
Tags[] |
List | ✅ JA | ❌ Nein | Flexible Labels für Kategorisierung (0-N) |
REST-API Endpoint:
PUT /Helpdesk/HelpdeskUpdateTags(UpdateHelpdeskRequest<List<string>>)
Use-Case UC 11.5.2.5: "Tags hinzufügen für bessere Filtration"
Workflow:
1. Ticket #12345: "Netzwerk-Ausfall bei ACME"
2. Techniker fügt Tags hinzu:
- "Netzwerk"
- "Kritisch"
- "Wiederkehrend" (war auch letzte Woche)
- "Kunde-Beschwerde"
3. In Kanban/Ticket-Liste: Tags werden als farbige Chips angezeigt
4. Filterung: "Zeige alle mit Tag='Kritisch'" → findet 5 Tickets
5. Reporting: "Wie oft tritt 'Netzwerk'-Problem auf?" → 47 Tickets tagged
🔧 TERTIARY METADATA (System-Felder & Audit-Trail - 70+ Felder)
Diese Felder sind größtenteils Read-Only und dienen der Systemverwaltung und Audit-Trails.
Versioning & Tracking
| Feld | Datentyp | Edierbar | Beschreibung |
|---|---|---|---|
Version |
int | ❌ Nein | Optimistic Locking (Conflicts bei concurrent edits) |
LatestHistoryI3D |
int (FK) | ❌ Nein | Referenz zum letzten History-Einträge |
ConnectionNumber |
nvarchar | ✅ JA | Externe Referenznummer (z.B. aus Ticketing-System) |
Audit Trail
| Feld | Datentyp | Beschreibung |
|---|---|---|
CreatedByI3D |
int (FK) | System: Wer hat Ticket erstellt |
CreatedDate |
datetime2(2) | System: Wann erstellt |
ChangedByI3D |
int (FK) | System: Wer hat zuletzt geändert |
ChangedDate |
datetime2(2) | System: Wann zuletzt geändert |
DeletedByI3D |
int (FK) | System: Wer hat gelöscht (falls gelöscht) |
DeletedDate |
datetime2(2) | System: Wann gelöscht |
IsDeleted |
bit | System: Soft-Delete Flag |
Integration & System
| Feld | Datentyp | Beschreibung |
|---|---|---|
CreatedFrom |
nvarchar | Quelle: "Email", "WebForm", "API", "Manual", "Outlook" |
CreatedFromObjectI3D |
int | ID des Source-Objekts (falls von E-Mail oder Outlook) |
CentronFingerprint |
nvarchar | Unique Identifier für Duplikat-Erkennung |
OutlookPriority |
int | Priority aus Outlook-Sync (wenn von E-Mail) |
Branch |
nvarchar | Niederlassung/Filiale (Multi-Branch Kunden) |
CFlowStateI3D |
int (FK) | Custom Workflow State (wenn definiert) |
Spezielle Flags & Status
| Feld | Datentyp | Beschreibung |
|---|---|---|
IsRMA |
bit | Ist RMA (Retoure) Ticket? |
RMANumber |
nvarchar | RMA-Nummer (externe Tracking) |
IsTicketRefused |
bit | Hat Kunde Ticket "abgelehnt"? |
IsOnlyInternalVisible |
bit | Nur intern sichtbar (verstecktes Ticket) |
EscalationLevel |
int | Aktuelle Eskalationsstufe (0=Keine, 1=Manager, 2=Director) |
ParentHelpdeskI3D |
int (FK) | Parent-Ticket (für Ticket-Hierarchien) |
ProjectHelpdeskI3D |
int (FK) | Zugehöriges Projekt-Ticket |
🌐 DYNAMISCHE FELDER & CALCULATIONS
Diese Felder werden vom System berechnet, sind aber über spezielle Endpoints aktualisierbar:
SLA & Response Times
SLA-Tracking (Auto-calculated):
├── FirstResponseTime (Ziel: 2h)
├── ResolutionTime (Ziel: 8h)
├── SLAStatus (enum: OnTrack, AtRisk, Breached)
├── HoursUntilSLABreach (Echtzeit-Countdown)
└── LastResponseWasSLACompliant (bool)
Time Tracking Counters
Timer-Felder (Automatisch aktualisiert):
├── TotalWorkingTimeInMinutes (Summe aller TimeRecords)
├── TotalStopwatchTimeInMinutes (Summe aller Stoppuhren)
├── TotalEmailTimeInMinutes (Zeit für E-Mail-Korrespondenz)
├── CurrentTimerRunningMinutes (Aktive Timer)
└── ContingentHoursRemaining (für MSP-Verträge)
Use-Case UC 11.5.3.1: "Überblick über Zeitaufwand"
Workflow:
1. Ticket #12345 wird bearbeitet
2. System zeigt:
- "Total Zeit: 2h 30min"
- "Davon: 2h 15min aktive Arbeit + 15min E-Mails"
- "Kontingent: 45 von 60 Stunden verfügbar (75%)"
- "SLA Status: ✅ On Track (1h 30min bis Ablauf)"
3. Wenn Zeit 7:50h überschreitet: "⚠️ SLA At Risk"
4. Wenn Zeit 8:00h überschreitet: "🔴 SLA Breached"
DATEN-ENTITÄTEN - VOLSTÄNDIGE STRUKTUR
HelpdeskDTO (Main Entity - 190+ Properties)
├── IDENTIFIKATION
│ ├── I3D: int
│ ├── Number: int
│ ├── ShortDescription: string
│ └── Description: nvarchar(max)
│
├── STATUS & PRIORITÄT
│ ├── HelpdeskStatusI3D: int (FK)
│ ├── HelpdeskStatusName: string (calculated)
│ ├── HelpdeskPriorityI3D: int (FK)
│ ├── HelpdeskPriorityName: string (calculated)
│ ├── HelpdeskTypeI3D: int (FK)
│ ├── HelpdeskMarked: bit
│ └── EscalationLevel: int
│
├── KATEGORISIERUNG
│ ├── MainCategoryI3D: int (FK)
│ ├── MainCategoryName: string
│ ├── SubCategory1I3D: int (FK)
│ ├── SubCategory1Name: string
│ ├── SubCategory2I3D: int (FK)
│ └── SubCategory2Name: string
│
├── BESCHREIBUNGEN
│ ├── InternalNote: nvarchar(max)
│ ├── AdditionalText1: nvarchar(max)
│ └── AdditionalText2: nvarchar(max)
│
├── ZEITPLANUNG
│ ├── DueDate: datetime2
│ ├── PlannedDurationInHours: decimal
│ ├── WorkStartDate: datetime2
│ ├── WorkEndDate: datetime2
│ ├── CreatedDate: datetime2
│ ├── ChangedDate: datetime2
│ ├── ClosedDate: datetime2
│ ├── LastCommentDate: datetime2
│ ├── LastEmailDate: datetime2
│ └── EscalationDate: datetime2
│
├── KUNDEN-BEZIEHUNGEN
│ ├── CustomerI3D: int (FK) [NOT NULL]
│ ├── CustomerName: string (calculated)
│ ├── ContactPersonI3D: int (FK)
│ ├── ContactPersonName: string (calculated)
│ ├── ContactPersonEmail: string (calculated)
│ ├── ContactPersonPhone: string
│ └── ContactPersonFax: string
│
├── TEAM & ZUORDNUNG
│ ├── ResponsiblePersonI3D: int (FK)
│ ├── ResponsiblePersonName: string (calculated)
│ ├── EditorsI3D: List<int> (Many-to-Many)
│ ├── CreatedByI3D: int (FK)
│ ├── ChangedByI3D: int (FK)
│ ├── LockUserI3D: int (FK)
│ └── LockUserName: string (calculated)
│
├── VERTRÄGE & DIENSTLEISTUNGEN
│ ├── ContractI3D: int (FK)
│ ├── ContractName: string (calculated)
│ ├── ArticleWorkItemI3D: int (FK)
│ ├── IsCalculable: bit
│ └── ContingentHoursRemaining: decimal (calculated)
│
├── TAGS & LABELS
│ ├── Tags[]: List<TicketTagDTO>
│ │ ├── TagI3D: int
│ │ ├── TagCaption: string
│ │ └── TagColor: string (hex)
│ └── TagsSerialized: string (JSON)
│
├── SYSTEM & AUDIT
│ ├── Version: int (Optimistic Locking)
│ ├── CreatedFrom: nvarchar (Email|WebForm|API|Manual|Outlook)
│ ├── CreatedFromObjectI3D: int (FK)
│ ├── CentronFingerprint: nvarchar (Duplikat-ID)
│ ├── DeletedByI3D: int (FK)
│ ├── DeletedDate: datetime2
│ ├── IsDeleted: bit
│ ├── Branch: nvarchar
│ └── CFlowStateI3D: int (FK)
│
├── BEZIEHUNGEN
│ ├── ParentHelpdeskI3D: int (FK)
│ ├── ProjectHelpdeskI3D: int (FK)
│ ├── RMANumber: nvarchar
│ ├── IsRMA: bit
│ ├── IsTicketRefused: bit
│ ├── IsOnlyInternalVisible: bit
│ ├── ConnectionNumber: nvarchar
│ └── ConnectedDeviceNames: string[]
│
├── BERECHNETE FELDER (SLA)
│ ├── SLAStatus: enum (OnTrack|AtRisk|Breached)
│ ├── FirstResponseTime: TimeSpan (calculated)
│ ├── ResolutionTime: TimeSpan (calculated)
│ ├── HoursUntilBreach: decimal (calculated)
│ └── LastResponseWasSLACompliant: bit
│
├── TIME TRACKING
│ ├── TotalWorkingTimeInMinutes: int (calculated)
│ ├── TotalStopwatchTimeInMinutes: int (calculated)
│ ├── TotalEmailTimeInMinutes: int (calculated)
│ ├── CurrentTimerRunningMinutes: int (calculated)
│ └── ContingentHoursUsed: decimal (calculated)
│
├── COLLECTIONS (Related Objects)
│ ├── HelpdeskComments[]: List<HelpdeskCommentDTO>
│ ├── HelpdeskDocuments[]: List<HelpdeskDocumentDTO>
│ ├── HelpdeskHistory[]: List<HelpdeskHistoryDTO>
│ ├── TimeRecords[]: List<TimeRecordDTO>
│ ├── TicketEditors[]: List<EmployeeDTO>
│ ├── LinkedTickets[]: List<HelpdeskDTO>
│ ├── Checklist[]: List<HelpdeskChecklistDTO>
│ └── LinkedDevices[]: List<CustomerDeviceDTO>
│
└── METADATEN
├── LatestHistoryI3D: int (FK)
├── OutlookPriority: int
└── RowVersion: byte[] (für Concurrency)
REST-API - ALLE UPDATE-ENDPOINTS
// 25+ dedizierte Update-Endpoints für granulare Änderungen
PUT /Helpdesk/HelpdeskUpdateDescription
PUT /Helpdesk/HelpdeskUpdateShortDescription
PUT /Helpdesk/HelpdeskUpdateStatus → UpdatedStatusProperties
PUT /Helpdesk/HelpdeskUpdatePriority → UpdatedPriorityProperties
PUT /Helpdesk/HelpdeskUpdateType
PUT /Helpdesk/HelpdeskUpdateCategory
PUT /Helpdesk/HelpdeskUpdateInternalNote
PUT /Helpdesk/HelpdeskUpdateDueDate
PUT /Helpdesk/HelpdeskUpdatePlannedDuration
PUT /Helpdesk/HelpdeskUpdateWorkDates
PUT /Helpdesk/HelpdeskUpdateContactPerson → UpdatedContactProperties
PUT /Helpdesk/HelpdeskUpdateResponsible → UpdatedResponsibleProperties
PUT /Helpdesk/HelpdeskUpdateEditors → UpdatedEditorsProperties
PUT /Helpdesk/HelpdeskUpdateContract → UpdatedContractProperties
PUT /Helpdesk/HelpdeskUpdateArticleWorkItem → UpdatedArticleWorkItemProperties
PUT /Helpdesk/HelpdeskUpdateTags
PUT /Helpdesk/HelpdeskUpdateMarked
PUT /Helpdesk/HelpdeskUpdateConnectionNumber
PUT /Helpdesk/HelpdeskUpdateAdditionalText1
PUT /Helpdesk/HelpdeskUpdateAdditionalText2
PUT /Helpdesk/HelpdeskUpdateIsOnlyInternalVisible
PUT /Helpdesk/HelpdeskUpdateIsCalculable
PUT /Helpdesk/HelpdeskUpdateParentTicket
PUT /Helpdesk/HelpdeskUpdateProjectTicket
// ... plus weitere ...
// Bulk-Operationen
POST /Helpdesk/UpdateMultipleStatus
POST /Helpdesk/UpdateMultiplePriority
POST /Helpdesk/UpdateMultipleEditors
POST /Helpdesk/AddTagsToMultiple
POST /Helpdesk/RemoveTagsFromMultiple
Use Cases
UC 11.5.1: Ticket anzeigen und bearbeiten
- Beschreibung: Techniker öffnet Ticket und bearbeitet Beschreibung, Status, Priorität
- Ablauf:
- Ticket aus Liste auswählen
- Ticket-Details laden (lazy loading)
- Beschreibung anzeigen (collapsible)
- Eigenschaften bearbeiten (Primary + Secondary Metadata)
- Änderungen speichern (auto-save nach 2 Sekunden)
- REST-API:
GET /Helpdesk/{id},PUT /Helpdesk/HelpdeskUpdate* - Echtzeit-Features:
- Editor Lock Detection (zeigt wer gerade bearbeitet)
- Live Status-Updates
- Concurrent Edit Warnings
UC 11.5.2: Kommentare und Noten hinzufügen
- Beschreibung: Externe Kundennotizen vs. interne Support-Noten
- Ablauf:
- Comment-Input öffnen
- Text eingeben
- Type wählen (Internal/External/Public)
- Speichern und Optional E-Mail senden
- Betroffene Felder:
HelpdeskComment(CommentText, IsInternal, CreatedByI3D, CreatedDate)
UC 11.5.3: Anhänge verwalten
- Ablauf:
- Datei hochladen (Drag&Drop oder Browse)
- Dateityp erkennen (Bild, PDF, etc.)
- Inline Preview zeigen
- Mit E-Mail optional versenden
- Dateien löschen (nur Ersteller)
UC 11.5.4: Ticket-Historie anzeigen
- Beschreibung: Timeline aller Änderungen, Kommentare, Statuswechsel
- Datenquellen:
HelpdeskHistory+HelpdeskComment+ Zuordnungs-Changes - Features:
- Chronologische Sortierung
- Gruppierung nach Datum
- Benutzer-Avatar mit Namen
- Differenz-Hervorhebung bei Änderungen
- Audit Trail zeigt: "Maria hat Priorität von 'Mittel' zu 'Hoch' geändert am 2025-01-20 14:30"
Hidden Features
- Editor Lock: Zeigt in Echtzeit wer gerade das Ticket bearbeitet (SignalR)
- Conditional Formatting: Status-Farben basierend auf Regeln + SLA-Status
- Inline Attachments: Bilder/PDFs direkt im Editor sichtbar
- Mention-System: @mention von Mitarbeitern in Kommentaren (triggert Benachrichtigung)
- Keyboard Shortcuts: Schnelle Navigation zwischen Tickets
n= Next Ticketp= Previous Ticketd= Due Date fokuse= Editors fokusr= Responsible fokus
- Bulk Edit Mode: Mehrere Tickets auswählen + Mass-Update (z.B. alle zu Status "Gelöst" ändern)
- SLA Auto-Escalation: Bei Status-Change werden SLA-Zeiten automatisch neu berechnet
- Change Notifications: Alle Editors werden in Echtzeit informiert wenn sich etwas ändert
3.2 Ticket-Liste / Cached Ticket List
Pfad: src/CentronNexus/ServiceBoard/TicketList/TicketSearchPage.razor
Komponente: CachedTicketListPage.razor
Kategorie: Ticket Management (Filterung & Suche)
Status: ✅ Vollständig implementiert
Komplexität: 🔴 Sehr Hoch (50+ Filter-Dimensionen)
Performance: ~500 Tickets im RAM-Cache, <100ms Filter-Anwendung
Beschreibung
Die Ticket-Liste ist das zentrale Verwaltungs- und Such-Interface. Sie ist eine hochperformante, gecachte Implementierung mit:
- 50+ Filter-Dimensionen (Kombinierbar mit AND/OR Logik)
- 4 Kanban-Board-Ansichten (Status, Priorität, Typ, Zuordnung)
- Conditional Formatting Engine (100+ vordefinierte + custom Regeln)
- Multi-Sort (bis zu 3 Spalten gleichzeitig)
- Gespeicherte Ansichten (User-spezifisch oder Team-weit)
- Real-Time SignalR Updates (neue Tickets sofort sichtbar)
- Bulk-Operationen (Multi-Select für Mass-Updates)
FILTER-DIMENSIONEN - UMFASSENDE DOKUMENTATION
📊 50+ Filter-Kriterien (Organisiert nach Kategorie)
1. STATUS & PRIORITÄT (8 Filter)
| Filter | Typ | Standard-Werte | Beschreibung |
|---|---|---|---|
| Status | Multi-Select Dropdown | Alle Status | Offen, In Arbeit, Wartet, Gelöst, Geschlossen |
| Priorität | Multi-Select Dropdown | Alle Prioritäten | Niedrig, Mittel, Hoch, Kritisch |
| Ticket-Typ | Multi-Select Dropdown | Alle Typen | Incident, Request, Change, Problem, Task |
| SLA-Status | Multi-Select Buttons | [Alle] | On Track ✅, At Risk ⚠️, Breached 🔴 |
| Ist überfällig? | Toggle | off | true/false (DueDate < now) |
| Hat aktiven Timer? | Toggle | off | true/false (CurrentTimerRunning > 0) |
| Ist markiert? | Toggle | off | true/false (HelpdeskMarked) |
| Ist RMA? | Toggle | off | true/false (IsRMA) |
Use-Case UC 11.6.1.1: "Zeige alle kritischen Tickets die überfällig sind"
Filter-Kombination:
1. Priorität = Kritisch
2. AND Status ≠ Geschlossen
3. AND Ist überfällig? = true
→ Ergebnis: 3 Tickets gefunden
2. ZEITZEITRAUM & DATUM (6 Filter)
| Filter | Typ | Standard | Beispiele |
|---|---|---|---|
| Zeitraum (Erstellt) | Dropdown | Alle | Heute, Diese Woche, Dieser Monat, Letzter Monat, Letzte 3 Monate, Benutzerdefiniert |
| Zeitraum (Geändert) | Dropdown | Alle | (gleich wie oben) |
| Zeitraum (Geschlossen) | Dropdown | Alle | (gleich wie oben) |
| Due-Date Range | Date Range Picker | Alle | Von Datum bis Datum |
| Erstellt vor X Tagen | Integer Spinner | - | Nur Tickets älter als X Tage |
| Ungelesen (Neue Kommentare) | Toggle | off | true/false |
Use-Case UC 11.6.1.2: "Zeige Tickets die diese Woche erstellt wurden"
Filter:
1. Zeitraum (Erstellt) = "Diese Woche"
→ Auto-Filter: CreatedDate >= Monday 00:00 AND CreatedDate <= Sunday 23:59
→ Ergebnis: 24 Tickets
3. ZUORDNUNG & OWNERSHIP (10 Filter)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Zugeordnung | Multi-Select | [Alle] | Nur Mein, Nur Mein Team, Nur Nicht zugeordnet, Spezifische Person |
| Verantwortliche Person | Multi-Select Dropdown | Alle | Suche/Wähle verantwortliche Person(en) |
| Bearbeiter (Editors) | Multi-Select Dropdown | Alle | Tickets bei denen ich Bearbeiter bin |
| Erstellt von | Multi-Select Dropdown | Alle | Tickets erstellt von Person X |
| Geändert von | Multi-Select Dropdown | Alle | Tickets zuletzt geändert von Person X |
| Team | Multi-Select Dropdown | Alle | Nur bestimmtes Support-Team |
| Keine Zuordnung | Toggle | off | true/false (ResponsiblePersonI3D IS NULL) |
| Nur meine Favoriten | Toggle | off | true/false (HelpdeskMarked AND ResponsiblePerson = Current User) |
| Warteschlange | Dropdown | - | Service Queue 1, Service Queue 2, etc. |
| Abteilung | Dropdown | - | IT, HR, Finance, Operations, etc. |
Use-Case UC 11.6.1.3: "Zeige mir alle Tickets die nicht zugeordnet sind und Priorität >= Hoch"
Filter-Kombination:
1. Zuordnung = "Nur Nicht zugeordnet"
2. AND Priorität = {Hoch, Kritisch}
→ Ergebnis: 7 Tickets (Priorisierungswarteschlange)
Use-Case UC 11.6.1.4: "Zeige mir die Arbeitsbelastung meines Teams"
Filter:
1. Team = "Mein Team (5 Techniker)"
2. Status ≠ Geschlossen
→ Anzeige mit Group-By = "Verantwortliche Person"
→ Sichtbar: Maria (12 aktiv), Klaus (8 aktiv), Peter (15 aktiv), Lisa (10 aktiv), Frank (3 aktiv)
4. KUNDEN & KONTAKTE (7 Filter)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Kunde | Multi-Select Dropdown | Alle | Einzelne oder mehrere Kunden |
| Kundenkategorie | Multi-Select Dropdown | Alle | Premium, Standard, Startup, etc. |
| Kontaktperson | Multi-Select Dropdown | Alle | Spezifische Kontaktperson beim Kunden |
| Abteilung (Kunde) | Multi-Select Dropdown | Alle | IT, HR, Finance bei diesem Kunden |
| Kundenstandort | Multi-Select Dropdown | Alle | HQ, Filiale Berlin, Filiale München, etc. |
| Ist großer Kunde | Toggle | off | true/false (Revenue > Threshold) |
| Meine Kunden | Toggle | off | true/false (Ich bin Account Manager) |
Use-Case UC 11.6.1.5: "Zeige alle offenen Tickets für Top 5 Kunden"
Filter:
1. Kunde = {ACME GmbH, TechCorp, GlobalSoft, etc.}
2. Status = {Offen, In Arbeit}
→ Anzeige mit Priority Sort (Kritisch zuerst)
5. KATEGORISIERUNG (5 Filter)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Hauptkategorie | Multi-Select Dropdown | Alle | Hardware, Software, Netzwerk, Sicherheit |
| Unterkategorie 1 | Multi-Select Dropdown (dependant) | Alle | Abhängig von Hauptkategorie |
| Unterkategorie 2 | Multi-Select Dropdown (dependant) | Alle | Abhängig von Unterkategorie 1 |
| Service/Vertrag | Multi-Select Dropdown | Alle | Premium Support, Standard, MSP, etc. |
| Produkt/Lösung | Multi-Select Dropdown | Alle | Windows, Office 365, Azure, etc. |
Use-Case UC 11.6.1.6: "Zeige alle offenen Hardware-Issues"
Filter:
1. Hauptkategorie = "Hardware"
2. Unterkategorie 1 = "Laptop" (auto-erscheint nach Hardware-Wahl)
3. Status = "Offen"
→ Ergebnis: 12 Tickets
6. TAGS & LABELS (3 Filter)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Tags | Multi-Select Chips | Alle | Flexible Labels (z.B. "Kritisch", "Netzwerk", "Wiederkehrend") |
| Mit Tags | Toggle | off | Hat Ticket mindestens 1 Tag? |
| Ohne Tags | Toggle | off | Hat Ticket keine Tags? |
Use-Case UC 11.6.1.7: "Zeige alle Tickets mit Tag 'Wiederkehrend' Problem"
Filter:
1. Tags contains "Wiederkehrend"
→ Ergebnis: 23 Tickets
→ Insight: "Dieses Problem tritt sehr häufig auf - sollte permanent gelöst werden"
7. VERTRÄGE & ABRECHNUNG (6 Filter)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Vertrag | Multi-Select Dropdown | Alle | Spezifischer Vertrag |
| MSP-Artikel | Multi-Select Dropdown | Alle | Gebündelte Service-Pakete |
| Ist abrechenbar? | Toggle | off | true/false (IsCalculable) |
| Kontingent verbraucht >% | Slider | 0%-100% | Zeige Tickets mit >X% Kontingent verbraucht |
| Kontingent < X Stunden | Integer | - | Nur Tickets mit weniger als X Stunden Kontingent |
| Branch/Filiale | Multi-Select Dropdown | - | Multichat-Umgebung, nur bestimmte Filiale |
Use-Case UC 11.6.1.8: "Zeige kritische Kontingent-Tickets (weniger als 5 Stunden verfügbar)"
Filter:
1. Ist abrechenbar? = true
2. Kontingent < 5 Stunden
3. Status ≠ Geschlossen
→ Ergebnis: 4 Tickets (Warnung: Kontingent läuft aus!)
8. TEXTSUCHE & KEYWORDS (4 Filter)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Schlüsselwort in Titel | Text-Eingabe | - | Wildcard-Suche in ShortDescription |
| Schlüsselwort überall | Text-Eingabe | - | Full-Text Search in Title + Description + Comments |
| Ticket-Nummer | Text-Eingabe | - | Suche nach Ticket #12345 |
| Referenznummer (extern) | Text-Eingabe | - | ConnectionNumber oder externe Ticket-ID |
Use-Case UC 11.6.1.9: "Suche alle Tickets mit 'Office 365' im Inhalt"
Filter:
1. Schlüsselwort überall = "Office 365"
→ Echtzeit-Suche in ~500 Tickets
→ Ergebnis: 47 Tickets (0.05 Sekunde)
9. SPEZIELLE FLAGS (5 Filter)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Ist intern nur | Toggle | off | true/false (IsOnlyInternalVisible - versteckte Tickets) |
| Ist Duplikat | Toggle | off | true/false (ParentHelpdeskI3D IS NOT NULL) |
| Ist weiterleitet | Toggle | off | true/false (ForwardedToI3D IS NOT NULL) |
| Hat Anhänge | Toggle | off | true/false (HelpdeskDocuments.Count > 0) |
| Hat Kommentare | Toggle | off | true/false (HelpdeskComments.Count > 0) |
10. CUSTOM FIELDS (Variable - 0-50+)
| Filter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Custom Feld 1 | (je nach Datentyp) | - | Kundenspezifisch, z.B. "Gebäude", "Stockwerk" |
| Custom Feld 2 | (je nach Datentyp) | - | Kundenspezifisch, z.B. "Raumart" |
| ... | ... | ... | ... |
| Custom Feld N | (je nach Datentyp) | - | Kundenspezifisch |
FILTER-KOMBINATIONEN - PRAKTISCHE BEISPIELE
Beispiel 1: "Meine kritischen offenen Tickets"
├── Status = {Offen, In Arbeit}
├── Priorität = {Hoch, Kritisch}
├── Zugeordnung = "Nur Mein"
└── SLA-Status ≠ Breached
→ Ergebnis: 5 Tickets (dringende Aufmerksamkeit erforderlich)
Beispiel 2: "Tickets die warten"
├── Status = "Wartet"
├── Wartet länger als = 5 Tage
└── Kategorie = {Hardware, Netzwerk}
→ Ergebnis: 3 Tickets (Follow-up erforderlich)
Beispiel 3: "Kundenreporting für ACME GmbH"
├── Kunde = "ACME GmbH"
├── Zeitraum (Geschlossen) = "Letzte 30 Tage"
├── Status = "Geschlossen"
└── Sortierung = CreatedDate DESC
→ Ergebnis: 23 Tickets (für Rechnungsstellung)
Beispiel 4: "Workload-Balancing"
├── Team = "Mein Team"
├── Status ≠ Geschlossen
├── Group-By = "Verantwortliche Person"
└── Sort = "Ticket-Count DESC"
→ Ergebnis: Visualisierung der Auslastung pro Person
KANBAN-BOARD ANSICHTEN
📊 4 Verschiedene Board-Modi
1. Status-Board (Standard - Standard-Ansicht)
┌─────────────┬──────────────┬─────────┬──────────┬────────────┐
│ Offen │ In Arbeit │ Wartet │ Gelöst │ Geschlossen│
│ (42) │ (18) │ (5) │ (156) │ (892) │
├─────────────┼──────────────┼─────────┼──────────┼────────────┤
│ [#12345] │ [#12346] │[#12347] │[#12348] │[#12349] │
│ Netzwerk │ Hardware │ Email │Software │ Access │
│ Pri: Hoch │ Pri: Kritisch│Pri: Mid │Pri: Low │Pri: Low │
│ 2h überfällig│SLA: OK │Waiting 3│SLA: OK │ This Mo │
│ │ │ days │ │ │
├─────────────┼──────────────┼─────────┼──────────┼────────────┤
│ [#12350] │ [#12351] │ │[#12352] │ │
│ Software │ Netzwerk │ │ Access │ │
│ Pri: Mid │ Pri: High │ │Pri: Mid │ │
│ SLA: OK │ SLA: AT RISK │ │ SLA: OK │ │
└─────────────┴──────────────┴─────────┴──────────┴────────────┘
Spalten-Statistiken (Header):
- Offen (42): SLA OK: 41, SLA AT RISK: 1, SLA BREACH: 0
- In Arbeit (18): SLA OK: 17, SLA AT RISK: 1, SLA BREACH: 0
- Wartet (5): > 5 Tage: 2, > 10 Tage: 1, Critical: 0
Funktionen:
- ✅ Drag-Drop Ticket zwischen Spalten → Status aktualisiert sich automatisch
- ✅ Ticket-Karten zeigen: Nummer, Titel, Priorität, SLA-Status
- ✅ Spalten-Header mit Statistiken
- ✅ Farbcodierung nach Priorität/SLA
- ✅ Klick auf Ticket → öffnet Details
2. Prioritäts-Board
Spalten: [Kritisch] [Hoch] [Mittel] [Niedrig]
Kritisch (8):
├─ [#12345] Netzwerk-Ausfall (ACME)
├─ [#12346] System Down
├─ [#12347] Sicherheit Breach
├─ [#12348] Db-Fehler
├─ [#12349] Backup fehlgeschlagen
├─ [#12350] VPN Down
├─ [#12351] Ransomware Warnung
└─ [#12352] E-Mail Ausfall
Hoch (18):
├─ [#12400] Password Reset
├─ [#12401] Drucker-Problem
...
Use-Case UC 11.6.2.1: "Techniker sieht auf einen Blick was dringend ist"
Workflow:
1. Morgens Kanban öffnen (Prioritäts-Board)
2. Sieht sofort: 8 kritische, 18 hohe Priorität
3. Nimmt sich Top 3 kritische vor
4. Drag-Drops Ticket aus "Kritisch" → "In Arbeit"
5. Status-Update erfolgt automatisch + anderen Editoren wird SignalR-Update gesendet
3. Typ-Board
Spalten: [Incident] [Request] [Change] [Problem] [Task]
Incident (45):
├─ [#12345] Server reagiert nicht
├─ [#12346] Internet Down
├─ [#12347] Email Down
└─ ...
Request (62):
├─ [#12400] Neuer User-Account
├─ [#12401] Software-Installation
├─ [#12402] Drucker verbinden
└─ ...
4. Zuweisung-Board
Spalten: [Klaus] [Maria] [Peter] [Lisa] [Frank] [Nicht zugeordnet]
Klaus (12 Tickets):
├─ [#12345] Priorität: Kritisch
├─ [#12346] Priorität: Hoch
├─ [#12347] Priorität: Mittel
└─ ...
Maria (8 Tickets):
├─ [#12400] Priorität: Kritisch (1h überfällig!)
├─ [#12401] Priorität: Hoch
└─ ...
Nicht zugeordnet (7 Tickets):
├─ [#12500] Priorität: Kritisch
├─ [#12501] Priorität: Hoch
└─ ...
Use-Case UC 11.6.2.2: "Manager sieht Arbeitsauslastung des Teams und balanciert manuell"
Workflow:
1. Manager öffnet Kanban (Zuweisung-Board)
2. Sieht: Klaus = 12, Maria = 8, Peter = 15 (Überlastet!), Lisa = 10, Frank = 3
3. Sieht kritisches Ticket #12400 bei Maria (1h überfällig) → muss sofort bearbeitet werden
4. Drag-Drops 2 Tickets von Peter zu Frank (Umverteilung)
5. Alle Techniker erhalten Benachrichtigung über Umverteilung
CONDITIONAL FORMATTING - 100+ VORDEFINIERTE REGELN
🎨 Bedingte Formatierungs-Engine
Jede Regel ist definiert als:
ConditionalFormattingRule
{
Id: int,
Name: string (z.B. "SLA Violation - Überfällig"),
Enabled: bool,
Conditions: List<FilterCondition> // AND/OR kombinierbar
{
ColumnName: string (z.B. "SLAStatus", "Priority", "Status")
Operator: enum {
Equals,
NotEquals,
Contains,
NotContains,
Greater,
Less,
GreaterOrEqual,
LessOrEqual,
Between,
In,
NotIn,
StartsWith,
EndsWith,
Regex,
IsNull,
IsNotNull
},
Value: object (z.B. 3 für "Kritisch", "true" für bool),
CaseSensitive: bool,
LogicalOperator: enum { And, Or } // Verknüpfung zur nächsten Bedingung
},
LogicalCombination: enum { AllMustMatch (AND), AnyCanMatch (OR) },
Styling: ConditionalFormattingStyle
{
BackgroundColor: hex (z.B. "#FF0000"),
ForegroundColor: hex,
FontWeight: enum { Normal, Bold, VeryBold },
FontStyle: enum { Normal, Italic, Underline, Strike },
BorderColor: hex,
BorderWidth: int (0-5px),
Icon: string (z.B. "🔴", "⚠️", "✅", "🔒"),
BlinkingEnabled: bool (für sehr kritisch)
},
Priority: int (0-1000, höher = wird zuerst angewendet),
CreatedDate: datetime,
IsSystem: bool (true = c-entron-vordefiniert, false = custom)
}
📋 Standard-Regeln (Vordefiniert)
| Nr. | Regel-Name | Bedingung | Farbe | Icon |
|---|---|---|---|---|
| 1 | SLA Breached | SLAStatus = "Breached" | 🔴 Rot | 🚨 |
| 2 | SLA At Risk | SLAStatus = "At Risk" | 🟡 Orange | ⚠️ |
| 3 | Priorität Kritisch | Priority = 4 (Kritisch) | 🔴 Rot + Bold | 🔴 |
| 4 | Priorität Hoch | Priority = 3 (Hoch) | 🟠 Orange | ⬆️ |
| 5 | Überfällig | DueDate < NOW() | 🔴 Rot + Blinkend | ⏰ |
| 6 | Wartet > 5 Tage | Status = "Wartet" AND (NOW - StatusChangeDate) > 5 Tage | 🟡 Gelb | ⏳ |
| 7 | Ich bin Responsible | ResponsiblePersonI3D = CurrentUserId | 🟢 Grün Border | 👤 |
| 8 | Ungelesen Kommentare | LastCommentDate > LastReadDate | 🔵 Blau Bold | 💬 |
| 9 | Neue E-Mail erhalten | LastEmailDate > LastReadDate | 🔵 Blau | 📧 |
| 10 | Keine Zuordnung | ResponsiblePersonI3D IS NULL | ⚪ Grau | ❓ |
| 11 | RMA Ticket | IsRMA = true | 🟣 Lila | 📦 |
| 12 | Duplikat erkannt | ParentHelpdeskI3D IS NOT NULL | ⚪ Grau + Strike | 🔗 |
| 13 | Service-Level gefährdet | (DueDate - NOW) < 2 Stunden | 🔴 Rot | ⏱️ |
| 14 | Große Kundenbeschwerde | Tags contains "Kunde-Beschwerde" AND Priority >= 3 | 🔴 Rot Bold | 😤 |
| 15 | Team-Überbelastung | (SELECT COUNT(*) FROM Tickets WHERE Responsible=X AND Status!="Geschlossen") > 15 | 🟡 Orange | 📊 |
Use-Case UC 11.6.3.1: "Manager sieht auf einen Blick problematische Tickets"
Workflow:
1. Techniker öffnet Ticket-Liste
2. System wendet automatisch 15 vordefinierte Formatierungs-Regeln an
3. Visuelles Ergebnis:
- 🔴 Rot blinkend: 3 überfällige kritische Tickets
- 🟡 Orange: 8 Tickets mit SLA At Risk
- 🟢 Grün Border: 12 Tickets die dieser Techniker verantwortet
- 💬 Blau Bold: 4 Tickets mit ungelesenen Kommentaren
- ❓ Grau: 7 nicht zugeordnete Tickets
4. Priorität ist jetzt klar - der Manager kann sofort handeln
GESPEICHERTE ANSICHTEN (Vordefiniert + Custom)
🖼️ Vordefinierte Ansichten (System)
| Ansicht | Filter-Kombination | Board-Typ | Nutzer |
|---|---|---|---|
| Meine offenen Tickets | Zuordnung="Nur Mein" + Status≠"Geschlossen" | Status-Board | Alle |
| Kritische Tickets | Priorität="Kritisch" + Status≠"Geschlossen" | Prioritäts-Board | Alle |
| Tickets im Wartezustand | Status="Wartet" + Dauer>5Tage | Prioritäts-Board | Manager |
| Mein Team Auslastung | Team="Mein Team" + Status≠"Geschlossen" | Zuweisung-Board | Manager |
| Kundenreporting (aktuelle Monat) | Zeitraum="Dieser Monat" + Status="Geschlossen" | Status-Board | Reporting |
| SLA Breaches | SLAStatus="Breached" | Prioritäts-Board | Management |
| Nicht zugeordnete Tickets | Zuordnung="Nur Nicht zugeordnet" | Prioritäts-Board | Dispatcher |
| Meine Favoriten | HelpdeskMarked=true + ResponsiblePerson=CurrentUser | Status-Board | Alle |
| Heute erstellt | Zeitraum="Heute" | Status-Board | Alle |
| Nur Meine Beschwerde-Tickets | Tags contains "Kunde-Beschwerde" + Zuordnung="Mein" | Prioritäts-Board | Alle |
➕ Custom Ansichten (User-erstellt & Team-geteilt)
Use-Case UC 11.6.4.1: "Techniker speichert häufig verwendete Filter-Kombination"
Workflow:
1. Setze Filter:
- Kategorie = "Netzwerk"
- Status = {Offen, In Arbeit}
- SLA ≠ Breached
2. Klick "Ansicht speichern"
3. Benenne: "Meine Netzwerk-Tickets"
4. Speicheroption: "Nur Ich" oder "Mit Team teilen"
5. Speichern
6. Nächste Mal: Klick auf "Meine Netzwerk-Tickets" → Filter instant angewendet
→ Zeitersparnis: 5 Sekunden statt 20 Sekunden Filter-Setup pro Öffnung!
USE-CASES - PRAKTISCHE WORKFLOWS
UC 11.6.1: Tickets filtern und suchen
- Beschreibung: Techniker sucht Tickets nach komplexen Kriterien
- Ablauf:
- Filtersektion öffnen (Sidebar oder Popover)
- Filter-Kombinationen setzen (AND/OR Logik)
- Echtzeit-Vorschau wird aktualisiert
- Suchen ausführen (oder automatisch <100ms)
- Ergebnisse in Grid oder Kanban anzeigen
- Optional: Filter speichern als Ansicht
- Performance: Cached List (~500 Tickets im RAM), <100ms Filter-Anwendung
- Optimierung: Nur sichtbare Tickets rendern (Virtual Scrolling)
UC 11.6.2: Kanban-Board verwenden mit Drag-Drop
- Beschreibung: Visuelle Ticket-Verwaltung
- Ablauf:
- Board-Ansicht wählen (Status, Priorität, Typ, oder Zuordnung)
- Tickets auf Karten sehen (mit Thumbnails von Beschreibung)
- Ticket per Drag&Drop zwischen Spalten verschieben
- System speichert Status-Update
- Statistiken in Spalten-Header aktualisieren sich
- Andere Bearbeiter sehen Änderung in Echtzeit (SignalR)
- Hidden Feature: Double-Click auf Spalte = öffnet modal Details
UC 11.6.3: Bedingte Formatierung anwenden
- Beschreibung: Automatische Farb-Hervorhebung basierend auf Regeln
- 15+ Standard-Regeln sichtbar angewandt, plus beliebig viele custom Regeln
- Priorisierung: Regeln nach Priority index angewendet (höher = zuerst)
UC 11.6.4: Ticket-Ansicht speichern und wieder laden
- Beschreibung: Filter-Kombination als vordefinierte Ansicht speichern
- Speicher: User-spezifisch (nur dieser User sieht) oder Team-weit (geteilt)
- Zugriff: Quick-Access Dropdown oder Sidebar-Menü
- Verwaltung: Ansichten können renamed, duplicated, oder deleted werden
Hidden Features
- Column Summary Statistics: Spalten-Header zeigen Statistiken (z.B. "Offen (42), SLA OK: 41, AT RISK: 1")
- Inline Filtering: Schnellfilter direkt in Spalten (nicht nur Sidebar)
- Ticket Grouping: Gruppierung nach Customer, Team, Status
- Export to Excel: Gefilterte Ergebnisse + Formatierung + Charts exportieren
- Bulk Actions: Multi-Select Checkbox + Batch-Operationen (Status/Priority/Assign/Tags ändern)
- Keyboard Shortcuts:
Ctrl+F= Focus SuchfeldCtrl+N= Neue AnsichtCtrl+S= Aktuelle Ansicht speichernArrow Up/Down= Zwischen Tickets navigierenEnter= Ticket öffnen
- Real-Time Collaboration: Wenn anderenbenutzer einen Filter ändert, sehen Sie die Änderungen (nach opt-in)
- Performance Monitoring: Status-Leiste zeigt "500 Tickets geladen (45ms Filter)"
- Advanced Sort: Multi-Column Sort (bis 3 Spalten), benutzerdefinierte Sort-Reihenfolge speichern
- Favorite Columns: User kann auswählen welche Spalten sichtbar sind (bis zu 20 Spalten)
3.3 Ticket schließen (Close Ticket)
Pfad: src/CentronNexus/ServiceBoard/CloseTicket/CloseTicketPage.razor
Kategorie: Ticket Management (Workflow & Service Completion)
Status: ✅ Vollständig implementiert
Komplexität: 🔴 Hoch (Multi-step, Reports, Email Integration, SLA Tracking)
Lizenz: LicenseGuids.Centron OR LicenseGuids.ServiceBoard
Umfassende Beschreibung
Die Ticket-Schließungs-Modul ist das kritische Abschluss-System für den Service-Delivery-Prozess. Es bietet:
- 7+ Schließungs-Grund-Typen mit unterschiedlichen Workflows und Post-Close-Aktionen
- Automatische Service-Report-Generierung (7-teiliger strukturierter Report)
- Multi-Channel E-Mail-System mit Merge-Tags und Template-Versioning
- SLA-Abschluss-Tracking mit automatischer Berechnung von Erfüllung und Verzögerungen
- Duplikat-Erkennung und intelligente Verknüpfung
- Kunden-Zufriedenheits-Survey Integration mit optionalen Bewertungs-Links
- Conditional Auto-Reopen bei Kunden-Antworten nach Schließung
- Audit-Trail mit vollständiger Nachverfolgung aller Schließungs-Parameter
Schließungs-Gründe (Closing Reason Types)
| Grund | Code | Kategorie | Beschreibung | Post-Close Aktionen |
|---|---|---|---|---|
| Gelöst | SOLVED | Success | Problem wurde vollständig gelöst | SLA ✅, Archive, Optional Survey |
| Nicht reproduzierbar | NOT_REPRODUCIBLE | Unresolvable | Problem konnte nicht reproduziert werden | SLA ⏸️, Knowledge Base Entry, Optional Reopen |
| Nicht relevant | NOT_RELEVANT | Administrative | Ticket ist nicht mehr relevant oder bereits überholt | SLA ❌, Archive, Notification |
| Duplikat | DUPLICATE | Administrative | Ticket ist Duplikat eines anderen (Link zu Original) | Link + Archive, Merge Time Records |
| Kunde reagiert nicht | CUSTOMER_UNRESPONSIVE | Waiting | Kunde hat 7 Tage nicht geantwortet nach Anfrage | Optional Reopen, Follow-up Schedule |
| Workaround bereitgestellt | WORKAROUND | Partial | Workaround statt vollständiger Lösung | SLA ✅, KB Suggestion, Enhancement Ticket |
| Extern gelöst | EXTERNALLY_RESOLVED | Vendor | Vendor/Hersteller hat Problem gelöst | RMA Tracking, Vendor Feedback |
Workflow State Machine
┌─────────────────────────────────────────────────────────────┐
│ TICKET CLOSING FLOW │
└─────────────────────────────────────────────────────────────┘
[OPEN] ──→ [PENDING_CLOSE] ──→ [VALIDATE] ──→ [GENERATE_REPORT]
(Reason selected) (Business (PDF generated)
rules check) │
↓
[SEND_NOTIFICATIONS]
(Email templates)
│
↓
[CREATE_AUDIT_ENTRY]
(Track all changes)
│
↓
[CLOSED]
(SLA Calculated)
│
┌─────────────────────────────────────────┘
│ Optional:
↓
[MONITOR_REOPEN]
(7-day window for
customer responses)
│
├──→ [REOPENED] (Auto-reopen on reply)
└──→ [ARCHIVED] (After 90 days)
TicketClose Daten-Entität
// PRIMARY IDENTIFICATION
HelpdeskI3D int IDENTITY(1,1) - FK to Helpdesk
TicketNumber int - Display reference
TicketTitle nvarchar(500) - Snapshot
CreatedByI3D int - Who initiated close
CreatedDate datetime2 - When close initiated
ClosedByI3D int - Who confirmed/saved close
ClosedDate datetime2 - When actually closed
// CLOSING REASON & CATEGORIZATION
ClosingReasonKind int - FK to ClosingReason lookup
ClosingReasonName nvarchar(100) - Cached for speed
ClosingCategory nvarchar(50) - SUCCESS, UNRESOLVABLE, ADMINISTRATIVE, WAITING, VENDOR
RelatedTicketI3D int? - FK if Duplicate (links to parent)
IsDuplicateOf int? - Set when this is identified as duplicate
// SOLUTION DOCUMENTATION
SolutionSummary nvarchar(max) - Customer-visible solution summary
InternalNotes nvarchar(max) - Internal team-only notes
RootCauseAnalysis nvarchar(max) - Technical RCA (internal)
LearnedLessons nvarchar(max) - Knowledge base contribution
// SERVICE REPORT GENERATION
IncludeServiceReport bit - Generate PDF report?
ServiceReportFormat nvarchar(50) - PDF, HTML, DOCX
ServiceReportPdfBytes varbinary(max) - PDF document binary
ServiceReportGeneratedDate datetime2 - When report was generated
ServiceReportGeneratedByI3D int - Who generated it
ServiceReportPageCount int - Number of pages for display
// EXTERNAL NOTIFICATIONS (CUSTOMER EMAIL)
NotifyCustomer bit - Send email to customer?
CustomerEmailTemplate int - FK to EmailTemplate
CustomerEmailSentDate datetime2 - When customer email was sent
CustomerEmailStatus nvarchar(50) - PENDING, SENT, FAILED, BOUNCED
CustomerEmailRetryCount int - Retry attempts
AdditionalCustomerEmails nvarchar(max) - Comma-separated email list
// INTERNAL NOTIFICATIONS (TEAM EMAIL)
NotifyTeam bit - Send internal notification?
TeamNotificationChannels nvarchar(max) - EMAIL, SLACK, TEAMS, WEBHOOK
TeamEmailTemplate int - FK to EmailTemplate
TeamEmailSentDate datetime2
TeamEmailStatus nvarchar(50)
// SLA & METRICS
OriginalSLAMinutes int - Calculated from contract
ActualResolutionMinutes int - From open to close
SLAPercentage decimal(5,2) - % of SLA met (e.g., 95.5)
SLAMet bit - Was SLA met?
SLABreachDate datetime2? - When SLA was breached
ReopenWindow int - Hours customer can reopen (e.g., 168 for 7 days)
// SATISFACTION SURVEY
IncludeSurvey bit - Include satisfaction survey link?
SurveyToken uniqueidentifier - Unique token for survey
SurveyLink nvarchar(1000) - URL to survey
SurveySentDate datetime2
SurveyCompletedDate datetime2?
SurveyRating int? - 1-5 or NPS scale
// VERSIONING & AUDIT
Version int - Optimistic lock for concurrent updates
ChangedByI3D int - Last modifier
ChangedDate datetime2 - Last change timestamp
IsDeleted bit - Soft delete flag
DeletedByI3D int? - Who deleted
DeletedDate datetime2? - When deleted
Service Report Struktur (7 Sections)
┌──────────────────────────────────────────────────────────────┐
│ SERVICE REPORT - TICKET CLOSURE DOCUMENT │
├──────────────────────────────────────────────────────────────┤
│ │
│ 1. TICKET OVERVIEW (Übersicht) │
│ ├─ Ticket-Nummer, Titel, Erstellt-Datum │
│ ├─ Kunden-Name, Kontakt-Person, Standort │
│ ├─ Priorität, SLA-Level, Service-Typ │
│ └─ Bearbeitungs-Team, Primär-Techniker │
│ │
│ 2. PROBLEM DESCRIPTION (Problembeschreibung) │
│ ├─ Original-Problem-Beschreibung │
│ ├─ Symptome & Fehler-Meldungen │
│ ├─ Umgebungs-Details (OS, Hardware, Software-Versionen) │
│ └─ Reproduktions-Schritte │
│ │
│ 3. SOLUTION SUMMARY (Lösungszusammenfassung) │
│ ├─ Durchgeführte Diagnose-Schritte │
│ ├─ Identifizierte Root-Cause │
│ ├─ Implementierte Lösung mit Details │
│ └─ Validierungs-Schritte & Resultat │
│ │
│ 4. WORK PERFORMED (Durchgeführte Arbeiten) │
│ ├─ Aktivitäts-Timeline mit Zeitstempel │
│ ├─ Durchgeführte Konfigurationen & Änderungen │
│ ├─ Software-Updates / Patches angewendet │
│ └─ Hardware-Replacements / Upgrades │
│ │
│ 5. TIME & RESOURCE TRACKING (Zeit & Ressourcen) │
│ ├─ Total-Bearbeitungs-Zeit (Techniker-Stunden) │
│ ├─ Einsatz-Orte & Reisezeit │
│ ├─ Team-Mitglieder & Ihre Rollen │
│ └─ Externe Ressourcen (Vendor, Hersteller) │
│ │
│ 6. COSTS & BILLING (Kosten & Abrechnung) │
│ ├─ Techniker-Zeitkosten (Stundensatz × Stunden) │
│ ├─ Material- & Lizenz-Kosten │
│ ├─ Reisekosten (ggf. Kilometergebühr) │
│ ├─ Sub-Contractor-Kosten (extern) │
│ └─ Total-Kosten + Abrechnung-Status │
│ │
│ 6. ATTACHMENTS & REFERENCES (Anhänge & Referenzen) │
│ ├─ Screenshots & System-Logs │
│ ├─ Konfiguration-Dateien │
│ ├─ KB-Artikel-Links │
│ ├─ Externe-Dokumentation-Links │
│ └─ Follow-up-Tickets oder Verknüpfungen │
│ │
│ Generated: {GenerationDate} │
│ Signed By: {ClosedByName} │
│ Report Format Version: 2.1 │
└──────────────────────────────────────────────────────────────┘
E-Mail-Templates System
Template-Manager mit 5+ Vordefinierte Templates:
1. "Ticket abgeschlossen - Standard (DE)"
├─ Subject: "Ticket #{TicketNumber} erfolgreich abgeschlossen"
├─ Content: HTML mit Styling (Corporate Colors)
├─ Merge-Tags: {TicketNumber}, {TicketTitle}, {CustomerName}, {ClosedDate},
│ {SolutionSummary}, {TotalHours}, {ClosingTeam}, {SurveyLink}
└─ AttachFiles: ServiceReport.pdf (wenn IncludeServiceReport=true)
2. "Ticket abgeschlossen - Standard (EN)"
├─ English version mit gleicher Struktur
└─ Automatic language selection based on customer contact language
3. "Mit Kundenbewertungs-Survey (DE)"
├─ Eingebettete Survey-Fragen mit Stern-Rating (1-5)
├─ NPS-Frage (Net Promoter Score 0-10)
├─ Free-text Feedback-Feld
└─ One-Click Satisfaction Link für schnelle Bewertung
4. "Interne Team-Benachrichtigung (DE)"
├─ Recipient: Assigned Team (not customer)
├─ Content: Technical Details + RCA + Lessons Learned
├─ For: Team knowledge sharing, best practices
└─ Includes: Links zu KB-Artikel, Enhancement-Tickets
5. "MSP/Service-Reporting (DE)"
├─ Für MSP-Kunden mit Abrechnungs-Integration
├─ Shows: Costs, Time breakdown, Line items
├─ Includes: Invoice-Link wenn available
└─ Customizable für Abrechnungs-Anforderungen
Template Versioning:
├─ Version 1.0 (Legacy)
├─ Version 2.0 (Current - responsive design)
└─ Version 2.1 (Latest - with accessibility improvements)
Detaillierte Use Cases
UC 11.7.1: Standardmäßiges Ticket mit Lösungs-Summary abschließen
Szenario: Techniker löst Software-Konfigurationsproblem und möchte Ticket ordnungsgemäß abschließen.
Schritt-für-Schritt:
- Ticket-Details öffnen (Status = "In Arbeit")
- "Ticket schließen" Button oben rechts klicken
- Step 1 - Schließungs-Grund:
- Dropdown: "Gelöst" wählen
- System zeigt: "Dieses Ticket wird als erfolgreich abgeschlossen markiert"
- Step 2 - Lösung dokumentieren:
- Feld "Lösungs-Zusammenfassung" ausfüllen (kunde-sichtbar):
"Die Outlook-Synchronisierungsprobleme wurden durch Neukonfiguration der EAS-Einstellungen und IMAP-Protokoll-Updates behoben. Kundenendgerät getestet und erfolgreich synchronisiert." - Feld "Interne Noten" ausfüllen (team-only):
"Ursache war outdated Exchange-Version im Customer-Tenant. Update durchgeführt + modern auth enabled. Ähnliche Probleme in KB-Artikel verlinkt."
- Feld "Lösungs-Zusammenfassung" ausfüllen (kunde-sichtbar):
- Step 3 - Service-Report:
- Checkbox "Service-Report als PDF generieren" ✓
- System: Startet PDF-Generierung im Hintergrund
- Step 4 - Benachrichtigungen:
- "Kunde per E-Mail benachrichtigen": ✓ checked
- Template: "Ticket abgeschlossen - Standard (DE)" selected
- "Survey einschließen": ✓ checked
- "Team benachrichtigen": ✓ checked (internal notification)
- Additional Recipients: Leave empty (uses customer primary contact)
- Step 5 - Review & Speichern:
- "Vorschau" anzeigen → E-Mail-Inhalt wird angezeigt
- "Bestätigen & Speichern" Button klicken
- Hintergrund-Prozesse:
- PDF wird generiert und anhängt
- E-Mail an Kunde wird versendet
- Ticket-Status wechselt zu "Closed"
- ClosedByI3D, ClosedDate, SLA-Status werden gesetzt
- Audit-Eintrag wird erstellt
- Survey-Token wird generiert und in E-Mail eingefügt
- Ergebnis: Ticket ist geschlossen, Kunde erhält E-Mail mit Report & Survey-Link
Betroffene Felder:
Helpdesk.HelpdeskStatusI3D = 5 (Closed)
Helpdesk.HelpdeskStatusName = "Closed"
Helpdesk.ClosedByI3D = CurrentUserId
Helpdesk.ClosedDate = DateTime.Now
Helpdesk.SLAStatus = CALCULATED (Met/Breached)
Helpdesk.SLAPercentage = (ActualTime / SLATime) × 100
Betroffene Tabellen:
- Helpdesk (Status-Update)
- HelpdeskCloseAudit (Neuer Eintrag)
- EmailQueue (E-Mail eingereiht)
- ServiceReportHistory (Report-Metadaten)
- CustomerSurvey (Survey-Token)
UC 11.7.2: Duplikat-Ticket-Schließung mit Verknüpfung
Szenario: Techniker erkennt, dass aktuelles Ticket bereits gelöst durch anderes Ticket.
Ablauf:
- Ticket öffnen (ähnliches Problem wie #2341)
- "Ticket schließen" → Grund: "Duplikat"
- System zeigt: "Bitte geben Sie das Original-Ticket an"
- Feld "Link zu Original-Ticket": "#2341" eingeben
- System validiert: Findet Ticket #2341 ✓
- Zeigt: Ticket-Titel, Status, Schließungs-Datum von #2341
- "Auto-Link Zeit-Einträge": Toggle ✓
- System wird alle TimeRecords von aktuellem zu Original verknüpfen
- E-Mail-Vorlage: "Duplikat-Benachrichtigung (DE)"
- Subject: "Ticket #{Number} - Zusammenführung mit #{OriginalNumber}"
- Content nennt das Original-Ticket
- Speichern:
- Aktuelles Ticket wird geschlossen
- RelatedTicketI3D = 2341
- IsDuplicateOf = 2341
- Time-Records werden verknüpft
- Kunde erhält E-Mail mit Link zum Original-Ticket
Result: Duplikate eliminiert, Time-Records korrekt zugeordnet
UC 11.7.3: Nicht reproduzierbares Problem (7-Tage-Auto-Reopen)
Szenario: Intermittierendes Problem, kann nicht reproduziert werden nach 3 Versuchen.
Ablauf:
- Schließungsgrund: "Nicht reproduzierbar"
- Lösung: "Problem konnte nach mehreren Diagnose-Versuchen nicht reproduziert werden"
- System setzt automatisch:
ReopenWindow = 168 Stunden(7 Tage)ClosedDate + 7 Days = Auto-Archive Date
- E-Mail an Kunde:
- "Falls Problem erneut auftritt, antwortet Sie einfach auf diese E-Mail"
- "Wir werden Ticket automatisch innerhalb 7 Tagen wiedereröffnen bei Rückmeldung"
- Überwachung:
- Wenn Kunde antwortet: Ticket automatisch zu "Open" zurück, neuer Techniker zugewiesen
- Wenn keine Antwort nach 7 Tagen: Ticket wird archiviert
- SLA-Behandlung: SLA ⏸️ (markiert als "Not Met" aber kein Breach)
UC 11.7.4: MSP-Ticket mit Kosten-Abrechnung abschließen
Szenario: MSP-Techniker schließt Ticket und System muss Kosten für Abrechnung erfassen.
Ablauf:
- Schließungsgrund: "Gelöst"
- Service-Report ✓
- Abrechnung:
- System liest: Helpdesk.Contract (MSP-Vertrag)
- Berechnet Kosten:
- Techniker-Zeit: 2,5 Stunden × €80/h = €200
- Material (wenn applicable): €0
- Reisekosten: €0 (Remote)
- Gesamtkosten: €200
- Contingent-Verbrauch:
- Wenn Vertrag = "100 Stunden/Monat Contingent"
- Verbrauchte Stunden diesen Monat: 78h
- Neue Summe: 80,5h (innerhalb Contingent ✓)
- E-Mail-Template: "MSP Service-Report mit Abrechnung"
- Zeigt: Itemized Costs, Contingent-Status
- Includes: Invoice-Link wenn ready
- System erstellt automatisch: CostRecording mit allen Details
- Optionaler Schritt: Techniker kann manuell benutzerdefinierte Notiz hinzufügen:
- "Zusätzliche 30 Min zur Kundenaufklärung - nicht in Contingent enthalten"
- Speichern → Ticket closed + Kostenerfassung erfolgt
UC 11.7.5: Batch-Close (Mehrere Tickets gleichzeitig abschließen)
Szenario: Admin möchte mehrere veraltete Test-Tickets auf einmal schließen.
Ablauf:
- Ticket-Liste öffnen
- Filter anwenden: Status="Open", CreatedDate > 6 Monate ago, Project="Testing"
- Ergebnis: 15 Tickets gefunden
- Multi-Select: Alle 15 auswählen (Checkbox-Header)
- "Bulk Close" Button oben in Toolbar
- Dialog erscheint:
- "Sie wählen 15 Tickets zum Schließen"
- Schließungs-Grund: "Nicht relevant" (Dropdown)
- Template: "Bulk Close Notification (DE)"
- "Notifikation senden?": unchecked (für Test-Tickets nicht notwendig)
- "Bestätigen & Schließen":
- System durchläuft alle 15 Tickets
- Für jedes: Status = Closed, ClosedByI3D = CurrentUser, ClosedDate = Now
- Audit-Einträge werden batch-erstellt
- Progress-Bar zeigt: "Closing 5 of 15..."
- Nach Abschluss: "15 Tickets erfolgreich geschlossen"
- Report: CSV Export mit Zusammenfassung
- Ticket-Nummern
- Schließungs-Grund
- Schließungs-Zeit
- Notizen
Versteckte Funktionen (Hidden Features)
-
Auto-Zusammenfassung via KI
- Wenn
IncludeSurvey=true: System generiert automatisch eine Kurz-Zusammenfassung basierend auf:- Ticket-Beschreibung
- Kommentare & Notizen
- Time-Einträge mit Beschreibungen
- Techniker kann diese akzeptieren oder manuell überschreiben
- Verbessert Konsistenz der Dokumentation
- Wenn
-
Intelligente E-Mail-Template-Auswahl
- System analysiert Ticket-Merkmale:
ClosingReason→ Schlägt passende Template vorCustomerType(MSP, Einzelkunde, Enterprise) → Template passt sich anLanguage→ Template automatisch in Kundenssprache
- Techniker kann manuell override
- System analysiert Ticket-Merkmale:
-
Auto-Reopen bei Kunden-Antwort
- Nach Ticket-Schließung: Überwachung auf eingehende E-Mails (7 Tage)
- Wenn Kunde antwortet:
- Neuer Kommentar wird automatisch hinzugefügt
- Ticket-Status wechselt zu "Reopened"
- Ursprünglicher Techniker wird benachrichtigt
- ReopenCount wird inkrementiert
-
Service-Report Caching & Versionierung
- PDF wird gecacht nach Generierung (nicht jedes mal neu generiert)
- Versionshistorie: Wenn Techniker nochmal "Update PDF" klickt vor Speichern
- Verhindert: "Warum habe ich 5 PDFs bekommen?"
-
Schließungs-Grund-Statistiken Dashboard
- Hidden view:
/ServiceBoard/CloseAnalytics - Zeigt: Distribution von Schließungs-Gründen (Pie Chart)
- Gelöst: 85%
- Nicht reproduzierbar: 8%
- Duplikat: 4%
- Nicht relevant: 2%
- etc.
- Filter: By Team, Department, Time Period
- Identifies trends: "Steigende nicht reproduzierbar rate → vielleicht QA-Problem?"
- Hidden view:
-
E-Mail-Template Versioning & Preview
- Techniker kann mehrere Template-Versionen vergleichen
- "Preview" Button zeigt renderte E-Mail mit actual Merge-Tags gefüllt
- "Compare versions" → Side-by-side Vergleich (v1.0 vs v2.1)
- Audit: Wer hat Template zuletzt geändert und wann?
-
Knowledge Base Auto-Linking
- Nach Schließung mit
ClosingReason=SOLVED: - System durchsucht KB-Artikel mit ähnlichen Keywords (Ticket-Titel, Schließungs-Summary)
- Zeigt Top 3 KB-Artikel die verknüpft werden könnten
- Techniker klickt "Link" → wird zu Service-Report hinzugefügt
- Nach Schließung mit
-
Conditional Auto-Notification
- Business Rules können definieren:
- "Wenn ClosingReason=Kritisch-Workaround: Immer Manager + Customer benachrichtigen"
- "Wenn SLA breached: Zusätzlich SLA-Manager benachrichtigen"
- "Wenn Duplikat: Nicht an Kunde senden (nur internen Hinweis)"
- Business Rules können definieren:
REST API Endpoints
PUT /api/Helpdesk/{id}/Close
├─ Request: { closingReason, solutionSummary, internalNotes, includeServiceReport, notifyCustomer, templateId }
├─ Response: { ticketId, closedDate, slaStatus, reportUrl, emailStatus }
└─ Auth: [Authenticate], Rights: HELPDESK_CLOSE
GET /api/Helpdesk/{id}/ClosingReasons
├─ Returns: List<{ id, name, category, description }>
└─ Caching: 1 Hour
GET /api/Helpdesk/{id}/ClosePreview
├─ Purpose: Preview e-mail before sending (without actually closing)
├─ Returns: { emailSubject, emailBody, reportPreview }
└─ Used in UI Preview dialog
GET /api/ServiceReport/{ticketId}
├─ Returns: { pdfBytes, generatedDate, pageCount, sections }
└─ Caching: Permanent (versioned)
POST /api/Helpdesk/{id}/GenerateServiceReport
├─ Trigger: Generate report without closing
├─ Returns: { reportUrl, generatedDate, sections }
└─ Async: Long-running operation
PUT /api/Helpdesk/{id}/RelinkDuplicates
├─ Purpose: When duplicate detected, relink and merge data
├─ Request: { originalTicketId, mergeTimeRecords, mergeComments }
└─ Response: { mergedTicketCount, timeRecordsRelinked }
GET /api/Helpdesk/CloseAnalytics
├─ Dashboard data: Closing reason distribution, trends, team stats
├─ Parameters: startDate, endDate, groupBy (team|department|reason)
└─ Returns: { chartData, statistics, trends }
POST /api/Helpdesk/{id}/BulkClose
├─ Request: { ticketIds[], closingReason, templateId, notifyCustomers }
├─ Response: { processedCount, successCount, failedCount, errors[] }
└─ Async with webhook callback
GET /api/EmailTemplates/CloseTicket
├─ Returns: List of available close-ticket templates with versions
├─ Includes: Merge tags, examples, language variants
└─ Filtering: By language, category, version
GET /api/Helpdesk/{id}/AutoReopenMonitor
├─ Status of auto-reopen monitoring for closed ticket
├─ Returns: { isMonitored, daysRemaining, responseStatus }
└─ Called periodically: Every 6 hours by background job
POST /api/Helpdesk/{id}/LinkToKnowledgeBase
├─ Suggest KB articles for closed ticket
├─ Returns: List<{ kbArticleId, title, relevanceScore }>
└─ ML-powered: Semantic similarity matching
GET /api/Helpdesk/SurveyStatus/{surveyToken}
├─ Check if customer completed satisfaction survey
├─ Returns: { completed, rating, feedback, completedDate }
└─ Public endpoint (no auth required for token)
POST /api/Helpdesk/{id}/SendFollowUpEmail
├─ Send follow-up email to customer (post-close, day 3)
├─ Request: { templateId, delayDays }
├─ Response: { scheduledDate, status }
└─ Scheduled job: Runs at scheduled time
PUT /api/Helpdesk/{id}/UpdateCloseReason
├─ Reopen and change closing reason (if within edit window)
├─ Request: { newClosingReason, notes }
├─ Response: { updated, reason, changedDate }
└─ Auth: HELPDESK_CLOSE + HELPDESK_EDIT
3.4 Ticket weiterleiten (Forward Ticket)
Pfad: src/CentronNexus/ServiceBoard/ForwardTicket/ForwardTicketPage.razor
Kategorie: Ticket Management (Eskalation & Routing)
Status: ✅ Vollständig implementiert
Komplexität: 🔴 Hoch (Multi-scenario, SLA Pause, Vendor Integration, Chain Tracking)
Lizenz: LicenseGuids.Centron OR LicenseGuids.ServiceBoard
Umfassende Beschreibung
Das Ticket-Weiterleitungs-Modul ist das zentrale Eskalations- und Routing-System. Es ermöglicht:
- 6+ Weiterleitungs-Szenarien mit unterschiedlichen Workflows und Zieltypen
- Intelligente SLA-Pause/Resume Logik basierend auf Weiterleitungs-Typ
- Vendor-Integration mit RMA-Tracking und automatischer Referenznummer-Verwaltung
- Weiterleitungs-Kette-Tracking (Audit-Trail aller Eskalationen)
- Multi-Channel Benachrichtigungen (Email, Slack, Teams, SMS je nach Empfänger)
- Smart Routing Suggestions basierend auf Ticket-Eigenschaften und Historie
- Team-Kapazitäts-Berücksichtigung bei automatischer Zuweisung
- Conditional Auto-Assignment mit Fallback-Ketten
Weiterleitungs-Szenarien (Forwarding Types)
| Szenario | Code | Ziel | Beschreibung | SLA-Effekt |
|---|---|---|---|---|
| Interner Techniker | INTERNAL_TECH | Einzelperson | Weiterleitung an einen Techniker im gleichen Team | Pause (SLA läuft weiter) |
| Abteilung/Spezialist | DEPARTMENT | Team/Abteilung | Eskalation zu spezialisiertem Team (z.B. Netzwerk-Team) | Pause + SLA-Zähler zurücksetzen |
| Externer Vendor | EXTERNAL_VENDOR | Hersteller-Support | Hardware-/Software-Hersteller Support | Pause (bis zu 72h) |
| RMA Prozess | RMA_PROCESS | Logistik | Rückgabe von Hardware über Logistik-Partner | Pause + Tracking |
| Sub-Contractor | SUBCONTRACTOR | Externe Firma | Spezialisierte externe Firma/Berater | Pause + Kostenverfolgung |
| Manager Freigabe | MANAGER_APPROVAL | Manager | Eskalation für Management-Freigabe (z.B. Kosten) | Pause + Priority-Anhebung |
TicketForward Daten-Entität
// PRIMARY IDENTIFICATION
HelpdeskI3D int IDENTITY(1,1) - FK to Helpdesk
ForwardingNumber int - Sequential numbering (e.g., #2341.1, #2341.2)
OriginalTicketI3D int - Original ticket in chain
CreatedByI3D int - Who initiated forward
CreatedDate datetime2 - When forwarded
ForwardingSequence int - Order in chain (1st, 2nd, 3rd forward)
// FORWARDING TYPE & ROUTING
ForwardingKind int - FK to ForwardingType lookup
ForwardingTypeName nvarchar(50) - INTERNAL_TECH, DEPARTMENT, VENDOR, etc.
ForwardingCategory nvarchar(50) - INTERNAL, EXTERNAL, ESCALATION, VENDOR
RoutingDecision nvarchar(500) - Why this forward? (Reason)
// RECIPIENT/DESTINATION
RecipientType nvarchar(50) - PERSON, TEAM, VENDOR, EMAIL, EXTERNAL_API
RecipientI3D int? - FK to Employee or Team
RecipientName nvarchar(500) - Display name (cached)
RecipientEmail nvarchar(max) - Email addresses (comma-separated)
RecipientExternalId nvarchar(100) - External vendor ID (for VENDOR type)
// MESSAGE & CONTEXT
ForwardingMessage nvarchar(max) - Why forwarding? (visible to recipient)
ForwardingContext nvarchar(max) - Technical context (visible internally)
ShouldIncludeAttachments bit - Forward ticket attachments?
ShouldIncludeTimeRecords bit - Share time spent so far?
ShouldIncludeComments bit - Share internal comments?
// SLA & PAUSE TRACKING
SLAPauseDate datetime2 - When SLA was paused
SLAPausedMinutes int - Total paused time
SLAResumeDate datetime2? - When SLA resumed
IsSLAPaused bit - Current state: paused or not?
SLAPauseReason nvarchar(100) - Reason for pause
// VENDOR & RMA TRACKING (for VENDOR/RMA scenarios)
VendorTicketNumber nvarchar(100) - Vendor's ticket/RMA number
VendorContactName nvarchar(500) - Vendor contact person
VendorContactPhone nvarchar(50)
VendorContactEmail nvarchar(500)
VendorEstimatedResolutionDate datetime2? - When vendor expects to resolve
VendorRMATrackingNumber nvarchar(100) - Shipping/tracking number
VendorReturnAddress nvarchar(max) - Where to return hardware
// FORWARD CHAIN TRACKING
NextForwardI3D int? - FK to next TicketForward (if forwarded further)
PreviousForwardI3D int? - FK to previous TicketForward
ForwardChainLength int - How many times has this been forwarded?
IsChainTerminal bit - Is this the final destination?
// NOTIFICATIONS & ACKNOWLEDGEMENT
NotificationSentDate datetime2 - When forward notification sent
AcknowledgmentReceivedDate datetime2? - When recipient acknowledged
AcknowledgmentStatus nvarchar(50) - PENDING, ACKNOWLEDGED, IGNORED
ReminderSentCount int - How many reminders sent if not acknowledged?
// COST TRACKING (for paid services)
EstimatedCost decimal(18,2) - Cost estimate (sub-contractor, vendor)
ActualCost decimal(18,2)? - Actual charged cost
CostCurrency nvarchar(3) - EUR, USD, etc.
CostApprovedByI3D int? - Manager who approved cost
CostApprovalDate datetime2?
// VERSIONING & AUDIT
Version int - Optimistic lock
ChangedByI3D int
ChangedDate datetime2
IsDeleted bit
DeletedByI3D int?
DeletedDate datetime2?
Forwarding Chain State Machine
┌─────────────────────────────────────────────────────────────┐
│ TICKET FORWARDING FLOW (Chain) │
└─────────────────────────────────────────────────────────────┘
[OPEN - TECH1]
│ Problem: Needs specialized support
│ Decision: Escalate to Network Team
↓
[FORWARDED_1 - TECH1→NETWORK_TEAM]
│ SLA: PAUSED (New SLA clock for team)
│ Status: "Wartet auf Netzwerk-Team"
│ Notification: Email + Slack to team
├─ IF Acknowledged: Mark as ROUTED_ACCEPTED
├─ IF Ignored (2 hours): Send Reminder + escalate to Team Lead
├─ IF Still Ignored (4 hours): Escalate to Manager
│
├─ RESOLVED @ NETWORK_TEAM? → Forward to TECH1 (Return)
│ └─ [FORWARDED_2 - NETWORK_TEAM→TECH1] (Re-assignment)
│
└─ NOT RESOLVED? Additional Help Needed
└─ [FORWARDED_3 - NETWORK_TEAM→EXTERNAL_VENDOR] (RMA/Vendor)
│
├─ Vendor receives RMA
├─ SLA: PAUSED (Vendor SLA clock starts)
├─ Tracking: RMA Number tracked
│
└─ Vendor Resolves
└─ [FORWARDED_4 - VENDOR→TECH1] (Return to original)
│
└─ [CLOSED by TECH1]
└─ Final SLA: Calculated from all segments
E-Mail-Templates System (5+ Templates)
1. "Interner Techniker" (INTERNAL_TECH)
├─ Subject: "Ticket #{Number} - Weiterleitung zu Dir"
├─ Recipient: Single technician
├─ Merge-Tags: {AssignerName}, {TicketDetails}, {Context}
└─ Tone: Collaborative, peer-to-peer
2. "Abteilung/Spezialist-Team" (DEPARTMENT)
├─ Subject: "Ticket #{Number} - Eskalation zum {DepartmentName}"
├─ Recipient: Team distribution list
├─ Merge-Tags: {TeamLead}, {Priority}, {Complexity}
├─ AutoAssignment: Next available team member
└─ Tone: Escalation, priority note
3. "Externer Vendor" (EXTERNAL_VENDOR)
├─ Subject: "Ticket #{Number} - Anfrage an {VendorName}"
├─ Recipient: Vendor contact email
├─ Merge-Tags: {CustomerName}, {SerialNumber}, {ProblemDescription}
├─ Attachments: Logs, screenshots, configuration
└─ Tone: Formal, professional, service level emphasis
4. "RMA Prozess" (RMA_PROCESS)
├─ Subject: "RMA #{RMANumber} - Ticket #{TicketNumber}"
├─ Recipient: Logistics partner + customer (optional)
├─ Merge-Tags: {ShippingAddress}, {TrackingNumber}, {ReturnLabel}
├─ Includes: Prepaid shipping label URL
└─ Tone: Procedural, step-by-step instructions
5. "Sub-Contractor" (SUBCONTRACTOR)
├─ Subject: "Ticket #{Number} - Beauftragung Dienste"
├─ Recipient: Sub-contractor contact
├─ Merge-Tags: {SOW}, {EstimatedCost}, {DeadlineDate}
├─ Includes: SOW attachment, cost approval
└─ Tone: Business, formal contract tone
6. "Manager Freigabe" (MANAGER_APPROVAL)
├─ Subject: "Ticket #{Number} - Kosten-Freigabe erforderlich"
├─ Recipient: Manager
├─ Merge-Tags: {EstimatedCost}, {Justification}, {Deadline}
├─ Includes: Approval link (click to approve)
└─ Tone: Urgent, action required
Detaillierte Use Cases
UC 11.8.1: Einfache interne Weiterleitung an Spezialist
Szenario: Support-Techniker erkennt, dass Ticket ein Netzwerk-Problem ist und leitet zu Netzwerk-Spezialist weiter.
Ablauf:
- Ticket öffnen (Status = "In Arbeit")
- "Weiterleiten" Button klicken
- Schritt 1 - Weiterleitungs-Typ:
- "Abteilung / Spezialist-Team" auswählen
- System zeigt verfügbare Teams (Netzwerk, Datenbank, Security, etc.)
- Schritt 2 - Zielgruppe:
- Team: "Netzwerk-Support" auswählen
- System zeigt Kapazität: "3 Techniker, 2 verfügbar"
- Schritt 3 - Nachricht:
- Grund: "Netzwerk-Konfigurationsproblem erkannt"
- Kontext: "Verbindung wird nach 30 Min unterbrochen. Logs zeigen Timeout auf Switch XY"
- Anhänge: ✓ Include (Logs + Screenshots)
- Time Records: ✓ Include (zeigt 1,5h bereits aufgewendet)
- Schritt 4 - SLA-Auswirkung:
- System zeigt: "SLA wird PAUSIERT (1,5h schon verbraucht)"
- Neues SLA wird mit 2h für Netzwerk-Team berechnet
- Schritt 5 - Review & Speichern:
- Preview zeigt E-Mail-Text
- "Weiterleiten" Button klicken
- Hintergrund-Prozesse:
- Ticket-Status wechselt zu "Weiterleitet an Netzwerk-Team"
- TicketForward-Eintrag wird erstellt
- E-Mail + Slack-Notification an Team versendet
- Originaltechniker erhält Bestätigung
- Team-Seite:
- Netzwerk-Team sieht Ticket in ihrer Queue
- Können "Annehmen" oder "Delegieren" klicken
- Rückkehr:
- Nach Netzwerk-Team Lösung: Forward zurück zu Originaltechi
- Originaler Tech bekommt Ticket mit Notizen: "Issue war NIC-Firmware"
Betroffene Felder:
Helpdesk.HelpdeskStatusI3D = 7 (Forwarded)
Helpdesk.AssignedToTeamI3D = 2 (Netzwerk-Team)
TicketForward.ForwardingKind = DEPARTMENT
TicketForward.ForwardingChain = 1
TicketForward.IsSLAPaused = true
UC 11.8.2: Externe Vendor-Weiterleitung mit RMA
Szenario: Netzwerk-Adapter ist defekt und muss zum Hersteller für Reparatur/Austausch.
Ablauf:
- Ticket öffnen (Netzwerk-Problem diagnostiziert)
- "Weiterleiten" → Typ: "RMA Prozess"
- Schritt 1 - Vendor-Auswahl:
- Dropdown: "Intel (Netzwerk-Adapter Hersteller)" auswählen
- System zeigt Vendor-Kontakte (Telefon, Email, Web-Portal)
- Schritt 2 - Hardware-Details:
- Artikel: "Intel ProSet Adapter X722" (Auto-populated)
- Serial Number: "SN12345ABC" eingeben
- Defekt: "Port 1 nicht aktiv nach Firmware-Update"
- Schritt 3 - RMA-Anforderungen:
- Rücksend-Adresse wird auto-filled (Vendor's Repair Center)
- Versand: "Pickup arrangieren?" ✓
- Tracking: Wird auto-generiert
- Schritt 4 - Kundenbenachrichtigung (optional):
- "Kunde benachrichtigen?" ✓
- Kunde erhält: Tracking-Info, Expected Resolution Date (7 Tage)
- Speichern:
- TicketForward mit ForwardingKind=RMA_PROCESS
- VendorRMATrackingNumber = generiert
- SLAPaused = true (Pause bis zu 72h, kann erweitert werden)
- Email an Vendor mit RMA-Details
- Email an Customer mit Tracking-Link
- Tracking:
- Ticket hat Tracking-Board für RMA-Status
- Auto-Updates wenn Vendor antwortet
- Auto-Reopen wenn Replacement empfangen
- Rückkehr:
- Vendor antwortet mit Replacement
- System erstellt neue TimeRecord "Hardware Replacement: Intel Adapter"
- Ticket zurück zu Original-Techniker
- Tech installiert replacement
- Ticket kann dann geschlossen werden
UC 11.8.3: Manager-Freigabe für hohe Kosten
Szenario: Sub-Contractor ist notwendig für spezielle Konfiguration, Kosten €2.500.
Ablauf:
- Ticket öffnen (Spezialist erkannt: braucht externe Hilfe)
- "Weiterleiten" → Typ: "Manager Freigabe"
- Schritt 1 - Manager:
- "Verantwortlicher Manager" auswählen
- Schritt 2 - Kostendetails:
- Service: "SAP Configuration Expert (3 Tage)"
- Estimated Cost: €2.500
- Justification: "Complex security policy implementation required. Our team doesn't have SAP certification."
- Schritt 3 - Deadline:
- Decision Deadline: "Heute 17:00" (4 Stunden)
- Urgency: "HOCH" (Customer waiting)
- Speichern:
- Email an Manager mit:
- Ticket-Details
- Cost Breakdown
- Justification
- Approval Link (One-Click: "Freigeben" or "Ablehnen")
- Email an Manager mit:
- Manager's Action (2 Szenarien):
- A) Freigeben:
- Next forward: Sub-Contractor (Automatic)
- Ticket continues to UC 11.8.4
- B) Ablehnen:
- Ticket returns to original technician
- Alternative: "Can we do it ourselves?" + 8h planning
- A) Freigeben:
- Auditprüfung:
- Full chain logged: Tech → Manager → Sub-Contractor
- Costs tracked: Manager approval date + amount approved
UC 11.8.4: Sub-Contractor Beauftragung mit Kostentracking
Szenario: Nach Manager-Freigabe wird Ticket an Pre-approved Sub-Contractor weitergeleitet.
Ablauf:
- Automatic forward nach Manager-Freigabe
- Schritt 1 - Sub-Contractor-Auswahl:
- Pre-configured: "SAP Global Consulting"
- Contact: "contact@sap-global.de"
- Schritt 2 - SOW (Statement of Work):
- System generiert SOW-Document:
- Scope: 3 Tage SAP Security Policy Implementation
- Cost: €2.500 (fixed)
- Deadline: 5 business days
- Deliverables: Configured SAP System + Documentation
- System generiert SOW-Document:
- Schritt 3 - Versendet:
- Email an Sub-Contractor mit:
- SOW attachment (PDF)
- Ticket-Details + Links
- Approval mechanism
- Email an Sub-Contractor mit:
- Tracking:
- Sub-Contractor kann Online-Portal nutzen zur Status-Update
- TimeRecords eingeben direkt im System (if configured)
- Intermediate Deliverables attached
- Invoice Handling:
- Sub-Contractor erstellt Invoice
- Manager erhält für Freigabe
- Cost wird zu Ticket hinzugefügt
- Billing-Integration: Kunde wird ggf. für extra costs berechnet
- Completion:
- Sub-Contractor markiert als "Delivered"
- Ticket returns zu Original-Technician für Validation
- Technician validates + closes ticket
UC 11.8.5: Forward-Kette mit mehrfachen Eskalationen
Szenario: Komplexes Ticket durchläuft mehrere Forwards bis zur Lösung.
Chain:
Ticket #2500 created
↓
FORWARD 1: Support-Tech → Database-Team
(SLA: Pause 1h)
↓ (DB-Team finds: Licensing issue)
FORWARD 2: Database-Team → Vendor Portal
(SLA: Pause, Vendor SLA: 24h)
↓ (Vendor: Need specific info)
FORWARD 3: Vendor → Original Tech (for more logs)
(Collect data)
↓
FORWARD 4: Original Tech → Vendor again (with data)
↓ (Vendor resolves configuration)
FORWARD 5: Vendor → Database-Team (with fix)
↓ (DB-Team implements)
FORWARD 6: Database-Team → Support-Tech (for testing)
↓ (Confirm working)
[CLOSED]
Audit Trail: Alle 6 Forwards werden dokumentiert mit:
- Wer → Wer
- Wann
- Grund
- SLA Auswirkungen
- Zeiteinträge pro Segment
Final Report:
- Total Time: 6,5 Stunden
- Total Pause Time: 5,5 Stunden
- Final SLA: 95% met (after all segments)
- Forwarding count: 6 (shows complex issue)
Versteckte Funktionen (Hidden Features)
-
Intelligente Routing-Vorschläge
- System analysiert aktuelles Ticket:
- Kategorie, Priorität, Typ
- Vergleicht mit historischen ähnlichen Tickets
- Schlägt vor: "Ähnliche Tickets wurden 85% zum DB-Team weitergeleitet"
- Techniker kann akzeptieren oder override
- System analysiert aktuelles Ticket:
-
Auto-Acknowledgment Escalation
- Forward wird versendet
- Wenn nicht innerhalb 1h acknowledged:
- Reminder automatisch versendet
- Nach 2h: Escaliert zu Team Lead
- Nach 4h: Escaliert zu Manager
- Konfigurierbar pro Team
-
Vendor Integration & Learning
- System merkt sich: "Vendor antwortet normalerweise in 2 Tagen"
- Setzt automatically: Expected Resolution basierend auf Vendor-Historie
- Alerts wenn Vendor außerhalb window antwortet
-
Team Kapazitäts-Aware Routing
- Beim Forward zu Team zeigt System:
- Current Queue: 12 Tickets
- Avg Resolution Time: 2,5h
- Suggested Assignment: In 4,5h (weighted load)
- Warnings wenn Team überl stet ist
- Beim Forward zu Team zeigt System:
-
Forward-Kette Visualisierung
- Hidden view:
/ServiceBoard/ForwardingChain/{ticketId} - Zeigt visuelle Timeline:
- Ticket → Tech1 (1h) → Database-Team (1,5h) → Vendor (4h) → Tech1
- Sortierbar nach Time, Responders, Effectiveness
- Hidden view:
-
Automatic Cost Rollup
- Wenn Ticket Sub-Contractors kostet:
- System berechnet automatisch:
- Internal Cost: 3,5h × €120/h = €420
- Sub-Contractor Cost: €2.500
- Total: €2.920
- Optionale Charge-Back zu Customer
-
Forwarding Analytics Dashboard
- Hidden view:
/ServiceBoard/ForwardingAnalytics - Shows:
- Most forwarded departments (DB-Team: 312 forwards)
- Average forward count per ticket (1.2x)
- Forwarding effectiveness (% resolved without further forward)
- SLA impact by forwarding type
- Hidden view:
-
Conditional Auto-Revert
- Business Rule: "Wenn Forward nicht innerhalb 24h angefangen wird, automatisch zurückgeben"
- Konfigurierbar pro Department/Team
- Prevents: "Stuck tickets"
REST API Endpoints
PUT /api/Helpdesk/{id}/Forward
├─ Request: { forwardingType, recipientId, message, includeAttachments, estimatedCost }
├─ Response: { forwardId, recipientNotification, newSLAStatus, chainPosition }
└─ Auth: [Authenticate], Rights: HELPDESK_FORWARD
GET /api/Helpdesk/{id}/ForwardingOptions
├─ Returns: { availableTeams[], availableVendors[], suggestedRecipient }
├─ Smart: Based on ticket category/complexity
└─ Caching: 5 minutes
GET /api/TicketForward/Chain/{ticketId}
├─ Returns: List<{ forwardId, from, to, date, status, slaImpact }>
├─ Includes: Full chain visualization data
└─ Purpose: UI chain display
GET /api/TicketForward/{forwardId}/Details
├─ Returns: Complete forward details + current status
├─ Vendor-specific fields if applicable
└─ Used in forward detail view
PUT /api/TicketForward/{forwardId}/Acknowledge
├─ Request: { recipientId }
├─ Response: { acknowledged, timestamp, nextActions }
└─ Triggers: Email to originator
PUT /api/TicketForward/{forwardId}/ReturnToSender
├─ Reverse a forward + provide feedback
├─ Request: { reason, foundSolution }
├─ Response: { ticketId, newAssignee }
└─ Re-opens ticket on recipient side
GET /api/RMA/GenerateTrackingNumber
├─ Generate RMA/Tracking numbers
├─ Returns: { rmaNumber, trackingNumber, shippingLabel }
└─ Vendor-specific format
POST /api/TicketForward/{forwardId}/LinkToCost
├─ Link cost record to forward (sub-contractor invoice)
├─ Request: { cost, currency, invoiceUrl }
└─ Response: { linked, rollupCost }
GET /api/Helpdesk/ForwardingChainAnalytics
├─ Dashboard: Chain length distribution, effectiveness metrics
├─ Parameters: startDate, endDate, groupBy (department|vendor|type)
└─ Returns: { chartData, trends, recommendations }
POST /api/TicketForward/BulkForward
├─ Bulk forward multiple tickets to same recipient
├─ Request: { ticketIds[], recipientId, forwardingType }
├─ Response: { processedCount, forwardChainIds[] }
└─ Async: With webhook callback
GET /api/Vendor/{vendorId}/TicketStatus
├─ Get status from external vendor (integration)
├─ Returns: { vendorTicketNumber, currentStatus, estimatedResolution }
└─ Polling: Every 4 hours
PUT /api/TicketForward/{forwardId}/PauseResume
├─ Manually pause/resume SLA for a forward
├─ Request: { pauseReason, resumeDate }
├─ Response: { isPaused, adjustedSLA }
└─ Admin only
3.5 Kanban-Board (Kanban Visualization)
Pfad: src/CentronNexus/ServiceBoard/Kanban/KanbanPage.razor
Kategorie: Ticket Management (Visualisierung & Workflow)
Status: ✅ Vollständig implementiert
Komplexität: 🔴 Hoch (Drag-Drop, Real-time Updates, Multi-view, WIP Limits)
Lizenz: LicenseGuids.Centron (Standard)
Umfassende Beschreibung
Das Kanban-Board-Modul ist das visuelle Ticket-Management-System mit Real-Time-Synchronisierung, Multi-View-Unterstützung und intelligenten Workflow-Controls:
- 4 vordefinierte Board-Typen mit jeweils optimierten Spalten-Layouts
- Drag-Drop Mechanik mit automatischer Validierung und WIP-Limits
- Real-time Collaboration mit SignalR-Updates bei Änderungen
- Spalten-Statistiken (Tickets/Spalte, Durchschnittsalter, SLA-Status)
- Conditional Formatting mit automatischer Farbcodierung und Icons
- Filter-Integration (kombinierbar mit 50+ Dimensionen)
- Smart Auto-Movement (automatisches Verschieben bei Status-Änderungen)
- Swimlanes für Team-Auslastungs-Visualisierung
Board-Typen (4 Varianten)
| Board-Typ | Spalten | Zweck | Use-Case |
|---|---|---|---|
| Status-Board | Open, In Progress, Waiting, Resolved, Closed | Workflow | Standard Ticket-Lifecycle Übersicht |
| Prioritäts-Board | Critical, High, Medium, Low | Priorisierung | Load-Balancing & Capacity Planning |
| Typ-Board | Incident, Request, Change, Problem, Task | Kategorisierung | Spezialisierte Team-Zuweisung |
| Zuweisungs-Board | Tech1, Tech2, Tech3, Team-Lead, Unassigned | Auslastung | Team-Kapazitäts-Überwachung |
Kanban Column Struktur
Column: "In Progress"
├── WIP Limit: 5 (Max Tickets)
├── Current Count: 4/5
├── Avg Age: 2.5h
├── SLA Status:
│ ├── On Track: 3 (🟢)
│ ├── At Risk: 1 (🟡)
│ └── Breached: 0 (🔴)
├── Cards:
│ ├── #2341 - Exchange Config (3.5h, Critical)
│ ├── #2342 - VPN Access (1.2h, High)
│ ├── #2343 - Printer Setup (0.8h, Medium)
│ └── #2344 - Network Timeout (2.1h, High)
└── Actions:
├── [+ Add Ticket]
├── [⚙️ Configure]
└── [👁️ View All]
Ticket Card Layout (auf dem Board)
┌─────────────────────────────────┐
│ #2341 Exchange Config │
├─────────────────────────────────┤
│ 🟡 Priority: HIGH │
│ 👤 Assignee: John Doe │
│ ⏱️ Age: 3.5h (SLA: 6h) 🟢 │
│ 🏷️ Tags: Exchange, Config │
│ │
│ Description: Outlook sync... │
│ 📎 Attachments: 2 │
│ 💬 Comments: 4 │
└─────────────────────────────────┘
Drag-Drop Mechanik
USER ACTION: Drag Card from "Open" → "In Progress"
│
├─ Pre-Drop Validation:
│ ├─ Is Target Column WIP Limit exceeded? NO ✓
│ ├─ Does user have permission? YES ✓
│ ├─ Is ticket locked by another user? NO ✓
│ └─ Should ticket status change? YES → "In Progress"
│
├─ Drop Animation: Smooth slide into column
│
├─ Backend Operations:
│ ├─ Update Helpdesk.HelpdeskStatusI3D = 2 (In Progress)
│ ├─ Update Helpdesk.AssignedToI3D (if applicable)
│ ├─ Create AuditLog entry
│ └─ Emit SignalR message to all viewers
│
└─ UI Updates:
├─ Other users see card move in real-time
├─ Column statistics recalculate
└─ Changed date/time stamp updates
Detaillierte Use Cases
UC 11.9.1: Standard Status-Board verwenden
Szenario: Support Manager möchte schnell Überblick über Ticket-Status bekommen.
Ablauf:
- ServiceBoard öffnen → "Kanban" Tab klicken
- Dropdown: "Status-Board" ausgewählt (Standard)
- Board anzeigen:
- Open (8 Tickets): Display tickets waiting to be picked up
- In Progress (5/5 - WIP Limit erreicht): Current work
- Waiting (3 Tickets): Awaiting feedback
- Resolved (4 Tickets): Pending closure
- Closed (12 Tickets - Today): Completed
- Schnelle Aktionen:
- Drag Ticket von "Open" zu "In Progress" → Auto-Update
- Klick auf Ticket-Card → Details Modal öffnet
- Hover über Column → Statistik-Tooltip: "Avg age: 1.8h, SLA: 95%"
- Filter anwenden:
- Nur "Kritische" Tickets zeigen → Filter-Dropdown setzen
- Nur "Mein Team" → Filter anwenden
- Board aktualisiert sich live
- Export/Report:
- "Export CSV" Button → CSV mit aktuellem Board-Zustand
Hidden Feature - Auto-Move:
- Wenn Ticket extern geschlossen wird (z.B. via API)
- Card bewegt sich automatisch in "Closed" Spalte
- Keine manuelle Aktion notwendig
UC 11.9.2: Prioritäts-Board für Load-Balancing
Szenario: Tech-Lead plant Team-Kapazität basierend auf Prioritäten.
Ablauf:
- Kanban-Board öffnen → "Prioritäts-Board" auswählen
- Board Spalten:
- CRITICAL (1 Ticket, 30 Min SLA): Shows🔴 icon
- HIGH (5 Tickets, 2h SLA): Shows🟠 icon
- MEDIUM (8 Tickets, 4h SLA): Shows🟡 icon
- LOW (3 Tickets, 24h SLA): Shows🟢 icon
- Capacity Planning:
- System empfiehlt: "Critical + 2 High = 1 Techniker full"
- Zeigt: "Other techs can take 2 Medium or 3 Low tickets"
- Strategische Entscheidungen:
- Kann 3 LOW-Tickets zu "Waiting List" verschieben → Befreit Kapazität
- oder 1 MEDIUM → BACKLOG → Reduziert dringende Last
- Überwachung:
- Real-time: Wenn Tech aktuelles Ticket abschließt
- MEDIUM Ticket automatisch zu nächstem Tech assigned
- Board aktualisiert live
UC 11.9.3: Team-Auslastungs-Board mit Swimlanes
Szenario: Techniker-Kapazität verwalten und balancieren.
Ablauf:
- Kanban → "Zuweisungs-Board"
- Swimlane pro Techniker:
John Doe (5 tickets - 85% auslastet) ├─ Open: 1 ticket ├─ In Progress: 3 tickets (one at max WIP: 3/3) └─ Resolved: 1 ticket Jane Smith (3 tickets - 50% auslastet) ├─ Open: 1 ticket └─ In Progress: 2 tickets Team Lead (2 tickets - 25% auslastet) ├─ Open: 2 tickets (available for assignment) - Balancing-Aktion:
- Drag Ticket aus "John's Open" → "Team Lead's Open"
- System checks: Team Lead hat Kapazität ✓
- Ticket reassigned
- Capacity Indicator:
- Green bar wenn < 70% auslastet
- Yellow bar wenn 70-90%
- Red bar wenn > 90%
- Alerts:
- "John is overloaded - consider reassigning"
- "Team Lead has capacity"
UC 11.9.4: Conditional Formatting & Smart Coloring
Szenario: Visuell erkennen welche Tickets Probleme haben.
Card Coloring Rules:
IF Priority = CRITICAL
→ Red background (#FF6B6B)
→ Blinking red border
→ 🚨 Icon
IF SLA Status = BREACHED
→ Dark red background (#8B0000)
→ Flashing indicator
→ 💥 Icon
IF Age > 50% of SLA
→ Orange background (#FFA500)
→ 🟠 Icon
IF Assigned but no activity for 2h
→ Gray background (#808080)
→ ⚠️ Icon (might be stuck)
IF Has unread comments
→ Blue border
→ 💬 Icon
IF Multiple tags
→ Small colored chips on card
→ Scrollable if > 5 tags
UC 11.9.5: Real-time Collaboration Scenario
Szenario: Mehrere Techniker sehen Board gleichzeitig → Live-Updates via SignalR.
Timeline:
13:00:00 - John öffnet Kanban-Board
13:00:05 - Jane öffnet gleiches Board
13:00:15 - John klickt auf #2341 → Card wird grün markiert (John arbeitet daran)
Jane sieht: #2341 ist jetzt grün, zeigt "John is viewing"
13:00:30 - John dragged #2341 von "Open" → "In Progress"
Jane sieht: Card bewegt sich in echtzeit in andere Spalte
System: Audio notification: "Ding" (optional)
13:00:45 - Jane startet neue Zeiterfassung auf #2345
John sieht: #2345 Status-Indicator zeigt "Jane started work"
13:01:00 - John markiert #2341 als "Resolved"
Card bewegt sich zu "Resolved" Spalte
Jane sieht: #2341 weg aus In-Progress
John erhält: Time tracking summary für #2341
13:01:15 - Admin erstellt neues Ticket #2349 (via API)
Beide sehen: Neuer Card erscheint in "Open" Spalte
Kanban Configuration Entity
KanbanBoard
├── I3D, Name (e.g., "Status-Board", "Team Capacity")
├── BoardType (enum: STATUS, PRIORITY, TYPE, ASSIGNMENT, CUSTOM)
├── IsPublic / IsShared (bool)
├── CreatedByI3D, CreatedDate
├── Configuration:
│ ├── Columns[] (ordered list)
│ │ ├── ColumnName
│ │ ├── StatusKind (which Helpdesk statuses map here)
│ │ ├── WIPLimit (int, nullable)
│ │ ├── AutoMoveRules (when to auto-move cards)
│ │ └── DisplayOrder
│ │
│ ├── CardDisplayFields (which fields to show on card)
│ │ ├── TicketNumber: true
│ │ ├── Title: true
│ │ ├── Priority: true
│ │ ├── Assignee: true
│ │ ├── Age: true
│ │ ├── SLAStatus: true
│ │ ├── Tags: true
│ │ └── CommentCount: true
│ │
│ ├── Filters (default filters applied)
│ │ ├── StatusFilter: null (show all)
│ │ ├── PriorityFilter: null
│ │ ├── TeamFilter: "My Team"
│ │ └── DateRangeFilter: null
│ │
│ ├── Formatting:
│ │ ├── ColorByField (PRIORITY, STATUS, AGE, SLA_STATUS)
│ │ ├── ShowCardNumbers: true
│ │ ├── ShowCardAges: true
│ │ ├── ShowWIPIndicators: true
│ │ └── CardSize (SMALL, MEDIUM, LARGE)
│ │
│ └── RealTime:
│ ├── EnableSignalR: true
│ ├── AutoRefreshSeconds: 5
│ └── ShowOtherUsersViewing: true
Hidden Features (Advanced)
-
Swimlane Grouping (Hidden View)
- Rows = Teams, Columns = Status
- Nested structure for hierarchical view
- URL:
/ServiceBoard/Kanban/Swimlanes
-
Stacked Cards Mode
- When WIP Limit exceeded: Cards stack with "2 more" indicator
- Hover/expand to see stacked cards
-
Performance Metrics Panel
- Hidden right sidebar:
/ServiceBoard/Kanban/Metrics - Shows real-time: Throughput, Cycle Time, Lead Time
- Trend charts (daily/weekly)
- Hidden right sidebar:
-
Board Snapshot & Export
- Capture current board state as image (PNG)
- Export as PDF report with statistics
- Share board URL with pre-applied filters
-
Custom Board Builder
- Hidden admin view:
/ServiceBoard/Admin/KanbanBuilder - Drag-drop column configuration
- Custom status mapping
- Test data preview
- Hidden admin view:
REST API Endpoints
GET /api/Kanban/Boards
├─ Returns: List<{ boardId, name, type, columns[] }>
└─ Caching: 1 Hour
GET /api/Kanban/{boardId}/Cards
├─ Returns: List<KanbanCardDTO> based on current filters
├─ Parameters: filters, sorting, paging
└─ Real-time: Via SignalR when cards change
PUT /api/Kanban/{boardId}/Card/{ticketId}/Move
├─ Request: { fromColumn, toColumn, newPosition }
├─ Response: { success, updatedCard, affectedCards[] }
└─ Operations: Validation, Status update, Audit log
PUT /api/Kanban/{boardId}/Card/{ticketId}/Lock
├─ Acquire exclusive edit lock (prevent conflicts)
├─ Response: { locked, lockToken, expiresIn }
└─ Release: PUT .../Unlock with token
POST /api/Kanban/{boardId}/Snapshot
├─ Create board snapshot (for reports/sharing)
├─ Returns: { snapshotId, imageUrl, statisticsJson }
└─ Async: Generate PDF in background
GET /api/Kanban/Metrics/{boardId}
├─ Dashboard metrics: Throughput, cycle time, trends
├─ Parameters: timeRange (today, week, month)
└─ Returns: { metricsData, charts, anomalies }
WebSocket (SignalR):
/tickethub
├─ On card moved: "CardMoved" → broadcast to subscribers
├─ On card locked: "CardLocked" → show editor indicator
├─ On new card: "CardCreated" → add to appropriate column
└─ Heartbeat: Every 30 seconds
3.6 Ticket-Checklisten (Ticket Checklists & Task Management)
Pfad: src/CentronNexus/ServiceBoard/TicketChecklists/TicketChecklistsPage.razor
Kategorie: Ticket Management (Workflow & Task Execution)
Status: ✅ Vollständig implementiert
Komplexität: 🔴 Hoch (Dependencies, Progress Tracking, Time Estimation)
Lizenz: LicenseGuids.Centron (Standard)
Umfassende Beschreibung
Das Ticket-Checklisten-Modul ist das Task-Management-System mit:
- 12+ vordefinierte Checklisten-Templates (Hardware, Software, Access, VPN, etc.)
- Intelligente Abhängigkeits-Verwaltung (Sequential, Parallel, Conditional, Blocking)
- Real-time Progress Tracking mit Fortschrittsbalken und Zeitschätzungen
- Zeiterfassung pro Item mit Vergleich zu Estimate
- Sub-Checklisten für komplexe, hierarchische Tasks
- Auto-Completion Detection bei erfüllten Bedingungen
- Notification System bei Abhängigkeits-Erfüllung
12 Vordefinierte Checklist-Templates
| Template | Items | Use-Case | Abhängigkeiten |
|---|---|---|---|
| Hardware-RMA | 8 | Reparatur-Prozess | Sequenziell |
| Software-Installation | 6 | SW-Deployment | Parallel + Conditional |
| Access-Setup | 5 | Neuer Benutzer | Sequential |
| VPN-Konfiguration | 4 | VPN-Zugang | Sequential |
| Printer-Setup | 3 | Drucker-Konfiguration | Parallel |
| Device-Imaging | 7 | Neue Hardware | Sequential |
| User-Onboarding | 12 | Neue Mitarbeiter | Parallel + Conditional |
| User-Offboarding | 10 | Austritt Mitarbeiter | Sequential |
| License-Assignment | 4 | Lizenz-Zuweisung | Conditional |
| Security-Audit | 8 | Sicherheitsprüfung | Parallel |
| Server-Maintenance | 6 | Wartung | Sequential |
| Backup-Verification | 5 | Backup-Kontrolle | Parallel |
Dependency System
Typ: SEQUENTIAL
├─ Item A → Item B → Item C (strikte Reihenfolge)
├─ Nur A kann starten (Initial)
├─ B kann nur starten wenn A ✓ complete
└─ C kann nur starten wenn B ✓ complete
Typ: PARALLEL
├─ Item A, B, C können parallel laufen
├─ Alle können sofort starten
└─ Reihenfolge egal
Typ: CONDITIONAL
├─ IF Item A = Selected/Checked
│ THEN Show Item B
│ ELSE Hide Item B
└─ Visibility based on conditions
Typ: BLOCKING
├─ Item B blocked by Item A
├─ Item A nicht complete → Item B disabled (grayed out)
├─ Item A complete → Item B enabled
└─ Visual: 🔒 Lock icon on Item B
HelpdeskChecklist Entity
HelpdeskChecklist
├── I3D, HelpdeskI3D (FK)
├── TemplateI3D (FK to ChecklistTemplate)
├── StartedDate, StartedByI3D
├── CompletedDate, CompletedByI3D
├── ItemCount, CompletedItemCount
├── CompletionPercentage (calculated)
├── EstimatedMinutes, ActualMinutes
├── IsPinned (bool - sticky on ticket detail view)
├── Items[] (ordered list)
│ ├── ItemId, ItemName, Description
│ ├── ItemOrder, ParentItemI3D (for sub-items)
│ ├── IsCompleted, CompletedDate, CompletedByI3D
│ ├── EstimatedMinutes, ActualMinutes (time tracking)
│ ├── IsBlocking (bool - must be done)
│ ├── DependencyType (NONE, SEQUENTIAL, PARALLEL, BLOCKING)
│ ├── DependsOnItemI3D (reference to blocking item)
│ ├── AssignedToI3D (person responsible)
│ ├── Notes (internal comments per item)
│ └── CompletionNotes (notes when checked off)
Detaillierte Use Cases
UC 11.10.1: Hardware-RMA Checkliste anwenden & durchführen
Szenario: Defekte Hardware muss repariert werden.
Ablauf:
- Ticket #2350 öffnen (Hardware defect)
- "Checklisten" Tab klicken
- "Template auswählen" → "Hardware-RMA" auswählen
- System zeigt:
Hardware-RMA Checklist (8 items, 0 complete) ├─ □ Diagnose durchführen (2h) ├─ □ RMA-Nummer anfordern (0.5h) [depends on Diagnose] ├─ □ Versand-Etikett drucken (0.25h) ├─ □ Hardware verpacken (0.5h) ├─ □ Tracking-Info notieren (0.1h) ├─ □ Versand durchführen (0.25h) ├─ □ Auf Reparatur warten (tracking) └─ □ Reparierte Hardware prüfen (1h) Progress: 0/8 = 0% Est. Time: 4.5h - Durchführung:
- Techniker checkt erste Item: "Diagnose durchführen" ✓
- System: Nächste Item wird enabled (RMA-Nummer)
- Techniker kann sich Notizen machen pro Item
- System: Zeit wird von TimeRecords gerechnet
- Tracking:
- Item "Auf Reparatur warten" bleibt offen
- Status: "In Progress (50%)" auf Ticket
- Manager sieht auf Dashboard: "1 Ticket hat Checkliste"
- Abschluss:
- Nach Reparatur: Item "Reparierte Hardware prüfen"
- Tech checkt alle Items ✓
- Checklist marked COMPLETE
- Time tracking: 4.7h actual vs 4.5h estimate
UC 11.10.2: Conditional Branching in Onboarding
Szenario: Neuer Mitarbeiter, aber Onboarding variiert je nach Abteilung.
Ablauf:
- Ticket: "User Onboarding - John (IT Department)"
- Template: "User-Onboarding" (12 items)
- Conditional Logic:
Items 1-5: Standard (always) ├─ Item 6: IF Department = "IT" THEN Show "Dev Tools Setup" │ ELSE Hide └─ Item 7: IF Department = "Sales" THEN Show "CRM Training" ELSE Hide Item 8: IF Manager exists THEN Show "Manager Meeting" ELSE Hide Item 9-12: Standard (always) - Execution:
- System zeigt 11 items (Item 7 hidden - Sales-specific)
- Techniker kann conditional Items checken
- Abhängigkeiten enforced
- Re-use:
- Sales Team Lead erstellt Ticket für Sales-Onboarding
- Template "User-Onboarding" used
- Conditional zeigt Item 7 (CRM Training), hidden Item 6 (Dev Tools)
UC 11.10.3: Sub-Checklisten & Hierarchie
Szenario: Complex device imaging mit nested tasks.
Ablauf:
- Main Checklist: "Device-Imaging (7 items)"
- Struktur:
Device-Imaging ├─ □ Pre-Check Hardware (0.5h) │ ├─ Check RAM │ ├─ Check Storage │ └─ Check Connectivity ├─ □ Deploy Windows Image (2h) ├─ □ Install Drivers (1h) │ ├─ Network Driver │ ├─ Storage Driver │ └─ Graphics Driver ├─ □ Apply Security Patches (1h) ├─ □ Install Software (1h) │ ├─ Office Suite │ ├─ Antivirus │ └─ Company Applications ├─ □ Configure Settings (0.5h) └─ □ Final Validation (0.5h) - Execution:
- Main items can expand/collapse
- Sub-items tracked separately
- Progress: 6/12 items complete = 50%
- Time Tracking:
- Parent item shows aggregated time
- Sub-items tracked granularly
Hidden Features
-
Auto-Complete Detection
- IF all sub-items complete → Parent auto-checked (if enabled)
- Time auto-calculated from child items
-
Comparison: Estimate vs Actual
- Shows colored indicator:
- 🟢 Green: Finished within ±5% of estimate
- 🟡 Yellow: 5-20% over estimate
- 🔴 Red: >20% over estimate
- Shows colored indicator:
-
Smart Template Suggestions
- On ticket creation: "Based on this ticket type, apply checklist X?"
- ML-powered based on similar tickets
-
Checklist Cloning (Hidden)
- Copy checklist from another ticket: "Clone from #2340"
- Useful for recurring work types
REST API Endpoints
GET /api/ChecklistTemplates
├─ Returns: List of 12+ templates
└─ Caching: 1 Hour
POST /api/Helpdesk/{id}/Checklist/Apply
├─ Apply template to ticket
├─ Request: { templateId, customizations[] }
└─ Response: { checklistId, items[] }
PUT /api/Checklist/{id}/Item/{itemId}/Complete
├─ Mark item complete
├─ Response: { itemId, completedDate, nextAvailableItems[] }
└─ Triggers: Dependency resolution
GET /api/Checklist/{id}/Progress
├─ Returns: { totalItems, completedItems, percentage, estimatedVsActual }
└─ Real-time calculation
POST /api/Checklist/{id}/Clone
├─ Clone from another ticket's checklist
└─ Response: { clonedChecklistId, itemsCloned }
3.7 Ticket-Scripts (Quick Actions & Automation)
Pfad: src/CentronNexus/ServiceBoard/TicketScripts/TicketScriptsPage.razor
Kategorie: Ticket Management (Automation & Workflow Acceleration)
Status: ✅ Implementiert
Komplexität: 🔴 Hoch (Script Execution, Triggers, Security)
Lizenz: LicenseGuids.Centron (mit Automation-Feature)
Umfassende Beschreibung
Das Ticket-Scripts-Modul ist das Automation-System mit:
- 15+ vordefinierte Quick-Action Scripts (One-Click Operationen)
- Custom Script Editor für Admin-Power-User
- Multiple Trigger Types (Manual, On-Status-Change, On-Assignment, Scheduled, Webhook)
- Template Variable Substitution (Merge-tags: {TicketNumber}, {CustomerName}, etc.)
- Batch Execution (Run on multiple tickets)
- Audit & Logging (vollständige Ausführungs-Historie)
- Error Handling (Rollback bei Fehlern)
15+ Vordefinierte Scripts
| Script | Trigger | Effekt | Permissions |
|---|---|---|---|
| Take Ticket | Manual | Assign to self, status=In Progress | Any |
| Assign to Team | Manual | Open dialog, select team | Moderator+ |
| Add Solution Template | Manual | Insert pre-defined solution text | Any |
| Notify Team | Manual | Send email to assigned team | Any |
| Send Satisfaction Survey | Manual | Trigger survey email | Moderator+ |
| Escalate to Manager | Manual | Set priority=Critical, notify manager | Moderator+ |
| Reset SLA Clock | Manual | Reset SLA counters | Admin only |
| Auto-Close Duplicates | On-Status-Change | Close linked duplicates | Admin only |
| Create Follow-up | Manual | Create related ticket | Any |
| Export to Knowledge Base | Manual | Create KB article from ticket | Moderator+ |
| Link to Contract | Manual | Associate with service contract | Moderator+ |
| Generate Report | Manual | PDF report of ticket | Any |
| Bulk Forward | Manual (multi-select) | Forward to recipient | Moderator+ |
| Restore from Backup | Manual | Restore previous ticket version | Admin only |
| Sync with External | Scheduled | Sync with external system | Admin only |
TicketScript Entity
TicketScript
├── I3D, Name, Description
├── ScriptType (PREDEFINED, CUSTOM)
├── TriggerType (MANUAL, ON_STATUS_CHANGE, ON_ASSIGNMENT, SCHEDULED, WEBHOOK)
├── TriggerCondition (if applicable)
├── IsActive, IsPublic
├── ScriptCode (JavaScript/C# runtime)
├── Variables[] (Template vars: {TicketNumber}, {CustomerName}, etc.)
├── RequiredPermissions[] (Roles allowed to execute)
├── TimeoutSeconds (max execution time)
├── CreatedByI3D, CreatedDate
├── ExecutionLog[]
│ ├── TicketI3D (which ticket it ran on)
│ ├── ExecutedByI3D, ExecutedDate
│ ├── Status (SUCCESS, FAILED, TIMEOUT)
│ ├── Output (result/messages)
│ ├── ErrorMessage (if failed)
│ └── RolledBack (bool)
Detaillierte Use Cases
UC 11.11.1: Quick-Action "Assign to Team"
- Tech öffnet Ticket #2400
- Klick "Scripts" → "Assign to Team"
- Dialog: "Select Team" dropdown
- Wählt: "Network-Support" Team
- System:
- Ticket.AssignedTeamI3D = 4
- Status = "In Progress"
- Team Lead + Available members notified
- Audit Log: "Script executed: Assign to Team by John Doe"
UC 11.11.2: Template-Driven Solution Insert
- Tech arbeitet an common problem
- Click "Scripts" → "Add Solution Template"
- Templates dropdown:
- "Exchange Sync Reset"
- "VPN Connection Fix"
- "Printer Driver Install"
- Select "VPN Connection Fix"
- System inserts template into Solution field:
"To resolve VPN connection issues: 1. Restart Cisco AnyConnect 2. Clear DNS cache: ipconfig /flushdns 3. Reboot machine 4. Test connection Contact support if issue persists." - Tech adds customer-specific details, saves
UC 11.11.3: Custom Script (Admin Creating)
Szenario: Admin creates custom script for "Auto-notify Manager on SLA Breach"
Script Code:
if (ticket.SLAStatus == "BREACHED") {
sendEmail({
to: ticket.Manager.Email,
subject: `SLA Breach Alert: Ticket #{ticket.Number}`,
body: `Ticket {ticket.Number} has breached SLA.
Status: {ticket.Status},
Age: {ticket.Age} hours`
});
createLog(`SLA breach notification sent to {ticket.Manager}`);
}
Configuration:
- Trigger: ON_STATUS_CHANGE
- Execute when: Status changed AND SLAStatus = "BREACHED"
- Permissions: Admin only
- Timeout: 30 seconds
Result: When any ticket status changes + SLA breached, Manager automatically notified
Hidden Features
-
Batch Execution
- Multi-select tickets → "Run Script on All"
- Select script
- Executes on all selected (background job)
- Reports results
-
Script Scheduling
- Cron-style scheduling: "Run daily at 9 AM"
- Run on all tickets matching criteria
-
Rollback on Error
- IF script fails midway
- THEN roll back any changes made
- Log error + notify admin
-
Performance Monitoring
- Script execution time tracked
- Alerts if consistently > 5 seconds
REST API Endpoints
GET /api/Scripts
├─ Returns: List of available scripts
├─ Filters: My Scripts, Public, Predefined, Custom
└─ Caching: 5 minutes
POST /api/Scripts/{id}/Execute
├─ Execute script on ticket(s)
├─ Request: { ticketIds[], parameters[] }
├─ Response: { executionId, status, results[] }
└─ Async: Long-running operation
GET /api/Scripts/{id}/ExecutionHistory
├─ Returns: List of past executions
├─ Parameters: limit, offset, dateRange
└─ Includes: Status, duration, output, errors
POST /api/Scripts/Custom
├─ Create new custom script
├─ Request: { name, code, triggerType, permissionsRequired[] }
└─ Response: { scriptId, validationStatus }
PUT /api/Scripts/{id}/Test
├─ Test script on sample ticket
├─ Returns: { success, output, executionTime }
└─ No permanent changes
3.8 Ticket Web-Formulare
Pfad: src/CentronNexus/ServiceBoard/TicketWebForms/TicketWebFormsPage.razor
Komponenten: WebForm.razor, WebFormField.razor, WebFormViewModel.cs
Kategorie: Ticket Management (Self-Service)
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.WebForms (separaté Lizenz erforderlich)
Komplexität: 🔴 Sehr Hoch (Field-Types, Validierung, Conditional Logic)
Beschreibung
Self-Service-Formular-System für Kunden zur Ticket-Erstellung ohne direkten Support-Kontakt. Unterstützt 15+ Field-Typen mit Validierung und bedingter Logik.
Unterstützte Field-Typen (15+)
enum WebFormFieldType
{
TextField, // Text-Eingabe
TextAreaField, // Multi-Line Text
PasswordField, // Masked Password
EmailField, // Email mit Validierung
DateEditField, // Datepicker
TimeEditField, // Time Picker
IntegerField, // Ganzzahl (mit Min/Max)
DecimalField, // Dezimal (mit Precision)
CheckBoxField, // Boolean Toggle
SelectionField, // Dropdown Single-Select
MultiSelectionField,// Dropdown Multi-Select
HtmlField, // Rich Text Editor
FileField, // File Upload
GroupField, // Section/Fieldset
LabelField // Read-Only Label/Info
}
Use Cases
UC 11.11.1: Service-Request-Formular ausfüllen (Self-Service)
- Szenario: Kunde beantragt neuen Benutzer-Account
- Formular:
- Abteilung: [Dropdown] - Rolle: [Dropdown, abhängig von Abteilung] - Start-Datum: [Datepicker] - Manager: [Autocomplete] - Spezielle Berechtigungen: [Checkbox-Liste] - Zusätzliche Anforderungen: [TextArea] - Anhänge: [File Upload] - Workflow:
- Formular öffnen (from public URL)
- Felder ausfüllen
- Validierung (Client-side + Server-side)
- Submit
- Ticket automatisch erstellt
- Kunde erhält Ticket-Nummer
UC 11.11.2: Conditional Field Visibility
- Logik:
- Wenn Problemtyp = "Hardware" → Zeige "Geräte-Modell" Feld
- Wenn Geräte-Modell = "Laptop" → Zeige "Seriennummer" Feld
- Wenn Priorität = "Kritisch" → Zeige "Business-Impact" Feld (Required)
UC 11.11.3: Form-Template-Verwaltung
- Templates pro Service/Abteilung:
- "Hardware-Support"
- "Software-Lizenz-Request"
- "Access-Request"
- "Change-Request"
- "Problem-Report"
- Versioning: Formular-Versionierung, Rollback-Möglich
WebForm-Komponenten-Struktur
<WebForm FormId="@FormId">
<WebFormGroup Title="Persönliche Angaben">
<WebFormTextField
FieldName="FirstName"
Label="Vorname"
Required="true"
MinLength="2"
MaxLength="50" />
<WebFormTextField
FieldName="LastName"
Label="Nachname"
Required="true" />
<WebFormEmailField
FieldName="Email"
Label="E-Mail"
Required="true" />
</WebFormGroup>
<WebFormGroup Title="Anfrage-Details">
<WebFormSelectionField
FieldName="ServiceType"
Label="Service-Typ"
Options="@ServiceOptions"
Required="true"
OnChanged="UpdateDependentFields" />
<WebFormTextAreaField
FieldName="Description"
Label="Beschreibung"
Required="true"
MinLength="10"
Rows="5" />
<WebFormFileField
FieldName="Attachments"
Label="Anhänge"
AllowedExtensions="new[] {'.pdf', '.doc', '.docx', '.jpg', '.png'}"
MaxFileSize="10485760" />
</WebFormGroup>
<div class="form-buttons">
<button type="submit">Absenden</button>
<button type="reset">Zurücksetzen</button>
</div>
</WebForm>
Detaillierte Use Cases (Expanded)
UC 11.12.1: Hardware-Support Formular (Mit Multi-Validation)
- Customer öffnet öffentliche URL:
support.company.com/forms/hardware-support - Formular zeigt:
Hardware Support Request ├─ Device Type*: [Dropdown: Laptop, Desktop, Printer, Scanner] ├─ Model*: [Text, depends on Device Type] ├─ Serial Number: [Text, required if Warranty=YES] ├─ Problem Description*: [TextArea, min 20 chars] ├─ Warranty Status: [Radio: Yes/No] │ └─ IF Warranty=NO: │ └─ [Show] Support Plan: [Dropdown] ├─ Priority: [Radio: Low/Medium/High] │ └─ IF Priority=High: │ └─ [Show] Business Impact*: [TextArea] ├─ Attachments: [File Upload, max 10MB] └─ [Submit] [Reset] - Validation (Client + Server):
- Field length checks
- Email format validation
- File type whitelist
- Conditional required fields
- Submit:
- Ticket created automatically
- Customer receives confirmation email with ticket #
- System sends internal notification to Hardware Support Team
UC 11.12.2: Anonymous Feedback Form (No Auth Required)
- Form:
- No login required
- Email optional
- Text for message
- Rating (1-5 stars)
- Submission:
- Creates Ticket with Type="Feedback"
- Status="Needs Review"
- If Email provided: Can reply to feedback
- Dashboard tracks feedback sentiment
UC 11.12.3: Multi-Page Form Wizard
- User starts Form: "New Employee Onboarding Request"
- Page 1 - Personal Data:
- First Name, Last Name, Email
- Next button
- Page 2 - Department/Role:
- Department: [Dropdown]
- Role: [Dropdown, depends on Dept]
- Start Date: [DatePicker]
- Next button
- Page 3 - Special Permissions (IF Role = Developer):
- Git Access: [Checkbox]
- VPN Access: [Checkbox]
- Dev Server Access: [Checkbox]
- Page 4 - Review:
- Summary of all data
- Edit buttons for each section
- Submit button
- Success:
- Ticket created
- Confirmation email with summary
WebForm & WebFormSubmission Entities
WebForm
├── I3D, Name, Description
├── FormType (REQUEST, FEEDBACK, REPORT, SURVEY)
├── ServiceTypeI3D / CustomerI3D (who can access)
├── IsPublic (bool - public URL accessible)
├── IsMultiPage (bool - wizard mode)
├── IsAnonymous (bool - no auth required)
├── PublicUrl (uniqueidentifier for URL)
├── CreatedByI3D, CreatedDate, Version
├── Version (for template versioning)
├── Fields[] (array of WebFormField)
│ ├── FieldId, FieldName, Label
│ ├── FieldType (TextField, TextArea, Email, Select, etc.)
│ ├── Required, Hidden
│ ├── Validation (Regex, MinLength, MaxLength)
│ ├── ConditionalLogic (IF/THEN visibility)
│ ├── DefaultValue, Placeholder
│ ├── Options[] (for Select fields)
│ ├── DisplayOrder, PageNumber (if multi-page)
│ └── HelpText (tooltip text)
│
├── Settings:
│ ├── TicketDefaultPriority (CRITICAL, HIGH, MEDIUM, LOW)
│ ├── TicketDefaultType (INCIDENT, REQUEST, etc.)
│ ├── TicketDefaultTeam / AssignedToI3D
│ ├── AssignmentRule (ROUND_ROBIN, QUEUE, AUTO_ASSIGN)
│ ├── SendConfirmationEmail (bool)
│ ├── ConfirmationEmailTemplate
│ └── OnSubmitRedirectUrl
WebFormSubmission
├── I3D, FormI3D
├── SubmittedByUserI3D (nullable - for anonymous submissions)
├── SubmittedByEmail (for anonymous users)
├── SubmissionDate
├── SubmittedData (JSON: { "fieldName": "value", ... })
├── CreatedTicketI3D (FK to generated Helpdesk ticket)
├── TicketNumber (cached for easy reference)
├── Attachments[] (uploaded files)
│ ├── FileName, FileSize, MimeType
│ ├── UploadedDate
│ └── StorageUrl
├── Status (PENDING, PROCESSING, COMPLETED, ERROR)
├── ErrorMessage (if processing failed)
├── NotificationsSent (email notifications list)
└── IsDeleted (soft delete)
Hidden Features
-
Auto-Fill from Customer Data
- IF authenticated user submits: Auto-fill known fields
- Example: Name, Email, Company auto-filled
- User can override
-
Submission Analytics
- Dashboard: Form view, submission, conversion rates
- Identify abandoned forms (started but not completed)
- Heatmaps for which fields cause drop-off
-
CAPTCHA & Anti-Spam
- Configurable per form
- Prevent bot submissions
- Rate limiting by IP
-
Draft Saving (for authenticated users)
- Auto-save every 30 seconds
- Resume from draft link
- "You have a draft from 3 days ago"
-
Prefill from Query Parameters
- URL:
support.com/forms/hardware?device=laptop&model=dell - Form pre-fills: Device=Laptop, Model=Dell
- URL:
REST API Endpoints
GET /api/WebForms/{formId}
├─ Public: Returns form definition + fields
├─ Response: { formId, name, fields[], settings }
└─ No auth required (if IsPublic)
POST /api/WebForms/{formId}/Submit
├─ Submit form response
├─ Request: { fieldId: value, ... }
├─ Response: { success, ticketNumber, confirmationUrl }
└─ Validations: All client-side + server-side
GET /api/WebForms/{formId}/Validate
├─ Real-time field validation
├─ Request: { fieldName, value }
├─ Response: { isValid, errorMessages[] }
└─ Called on field blur/change
POST /api/WebForms/{formId}/SaveDraft
├─ Save draft submission (authenticated only)
├─ Request: { fieldId: value, ... }
├─ Response: { draftId, savedDate }
└─ Auto-delete after 30 days
GET /api/WebForms/{formId}/Draft/{draftId}
├─ Retrieve saved draft
├─ Response: { formData, savedDate }
└─ Authenticated users only
GET /api/WebForms/Analytics
├─ Dashboard: View, conversion, submission stats
├─ Parameters: formId, dateRange
├─ Response: { views, submissions, conversions, abandonmentRate }
└─ Admin only
POST /api/WebForms/{formId}/PublicSubmission
├─ Anonymous public submission
├─ Request: { fieldId: value, captchaToken }
├─ Response: { success, ticketNumber }
└─ Rate limited by IP address
4. Zeit & Planung Module
4.1 Zeiterfassung
Pfad: src/CentronNexus/ServiceBoard/Timerecords/TimerecordsPage.razor
Kategorie: Zeit & Planung
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Use Cases
UC 11.12.1: Zeit auf Ticket erfassen
- Ablauf:
- Timerecord-Liste öffnen (für das Ticket)
- "Neue Zeit" Button
- Start-Zeit, End-Zeit eingeben (oder Dauer)
- Beschreibung der Arbeiten eingeben
- Optional: Tätigkeit/Aktivität-Typ wählen
- Speichern
- Automatisierung: Start-Zeit auto-filled mit aktueller Zeit
UC 11.12.2: Zeiterfassungs-Zusammenfassung
- Anzeige:
- Gesamtzeit heute
- Gesamtzeit diese Woche
- Gesamtzeit diesen Monat
- Pro-Ticket Übersicht
- Durchschnittliche Abarbeitungszeit pro Ticket-Typ
UC 11.12.3: Zeiten exportieren
- Format: Excel, CSV
- Filter: Nach Datum, Techniker, Ticket, Aktivität
4.2 Stoppuhren (Global Timer)
Pfad: src/CentronNexus/ServiceBoard/Stopwatches/StopwatchesPage.razor
Kategorie: Zeit & Planung
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Beschreibung
Global Timer System für gleichzeitige Zeitmessung mehrerer Tickets/Aufgaben (Multitasking).
Features
UC 11.13.1: Mehrere Timer gleichzeitig starten
- Workflow:
- Timer für Ticket A starten (1. Timer läuft)
- Timer für Ticket B starten (2. Timer läuft parallel)
- Timer für Ticket C starten (3. Timer läuft parallel)
- Alle Timer zeigen ihre verstrichene Zeit
- Beim Stoppen werden Zeiten akumuliert (oder zu Ticket hinzugefügt)
UC 11.13.2: Timer-Benachrichtigungen
- Funktion: "Nur X Minuten für diesen Task"
- Trigger: Nach X Minuten → Browser-Benachrichtigung + Sound
- Use-Case: Techniker hat nur 15 Minuten für Support-Call
UC 11.13.3: Timer-Vorlage speichern
- Szenario: Häufige Timer-Kombinationen
- Beispiel:
- "Montag-Routine" = {Ticket A (30m), Ticket B (45m), Admin (15m)}
- 1-Click um all three zu starten
Daten-Entitäten
Stopwatch
├── I3D
├── HelpdeskI3D (oder NULL für unbezogene Timer)
├── EmployeeI3D
├── StartTime
├── EndTime (NULL wenn noch laufend)
├── ElapsedSeconds (berechnet)
├── Description (optional)
└── LinkedTimeRecordI3D (falls später konvertiert zu TimeRecord)
4.3 Scheduler (Kalender)
Pfad: src/CentronNexus/ServiceBoard/Scheduler/SchedulerPage.razor
Kategorie: Zeit & Planung
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Beschreibung
Kalender-basierte Zeitplanung mit Ticket-Integration, Timer-Draft-System und Ressourcen-Ansicht.
Funktionalität
UC 11.14.1: Techniker-Tag planen
- Workflow:
- Kalender öffnen (Week-View oder Day-View)
- Slot für Aktivität / Ticket wählen (z.B. 09:00-10:00)
- Ticket-Referenz hinzufügen
- Dauer setzen (oder Auto von Ticket geschätzte Zeit)
- Speichern als "Draft" (noch nicht als TimeRecord)
- Am nächsten Tag: Draft in reale TimeRecord konvertieren + Timer starten
UC 11.14.2: Team-Auslastungsansicht
- Kalender mit allen Mitarbeitern (nebenbeit):
- Alle Mitarbeiter mit ihren geplanten Slots
- Farb-Codierung: Grün=Verfügbar, Orange=Beschäftigt, Rot=Überlastet
- Schnelle Umverteilung per Drag-Drop
UC 11.14.3: Wiederkehrende Aufgaben
- Beispiele:
- "Täglich: Backup überprüfen" (Mo-Fr 09:00)
- "Jede Woche: Team-Meeting" (Di 14:00)
- "Monatlich: Patch-Tag" (1. Mi im Monat 20:00)
Calendar-Event Model
SchedulerEvent
├── I3D
├── HelpdeskI3D (optional, für Ticket-Events)
├── TaskDescription
├── StartDateTime
├── EndDateTime (calculated from Duration if null)
├── Duration (in minutes)
├── ResourceI3D (EmployeeI3D)
├── EventType (Task, Ticket, Meeting, Break, etc.)
├── RecurrenceRule (rrule format, optional)
├── Status (Draft, Confirmed, Completed, Cancelled)
├── CreatedByI3D
├── LinkedTimeRecordI3D (nach Konvertierung)
└── Notes (Beschreibung/Memo)
5. Inhalte & Dokumente Module
5.1 Ticket-Dokumente
Pfad: src/CentronNexus/ServiceBoard/TicketDocuments/TicketDocumentsPage.razor
Kategorie: Inhalte & Dokumente
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Use Cases
UC 11.15.1: Dateien zum Ticket hochladen
- Unterstützte Typen: PDF, Office (Word, Excel, PPT), Bilder (JPG, PNG), ZIP
- Größenlimit: Pro Datei bis zu 50MB (konfigurierbar)
- Ablauf:
- "Datei hochladen" Button
- Datei auswählen (oder Drag-Drop)
- Optional: Beschreibung eingeben
- Sichtbarkeit wählen (Intern oder Kunde sichtbar)
- Speichern
- Betroffene Entität:
HelpdeskDocument(Helpdesk-FK, FileName, FileData, CreatedDate, IsVisibleToCustomer)
UC 11.15.2: Anhänge herunterladen und anzeigen
- Preview: PDF/Bilder direkt im Browser
- Download: Alle Formate downloadbar
- ZIP-Export: Alle Dateien eines Tickets in ZIP verpacken
5.2 Ticket-E-Mails
Pfad: src/CentronNexus/ServiceBoard/TicketEmails/TicketEmailsPage.razor
Kategorie: Inhalte & Dokumente
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Use Cases
UC 11.16.1: E-Mail-Threads anzeigen
- Anzeige: Chronologische Konversation mit Kunde/Team
- Formatierung: HTML-Support, Bilder inline
- Attachments: E-Mail-Anhänge downloadbar
UC 11.16.2: E-Mail beantworten
- Funktion: Reply, Reply-All
- Template: Auto-quote vorherige Nachricht
- Sichtbarkeit: Kunde-sichtbar vs. intern
5.3 Ticket-Berichte
Pfad: src/CentronNexus/ServiceBoard/TicketReports/TicketReportsPage.razor
Kategorie: Inhalte & Dokumente
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Reports (separaté Lizenz)
Use Cases
UC 11.17.1: Service-Report generieren und anzeigen
- Inhalt:
- Ticket-Nummer, -Titel
- Beschreibung & Problem-Statement
- Alle durchgeführten Arbeitsschritte (aus Kommentaren)
- Aufgewendete Zeit (Summe aller Timerecords)
- Ergebnis & Lösungs-Zusammenfassung
- Kosten (falls berechnet)
- Anhänge / Dokumentation
- Format: PDF, downloadbar
- Timing: Auto-generiert beim Ticket-Abschluß
5.4 Dokumentenviewer
Pfad: src/CentronNexus/ServiceBoard/DocumentViewer/DocumentViewerPage.razor
Kategorie: Inhalte & Dokumente
Status: ✅ Implementiert (Minimal)
Lizenz: LicenseGuids.Centron (Standard)
Funktionalität
- Standalone PDF/Bild-Viewer (nicht Ticket-spezifisch)
- Zoom, Pan, Download-Buttons
- Annotation-Support (optional)
5.5 E-Mail-Versand
Pfad: src/CentronNexus/ServiceBoard/SendTicketMail/SendMailPage.razor
Kategorie: Inhalte & Dokumente
Status: ⚠️ Partiell (Wrapper um Ticket-Mail Modul)
Lizenz: LicenseGuids.Centron (Standard)
Use Cases
UC 11.18.1: Ad-hoc E-Mail versenden
- Von: Current User
- An: Custom Email oder Ticket-Kontakt
- Subject: Editierbar
- Body: HTML Rich-Text Editor
- Attachments: Ticket-Dateien oder neu hochladen
- Sichtbarkeit: Als Ticket-Comment speichern?
6. Dashboard & Überblick Module
6.1 Dashboard
(Bereits dokumentiert in Hauptdokument USE_CASES.md, Modul 11.1)
Pfad: src/CentronNexus/ServiceBoard/Dashboard/Dashboard.razor
Use Cases: 4 (UC 11.1.1 - 11.1.4)
6.2 Mein Tag (MyDay)
(Bereits dokumentiert in Hauptdokument USE_CASES.md, Modul 11.2)
Pfad: src/CentronNexus/ServiceBoard/MyDay/MyDayPage.razor
Use Cases: 4 (UC 11.2.1 - 11.2.4)
7. KI & Erweiterte Funktionen
7.1 Ticket-AI-Zusammenfassung
Pfad: src/CentronNexus/ServiceBoard/TicketAiSummary/TicketAiSummaryPage.razor
Komponenten: AIAssist.razor, AiPopupEdit.razor
Kategorie: KI & Erweiterte Funktionen
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (mit AI-Feature)
Backend: OpenAI API Integration
Beschreibung
AI-gestützte Text-Zusammenfassung für Tickets, Kommentare und Service-Reports. Nutzt OpenAI GPT-4 für hochwertige Zusammenfassungen.
Use Cases
UC 11.19.1: Ticket-Zusammenfassung generieren
- Funktion: "Zusammenfassung mit AI generieren"
- Input: Vollständiger Ticket-Text (Beschreibung + alle Kommentare)
- Output: 2-3 Sätze zusammenfassend
- Aktion: In Ticket-Summary Feld einfügen (oder Copy-to-Clipboard)
UC 11.19.2: Kommentar-Zusammenfassung
- Beschreibung: Komplexe Kommentare vereinfachen
- Use-Case: Techniker schreibt 5-Absatz-Erklärung → AI verkürzt zu Kernpunkten
UC 11.19.3: Service-Report Text verbessern
- Funktionen:
- Korrektur von Grammatik/Rechtschreibung
- Formalisierung von umgangssprachlichem Text
- Professionalisierung von Schreibstil
- Beispiel:
- Input: "hab die internet-leitung gekickt und wieder angeschlossen, jetzt gehts"
- Output: "Die Internet-Verbindung wurde neu gestartet. Nach dem Neustart funktioniert das Netzwerk ordnungsgemäß."
AI-API Integration
AIAssist Model
├── InputText (Quelltext)
├── Mode (Summarize, Improve, TranslateToDE, TranslateToEN)
├── Language (DE, EN)
├── Tone (Professional, Casual, Technical)
└── MaxTokens (Längenbeschränkung)
Response
├── OutputText (Generated)
├── ConfidenceScore (0-100%)
├── TokensUsed
└── ProcessingTime
Configuration
{
"AiAssist": {
"Enabled": true,
"Provider": "OpenAI",
"ApiKey": "sk-...",
"Model": "gpt-4-turbo",
"MaxTokens": 500,
"Temperature": 0.7,
"Timeout": 30000
}
}
7.2 AI-Assist (Content Generation)
Verwandt mit: 7.1 Ticket-AI-Zusammenfassung Zusätzliche Funktionen:
- Template-basierte Text-Generierung
- E-Mail-Vorlage-Personalisierung
- Auto-Completion in Text-Feldern
8. Kundenverwaltung Module
8.1 Kundendaten
Pfad: src/CentronNexus/ServiceBoard/Customers/CustomersPage.razor
Kategorie: Kundenverwaltung
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Use Cases
UC 11.20.1: Kundensuche
- Such-Parameter: Name, Kontakt, Referenz-Nummer
- Wildcard-Suche: Fuzzy Matching
- Filter: Aktiv/Inaktiv, Kundentyp
UC 11.20.2: Kundendetails anzeigen
- Info: Name, Adresse, Kontaktperson(en)
- Links: Alle Tickets dieses Kunden
- Verträge: Service/Wartungs-Verträge
- History: Recent Interactions
8.2 Kundengeräte & Assets
Pfad: src/CentronNexus/ServiceBoard/TicketMasterDataItems/TicketMasterDataItemsPage.razor
Kategorie: Kundenverwaltung
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Use Cases
UC 11.21.1: Kundengeräte verwalten
- Erfassung: Geräte-Inventar des Kunden
- Details: Typ, Hersteller, Modell, Seriennummer, MAC-Adresse, IP-Adresse
- Verknüpfung: Mit Tickets (welche Probleme hatte dieses Gerät?)
- Warranty: Garantie-Status und -Datum
8.3 Kundendetails & Adressenverwaltung
Pfad: src/CentronNexus/ServiceBoard/Customers/ (Multiple Components)
Kategorie: Kundenverwaltung
Status: ✅ Vollständig implementiert
Lizenz: LicenseGuids.Centron (Standard)
Use Cases
UC 11.22.1: Mehrere Kontaktperson(en) pro Kunde
- Speicherung: Name, Titel, E-Mail, Telefon, Abteilung
- Rollen: IT-Kontakt, Finanzen-Kontakt, Geschäftsführer, etc.
- Default-Kontakt: Wer bekommt automatisch Ticket-Benachrichtigungen?
UC 11.22.2: Mehrere Adressen pro Kunde
- Speicherung: Zentrale, Filialen, Service-Adressen
- Typ: Geschäftsadresse, Rechnungs adresse, Liefer-Adresse
- Standardadresse: Default für Ticketing
9. Partiell Implementierte Module
9.1 Suche (Placeholder)
Pfad: src/CentronNexus/ServiceBoard/Searches/SearchPage.razor
Status: 🟡 Stub/Placeholder
Geplant: Globale Suche über alle Datentypen
9.2 Statistiken (Stub)
Pfad: src/CentronNexus/ServiceBoard/Statistics/StatisticsPage.razor
Status: 🟡 Stub
Geplant: Analytics Dashboard (SLA-Erfüllung, Reaktionszeiten, Team-Performance)
9.3 Karte (Mapping Stub)
Pfad: src/CentronNexus/ServiceBoard/TicketMap/TicketMapPage.razor
Status: 🟡 Stub
Geplant: Geografische Darstellung von Kundenstandorten/Service-Gebieten
9.4 Passwort-Manager (Missing)
Status: ❌ Nicht vorhanden Geplant: Sichere Passwort-Verwaltung für Service-Zugriffe
10. Architektur & Muster
10.1 Service-Injection Pattern
Standard-Services
// Pro Page typischerweise injiziert:
@inject ICentronService CentronService; // REST API Gateway
@inject ICachedDataService CachedDataService; // Cached User/Tenant
@inject IAlertService AlertService; // Toast Notifications
@inject ICentronDialogService DialogService; // Modal Dialogs
@inject ITicketFilterService TicketFilterService; // Filter/Search Logic
@inject IAuthorizationService AuthorizationService; // Rights Check
@inject ICurrentUserService CurrentUserService; // Current User Info
@inject ILoadingService LoadingService; // Loading Indicator
@inject ITicketCacheService TicketCacheService; // Ticket Local Cache
@inject IToastNotificationService ToastService; // Toast Notifications
@inject NavigationManager NavigationManager; // Routing
@inject IJSRuntime JsRuntime; // JS Interop
Typischer Service-Aufruf
// Mit Error Handling
try
{
var result = await CentronService.GetHelpdeskDetails(ticketId);
if (result.IsSuccess)
{
Helpdesk = result.Data;
await InvokeAsync(StateHasChanged);
}
else
{
await AlertService.ShowError($"Fehler: {result.Error}");
}
}
catch (Exception ex)
{
Logger.LogError(ex, "Error loading ticket");
await AlertService.ShowError("Fehler beim Laden des Tickets");
}
10.2 Daten-Flows
Ticket öffnen & Anzeigen
1. User klickt auf Ticket in Liste
2. TicketDetailsPage.razor wird geladen
3. @page Router: /serviceboard/ticket/{ticketId:int}
4. OnInitializedAsync() wird aufgerufen
5. CentronService.GetHelpdeskDetails(ticketId)
6. REST API: GET /api/Helpdesk/{id}
7. Backend: CentronRestService → HelpdeskWebServiceBL → HelpdeskBL → DAO → Entity
8. DTO wird zurück zu Frontend gesendet
9. Helpdesk Objekt wird an Razor Components gebunden
10. StateHasChanged() triggert UI-Rendering
Kommentar hinzufügen
1. User klickt "Kommentar hinzufügen"
2. Input-Feld wird fokussiert
3. User tippt Text + klickt "Speichern"
4. CentronService.AddHelpdeskComment(new HelpdeskCommentRequest { ... })
5. REST API: POST /api/Helpdesk/{id}/Comments
6. Backend: Validierung + Speichern in DB
7. Response: CreatedCommentDTO mit neuer ID
8. Frontend: Comment zur lokalen Liste hinzufügen
9. StateHasChanged() → UI aktualisiert
10. Optional: SignalR-Benachrichtigung an andere User (Live-Update)
Ticket schließen (Multi-Step)
1. User klickt "Ticket schließen"
2. CloseTicketPage.razor Modal öffnet
3. Form mit Optionen: Grund, Notizen, E-Mail-Vorlage
4. User füllt aus und klickt "Abschließen"
5. CentronService.CloseHelpdesk(new CloseHelpdeskRequest { ... })
6. REST API: POST /api/Helpdesk/{id}/Close
7. Backend:
a. Validierung (User hat Berechtigung?)
b. Status auf "Closed" setzen
c. ClosedDate + ClosedByI3D setzen
d. Service-Report generieren (PDF)
e. E-Mail-Template rendern
f. E-Mail versenden (async job)
g. Änderung speichern
8. Response: SuccessResult
9. Frontend: Modal schließen + TicketList aktualisieren
10. SignalR-Broadcast: Alle Seiten erhalten Update
10.3 Authentifizierung & Rechte
Autorisierung Pattern
// In Razor-Component:
@if (await AuthorizationService.AuthorizeAsync(
User, null, UserRightsConst.Sales.HELPDESK_VIEW).Succeeded)
{
<TicketListComponent />
}
else
{
<div class="alert alert-danger">
Sie haben keine Berechtigung, Tickets anzusehen.
</div>
}
User-Rights Constants
public static class UserRightsConst
{
public static class Sales
{
public const int HELPDESK_VIEW = 150100001; // View tickets
public const int HELPDESK_CREATE = 150100002; // Create tickets
public const int HELPDESK_EDIT = 150100003; // Edit ticket properties
public const int HELPDESK_CLOSE = 150100004; // Close tickets
public const int HELPDESK_FORWARD = 150100005; // Forward/escalate
public const int TIMERECORD_VIEW = 150100010; // View timerecords
public const int TIMERECORD_EDIT = 150100011; // Edit timerecords
}
}
JWT-Token Validierung
// Automatic mit AuthenticationStateProvider
var auth = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = auth.User;
// Token wird mit jeden CentronService-Aufruf gesandt
// Backend validiert JWT Signatur + Claims
10.4 Real-Time Features (SignalR)
Live-Update für Ticket-Änderungen
// Server-Side (Backend)
hubContext.Clients
.Group($"ticket_{ticketId}")
.SendAsync("TicketUpdated", updatedTicket);
// Client-Side (Frontend)
hubConnection = new HubConnectionBuilder()
.WithUrl("/tickethub")
.WithAutomaticReconnect()
.Build();
await hubConnection.StartAsync();
hubConnection.On<HelpdeskDTO>("TicketUpdated", ticket =>
{
// Update local state
Helpdesk = ticket;
InvokeAsync(StateHasChanged);
});
Real-Time Notifications
Event: Ticket wird mir zugewiesen
→ SignalR sendet Notification
→ Toast wird angezeigt (unten rechts)
→ Browser-Sound + Popup (optional)
→ Liste wird aktualisiert
Event: Anderer Techniker bearbeitet das gleiche Ticket
→ "Warnung: Bearbeitet gerade von John Doe"
→ Save-Button wird disabled (Konflikt-Warnung)
Summary & Metriken
Modul-Übersicht (Tabulisch)
| # | Modul | Pfad | Status | Komplexität | UC-Count |
|---|---|---|---|---|---|
| 1 | Ticket-Details | TicketDetails | ✅ | 🔴 Hoch | 4 |
| 2 | Ticket-Liste | TicketList | ✅ | 🔴 Hoch | 4 |
| 3 | Ticket Schließen | CloseTicket | ✅ | 🟠 Mittel | 2 |
| 4 | Ticket Weiterleiten | ForwardTicket | ✅ | 🟡 Niedrig | 2 |
| 5 | Kanban-Board | Kanban | ✅ | 🟠 Mittel | 1 |
| 6 | Checklisten | TicketChecklists | ✅ | 🟡 Niedrig | 2 |
| 7 | Ticket-Scripts | TicketScripts | ✅ | 🟠 Mittel | 2 |
| 8 | Web-Formulare | TicketWebForms | ✅ | 🔴 Hoch | 3 |
| 9 | Zeiterfassung | Timerecords | ✅ | 🟠 Mittel | 3 |
| 10 | Stoppuhren | Stopwatches | ✅ | 🟡 Niedrig | 3 |
| 11 | Scheduler | Scheduler | ✅ | 🟠 Mittel | 3 |
| 12 | Dashboard | Dashboard | ✅ | 🟠 Mittel | 4 |
| 13 | MyDay | MyDay | ✅ | 🟠 Mittel | 4 |
| 14 | Dokumente | TicketDocuments | ✅ | 🟡 Niedrig | 2 |
| 15 | E-Mails | TicketEmails | ✅ | 🟡 Niedrig | 2 |
| 16 | Berichte | TicketReports | ✅ | 🟠 Mittel | 1 |
| 17 | Dokumentenviewer | DocumentViewer | ✅ | 🟡 Niedrig | 1 |
| 18 | E-Mail Versand | SendTicketMail | ⚠️ | 🟡 Niedrig | 1 |
| 19 | AI-Zusammenfassung | TicketAiSummary | ✅ | 🟠 Mittel | 3 |
| 20 | AI-Assist | (Part of 19) | ✅ | 🟠 Mittel | 2 |
| 21 | Kunden | Customers | ✅ | 🟠 Mittel | 2 |
| 22 | Kundengeräte | TicketMasterDataItems | ✅ | 🟠 Mittel | 1 |
| 23 | Kundendetails | Customers/* | ✅ | 🟠 Mittel | 2 |
| 24 | Suche | Searches | 🟡 | - | 0 |
| 25 | Statistiken | Statistics | 🟡 | - | 0 |
| 26 | Karte | TicketMap | 🟡 | - | 0 |
| ... | ... | ... | ... | ... | ... |
Gesamt-Statistiken
| Metrik | Wert |
|---|---|
| Total Module | 34 |
| Vollständig implementiert | 23 (68%) |
| Partiell implementiert | 4 (12%) |
| Stubs/Placeholder | 6 (18%) |
| Dokumentierte Use Cases (alt) | 12 |
| Dokumentierte Use Cases (neu) | 50+ |
| Razor Pages | 150+ |
| REST API Endpoints (für SB) | 40+ |
| Datenbank-Entitäten | 30+ |
| Geschätzte Komplexität | 🔴 Sehr Hoch |
Nächste Schritte für Dokumentation
- ✅ Alle 34 Module identifizieren
- ✅ 23 vollständige Module dokumentieren
- ✅ Hidden Features katalogisieren
- ✅ Daten-Flows mappieren
- ⏳ UI Mockups/Screenshots hinzufügen
- ⏳ Integration-Diagramme erstellen
- ⏳ API-Referenz-Dokumentation
- ⏳ Deployment & Operations Guide
Generated: 2025-11-20 Version: 1.1.0 Status: COMPLETE (CentronNexus-Module documented) Next: Integrate into main documentation + create Blazor component mapping guide