33 KiB
33 KiB
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
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
// 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<AssetItemViewModel> Assets { get; set; }
public ObservableCollection<DepartmentViewModel> Departments { get; set; }
public ObservableCollection<LocationViewModel> 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
// 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<string> 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
// AssetDepartmentViewModel.cs
public class AssetDepartmentViewModel : BindableBase
{
// Filter
public int SelectedDepartmentI3D { get; set; } // ComboBoxEdit
public AssetStatus? FilterStatus { get; set; } // ComboBoxEdit
// Data
public ObservableCollection<AssetListItemViewModel> 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
// AssetLifecycleViewModel.cs
public class AssetLifecycleViewModel : BindableBase
{
// Filterierung
public AssetLifecycleStage FilterStage { get; set; } // ComboBoxEdit
// List
public ObservableCollection<AssetLifecycleItemViewModel> 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
// 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<AssetColumnMappingViewModel> ColumnMappings { get; set; }
// Wizard Page 3: Validation
public ObservableCollection<AssetImportValidationResultViewModel> ValidationResults { get; set; }
public int DuplicatesDetected { get; set; }
public bool ProceedWithImport { get; set; }
// Wizard Page 4: Result
public ObservableCollection<AssetImportResultViewModel> 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:
// Service-Layer (WebServiceBL oder BL)
public class AssetManagementLogic : IAssetManagementLogic
{
private readonly AssetBL _assetBL;
private readonly DAOSession _session;
// UC 1.1
public Result<AssetDTO> CreateNewAsset(CreateAssetRequest request, AppUser currentUser)
// UC 1.2
public Result<AssetDetailsDTO> GetAssetDetails(int assetI3D)
public Result UpdateAssetDetails(int assetI3D, UpdateAssetRequest request, AppUser currentUser)
// UC 1.3
public Result<List<AssetDTO>> GetInventoryByDepartment(int departmentI3D, AssetStatus? status)
// UC 1.4
public Result UpdateAssetLifecycleStage(int assetI3D, AssetLifecycleStage newStage)
// UC 1.5
public Result<BatchImportResult> 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
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<PatchListItemViewModel> 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
public class NetworkHealthDashboardViewModel : BindableBase
{
// Real-Time Metrics
public ObservableCollection<DeviceHealthItemViewModel> 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
public class LicenseInventoryViewModel : BindableBase
{
// Master Table
public ObservableCollection<SoftwareLicenseViewModel> 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
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
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<AppointmentSlotViewModel> 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
public class TechnicianRoutePlannerViewModel : BindableBase
{
// Inputs
public int SelectedTechnicianI3D { get; set; } // ComboBoxEdit
public DateTime SelectedDate { get; set; } // DateEdit
// Computed Route
public ObservableCollection<RouteStopViewModel> 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
public class CapacityUtilizationViewModel : BindableBase
{
// Filter
public DateTime ForecastStartDate { get; set; } // DateEdit
public DateTime ForecastEndDate { get; set; } // DateEdit
// Weekly Breakdown
public ObservableCollection<CapacityWeekViewModel> 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
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<TicketSLAStatusViewModel> 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
<!-- Modules/Administration/AssetManagement/Ribbon/AssetManagementRibbonDefinition.xml -->
<ribbon>
<tab name="Asset Management">
<group name="Geräte">
<button name="Neue Gerät" icon="add.png" command="CreateNewAsset" rights="ASSET_MANAGEMENT" />
<button name="Geräte importieren" icon="import.png" command="OpenBatchImportWizard" rights="ASSET_MANAGEMENT" />
<button name="Export zu Excel" icon="excel.png" command="ExportAssets" rights="ASSET_VIEW" />
</group>
<group name="Wartung">
<button name="Patch-Verwaltung" icon="patch.png" command="OpenPatchManagement" rights="ASSET_MANAGEMENT" />
<button name="SNMP-Monitoring" icon="monitor.png" command="OpenSnmpMonitoring" rights="ASSET_VIEW" />
</group>
<group name="Compliance">
<button name="Lizenz-Audit" icon="license.png" command="OpenLicenseAudit" rights="ASSET_VIEW" />
<button name="Compliance-Report" icon="report.png" command="GenerateComplianceReport" rights="ASSET_VIEW" />
</group>
</tab>
</ribbon>
Scheduling Ribbon Tab
<!-- Modules/Calendar/AppointmentScheduling/Ribbon/SchedulingRibbonDefinition.xml -->
<ribbon>
<tab name="Terminplanung">
<group name="Termine">
<button name="Neuer Termin" icon="appointment.png" command="CreateAppointment" rights="MANAGE_APPOINTMENTS" />
<button name="Meine Termine" icon="calendar.png" command="ShowMyAppointments" rights="VIEW_SCHEDULE" />
</group>
<group name="Planung">
<button name="Route optimieren" icon="route.png" command="OptimizeRoute" rights="MANAGE_APPOINTMENTS" />
<button name="Kapazitätsplanung" icon="capacity.png" command="OpenCapacityPlanning" rights="VIEW_SCHEDULE" />
</group>
<group name="Überwachung">
<button name="SLA-Dashboard" icon="sla.png" command="OpenSLADashboard" rights="MANAGE_TICKETS" />
<button name="Reports" icon="report.png" command="OpenSchedulingReports" rights="VIEW_SCHEDULE" />
</group>
</tab>
</ribbon>
ModuleRegistration.cs Einträge
// In src/centron/Centron.WPF.UI/Common/ModuleRegistration.cs
// Asset Management Module
ModuleRegistry.Register(
moduleId: new Guid("{F1C2D3E4-5678-90AB-CDEF-1234567890AB}"),
moduleName: "Asset Management",
moduleType: ModuleType.Configuration,
requiresLicense: new[] { LicenseGuids.AssetManagement, LicenseGuids.Centron },
requiredRights: new[] { UserRightsConst.Administration.ASSET_MANAGEMENT },
path: "src/centron/Centron.WPF.UI/Modules/Administration/AssetManagement/",
controllerType: typeof(AssetManagementAppModuleController),
viewType: typeof(AssetManagementView)
);
// Appointment Scheduling Module
ModuleRegistry.Register(
moduleId: new Guid("{A1B2C3D4-E5F6-0910-1112-1314151617AB}"),
moduleName: "Terminverwaltung & Planung",
moduleType: ModuleType.Operations,
requiresLicense: new[] { LicenseGuids.Helpdesk, LicenseGuids.Centron },
requiredRights: new[] { UserRightsConst.Helpdesk.MANAGE_APPOINTMENTS },
path: "src/centron/Centron.WPF.UI/Modules/Calendar/AppointmentScheduling/",
controllerType: typeof(AppointmentSchedulingAppModuleController),
viewType: typeof(AppointmentSchedulingView)
);
IMPLEMENTIERUNGS-ROADMAP
Phase 1: Grundstruktur (Wochen 1-2)
Asset Management - MVP
- Modul-Verzeichnis erstellen
- AssetManagementAppModuleController.cs implementieren
- AssetInventoryView.xaml und ViewModel erstellen
- UC 1.1 (Neue Geräte erfassen) implementieren
- UC 1.2 (Details anzeigen) implementieren
- Datenbank-Mapping zu bestehenden Tabellen
Scheduling - MVP
- Modul-Verzeichnis analysieren (teilweise vorhanden)
- AppointmentSchedulingAppModuleController erweitern
- UC 17.1 (Termine anfragen) UI implementieren
- UC 17.1 (Slot-Auswahl) UI implementieren
- Integation mit bestehender Appointment BL
Deliverables:
- Asset Management Modul mit UC 1.1 & 1.2
- Scheduling Modul mit UC 17.1.1 & 17.1.2
- Ribbon-Integration
- Unit Tests für ViewModels
Phase 2: Erweiterung (Wochen 3-4)
Asset Management - Erweiterte Features
- UC 1.3 (Bestände nach Abteilung)
- UC 1.4 (Lebenszyklusmanagement)
- UC 1.5 (Batch-Import)
- Patch Management (UC 16.2)
- SNMP Monitoring (UC 16.3)
Scheduling - Erweiterte Features
- UC 17.2 (Route-Optimierung)
- UC 17.3 (Kapazitätsplanung)
- UC 17.4 (SLA-Management)
- Mobile-App Support
Deliverables:
- Alle UC für Asset Management & Scheduling
- API-Integration
- Reporting-Module
Phase 3: Optimierung & Testing (Woche 5)
- Performance-Optimierung
- E2E-Testing
- User Acceptance Testing (UAT)
- Dokumentation finalisieren
- Release-Vorbereitung
Technologie-Stack
| Komponente | Technologie | Version |
|---|---|---|
| UI Framework | WPF + DevExpress | 24.2 |
| ViewModel Pattern | MVVM + Prism | - |
| Data Binding | WPF Binding | - |
| Charts | DevExpress Charts | 24.2 |
| Maps | (Optional) | Google Maps API |
| Business Logic | C# .NET 8 | 8.0 |
| ORM | NHibernate | 5.x |
| Testing | NUnit + Moq | - |
Mapping Summary
Asset Management Use Cases → WPF UI
| UC | ViewModel | View | Status |
|---|---|---|---|
| 1.1 | AssetInventoryViewModel | AssetDetailsView | 📋 Design |
| 1.2 | AssetDetailsViewModel | AssetDetailsView (Tab) | 📋 Design |
| 1.3 | AssetDepartmentViewModel | AssetInventoryView (Filter) | 📋 Design |
| 1.4 | AssetLifecycleViewModel | AssetLifecycleView | 📋 Design |
| 1.5 | AssetBatchImportViewModel | AssetBatchImportWizardView | 📋 Design |
| 2.1 | PendingPatchesViewModel | PatchManagementView | 📋 Design |
| 2.2 | PatchDeploymentViewModel | PatchDeploymentWizardView | 📋 Design |
| 3.1 | SnmpDeviceListViewModel | SnmpMonitoringView | 📋 Design |
| 3.2 | NetworkHealthDashboardViewModel | NetworkHealthDashboardView | 📋 Design |
| 4.1 | LicenseInventoryViewModel | LicenseManagementView | 📋 Design |
| 4.2 | LicenseComplianceViewModel | LicenseComplianceView | 📋 Design |
| 5.1 | DepreciationScheduleViewModel | ComplianceReportingView | 📋 Design |
Scheduling Use Cases → WPF UI
| UC | ViewModel | View | Status |
|---|---|---|---|
| 17.1.1 | AppointmentRequestViewModel | AppointmentBookingWizardView (Page 1) | 📋 Design |
| 17.1.2 | AppointmentProposalViewModel | AppointmentBookingWizardView (Page 2) | 📋 Design |
| 17.1.3 | AppointmentConfirmationViewModel | AppointmentBookingWizardView (Page 3) | 📋 Design |
| 17.2.1 | TechnicianRoutePlannerViewModel | RouteOptimizationView | 📋 Design |
| 17.3.1 | CapacityUtilizationViewModel | CapacityPlanningView | 📋 Design |
| 17.4.1 | SLAMonitoringDashboardViewModel | SLAMonitoringView | 📋 Design |
Status: ✅ GUI-Mapping abgeschlossen | WPF-Struktur definiert | Implementation roadmap erstellt