# c-entron.NET - WPF GUI Mapping für Asset Management & Scheduling > **Generiert**: 2025-11-11 > **Status**: GUI-Mapping für neue Use Cases > **Basis**: USE_CASES_NEW.md Dokumentation > **Ziel**: Mapping auf WPF ViewModels, Views, Controller --- ## 📋 Inhaltsverzeichnis 1. [Asset Management GUI-Struktur](#asset-management-gui-struktur) - [Geräte-Inventarverwaltung UI](#161-geräte-inventarverwaltung-ui) - [Patch-Management UI](#162-patch--update-management-ui) - [SNMP-Monitoring UI](#163-snmp-monitoring-ui) - [Lizenz-Verwaltung UI](#164-lizenz-verwaltung-ui) - [Compliance & Depreciation UI](#165-compliance--depreciation-ui) 2. [Scheduling GUI-Struktur](#scheduling-gui-struktur) - [Termine & Buchungen UI](#171-termine--buchungen-ui) - [Route-Optimierung UI](#172-route-optimierung-ui) - [Kapazitätsplanung UI](#173-kapazitätsplanung-ui) - [SLA-Management UI](#174-sla-management-ui) 3. [Module-Registrierung](#module-registrierung) 4. [Ribbon-Integration](#ribbon-integration) 5. [Implementierungs-Roadmap](#implementierungs-roadmap) --- # ASSET MANAGEMENT GUI-STRUKTUR ## 16.1 Geräte-Inventarverwaltung UI ### WPF Modul-Struktur ``` src/centron/Centron.WPF.UI/Modules/Administration/ ├── AssetManagement/ │ ├── AssetManagementAppModuleController.cs │ ├── AssetManagementView.xaml │ ├── ViewModels/ │ │ ├── AssetInventoryViewModel.cs [Hauptview] │ │ ├── AssetDetailsViewModel.cs [Detail-Edit] │ │ ├── AssetLifecycleViewModel.cs [Lebenszyklusmanagement] │ │ ├── AssetBatchImportViewModel.cs [Batch-Import Wizard] │ │ ├── AssetDepartmentViewModel.cs [Abteilungs-Übersicht] │ │ └── WizardPages/ │ │ ├── AssetImportSourceWizardPageViewModel.cs │ │ ├── AssetImportMappingWizardPageViewModel.cs │ │ ├── AssetImportValidationWizardPageViewModel.cs │ │ └── AssetImportResultWizardPageViewModel.cs │ └── Views/ │ ├── AssetInventoryView.xaml │ ├── AssetDetailsView.xaml │ ├── AssetLifecycleView.xaml │ └── Wizard/ │ ├── AssetBatchImportWizardView.xaml ``` ### ViewModel-Eigenschaften Mapping #### UC 1.1: Neue IT-Geräte erfassen ```csharp // AssetInventoryViewModel.cs public class AssetInventoryViewModel : BindableBase { // UC 1.1 Properties public string DeviceName { get; set; } // TextEdit public AssetDeviceType SelectedDeviceType { get; set; } // ComboBoxEdit public string Manufacturer { get; set; } // TextEdit public string ModelNumber { get; set; } // TextEdit public string SerialNumber { get; set; } // TextEdit (unique!) public string AssetTag { get; set; } // TextEdit (auto-generated) public int SelectedDepartmentI3D { get; set; } // ComboBoxEdit public int SelectedLocationI3D { get; set; } // ComboBoxEdit public AssetStatus SelectedStatus { get; set; } // ComboBoxEdit (Active/Inactive) // Commands public ICommand CreateNewAssetCommand { get; } // Neues Gerät erstellen public ICommand SaveAssetCommand { get; } // Speichern public ICommand ImportBatchCommand { get; } // Batch-Import starten public ICommand GenerateAssetTagCommand { get; } // Asset-Tag generieren // List Properties public ObservableCollection Assets { get; set; } public ObservableCollection Departments { get; set; } public ObservableCollection Locations { get; set; } } // UI-Bindungen: // TextEdit "DeviceName" → DeviceName // ComboBoxEdit "Gerättyp" → SelectedDeviceType // TextEdit "Seriennummer" → SerialNumber (mit Validierung) // Button "Asset-Tag generieren" → GenerateAssetTagCommand // Button "Speichern" → SaveAssetCommand ``` **UI-Elemente**: | UI-Element | Typ | ViewModel Property | Validierung | Status | |-----------|------|-------------------|-----------|--------| | Gerätname | TextEdit | DeviceName | Required | 📋 UI Design | | Gerättyp | ComboBoxEdit | SelectedDeviceType | Enum | 📋 UI Design | | Hersteller | TextEdit | Manufacturer | Optional | 📋 UI Design | | Modell | TextEdit | ModelNumber | Required | 📋 UI Design | | Seriennummer | TextEdit | SerialNumber | Required + Unique | 📋 UI Design | | Asset-Tag | TextEdit | AssetTag | Auto-generated | 📋 UI Design | | Abteilung | ComboBoxEdit | SelectedDepartmentI3D | Required | 📋 UI Design | | Standort | ComboBoxEdit | SelectedLocationI3D | Required | 📋 UI Design | | Status | ComboBoxEdit | SelectedStatus | Active/Inactive | 📋 UI Design | | [Neu] Button | Button | CreateNewAssetCommand | - | 📋 UI Design | | [Asset-Tag] Button | Button | GenerateAssetTagCommand | - | 📋 UI Design | | [Speichern] Button | Button | SaveAssetCommand | - | 📋 UI Design | #### UC 1.2: Geräte-Details anzeigen & bearbeiten ```csharp // AssetDetailsViewModel.cs public class AssetDetailsViewModel : BindableBase { // UC 1.2 Properties public string Hostname { get; set; } // TextEdit public string IPAddress { get; set; } // TextEdit public string MacAddress { get; set; } // TextEdit (read-only) public int RAMInGB { get; set; } // SpinEdit public int StorageSizeInGB { get; set; } // SpinEdit public string CPUName { get; set; } // TextEdit (read-only) public string OperatingSystem { get; set; } // ComboBoxEdit public DateTime AcquisitionDate { get; set; } // DateEdit public int DepartmentI3D { get; set; } // ComboBoxEdit // Commands public ICommand SaveDetailsCommand { get; } public ICommand RefreshDetailsCommand { get; } // Von Scanner abrufen // Binding Collections public List OperatingSystems { get; set; } } // UI-Bindungen: // Grid mit Tabs: // [Allgemein] [Hardware] [Software] [Service-Historie] // // Tab "Allgemein": // - Hostname (TextEdit) // - IP-Adresse (TextEdit) // - Abteilung (ComboBoxEdit) // - Status (ComboBoxEdit) // // Tab "Hardware": // - CPU (read-only) // - RAM (SpinEdit) // - Storage (SpinEdit) // - Netzwerk-Interfaces (Grid) // // Tab "Software": // - Betriebssystem (ComboBoxEdit) // - Installierte Apps (Grid, read-only) // - Services (Grid, read-only) ``` #### UC 1.3: Geräte-Bestände nach Abteilung ```csharp // AssetDepartmentViewModel.cs public class AssetDepartmentViewModel : BindableBase { // Filter public int SelectedDepartmentI3D { get; set; } // ComboBoxEdit public AssetStatus? FilterStatus { get; set; } // ComboBoxEdit // Data public ObservableCollection Assets { get; set; } // GridControl // Commands public ICommand FilterCommand { get; } public ICommand ExportToExcelCommand { get; } // Status-Anzeige public int TotalAssetCount { get; set; } public int ActiveAssetCount { get; set; } public int InactiveAssetCount { get; set; } } // UI-Bindungen: // GroupBox "Filter" // - ComboBoxEdit "Abteilung" → SelectedDepartmentI3D // - ComboBoxEdit "Status" → FilterStatus // - Button [Filter] → FilterCommand // // StatusBar (unten): // - "Gesamt: 150 Geräte | Aktiv: 145 | Inaktiv: 5" // // GridControl (Geräte-Liste): // Columns: // - Asset-Tag // - Gerätname // - Typ // - Benutzer // - Standort // - Status // - Ablauf-Datum ``` #### UC 1.4: Geräte-Lebenszyklusmanagement ```csharp // AssetLifecycleViewModel.cs public class AssetLifecycleViewModel : BindableBase { // Filterierung public AssetLifecycleStage FilterStage { get; set; } // ComboBoxEdit // List public ObservableCollection Assets { get; set; } // Bulk Operations public ICommand MoveToInactiveCommand { get; } public ICommand MoveToDisposalCommand { get; } public ICommand UpdateDepreciationCommand { get; } // Reporting public decimal TotalDepreciation { get; set; } // TextBlock (read-only) public decimal TotalResidualValue { get; set; } // TextBlock (read-only) } // Lifecycle Stages: // [Beschaffung] → [Aktiv] → [Wartung] → [Ruhestand] → [Entsorgung] // // GridControl Columns: // - Asset-Tag // - Gerätname // - Aktueller Stage // - Erwerbs-Datum // - Geplante Entsorgung // - Restwert // - [Move to Stage] Button ``` #### UC 1.5: Batch-Import von Geräten ```csharp // AssetBatchImportViewModel.cs public class AssetBatchImportViewModel : BindableBase { // Wizard Page 1: Source public string ImportFileSourcePath { get; set; } // TextEdit public AssetImportFormat SelectedFormat { get; set; } // ComboBoxEdit (CSV/JSON/XML) public ICommand BrowseFileCommand { get; } // Wizard Page 2: Mapping public ObservableCollection ColumnMappings { get; set; } // Wizard Page 3: Validation public ObservableCollection ValidationResults { get; set; } public int DuplicatesDetected { get; set; } public bool ProceedWithImport { get; set; } // Wizard Page 4: Result public ObservableCollection ImportedAssets { get; set; } public int SuccessCount { get; set; } public int ErrorCount { get; set; } } // Wizard-Seiten: // Page 1: "Datei auswählen" // - TextEdit mit BrowseButton // - ComboBoxEdit "Format" // - Preview der ersten Zeilen // // Page 2: "Spalten-Zuordnung" // - Grid: CSV-Spalte → Asset-Feld // - Dropdown für Zuordnung // // Page 3: "Validierung" // - Anzahl Duplikate // - Fehler-Summary // - Checkbox "Mit Duplikaten fortfahren?" // // Page 4: "Ergebnis" // - "150 Geräte erfolgreich importiert" // - Grid mit importierten Geräten ``` **BL-Integration**: ```csharp // Service-Layer (WebServiceBL oder BL) public class AssetManagementLogic : IAssetManagementLogic { private readonly AssetBL _assetBL; private readonly DAOSession _session; // UC 1.1 public Result CreateNewAsset(CreateAssetRequest request, AppUser currentUser) // UC 1.2 public Result GetAssetDetails(int assetI3D) public Result UpdateAssetDetails(int assetI3D, UpdateAssetRequest request, AppUser currentUser) // UC 1.3 public Result> GetInventoryByDepartment(int departmentI3D, AssetStatus? status) // UC 1.4 public Result UpdateAssetLifecycleStage(int assetI3D, AssetLifecycleStage newStage) // UC 1.5 public Result ImportAssetsBatch(Stream fileStream, AssetImportFormat format) } // REST API Endpoints POST /AssetManagement/CreateAsset POST /AssetManagement/GetAssetDetails POST /AssetManagement/UpdateAsset POST /AssetManagement/GetInventoryByDepartment POST /AssetManagement/ImportBatch ``` --- ## 16.2 Patch- & Update-Management UI ### WPF Modul-Struktur ``` src/centron/Centron.WPF.UI/Modules/Administration/ ├── AssetManagement/PatchManagement/ │ ├── PatchManagementViewModel.cs │ ├── PatchManagementView.xaml │ └── ViewModels/ │ ├── PendingPatchesViewModel.cs │ ├── PatchDeploymentViewModel.cs [Wizard] │ ├── PatchCampaignViewModel.cs │ └── PatchHistoryViewModel.cs ``` ### ViewModel-Eigenschaften ```csharp public class PendingPatchesViewModel : BindableBase { // Filter public int? SelectedDeviceI3D { get; set; } public PatchKind? FilterPatchKind { get; set; } // ComboBoxEdit (Security/Critical/Standard) public DateTime? FilterFromDate { get; set; } public DateTime? FilterToDate { get; set; } // Data public ObservableCollection PendingPatches { get; set; } // Commands public ICommand FilterCommand { get; } public ICommand ApprovePatchCommand { get; } public ICommand RejectPatchCommand { get; } public ICommand ScheduleDeploymentCommand { get; } // Statistics public int CriticalPatchCount { get; set; } public int SecurityPatchCount { get; set; } public int StandardPatchCount { get; set; } } // UI-Bindungen: // TreeView (links): // - Alle Geräte // - Nach Patch-Status gruppiert // // Main Grid (rechts): // Columns: // - Patch-Name // - Typ (Security/Critical/Standard) // - Status (Pending/Approved/Deployed) // - Betroffene Geräte (Anzahl) // - Größe // - [Genehmigen] Button // - [Ablehnen] Button // - [Deploy] Button ``` --- ## 16.3 SNMP-Monitoring UI ``` src/centron/Centron.WPF.UI/Modules/Administration/ ├── AssetManagement/SnmpMonitoring/ │ ├── SnmpMonitoringViewModel.cs │ ├── SnmpMonitoringView.xaml │ └── ViewModels/ │ ├── SnmpDeviceListViewModel.cs │ ├── SnmpDeviceDetailsViewModel.cs │ ├── SnmpThresholdViewModel.cs │ ├── NetworkHealthDashboardViewModel.cs ``` ### Dashboard-Komponenten ```csharp public class NetworkHealthDashboardViewModel : BindableBase { // Real-Time Metrics public ObservableCollection DevicesStatus { get; set; } // Gauges public double AverageCpuUsage { get; set; } // Gauge Control public double AverageMemoryUsage { get; set; } // Gauge Control public double AverageDiskUsage { get; set; } // Gauge Control // Color-coded Status public DeviceStatus OverallStatus { get; set; } // Green/Yellow/Red // Commands public ICommand RefreshCommand { get; } public ICommand DrillDownCommand { get; } } // UI-Bindungen: // [Gauge Control] Durchschnittliche CPU: 65% // [Gauge Control] Durchschnittlicher RAM: 72% // [Gauge Control] Durchschnittlicher Disk: 58% // // [Heatmap oder Icon-Grid] // Alle Geräte als farbige Quadrate // 🟢 Online & Gut // 🟡 Online aber langsam // 🔴 Offline oder Critical ``` --- ## 16.4 Lizenz-Verwaltung UI ``` src/centron/Centron.WPF.UI/Modules/Administration/ ├── AssetManagement/LicenseManagement/ │ ├── LicenseManagementViewModel.cs │ ├── LicenseManagementView.xaml │ └── ViewModels/ │ ├── LicenseInventoryViewModel.cs │ ├── LicenseComplianceViewModel.cs │ ├── LicenseAuditViewModel.cs ``` ### ViewModel-Eigenschaften ```csharp public class LicenseInventoryViewModel : BindableBase { // Master Table public ObservableCollection InstalledLicenses { get; set; } // For each License: // - Product Name // - License Type (Home/Pro/Enterprise) // - Purchase Date // - Expiration Date // - Licensed Seats // - Installed Count // - Status (OK/Over-Licensed/Under-Licensed) public ICommand RegisterNewLicenseCommand { get; } public ICommand RenewLicenseCommand { get; } } // UI-Bindungen: // GridControl "Lizenzen" // Columns: // - Produkt-Name // - Lizenz-Typ // - Ablauf-Datum // - Lizenziert (Anzahl) // - Installiert (Anzahl) // - Status (🔴 Over / 🟡 Warning / 🟢 OK) // - [Erneuern] Button // - [Details] Button ``` --- ## 16.5 Compliance & Depreciation UI ``` src/centron/Centron.WPF.UI/Modules/Administration/ ├── AssetManagement/ComplianceReporting/ │ ├── ComplianceReportingViewModel.cs │ ├── ComplianceReportingView.xaml │ └── ViewModels/ │ ├── DepreciationScheduleViewModel.cs │ ├── ComplianceAuditViewModel.cs │ ├── AssetAuditReportViewModel.cs ``` ### Report-Komponenten ```csharp public class DepreciationScheduleViewModel : BindableBase { // Calculate Depreciation public decimal AcquisitionCost { get; set; } public int UsefulLifeMonths { get; set; } public DepreciationMethod Method { get; set; } // Linear/Accelerated // Results public decimal MonthlyDepreciation { get; set; } public decimal CurrentBookValue { get; set; } public decimal ResidualValue { get; set; } // Chart public ChartData DepreciationCurve { get; set; } // Line Chart public ICommand CalculateCommand { get; } } // UI-Bindungen: // [SpinEdit] Anschaffungswert: 1000 € // [SpinEdit] Nutzungsdauer: 36 Monate // [ComboBox] Methode: Linear / Accelerated // [Button] Berechnen // // [TextBlock] Monatliche Abschreibung: 27.78 € // [TextBlock] Aktueller Wert: 500 € // [TextBlock] Restwert: 100 € // // [Chart] Abschreibungs-Kurve (über Zeit) ``` --- --- # SCHEDULING GUI-STRUKTUR ## 17.1 Termine & Buchungen UI ### WPF Modul-Struktur ``` src/centron/Centron.WPF.UI/Modules/Calendar/ ├── AppointmentScheduling/ │ ├── AppointmentSchedulingAppModuleController.cs │ ├── AppointmentSchedulingView.xaml │ ├── ViewModels/ │ │ ├── AppointmentRequestViewModel.cs [Hauptview] │ │ ├── AppointmentProposalViewModel.cs [Slot-Auswahl] │ │ ├── AppointmentConfirmationViewModel.cs [Bestätigung] │ │ ├── AppointmentRescheduleViewModel.cs [Umbuchen] │ │ ├── TechnicianAvailabilityViewModel.cs [Verfügbarkeit] │ │ └── WizardPages/ │ │ ├── AppointmentRequestWizardPageViewModel.cs │ │ ├── AppointmentProposalWizardPageViewModel.cs │ │ ├── AppointmentConfirmationWizardPageViewModel.cs │ └── Views/ │ ├── AppointmentRequestView.xaml │ ├── AppointmentSlotSelectionView.xaml │ └── Wizard/ │ ├── AppointmentBookingWizardView.xaml ``` ### ViewModel-Eigenschaften ```csharp public class AppointmentRequestViewModel : BindableBase { // UC 17.1.1: Termine-Anfrage public int TicketI3D { get; set; } // Hidden (aus Ticket context) public int CustomerI3D { get; set; } // Hidden public ServiceType RequestedServiceType { get; set; } // ComboBoxEdit public DateTime PreferredDateFrom { get; set; } // DateEdit public DateTime PreferredDateTo { get; set; } // DateEdit public int EstimatedDurationInHours { get; set; } // SpinEdit public string LocationAddress { get; set; } // TextEdit public string CustomerNotes { get; set; } // MemoEdit // Available Slots public ObservableCollection ProposedSlots { get; set; } // Commands public ICommand RequestAppointmentCommand { get; } // Anfrage einreichen public ICommand SelectSlotCommand { get; } // Slot auswählen public ICommand ConfirmAppointmentCommand { get; } // Bestätigen // Status public string AppointmentStatus { get; set; } // "Anfrage eingereicht", "Slots verfügbar", "Gebucht" } // UI-Bindungen (Wizard, Seite 1): // [ComboBox] Service-Typ: Installation / Wartung / Reparatur // [DateEdit] Gewünschter Zeitraum von: ___ // [DateEdit] bis: ___ // [SpinEdit] Geschätzte Dauer: ___ Stunden // [TextEdit] Adresse: ___ // [MemoEdit] Anmerkungen: ___ // [Button] Anfrage absenden // // Wizard Seite 2 (wenn Slots verfügbar): // [Tabelle] Verfügbare Termine: // | Datum | Zeit | Techniker | Fahrtzeit | [Wählen] | // | Do 10. | 09:00-10:30 | Hans M. | 15 Min | ✓ | // | Do 10. | 14:00-15:30 | Max B. | 25 Min | ✓ | // // Wizard Seite 3 (Bestätigung): // "Termin bestätigt: Donnerstag 10. Juli, 09:00-10:30 bei Anna K." // [Button] Termin speichern ``` --- ## 17.2 Route-Optimierung UI ``` src/centron/Centron.WPF.UI/Modules/Calendar/ ├── RouteOptimization/ │ ├── RouteOptimizationViewModel.cs │ ├── RouteOptimizationView.xaml │ └── ViewModels/ │ ├── TechnicianRoutePlannerViewModel.cs [Tages-Route] │ ├── ZoneManagementViewModel.cs [Zone-Verwaltung] │ ├── RouteMapViewModel.cs [Karten-Anzeige] ``` ### ViewModel-Eigenschaften ```csharp public class TechnicianRoutePlannerViewModel : BindableBase { // Inputs public int SelectedTechnicianI3D { get; set; } // ComboBoxEdit public DateTime SelectedDate { get; set; } // DateEdit // Computed Route public ObservableCollection OptimizedRoute { get; set; } // Metrics public double TotalDrivingTimeInMinutes { get; set; } // TextBlock public double TotalDrivingDistanceInKm { get; set; } // TextBlock public decimal TotalTravelCosts { get; set; } // TextBlock // Visualization public MapData RouteMapData { get; set; } // Map Control // Commands public ICommand OptimizeRouteCommand { get; } public ICommand PrintRouteCommand { get; } public ICommand ExportRouteCommand { get; } } // UI-Bindungen: // [ComboBox] Techniker: Hans M. // [DateEdit] Datum: Montag, 10. Juli 2025 // [Button] Route optimieren // // [Route-Tabelle] // | Uhrzeit | Adresse | Kunde | Dauer | Fahrtzeit | Nächster Stop | // | 09:00 | HQ Start | - | - | 15 Min | Kunde A | // | 09:15 | Seestr. 15 | Müller GmbH | 1.5h | 30 Min | Kunde C | // | 10:45 | Hauptstr. 42 | Schmidt KG | 0.5h | 15 Min | Kunde B | // | 13:00 | Mittagspause | - | 1h | - | - | // | 14:00 | Gewerbepark 10 | Reisebüro | 1h | 15 Min | Rückfahrt | // | 15:15 | Marienplatz 5 | Bauuntern. | 1h | - | HQ | // | 16:15 | HQ | - | - | - | - | // // [Info-Zeile unten] // Fahrtzeit gesamt: 2h 45 Min | Fahrstrecke: 85 km | Kosten: €42,50 // // [Map View] (rechts, optional) // Karte mit markierten Kunden-Positionen und Fahrt-Route ``` --- ## 17.3 Ressourcen-Kapazitätsplanung UI ``` src/centron/Centron.WPF.UI/Modules/Calendar/ ├── CapacityPlanning/ │ ├── CapacityPlanningViewModel.cs │ ├── CapacityPlanningView.xaml │ └── ViewModels/ │ ├── DemandForecastViewModel.cs │ ├── ResourceNeedsAnalysisViewModel.cs │ ├── CapacityUtilizationViewModel.cs ``` ### ViewModel-Eigenschaften ```csharp public class CapacityUtilizationViewModel : BindableBase { // Filter public DateTime ForecastStartDate { get; set; } // DateEdit public DateTime ForecastEndDate { get; set; } // DateEdit // Weekly Breakdown public ObservableCollection WeeklyCapacity { get; set; } // For each week: // - Week number // - Predicted demand (hours) // - Available capacity (hours) // - Utilization % (0-100) // - Status (🟢 OK / 🟡 Warning / 🔴 Overbooked) // Metrics public double AverageUtilizationPercent { get; set; } // TextBlock public double PeakUtilizationPercent { get; set; } // TextBlock public int BottleneckWeekCount { get; set; } // TextBlock // Commands public ICommand ForecastCommand { get; } } // UI-Bindungen: // [DateEdit] Von: _________ // [DateEdit] Bis: _________ // [Button] Prognose berechnen // // [Heatmap oder Tabelle] // Woche | Nachfrage | Verfügbar | Auslastung | Status // 40 | 150h | 160h | 94% | 🟢 OK // 41 | 200h | 160h | 125% | 🔴 PROBLEM! // 42 | 130h | 160h | 81% | 🟢 OK // 43 | 180h | 160h | 113% | 🟡 Warning // 44 | 100h | 160h | 63% | 🟢 OK // // [Info] // Durchschnittliche Auslastung: 95% // Peak: Woche 41 (125%) - Externe Ressourcen empfohlen! // // [Recommendations Panel] // ⚠️ Woche 41: 40h Mehrarbeit nötig // → Externe Techniker hinzubuchen ODER // → Wartungen auf Woche 40/42 verschieben ``` --- ## 17.4 SLA-Management UI ``` src/centron/Centron.WPF.UI/Modules/Helpdesk/ ├── SLAManagement/ │ ├── SLAManagementViewModel.cs │ ├── SLAManagementView.xaml │ └── ViewModels/ │ ├── SLAConfigurationViewModel.cs │ ├── SLAMonitoringDashboardViewModel.cs │ ├── SLAReportingViewModel.cs ``` ### Dashboard-Komponenten ```csharp public class SLAMonitoringDashboardViewModel : BindableBase { // Real-Time Status public int OKTicketCount { get; set; } // Badge (Green) public int WarningTicketCount { get; set; } // Badge (Yellow) public int BreachTicketCount { get; set; } // Badge (Red) // SLA Status Grid public ObservableCollection TicketSLAStatuses { get; set; } // For each ticket: // - Ticket ID // - Priority // - Created // - SLA Response Deadline // - SLA Resolution Deadline // - Time Remaining (%) // - Status (🟢 OK / 🟡 Warning / 🔴 Breach) // Commands public ICommand RefreshCommand { get; } public ICommand SendEscalationCommand { get; } } // UI-Bindungen: // [Status-Header] // 🟢 OK: 95 Tickets | 🟡 Warning: 12 Tickets | 🔴 Breach: 2 Tickets // // [Filter] // [ComboBox] Priorität: Alle / P1 / P2 / P3 / P4 // [ComboBox] Status: Alle / OK / Warning / Breach // [Button] Filtern // // [Ticket-Grid] // | ID | Titel | Prio | Erstellt | Response SLA | Lösung SLA | Verbl. Zeit | Status | // |---|---|---|---|---|---|---|---| // | #1001 | Mail-Server down | P1 | 09:30 | 10:30 | 13:30 | 67% | 🟢 OK | // | #1002 | Drucker Problem | P3 | 14:15 | 22:15 | 5 Tage | 12% | 🔴 Breach! | // // [Alerts Panel] (unten) // ⚠️ 2 Tickets mit SLA-Verletzung! // → Ticket #1002 (67h überfällig) - Eskalation zu Manager erforderlich // [Button] Eskalation senden ``` --- # MODULE-REGISTRIERUNG ## Ribbon-Integration ### Asset Management Ribbon Tab ```xml