# 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

