994 lines
33 KiB
Markdown
994 lines
33 KiB
Markdown
# 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<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
|
|
```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<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
|
|
```csharp
|
|
// 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
|
|
```csharp
|
|
// 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
|
|
```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<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**:
|
|
```csharp
|
|
// 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
|
|
|
|
```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<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
|
|
|
|
```csharp
|
|
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
|
|
|
|
```csharp
|
|
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
|
|
|
|
```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<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
|
|
|
|
```csharp
|
|
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
|
|
|
|
```csharp
|
|
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
|
|
|
|
```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<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
|
|
|
|
```xml
|
|
<!-- 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
|
|
|
|
```xml
|
|
<!-- 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
|
|
|
|
```csharp
|
|
// 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
|
|
|
|
- [x] 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
|
|
|
|
- [x] 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
|
|
|