Versuche und Ergebnisse Umstrukturiert

This commit is contained in:
2026-02-19 20:16:26 +01:00
parent a5d2f5490c
commit 9b95958eeb
108 changed files with 1427 additions and 7786 deletions

View File

@@ -0,0 +1,369 @@
# CentronNexus ServiceBoard Ticket Metadata - Complete Field Analysis
## Document Overview
Comprehensive extraction of ALL ticket metadata fields, properties, and editable fields from the CentronNexus/ServiceBoard codebase. Analysis based on:
- Entity definitions (Helpdesk.cs)
- Data Transfer Objects (HelpdeskDTO, HelpdeskPreviewDTO, TicketTagDTO)
- UI Component rendering (TicketDetailsPage.razor)
- Service update methods (ICentronService, UpdateHelpdeskWebServiceBL)
- Change tracking properties (UpdatedTicketProperties)
## PRIMARY METADATA FIELDS
### Ticket Identity & Numbers
- **Number** | Type: int | Editable: No | Required: Yes | Display identifier for the ticket
- **ShortDescription** | Type: string | Editable: Yes | Required: Yes | Brief title/subject
- **I3D** | Type: int | Editable: No | Required: Yes | Primary key (auto-generated IDENTITY)
### Ticket Core Status Information
- **HelpdeskStatusI3D** | Type: int? | Editable: Yes | Required: No | Reference to status enum
- **HelpdeskStatusCaption** | Type: string | Editable: No | Required: No | Display name of status
- **HelpdeskState** (Entity) | Type: HelpdeskState | Editable: Yes | Required: No | Full status object
- **HelpdeskMarked** | Type: bool | Editable: Yes | Required: No | Flag/marking indicator
- **IsOnlyInternalVisible** | Type: bool | Editable: Yes | Required: No | Internal-only visibility flag
### Ticket Type & Priority
- **HelpdeskTypeI3D** | Type: int? | Editable: Yes | Required: No | Reference to ticket type
- **HelpdeskTypeCaption** | Type: string | Editable: No | Required: No | Display name of type
- **HelpdeskType** (Entity) | Type: HelpdeskType | Editable: Yes | Required: No | Full type object
- **HelpdeskPriorityI3D** | Type: int? | Editable: Yes | Required: No | Reference to priority
- **HelpdeskPriorityCaption** | Type: string | Editable: No | Required: No | Display name of priority
- **HelpdeskPriority** (Entity) | Type: HelpdeskPriority | Editable: Yes | Required: No | Full priority object
- **OutlookPriority** | Type: int | Editable: No | Required: No | Outlook integration priority
### Descriptions & Notes
- **Description** | Type: string | Editable: Yes | Required: No | Full ticket description/body
- **InternalNote** | Type: string | Editable: Yes | Required: No | Internal notes (not visible to customer)
- **FreeText1** | Type: string | Editable: No | Required: No | Additional free text field
## SECONDARY METADATA FIELDS
### Categories
- **MainCategoryI3D** | Type: int? | Editable: No (Read-only) | Required: No | Primary category reference
- **MainCategoryCaption** | Type: string | Editable: No | Required: No | Primary category name
- **MainCategory** (Entity) | Type: HelpdeskCategory | Editable: No | Required: No | Full category object
- **SubCategory1I3D** | Type: int? | Editable: No | Required: No | Sub-category 1 reference
- **SubCategory1Caption** | Type: string | Editable: No | Required: No | Sub-category 1 name
- **SubCategory1** (Entity) | Type: HelpdeskCategory | Editable: No | Required: No | Full sub-category 1 object
- **SubCategory2I3D** | Type: int? | Editable: No | Required: No | Sub-category 2 reference
- **SubCategory2Caption** | Type: string | Editable: No | Required: No | Sub-category 2 name
- **SubCategory2** (Entity) | Type: HelpdeskCategory | Editable: No | Required: No | Full sub-category 2 object
### Responsible Parties
- **ResponsiblePersonI3D** (DTO) | Type: int? | Editable: Yes | Required: No | ID of responsible employee
- **ResponsiblePerson** (Entity) | Type: EmployeeCompact | Editable: Yes | Required: No | Full employee object
- **Editors** | Type: List<HelpdeskEditor> | Editable: Yes | Required: Yes (min 1) | List of ticket editors/processors
- **CreatedByI3D** (Standard) | Type: int | Editable: No | Required: Yes | ID of creator
- **CreatedBy** | Type: EmployeePreviewDTO | Editable: No | Required: Yes | Creator information
### Dates & Timings
- **DueDate** | Type: DateTime? | Editable: Yes | Required: No | Deadline for ticket
- **CreatedDate** | Type: DateTime? | Editable: No | Required: Yes | Creation timestamp
- **ChangedDate** | Type: DateTime? | Editable: No | Required: Yes | Last modification timestamp
- **ClosedDate** | Type: DateTime? | Editable: No | Required: No | Date ticket was closed
- **ClosedAt** (Entity) | Type: DateTime? | Editable: No | Required: No | Closure timestamp
- **WorkStartDate** (Entity) | Type: DateTime? | Editable: Yes | Required: No | Work start date (internal)
- **WorkEndDate** (Entity) | Type: DateTime? | Editable: Yes | Required: No | Work end date (internal)
- **EditStartDate** | Type: DateTime? | Editable: Yes | Required: No | Editing start date (UI property)
- **EditEndDate** | Type: DateTime? | Editable: Yes | Required: No | Editing end date (UI property)
- **LastCommentDate** | Type: DateTime? | Editable: No | Required: No | Date of last comment
- **LastEmailDate** | Type: DateTime? | Editable: No | Required: No | Date of last email
### Time & Duration Tracking
- **PlannedDurationInHours** | Type: float? | Editable: Yes | Required: No | Estimated hours needed
- **TotalTimer** | Type: int | Editable: No | Required: No | Total recorded time (seconds)
- **CalculableTimesInSeconds** | Type: int | Editable: No | Required: No | Billable time
- **NotCalculableTimesInSeconds** | Type: int | Editable: No | Required: No | Non-billable time
- **PlannedTimesInSeconds** | Type: int | Editable: No | Required: No | Planned time
- **CalculableNotPlannedTimesInSeconds** | Type: int | Editable: No | Required: No | Billable unplanned time
- **NotCalculableNotPlannedTimesInSeconds** | Type: int | Editable: No | Required: No | Non-billable unplanned time
- **NotBilledCalculableNotPlannedTimesInSeconds** | Type: int | Editable: No | Required: No | Unbilled billable unplanned
- **BilledCalculableNotPlannedTimesInSeconds** | Type: int | Editable: No | Required: No | Billed billable unplanned
- **CalcuableTimersCount** | Type: int | Editable: No | Required: No | Count of billable timers
- **TimersCount** | Type: int | Editable: No | Required: No | Total timer count
- **HistoryCount** | Type: int | Editable: No | Required: No | Number of history entries
### Customer Related
- **CustomerI3D** | Type: int | Editable: No | Required: Yes | Customer reference ID
- **CustomerName** | Type: string | Editable: No | Required: No | Customer display name
- **CustomerStreet** | Type: string | Editable: No | Required: No | Customer address street
- **CustomerZip** | Type: string | Editable: No | Required: No | Customer postal code
- **CustomerCity** | Type: string | Editable: No | Required: No | Customer city
- **CustomerPostCode** (Entity) | Type: string | Editable: No | Required: No | Postal code
- **Customer** (Entity) | Type: CustomerCompact | Editable: No | Required: Yes | Full customer object
- **CustomerAdviser1** | Type: string | Editable: No | Required: No | Customer adviser 1
- **CustomerAdviser2** | Type: string | Editable: No | Required: No | Customer adviser 2
- **CustomerAdviser3** | Type: string | Editable: No | Required: No | Customer adviser 3
- **CustomerAdviser4** | Type: string | Editable: No | Required: No | Customer adviser 4
- **CustomerOrderProcessingContractState** | Type: OrderProcessingContractState? | Editable: No | Required: No | DSGVO contract state
### Contact Information
- **ContactPersonI3D** (DTO) | Type: int? | Editable: Yes | Required: No | Contact person reference
- **ContactPerson** (Entity) | Type: ContactPerson | Editable: Yes | Required: No | Full contact person object
- **AddressI3D** | Type: int? | Editable: Yes | Required: No | Associated address reference
- **Address** (Entity) | Type: Address | Editable: Yes | Required: No | Full address object
- **AdressContactI3D** (DTO) | Type: int? | Editable: Yes | Required: No | Address contact reference (note: spelling variant)
- **ContactTitle** | Type: string | Editable: No | Required: No | Contact title/salutation
- **ContactName** | Type: string | Editable: No | Required: No | Contact person name
- **ContactEmail** | Type: string | Editable: No | Required: No | Contact email address
- **ContactEMail** (Entity) | Type: string | Editable: No | Required: No | Contact email (variant)
- **CustomerEMail** (Entity) | Type: string | Editable: No | Required: No | Customer email
- **ContactTelephoneNumber** | Type: string | Editable: No | Required: No | Phone number
- **ContactPhone** (Entity) | Type: string | Editable: No | Required: No | Phone (variant)
- **ContactFax** (Entity) | Type: string | Editable: No | Required: No | Fax number
### Contract & Billing
- **ContractId** | Type: int | Editable: Yes | Required: No | Associated contract ID
- **ContractI3D** | Type: int? (in UpdatedContractProperties) | Editable: Yes | Required: No | Contract reference
- **ContractName** | Type: string | Editable: No | Required: No | Contract display name
- **ContractCaption** (DTO) | Type: string | Editable: No | Required: No | Contract caption
- **ContractNumber** | Type: int? | Editable: No | Required: No | Contract number
- **ContractTypeCaption** | Type: string | Editable: No | Required: No | Contract type name
- **IsSlaContract** | Type: bool | Editable: No | Required: No | Whether contract is SLA
- **ArticleWorkItemI3D** | Type: int? | Editable: Yes | Required: No | MSP article/work item reference
- **ArticleWorkItemCaption** | Type: string | Editable: No | Required: No | Work item description
- **IsCalculable** | Type: bool | Editable: No | Required: No | Whether time is billable
### Additional Text Fields
- **Version** | Type: string | Editable: Yes | Required: No | Version/AdditionalText1 field
- **AdditionalText2** | Type: string | Editable: Yes | Required: No | Custom additional field 2
- **ProjectNumber** | Type: string | Editable: Yes | Required: No | CRM project reference number
- **SerialNumber** | Type: string | Editable: No | Required: No | Device serial number
### Tags & Classification
- **TicketTags** | Type: List<TicketTagDTO> | Editable: Yes | Required: No | Associated tags collection
- **HelpdeskI3D** | Type: int | Part of tag | Ticket reference
- **TagI3D** | Type: int | Part of tag | Tag ID
- **Caption** | Type: string | Part of tag | Tag display name
### Device Association
- **ConnectedDeviceNames** | Type: List<string> | Editable: Yes | Required: No | Associated device names/IDs
- **DeviceI3Ds** (UpdatedTicketProperties) | Type: IEnumerable<int>? | Editable: Yes | Required: No | Device IDs in update
## TERTIARY METADATA FIELDS
### System & Integration Fields
- **CreatedFrom** | Type: int | Editable: No | Required: No | Source of creation (0=manual, 1=email, etc.)
- **CreatedFromObjectI3D** | Type: int? | Editable: No | Required: No | Creating object reference
- **CreatedFromObjectKind** | Type: CentronObjectKindNumeric? | Editable: No | Required: No | Type of creating object
- **CreatedFromTicketPatternI3D** | Type: int? | Editable: No | Required: No | Ticket pattern used for creation
- **InFAQ** | Type: int | Editable: No | Required: No | FAQ reference
- **IsTemplate** | Type: int | Editable: No | Required: No | Whether is template
- **TemplateI3D** | Type: int | Editable: No | Required: No | Template reference
- **TemplatePos** | Type: int | Editable: No | Required: No | Position in template
- **OutlookModule** | Type: string | Editable: No | Required: No | Outlook integration module
- **OutlookPriority** | Type: int | Editable: No | Required: No | Outlook priority mapping
- **CentronFingerprint** | Type: string | Editable: No | Required: No | Unique fingerprint
### RMA & Escalation
- **IsRMA** | Type: bool | Editable: No | Required: No | Return Merchandise Authorization
- **RMANumber** | Type: int? | Editable: No | Required: No | RMA number reference
- **IsTicketRefused** | Type: bool? | Editable: No | Required: No | Ticket refusal flag
- **EscalationLevel** | Type: int | Editable: No | Required: No | Escalation tier (0-N)
### Hierarchical Relationships
- **ParentHelpdeskI3D** | Type: int? | Editable: No | Required: No | Parent ticket reference
- **ProjectHelpdeskI3D** | Type: int? | Editable: No | Required: No | Project ticket reference
- **LatestHistoryI3D** | Type: int | Editable: No | Required: No | Most recent history entry ID
### Workflow State
- **CFlowStateI3D** | Type: int? | Editable: No | Required: No | Custom flow state ID
### Solution & Documentation
- **HelpdeskSolution** (Entity) | Type: HelpdeskSolution | Editable: No | Required: No | Solution reference
- **Documentation** | Type: string | Editable: No | Required: No | Documentation content
- **LastAction** | Type: string | Editable: No | Required: No | Description of last action
### Linking & Connections
- **ConnectionNumber** | Type: int | Editable: No (via dialog) | Required: No | Ticket connection number for grouping
- **TodoI3D** | Type: int | Editable: No | Required: No | Associated to-do ID
- **ScanDocI3D** | Type: int | Editable: No | Required: No | Scanned document reference
- **RechPosI3D** | Type: int | Editable: No | Required: No | Receipt position reference
- **LizenzKopfI3D** | Type: int | Editable: No | Required: No | License reference
- **ErrorNumber** | Type: int | Editable: No | Required: No | Error code reference
- **AssetRequest** | Type: int | Editable: No | Required: No | Asset request reference
- **Classification** | Type: int | Editable: No | Required: No | Classification code
### Branch & Organization
- **BranchI3D** | Type: int? | Editable: No | Required: No | Branch/Filiale reference
- **BranchName** | Type: string | Editable: No | Required: No | Branch display name
- **Branch** (Entity) | Type: Branch | Editable: No | Required: No | Full branch object
- **hlpdsk_GruppenI3D** | Type: int | Editable: No | Required: No | Helpdesk group reference
### Locking & Editing
- **LockUser** (Entity) | Type: Employee | Editable: No | Required: No | User editing ticket
- **LockUserName** | Type: string | Editable: No | Required: No | Name of editing user
- **WorkingOnDescriptionI3D** (Component state) | Type: int? | Editable: No | Required: No | Employee currently editing description
- **WorkingOnInternalNoteI3D** (Component state) | Type: int? | Editable: No | Required: No | Employee currently editing internal note
### Display & UI Properties
- **Matchcode** | Type: string | Editable: No | Required: No | Search code
- **Calculated** | Type: bool | Editable: No | Required: No | Whether values calculated
- **IsCalculable** | Type: bool | Editable: No | Required: No | Whether billable
- **LastAction** | Type: string | Editable: No | Required: No | Last action description
### Metadata Fields
- **ContractType** | Type: int | Editable: No | Required: No | Contract type code
- **EditorsSingleLine** | Type: string | Editable: No | Required: No | Editors as single string
- **EditorI3Ds** | Type: string | Editable: No | Required: No | Editor IDs as string
## CALCULATED & READ-ONLY FIELDS
### Automatically Calculated
- **EditStartDate** | Calculated from WorkStartDate | Special handling for year <= 1900
- **EditEndDate** | Calculated from WorkEndDate | Special handling for year <= 1900
- **ContingentValue** | Calculated from contract | Hours or currency based on contract
- **ContingentBooked** | Calculated from contract | Booked contingent amount
- **ContingentUsed** | Calculated from contract | Used contingent amount
- **ContingentReserved** | Calculated from contract | Reserved contingent amount
- **ContingentRest** | Calculated from contract | Remaining contingent
- **ContingentTakeOver** | Calculated from contract | Taken over amount
### Audit Trail
- **ChangedByI3D** (Standard column) | Type: int | Editable: No | Required: Yes | ID of last modifier
- **DeletedByI3D** (Standard column) | Type: int | Editable: No | Required: No | ID of deleting user
- **DeletedDate** (Standard column) | Type: DateTime? | Editable: No | Required: No | Soft delete timestamp
- **IsDeleted** (Standard column) | Type: bit | Editable: No | Required: Yes | Soft delete flag
## UPDATE RETURN PROPERTIES
When updating certain fields, the system returns additional computed properties:
### UpdatedPriorityProperties (returned by HelpdeskUpdatePriority)
- **PriorityI3D** | Type: int?
- **DueDate** | Type: DateTime? (auto-calculated from SLA)
### UpdatedArticleWorkItemProperties (returned by HelpdeskUpdateArticleWorkItem)
- **ArticleWorkItemI3D** | Type: int?
- **MasterDataI3D** | Type: int?
- **ContractI3D** | Type: int? (derived from article work item)
- **PriorityI3D** | Type: int? (derived from article work item)
- **DueDate** | Type: DateTime? (derived from SLA)
### UpdatedContractProperties (returned by HelpdeskUpdateContract)
- **ContractI3D** | Type: int?
- **PriorityI3D** | Type: int? (from contract SLA)
- **DueDate** | Type: DateTime? (from SLA)
- **IsSlaContract** | Type: bool
### UpdatedEditorsProperties (returned by HelpdeskUpdateEditors)
- **HelpdeskStateI3D** | Type: int? (may change based on editors)
- **EditorI3Ds** | Type: List<int>
## FIELD CATEGORIES BY EDITABILITY
### Always Editable (User can change directly)
- ShortDescription
- Description
- InternalNote
- Version
- AdditionalText2
- PlannedDurationInHours
- DueDate
- EditStartDate (WorkStartDate)
- EditEndDate (WorkEndDate)
- HelpdeskMarked
- IsOnlyInternalVisible
- ProjectNumber
- ResponsiblePersonI3D
- Editors (add/remove)
- Tags (add/remove)
- ContractId
- ArticleWorkItemI3D
- StatusI3D (via status update)
- TypeI3D (via type update)
- PriorityI3D (via priority update, may auto-adjust DueDate)
- MainCategoryI3D (via category update)
- AddressI3D (via address update)
- AdressContactI3D (via contact update)
- ConnectionNumber (via connect dialog)
- ConnectedDeviceNames (via device dialog)
### Read-Only (Cannot edit directly, derived/calculated)
- Number
- I3D
- HelpdeskStatusCaption
- HelpdeskTypeCaption
- HelpdeskPriorityCaption
- MainCategoryCaption
- SubCategory1Caption
- SubCategory2Caption
- CustomerName, CustomerStreet, CustomerZip, CustomerCity
- ContactTitle, ContactName, ContactEmail, ContactPhone, ContactFax
- CreatedDate, ChangedDate, ClosedDate, LastCommentDate, LastEmailDate
- TotalTimer, CalculableTimesInSeconds, NotCalculableTimesInSeconds, etc.
- ContractName, ContractNumber, ContractTypeCaption
- ArticleWorkItemCaption
- CreatedBy, LockUser
- HelpdeskStatusCaption, HelpdeskTypeCaption, HelpdeskPriorityCaption
- WorkingOnDescriptionI3D, WorkingOnInternalNoteI3D (realtime only)
- Contingent values (calculated from contract)
- LastAction
- IsCalculable
- HistoryCount, TimersCount, CalcuableTimersCount
- EscalationLevel
- CreatedFrom, CreatedFromObjectI3D, CreatedFromObjectKind
- IsRMA, IsTicketRefused
- Documentation
- OutlookPriority, OutlookModule
- CentronFingerprint
- EditorsSingleLine, EditorI3Ds
## REST API ENDPOINTS FOR UPDATES
All updates use the pattern: `HelpdeskUpdate{FieldName}(UpdateHelpdeskRequest<T>)`
- HelpdeskUpdateAddress(UpdateHelpdeskRequest<int>) -> AddressDTO
- HelpdeskUpdateAddressContact(UpdateHelpdeskRequest<int>) -> AddressContactDTO
- HelpdeskUpdateEditors(UpdateHelpdeskRequest<List<int>>) -> UpdatedEditorsProperties
- HelpdeskUpdateResponsiblePerson(UpdateHelpdeskRequest<int?>) -> int?
- HelpdeskUpdateShortDescription(UpdateHelpdeskRequest<string>) -> string
- HelpdeskUpdateDescription(UpdateHelpdeskRequest<string>) -> string
- HelpdeskUpdateInternalNote(UpdateHelpdeskRequest<string>) -> string
- HelpdeskUpdateHelpdeskMarked(UpdateHelpdeskRequest<bool>) -> bool
- HelpdeskUpdateIsOnlyInternalVisible(UpdateHelpdeskRequest<bool>) -> bool
- HelpdeskUpdateVersion(UpdateHelpdeskRequest<string>) -> string
- HelpdeskUpdateAdditionalText2(UpdateHelpdeskRequest<string>) -> string
- HelpdeskUpdateStatus(UpdateHelpdeskRequest<int>) -> int?
- HelpdeskUpdateType(UpdateHelpdeskRequest<int?>) -> int?
- HelpdeskUpdatePriority(UpdateHelpdeskRequest<int?>) -> UpdatedPriorityProperties
- HelpdeskUpdatePlannedDurationInHours(UpdateHelpdeskRequest<float?>) -> float?
- HelpdeskUpdateDueDate(UpdateHelpdeskRequest<DateTime?>) -> DateTime?
- HelpdeskUpdateEditStartDate(UpdateHelpdeskRequest<DateTime?>) -> DateTime?
- HelpdeskUpdateEditEndDate(UpdateHelpdeskRequest<DateTime?>) -> DateTime?
- HelpdeskUpdateCategory(UpdateHelpdeskRequest<int?>) -> int?
- HelpdeskUpdateArticleWorkItem(UpdateHelpdeskRequest<int?>) -> UpdatedArticleWorkItemProperties
- HelpdeskUpdateContract(UpdateHelpdeskRequest<int>) -> UpdatedContractProperties
- HelpdeskUpdateProjectNumber(UpdateHelpdeskRequest<string?>) -> string
## DATA TYPES REFERENCE
- **I3D** (int) - Primary Key, auto-incrementing identity
- **Enum IDs** (int?) - References to lookup tables (Status, Type, Priority, Category)
- **String** - Text fields (descriptions, names, codes)
- **DateTime?** - Date/time fields, nullable
- **float?** - Hours/decimal fields, nullable
- **bool/bit** - Flags
- **List<T>** - Collections (Editors, Tags, DeviceIds)
- **DTO objects** - Full data transfer objects with nested properties
- **Entity objects** - Full ORM entity objects with relationships
## KEY CONSTRAINTS & BUSINESS RULES
1. **Minimum Editors**: At least 1 editor required (cannot remove all)
2. **Status Validation**: Some status transitions may be restricted
3. **Priority Auto-Adjust**: Changing priority or contract may auto-adjust DueDate
4. **Category Read-Only**: Categories cannot be changed directly via UI (displayed read-only)
5. **Soft Delete**: Tickets use soft-delete pattern (IsDeleted flag)
6. **Audit Trail**: All standard columns required (CreatedBy, CreatedDate, ChangedBy, ChangedDate)
7. **Customer Lock**: CustomerI3D cannot be changed after creation
8. **Connection Grouping**: Multiple tickets can share a ConnectionNumber for grouping
## FILE LOCATIONS
- Entity: `/src/backend/Centron.Entities/Entities/CustomerArea/Support/Helpdesk.cs`
- DTO: `/src/webservice/Centron.WebServices.Core/Entities/Sales/Support/HelpdeskPreviewDTO.cs`
- UI: `/src/CentronNexus/ServiceBoard/TicketDetails/TicketDetailsPage.razor`
- Service: `/src/CentronNexus/Shared/Centron/CentronService.cs`
- BL: `/src/backend/Centron.BL/WebServices/Sales/Support/UpdateHelpdeskWebServiceBL.cs`
- Change Tracking: `/src/CentronNexus/Shared/Services/TicketUpdateService.cs`

View File

@@ -0,0 +1,150 @@
# c-entron.NET - Remaining Kapitel Modules Summary
## KAPITEL 4: PROJEKTE/PLM - 2 Main Modules
### 4.1 Machine Management (Maschinenverwaltung)
- **Path**: `src/centron/Centron.WPF.UI/Modules/Production/MachineManagement`
- **Controller**: `MaschineManagementAppModuleController`
- **ViewModel**: `MaschineManagementViewModel`
- **Module ID**: {B8ABD2AB-366A-4AAE-B33F-70A0EF1846E2}
- **Category**: Production
- **Description**: Verwaltung der Maschinen für die Produktion
- **Settings**: MachineKind, MachineLocation
### 4.2 Production Orders (Produktionsaufträge)
- **Path**: `src/centron/Centron.WPF.UI/Modules/Production/ProductionOrder`
- **Controller**: `ProductionOrderManagementAppModuleController`
- **ViewModel**: `ProductionOrderManagementViewModel`
- **Module ID**: {2CDAB59B-88C6-49DE-BB03-E11FEFF563D3}
- **Category**: Production
- **Description**: Erstellung und Verwaltung von Produktionsaufträgen
- **Sub-Modules**: AddProductionOrder, EditProductionOrder
**KAPITEL 4 TOTAL: 2 modules** (Note: QM, RMA, PLM are separate or in other chapters)
---
## KAPITEL 9: MYCENTRON - 6 Main Modules
### 9.1 Dashboard (Centron Dashboard)
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/Dashboard`
- **Controller**: `CentronDashboardAppModuleController`
- **ViewModel**: `CentronDashboardViewModel`
- **Module ID**: {95D7D9C0-0000-0000-0000-000000000001} (approx)
- **Description**: Personal Dashboard with configurable tiles and containers
- **Features**: DashboardContainer, ColorSelector, TileView
### 9.2 Calendar (Kalender)
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/Calendar`
- **Controller**: `CalenderAppController`
- **ViewModel**: CalenderViewModel
- **Description**: Appointments, meetings, sales events
### 9.3 Centron Inspectors (System Health Checks)
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/CentronInspectors`
- **Controller**: `CentronInspectorAppModuleController`
- **ViewModel**: `CentronInspectorViewModel`
- **Description**: Database integrity checks, configuration validation, data quality inspectors
- **Inspector Types**: Article, Configurations, Database, Documents, PLM, Receipts, Reports, Security, Time
### 9.4 MyDay - Editor
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/MyDay/Editor`
- **Controller**: `MyDayEditorAppModuleController`
- **ViewModel**: `MyDayEditorWrapperViewModel`
- **Description**: Time entry and work item editor
### 9.5 MyDay - Employee Overview (Mitarbeiterauslastung)
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/MyDay/EmployeeOverview`
- **Controller**: `MyDayEmployeeOverviewAppModuleController`
- **ViewModel**: `MyDayEmployeeOverviewWrapperViewModel`
- **Description**: Overview of employee work schedules and department capacity
### 9.6 MyDay - Month Review
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/MyDay/MonthReview`
- **Controller**: `MyDayMonthReviewAppModuleController`
- **ViewModel**: `MyDayMonthReviewWrapperViewModel`
- **Description**: Monthly time and work item review
### 9.7 Telephony Call Log
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/Telephony/CallLog`
- **Controller**: `TelephonyCallLogAppModuleController`
- **Description**: Call history and telephony integration
### 9.8 Todo List
- **Path**: `src/centron/Centron.WPF.UI/Modules/MyCentron/TodoList`
- **Controller**: `TodoListAppController`
- **ViewModel**: `TodoListViewModel`
- **Description**: Personal task management
**KAPITEL 9 TOTAL: 8 modules**
---
## KAPITEL 12: PASSWORD MANAGER / SECURITY - 5 Modules
### 12.1 Access Area Management (Zugangsbereicheverwaltung)
- **Path**: `src/centron/Centron.WPF.UI/Modules/PasswordManager/AccessAreaManagementAppModuleController`
- **Controller**: `AccessAreaManagementAppModuleController`
- **Module ID**: {6CF0F552-E6C8-4651-B1A1-27E03FD0B9FB}
- **Category**: PasswordManager
- **Description**: Verwaltung für die Zugangsbereiche des Passwort Managers
- **Interface**: IOnlyOpenOnceModule, ICentronAppModuleControllerWithVideoPortal
### 12.2 Access Management (Zugriffsverwaltung)
- **Path**: `src/centron/Centron.WPF.UI/Modules/PasswordManager`
- **Controller**: `AccessManagementAppModuleController`
- **Description**: User access control for password manager
### 12.3 Guideline Management (Richtlinienverwaltung)
- **Path**: `src/centron/Centron.WPF.UI/Modules/PasswordManager`
- **Controller**: `GuidelineManagementAppModuleController`
- **Description**: Password policy and guideline management
### 12.4 RDP Embedded (Remote Desktop)
- **Path**: `src/centron/Centron.WPF.UI/Modules/PasswordManager`
- **Controller**: `RDPEmbeddedAppModuleController`
- **Description**: Embedded RDP connection manager
### 12.5 SSH Embedded (Secure Shell)
- **Path**: `src/centron/Centron.WPF.UI/Modules/PasswordManager`
- **Controller**: `SSHEmbeddedAppModuleController`
- **Description**: Embedded SSH connection manager
**KAPITEL 12 TOTAL: 5 modules**
---
## KAPITEL 11 & KAPITEL 13: NOT FOUND
Based on the codebase search:
- **Kapitel 11**: No dedicated modules found with "Kapitel11" naming or separate directory
- **Kapitel 13**: No dedicated modules found with "Kapitel13" naming or separate directory
These chapters may not have dedicated module structures yet, or modules are distributed across other categories.
---
## SUMMARY TABLE
| Chapter | Name | Module Count | Categories |
|---------|------|--------------|-----------|
| 4 | Projekte/PLM | 2 | Production, QM, PLM, RMA |
| 9 | MyCentron | 8 | Dashboard, Calendar, Inspectors, MyDay, TodoList, Telephony |
| 11 | (Unknown) | 0 | - |
| 12 | Sicherheit/Passwort | 5 | PasswordManager, RDP, SSH |
| 13 | (Unknown) | 0 | - |
**Total Remaining Modules Found: 15 modules**
---
## Key Observations
1. **Production/QM**: Currently has 2 documented modules; QM appears separate or underdocumented
2. **MyCentron**: Rich feature set with 8+ modules including dashboard, personal settings, and MyDay workflows
3. **PasswordManager**: Comprehensive security module with 5 sub-modules for access control and remote connections
4. **Missing Chapters**: Kapitel 11 and 13 may be:
- Not yet implemented
- Distributed across other modules
- Legacy/renamed chapters
- Web portal only (CentronNexus/Blazor instead of WPF)

View File

@@ -0,0 +1,57 @@
# WPF Modules Analysis - Phase 1
## Key Findings:
### Administration Module - 13+ Sub-modules Found
1. CountryManagement - ICentronAppModuleController
2. DSGVO (Data Security) - CentronDataSecurityAppModuleController
3. EmployeeManagement - EmployeeManagementAppModuleController
4. HourlySurchargeRates - HourlySurchargeRatesAppModuleController
5. LogViewer - CentronLogAppModuleController
6. MailTemplates - MailTemplatesAppModuleController
7. MandatorManagement - MandatorManagementAppModuleController
8. ReceiptConditions - ReceiptConditionManagementAppModuleController
9. ReportServer - ReportServerAppModuleController
10. RightsManagement - RightsManagamentAppModuleController
11. ServiceAndLeasing - ServiceLeasingAppModuleController
12. Settings - SettingsAppModuleController
13. SqlManagers - SqlManagerAppModuleController
14. TextBlockManagement - TextBlockManagementAppModuleController
### Finances Module - 18+ Sub-modules Found (Major Category)
1. AccountManagement - AccountManagementAppModuleController
2. AutomatedBilling - AutomatedBillingAppModuleController
3. Campaigns (CRM Management)
4. ContractEvaluation2, ContractEvaluationOld
5. Contracts - ContractsAppModuleController
6. Crm - CrmAppModuleController (with sub-components)
7. DeviceClickCounter - DeviceClickCounterAppModuleController
8. Dunning - DunningOverviewAppModuleController (Mahnung)
9. FlatrateBilling - FlatRateProjectAppModuleController
10. MasterDataLists - MasterDataListAppModulController
11. Opos - OposOverviewAppModuleController
12. Payments - PaymentsAppModuleController
13. Projects - ProjectsAppModuleController
14. Receipts (Belege) - ReceiptAppModuleController (Complex)
15. TimerBilling - TimerBillingAppModuleController
### Helpdesk Module - 12+ Sub-modules Found
1. CentronChecklist
2. ConnectionNumber
3. Dashboard
4. Events
5. ExpectedEvents, ExpectedEventsReporting
6. TaskManagement
7. TicketDetails, TicketList
8. TicketProcessTemplates
### Purchasing Module
1. EDIManagement - EDIManagementController
2. OrderSuggestionList - OrderSuggestionListAppModuleController
3. TravelExpense - TravelExpenseAppModuleController
### Next Steps:
- Get ViewModels for each major module
- Map Logic interfaces (IXxxLogic)
- Extract use cases and features
- Cover remaining categories: Logistic, Warehousing, Reports, Statistics

View File

@@ -0,0 +1,588 @@
# c-entron.NET WPF Module - Vollständige Analyse
## KAPITEL 2: ADMINISTRATION
### 1. Settings (Einstellungen)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/Settings`
- **Controller**: `SettingsAppModuleController`
- **ViewModel**: `SettingsContainerViewModel`
- **Logic Interface**: `ISettingsLogic` (Settings aus ApplicationSettings Tabelle)
- **Use Cases**:
- Globale Systemeinstellungen verwalten und konfigurieren
- Anwendungsverhalten anpassen (Zeitformate, Währungen, Sprachen)
- Modul-spezifische Einstellungen central steuern
- Backup- und Wiederherstellungsparameter setzen
- Benutzer-erlebnis optimieren (UI-Themes, Layouts)
### 2. Benutzer & Mitarbeiterverwaltung
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/EmployeeManagement`
- **Controller**: `EmployeeManagementAppModuleController`
- **ViewModel**: `EmployeeSettingsViewModel`
- **Logic Interface**: `IEmployeeLogic`
- **Use Cases**:
- Mitarbeiter anlegen, bearbeiten und löschen
- Azure AD Integration für automatisches Employee Syncing
- Benutzer-Rollen und Zuständigkeiten zuweisen
- Mitarbeiter-Dashboards (Sales, Common) erstellen
- Verkäufer-Performance tracken
### 3. Rechteverwaltung
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/RightsManagement`
- **Controller**: `RightsManagamentAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `RightsManagementViewModel`
- **Logic Interface**: `IUserRightsLogic`
- **Use Cases**:
- Benutzerrechte granular vergeben (nach UserRightsConst IDs)
- Rollenbasierte Zugriffskontrolle (RBAC) konfigurieren
- Funktionszugriff blockieren/freigeben
- Modulzugriff restriktiv steuern
- Audit-Logs für Rechtsänderungen führen
### 4. Verträge (Administration)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/SepaContract`
- **Controller**: `SepaContractAppModuleController`
- **ViewModel**: `SepaContractViewModel`
- **Logic Interface**: `ISepaContractLogic`
- **Use Cases**:
- SEPA-Mandate anlegen und verwalten
- SEPA-Lastschriften konfigurieren
- Vertragsbedingungen für Zahlungen definieren
- Gläubigeridentifikation (Creditor ID) verwalten
### 5. Mandanten & Filialenverwaltung
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/MandatorManagement`
- **Controller**: `MandatorManagementAppModuleController`
- **ViewModel**: `MandatorManagementViewModel`, `BranchManagementViewModel`
- **Logic Interface**: `IMandatorLogic`, `IBranchLogic`
- **Use Cases**:
- Mehrere Mandanten verwalten (für Multi-Tenant-Setups)
- Filialen/Standorte anlegen und konfigurieren
- Nummerngruppen pro Filiale definieren
- Hierarchie von Mandanten-Filialen aufbauen
### 6. Länder & Regionalverwaltung
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/CountryManagement`
- **Controller**: `CountryManagementAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `CountryManagementViewModel`
- **Logic Interface**: `ICountryLogic`
- **Use Cases**:
- Länder und Bundesländer/Regionen verwalten
- Standardisierte Adressen-Formate pro Land
- Steuercodes und Zollklassifizierungen setzen
### 7. DSGVO / Datenschutz
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/DSGVO`
- **Controller**: `CentronDataSecurityAppModuleController`
- **ViewModel**: `CentronDataSecurityViewModel`
- **Logic Interface**: `IDataSecurityLogic`
- **Use Cases**:
- DSGVO-Compliance Settings konfigurieren
- Datenverarbeitungsverträge (AV-Verträge) verwalt
- Kundendaten-Lösch-Regeln definieren
- Datenschutz-Vorlagengenerator nutzen
### 8. Mail & Kalender
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/MailAndCalender`
- **Controller**: `MailAndCalenderAppModuleController`
- **ViewModel**: `MailAndCalenderGeneralSettingsViewModel`
- **Logic Interface**: `IMailLogic`, `ICalendarLogic`
- **Use Cases**:
- E-Mail-Server konfigurieren (SMTP/POP3)
- Kalender-Integration einrichten
- Mail-Tracking aktivieren
- Template für automatische Mails erstellen
### 9. Mail-Templates
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/MailTemplates`
- **Controller**: `MailTemplatesAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `MailTemplatesModuleViewModel`, `AiMailTemplatesViewModel`
- **Logic Interface**: `IMailTemplateLogic`
- **Use Cases**:
- E-Mail-Vorlagen für verschiedene Prozesse erstellen
- Platzhalter für dynamische Inhalte nutzen (z.B. {{Customer}}, {{Invoice}})
- AI-gestützte Template-Generierung
- Multi-Sprachen-Templates verwalten
### 10. Stundenzuschläge
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/HourlySurchargeRates`
- **Controller**: `HourlySurchargeRatesAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `HourlySurchargeRatesViewModel`
- **Logic Interface**: `IHourlySurchargeLogic`
- **Use Cases**:
- Stundensätze und Zuschläge definieren (Urlaub, Krankheit, Überstunden)
- Zuschläge an Verträge koppeln
- Zeitbasierte Abrechnungslogik konfigurieren
### 11. Report Server
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/ReportServer`
- **Controller**: `ReportServerAppModuleController`
- **ViewModel**: `ReportServerViewModel`
- **Logic Interface**: `IReportLogic`
- **Use Cases**:
- SQL Reporting Services (SSRS) konfigurieren
- Berichtspfade und Zugriff setzen
- Report-Subscriptions verwalten
### 12. Protokollierung (LogViewer)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/LogViewer`
- **Controller**: `CentronLogAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `CentronLogViewModel`
- **Logic Interface**: `ILogViewerLogic`
- **Use Cases**:
- System-Logs in Echtzeit anschauen
- Fehler und Warnungen filtern
- Performance-Daten analysieren
- Debug-Informationen während Entwicklung
### 13. Zahlungsbedingungen (Receipt Conditions)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Administration/ReceiptConditions`
- **Controller**: `ReceiptConditionManagementAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `ReceiptConditionManagementViewModel`
- **Logic Interface**: `IReceiptConditionLogic`
- **Use Cases**:
- Zahlungsbedingungen anlegen (Netto, Skonto, etc.)
- Fälligkeitsberechnung konfigurieren
- Skontoregeln definieren
- Zahlungs-reminder Settings
---
## KAPITEL 5: BUCHHALTUNG/FINANZEN
### 1. Vertragsabrechnung (AutomatedBilling)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/AutomatedBilling`
- **Controller**: `AutomatedBillingAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `AutomatedBillingViewModel`
- **Logic Interface**: `IAutomatedBillingLogic`
- **Wichtigste Commands/Properties**:
- `ShowContractTypesCommand`, `ShowCounterTypesCommand`, `ShowTerminationTypesCommand`
- `ContractKinds`, `Customers`, `Branches` (Filtermöglichkeiten)
- `BillingResults` (Abrechnung Ergebnisse)
- **Use Cases**:
- Verträge nach Kundenkind, Filiale, Zeitraum filtern
- Automatische Vertragsabrechnung durchführen
- Rechnungen massenhaft erstellen und versenden
- Counter (Zähler) mit Verträgen koppeln und abrechnen
- Abrechnungsergebnisse anschauen und korrigieren
- Versandart konfigurieren (Druck/Mail/beide)
### 2. Zahlungseingang (Payments)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/Payments`
- **Controller**: `PaymentsAppModuleController`
- **ViewModel**: `IncomingPaymentsViewModel`
- **Logic Interface**: `IPaymentLogic`
- **Use Cases**:
- Manuelle Zahlungseingänge erfassen
- Bank-CSV-Importe verarbeiten (SEPA, MT940)
- Zahlungen automatisch Rechnungen zuordnen
- Zahlungsdifferenzen handhaben
- Zahlungs-Journal ausdrucken
- Inkassoprovisionen automatisch berechnen
### 3. Mahnungswesen (Dunning)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/Dunning`
- **Controller**: `DunningOverviewAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `DunningOverviewViewModel`
- **Logic Interface**: `IDunningLogic`
- **Use Cases**:
- Mahnungsstufen automatisch eskalieren (Mahnung 1, 2, 3)
- Fällige Rechnungen identifizieren
- Mahngebühren automatisch berechnen und hinzufügen
- Mahnbriefe drucken/mailen
- Zahlungsversprechungen trackеn
- Inkasso-Prozesse starten
### 4. OPOS (Offene Posten)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/Opos`
- **Controller**: `OposOverviewAppModuleController`
- **ViewModel**: `OposOverviewViewModel`
- **Logic Interface**: `IOposLogic`, `IBookKeepingImportLogic`
- **Use Cases**:
- Offene Posten (Verbindlichkeiten & Forderungen) verwalten
- Automatischer Import von OPOS aus Buchhaltungs-Schnittstellen
- CSV-Dateien für externe Buchhaltung exportieren
- Zahlungszuordnung zu offenen Posten
- Bilanzierungsdaten vorbereiten
### 5. Rechnungen & Belege (Receipts)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/Receipts`
- **Controller**: `ReceiptAppModuleController`
- **ViewModel**: `ReceiptsListViewModel`, `ReceiptsOverviewViewModel`
- **Logic Interface**: `IReceiptLogic`
- **Wichtigste Commands**:
- `ForwardToOrder`, `ForwardToDeliveryList`, `ForwardToInvoice`, `ForwardToCreditVoucher`
- `PrintReceipts`, `MailReceipts`, `PreviewReceipts`, `ExportReceiptsAsPDF`
- `CopyReceipt`, `UnlockReceipt`, `CloseReceipts`
- `EditCustomProperties`, `ChangeUserState`
- **Use Cases**:
- Angebote → Bestellungen → Lieferscheine → Rechnungen (vollständiger Workflower)
- Belege duplizieren und an andere Kunden senden
- Steuerkorrekturen via Gutschriften
- Belege sperren/entsperren (für Bearbeitung)
- Custom Properties pro Beleg (für erweiterte Datenfelder)
- Provisionen berechnen (Provision-Schemas)
- Live-Vorschau von Beleginhalten
- Beleg-Status tracken (Benutzer-States)
### 6. Verträge (Finances - Main Module)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/Contracts`
- **Controller**: `ContractsAppModuleController`
- **ViewModel**: `ContractsViewModel`
- **Logic Interface**: `IContractLogic`
- **Use Cases**:
- Service/Support-Verträge anlegen und verwalten
- Vertrag-Typen und -Strukturen definieren
- Termination-Types (Kündigungsfristen) konfigurieren
- Counter/Zähler für Verbrauchs-Abrechnung
- Konditionale Rabatte/Zuschläge setzen
- Vertragslebenszyklus verwalten
### 7. CRM - Accounts/Adressen
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/Crm`
- **Controller**: `CrmAppModuleController`
- **ViewModel**: `CrmViewModel`
- **Logic Interface**: `IAccountLogic`
- **Sub-Modules**:
- `AccountContracts` - Vertragshistorie pro Kunde
- `AccountDeviceEdit` - Geräte-Zuordnung zu Kunden
- **Use Cases**:
- Kundendaten-Verwaltung (Name, Adresse, Kontaktpersonen)
- Kundensegmentierung (Premium, Standard, etc.)
- Mehrere Lieferadressen pro Kunde
- Kontaktpersonen-Management
- Kundenhistorie und Interaktionen tracken
- Geräte-Zuordnung zu Kunden
### 8. Kampagnen/Projekte
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/Campaigns`
- **Controller**: `CampaignAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `CampaignViewModel`
- **Logic Interface**: `ICampaignLogic`
- **Use Cases**:
- Verkaufskampagnen planen und ausführen
- Kundenzielgruppen definieren
- Marketing-Maßnahmen tracken
- ROI-Berechnung für Kampagnen
- A/B-Tests erstellen
### 9. Vertragsauswertung (ContractEvaluation)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/ContractEvaluation2`
- **Controller**: `ContractEvaluation2AppModuleController`
- **ViewModel**: `ContractEvaluationViewModel`
- **Logic Interface**: `IContractEvaluationLogic`
- **Use Cases**:
- Vertragslaufzeiten und Kündigungstermine analysieren
- Vertragsumsätze nach Typ/Kunde aggregieren
- Erneuerungs-potenziale identifizieren
- Rentabilität pro Vertrag berechnen
- Churn-Analysen durchführen
### 10. Timer-Abrechnung
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/TimerBilling`
- **Controller**: `TimerBillingAppModuleController` (IOnlyOpenOnceModule)
- **ViewModel**: `TimerBillingViewModel`
- **Logic Interface**: `ITimerBillingLogic`
- **Use Cases**:
- Zeiterfassungszeiten in Rechnungen überführen
- Stundensätze pro Mitarbeiter/Projekt nutzen
- Zeitlogeinträge validieren
- Provisionen für Zeiteingaben berechnen
### 11. Pauschalabrechnung (FlatrateBilling)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/FlatrateBilling`
- **Controller**: `FlatRateProjectAppModuleController`
- **ViewModel**: `FlatRateProjectViewModel`
- **Logic Interface**: `IFlatRateBillingLogic`
- **Use Cases**:
- Pauschale Projekte/Leistungen abrechnen
- Regelmäßige Monats-/Jahres-Pauschalen
### 12. Geräte-Zähler
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/DeviceClickCounter`
- **Controller**: `DeviceClickCounterAppModuleController`
- **ViewModel**: `DeviceClickCounterViewModel`
- **Logic Interface**: `IDeviceClickCounterLogic`
- **Use Cases**:
- Kopierer-/Drucker-Seiten zählen und abrechnen
- Click-Counter-Lesevorgänge erfassen
- Abrechnungsdaten vorbereiten
### 13. Stammdaten-Listen
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/MasterDataLists`
- **Controller**: `MasterDataListAppModulController`
- **ViewModel**: `MasterDataListViewModel`
- **Logic Interface**: `IMasterDataListLogic`
- **Use Cases**:
- Artikel-Preislisten anlegen und verwalten
- Kundenpreise vs. Standardpreise
### 14. Account Management
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Finances/AccountManagement`
- **Controller**: `AccountManagementAppModuleController`
- **ViewModel**: `ReceiptsListViewModel` (Sub-Component)
- **Logic Interface**: `IAccountLogic`
- **Use Cases**:
- Kontovorgänge filtern und anschauen
- Rechnungshistorie je Kunde
---
## KAPITEL 3: CRM / VERTRIEB
### Sales Module
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Sales`
- **Sub-Modules**:
- `Mailing` - Serien-E-Mails für Kunden
- `ProductMatrix` - Produkt-Verfügbarkeit je Kunde
- `SpecialArticleImport` - Spezial-Artikel-Import
---
## KAPITEL 6: CONTROLLING / ANALYTICS
### Statistics & Reporting
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Statistics`
- **Controller**: `StatisticAppModuleController`
- **ViewModel**: `StatisticViewModel`
- **Sub-Modules**:
- `Dashboard` - KPI-Übersicht
- `EmployeeAnalytics` - Vertriebsleistung pro Mitarbeiter
- `ManagementInfo` - Executive Dashboard
- `MspStatistics` - Managed Services Performance
- `SaleStatistics` - Verkaufs-Kennzahlen
- **Use Cases**:
- Umsatz-, Gewinn-, Marge-Analysen
- Mitarbeiter-Performance-Vergleiche
- MSP-Auslastung und -Rentabilität
- Verkaufstrichter-Analysen
- Kundenakquisitions-Kosten (CAC) berechnen
### Reports Module
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Reports`
- **Sub-Module**: `ReportManagement`
- **Use Cases**:
- Vordefinierte Reports ausführen
- Benutzer-Berichte erstellen
- Adhoc-Queries schreiben
---
## KAPITEL 8: HELPDESK / TICKETSYSTEM
### 1. Ticket-Liste (TicketList)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Helpdesk/TicketList`
- **Controller**: `TicketListAppModuleController`
- **ViewModel**: `TicketListViewModel`
- **Logic Interface**: `ITicketLogic`
- **Use Cases**:
- Tickets filtert nach Status/Priorität/Zuständiger
- Bulk-Operationen (mehrere Tickets ändern)
- Ticket-Historie und Kommentare anschauen
### 2. Ticket-Details
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Helpdesk/TicketDetails`
- **Controller**: `TicketDetailsAppModuleController`
- **ViewModel**: `TicketDetailsViewModel`
- **Logic Interface**: `ITicketLogic`
- **Use Cases**:
- Einzelnes Ticket öffnen und bearbeiten
- Attachment hinzufügen
- Zeiteinträge für Support-Zeit
- Ticket-Eskalation
- Status-Übergänge nachvollziehen
### 3. Task Management
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Helpdesk/TaskManagement`
- **Controller**: `TaskManagementAppModuleController`
- **ViewModel**: `TaskManagementViewModel`
- **Logic Interface**: `ITaskLogic`
- **Use Cases**:
- Aufgaben/Todos für Mitarbeiter erstellen
- Aufgaben-Prioritäten setzen
- Fortschritt tracken
- Abhängigkeiten definieren
### 4. Events & Expected Events
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Helpdesk/Events`
- **Controller**: `EventsAppModuleController`
- **ViewModel**: `EventsViewModel`
- **Use Cases**:
- Geplante Wartungen/Events kommunizieren
- Automation-Ereignisse tracken
- Event-Kalender mit Benachrichtigungen
### 5. Helpdesk Dashboard
- **Controller**: `TicketDashboardContainerController`
- **Use Cases**:
- Ticket-Queue-Übersicht
- SLA-Status live sehen
- Ungelöste Tickets anzeigen
### 6. Checklist Module
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Helpdesk/CentronChecklist`
- **Controller**: `CentronChecklistAppModuleController`
- **Use Cases**:
- Checklisten für standardisierte Prozesse
- Onboarding-Checklisten
- Konfigurationsvorgaben
---
## KAPITEL 7: EINKAUF / PURCHASING
### 1. EDI Management
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Purchasing/EDIManagement`
- **Controller**: `EDIManagementController`
- **ViewModel**: `EDIManagementViewModel`
- **Logic Interface**: `IEDILogic`
- **Use Cases**:
- EDI-Bestellungen (OpenTrans, EDIFACT) empfangen
- Lieferabrufe (JIT-Bestellungen)
- Wareneingangs-bestätigungen versenden
- EDI-Partner verwalten
- EDI-Fehler diagnostizieren
### 2. Bestellvorschläge (OrderSuggestions)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Purchasing/OrderSuggestionList`
- **Controller**: `OrderSuggestionListAppModuleController`
- **ViewModel**: `OrderSuggestionListViewModel`
- **Logic Interface**: `IOrderSuggestionLogic`
- **Use Cases**:
- Automatische Bestellvorschläge basierend auf Bestand/Verbrauch
- Bestellmengen-Optimierung
- Lieferanten-Vergleich
- Bestell-Historie
### 3. Reisekostenabrechnung (TravelExpense)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Purchasing/TravelExpense`
- **Controller**: `TravelExpenseAppModuleController`
- **ViewModel**: `TravelExpenseViewModel`
- **Logic Interface**: `ITravelExpenseLogic`
- **Use Cases**:
- Reisekostenbelege erfassen
- Automatische Berechnung von Tagesgeldern und Fahrtkosten
- Abrechnung mit Kostenträgern
---
## KAPITEL 10: LOGISTIK & LAGERVERWALTUNG
### Warehousing Module Übersicht
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Warehousing`
### 1. Artikel-Management (ArticleManagement)
- **Controller**: `ArticleManagementAppModuleController`
- **ViewModel**: `ArticleManagementViewModel`
- **Logic Interface**: `IArticleLogic`
- **Sub-Features**:
- `ConvertArticleAppModuleController` - Artikel-Konvertierungen (Mengeneindligkeit)
- `EditArticleAppModuleController` - Einzelnen Artikel bearbeiten
- Settings für: Serialnummern, Bestände, Preisfindung, Variablen
- **Use Cases**:
- Artikel anlegen/bearbeiten (EAN, Kurzbeschreibung, Preise)
- Lagerverwaltungseinheit (LVE) setzen
- Verfallsdatum-Tracking (Chargennummern)
- Automatische Preisfindung (EK von Lieferanten)
- Artikel-Kategorisierung und Materialgruppen
### 2. Kommissionierung (Commissioning)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Warehousing/Commissioning`
- **Controller**: `CommissioningAppModuleController`
- **ViewModel**: `CommissioningViewModel`
- **Logic Interface**: `ICommissioningLogic`
- **Use Cases**:
- Picking-Listen generieren nach Lieferscheinen
- Mehrere Positionen gleichzeitig kommissionieren
- Barcode-Scans zur Erfassung
- Quantity-Abweichungen handhaben
- Provisionen/Provisionsprozesse
### 3. Inventur (Inventory)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Warehousing/Inventory`
- **Controller**: `InventoryAppModuleController`
- **ViewModel**: `InventoryViewModel`
- **Logic Interface**: `IInventoryLogic`
- **Use Cases**:
- Zählzetttel generieren
- Barcode-gestützte Erfassung
- Differenzen zwischen IST/SOLL
- Bestands-Korrektur buchen
- Cyclus-Counting
### 4. Barcode Management
- **Controller**: `BarcodeSettingsAppModuleSettingsController`
- **Use Cases**:
- EAN/Barcodes generieren
- Barcode-Drucker konfigurieren
- Etiketten-Formate festlegen
### 5. Artikel-Import
- **Controller**: `ArticleImportAppModuleController`
- **Logic Interface**: `IArticleImportLogic`
- **Use Cases**:
- CSV/Excel Artikel-Daten importieren
- Stamm-Daten aktualisieren
### 6. Account Systems (Bestandssysteme)
- **Controller**: `AccountSystemsAppModuleController`
- **Logic Interface**: `IAccountSystemLogic`
- **Use Cases**:
- Integration zu externen WMS (SAP, tis, etc.)
- Bestand-Synchronisation
### 7. Material Group Management
- **Logic Interface**: `IMaterialGroupLogic`
- **Use Cases**:
- Artikelgruppen/Materialgruppen anlegen
- Gruppenbezogene Regeln setzen
---
## KAPITEL 4: PROJEKTE & PLM
### Production & QM
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Production`
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/QM` (Qualitätsmangement)
- **Use Cases**:
- Produktionsaufträge planen und steuern
- Qualitätssicherung und Prüfpläne
- MPI-Verwaltung
### PLM (ProductLifecycleManagement)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/PLM`
- **Sub-Module**: `Finances/Finances/ProductLifecycleManagement`
- **Use Cases**:
- Produkt-Versionen verwalten
- Zeichnungen/Dokumente hochladen
- Change-Requests tracken
### RMA (Return Merchandise Authorization)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Rma`
- **Use Cases**:
- Retouren-Anforderungen erstellen
- Fehlerhafte Teile verwalten
- Gutschriften auslösen
---
## Weitere Module:
### MyCentron (User Portal)
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/MyCentron`
- **Use Cases**: Persönliche Ansichten und Dashboard
### Calendar
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/Calendar`
- **Use Cases**: Termine, Meetings, Verkaufs-Events
### OnlineBanking
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/OnlineBanking`
- **Use Cases**: Bank-Konten-Verwaltung, Transaktions-Abruf
### DataExchange
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/DataExchange`
- **Use Cases**: EDI, Import/Export, API-Integration
### ArtificialIntelligence
- **Pfad**: `src/centron/Centron.WPF.UI/Modules/ArtificialIntelligence`
- **Use Cases**: AI-Vorhersagen, automatische Klassifizierung

View File

@@ -0,0 +1,642 @@
# c-entron.NET WPF GUI - Architecture & Reuse Patterns
## CRITICAL VIEWMODEL REUSE PATTERNS
### TIER 1: EXTREME REUSE (8+ Contexts)
#### TicketListViewModel [MOST REUSED]
**Reuse Locations**:
1. Helpdesk.TicketList.TicketListView (PRIMARY)
- Path: `Modules/Helpdesk/TicketList/TicketListView.xaml`
- Full ticket management interface with all filters
2. Helpdesk.TicketList.TicketListWithDialogView
- Path: `Modules/Helpdesk/TicketList/TicketListWithDialogView.xaml`
- Dialog wrapper for ticket selection
3. Helpdesk.TicketList.TicketListWithRibbonView
- Path: `Modules/Helpdesk/TicketList/TicketListWithRibbonView.xaml`
- Variant with ribbon toolbar
4. Finances.AccountManagement.AccountManagementView [NESTED TAB]
- Path: `Modules/Finances/AccountManagement/AccountManagementView.xaml`
- Embedded as "Tickets" tab in customer account view
- Shows all tickets related to selected customer
5. Sales.CampaignAnalysis
- Used to display customer activity/ticket history within campaign context
6. Warehousing.Commissioning
- References tickets for commissioning order tracking
7. Dashboard.HelpdeskDashboardContainerView
- Statistics aggregation of tickets
8. Reports Module
- Ticket analytics and reporting views
9. MyCentron Module
- Personal task list (filtered ticket view)
10. Multiple Dialog Contexts
- HelpdeskConnectionNumberSelectionView
- Ticket preview dialogs
- Batch operations dialogs
**Key Design Pattern**: Context-aware filtering
- When instantiated in AccountManagement: Shows only tickets for selected customer
- When instantiated in Helpdesk: Shows all accessible tickets
- When instantiated in Reports: Shows filtered/aggregated ticket data
- Same ViewModel, different visual contexts and filter presets
**Initialization Pattern**:
```csharp
// In AccountManagementViewModel constructor:
this.TicketListViewModel = new TicketListViewModel();
// Then bound in XAML: <ticketList1:TicketListView DataContext="{Binding TicketListViewModel}" />
```
---
### TIER 2: HIGH REUSE (4-7 Contexts)
#### ReceiptsOverviewViewModel
**Reuse Locations**:
1. Finances.AccountManagement (PRIMARY)
- Shows all receipts for selected customer
2. Finances.Receipts.ReceiptsModule
- Standalone receipt management view
3. Finances.Invoicing
- Invoice-specific receipt view
4. CRM.CustomerDetail
- Customer transaction history tab
5. Reports.TransactionReports
- Receipt analytics
**Pattern**: Same grid-based display, different filter contexts
---
#### AccountSalesStatisticViewModel
**Reuse Locations**:
1. Finances.AccountManagement.Dashboard (PRIMARY)
- Main statistics view with ChartControl
2. MyCentron.Dashboard
- Personal sales metrics
3. Sales.Dashboard
- Department sales metrics
4. Reports.AccountAnalysis
- Detailed account analysis
---
#### Dashboard Container ViewModels (7 variations)
**Pattern**: Each specialized for single metric
1. HelpdeskDashboardContainerViewModel → Overall helpdesk KPIs
2. TicketStatusDashboardContainerViewModel → Status distribution
3. TicketPriorityDashboardContainerViewModel → Priority breakdown
4. TicketTypeDashboardContainerViewModel → Type distribution
5. TicketDueDateDashboardContainerViewModel → Due date analysis
6. TicketDatesDashboardContainerViewModel → Date range analysis
7. TicketRecordedTimeContainerViewModel → Time tracking metrics
**Reuse**: All 7 appear in multiple dashboard views throughout system
---
### TIER 3: MODERATE REUSE (2-3 Contexts)
#### AccountManagementViewModel
**Reuse Locations**:
1. Finances.AccountManagement (PRIMARY)
- Main account/customer management view
2. CRM.AccountDetails
- Detailed account information panels
3. Sales.OrderEntry
- Customer selection and account validation
---
#### AuthenticationSettingsViewModel
**Reuse Locations**:
1. Administration.Connections (PRIMARY)
2. Administration.Settings
- General authentication settings
---
### TIER 4: SINGLE-PURPOSE (1 Context Only)
#### Single-Use ViewModels
- CountryManagementViewModel (Administration.CountryManagement)
- ProductionOrderManagementViewModel (Production.ProductionOrder)
- ArticleManagementViewModel (primarily Warehousing, minimal dialog reuse)
- RightsManagementViewModel (Administration.RightsManagement)
- MailTemplatesModuleViewModel (Administration.MailTemplates)
- And many others...
**Percentage**: ~70% of ViewModels are single-purpose, ~30% are reused
---
## NESTED VIEWMODEL PATTERN
### AccountManagementViewModel Structure (5-level nesting)
```
AccountManagementViewModel (root - ViewModelBase)
├── ReceiptsOverviewViewModel (nested - INotifyPropertyChanged)
│ ├── ReceiptItemViewModel
│ └── ReceiptFilterViewModel
├── TicketListViewModel (REUSED - IViewModelWithLoading)
│ ├── HelpdeskListItemViewModel (collection items)
│ └── TicketListUISettingsViewModel
├── AccountSalesStatisticViewModel (nested - ViewModelBase)
│ ├── ChartDataViewModel
│ └── StatisticSeriesViewModel
├── BranchBookKeepingNumbersViewModel (nested)
│ └── BranchViewModel (collection items)
└── OrderProcessingContractViewModel (nested - per contract)
└── ContractStatusViewModel
```
**Pattern Benefits**:
- Each nested ViewModel manages its own state
- Parent coordinates overall view layout
- Tab switching shows/hides child ViewModel content
- Simplifies testing (isolate ViewModel hierarchy)
**Parent Property Pattern**:
```csharp
private TicketListViewModel _ticketListViewModel;
public TicketListViewModel TicketListViewModel
{
get { return this._ticketListViewModel; }
set { this.SetProperty(ref this._ticketListViewModel, value, () => this.TicketListViewModel); }
}
```
---
## MASTER-DETAIL LAYOUT PATTERN (Standard Across 80% of Views)
### Typical Structure:
```xaml
<LayoutControl Orientation="Horizontal">
<!-- LEFT PANEL: Fixed Width ~250-300px -->
<LayoutItem Width="250" AllowHorizontalSizing="True">
<GridControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
<!-- Master list: Countries, Customers, Tickets, Articles, etc. -->
</GridControl>
</LayoutItem>
<!-- RIGHT PANEL: Flex Width -->
<LayoutGroup Width="*" Orientation="Vertical">
<!-- Detail form with input controls -->
<TextEdit Value="{Binding SelectedItem.Name}" />
<ComboBox ItemsSource="{Binding Categories}" SelectedItem="{Binding SelectedCategory}" />
<!-- More details... -->
</LayoutGroup>
</LayoutControl>
```
### Usage Throughout:
- Administration.CountryManagement: Countries list (left) + Country properties (right)
- Finances.AccountManagement: Customers list (left) + Tabs (right)
- Helpdesk.TicketList: Tickets list (left) + Filters above (top)
- Warehousing.ArticleManagement: Articles list (left) + Article details (right)
- Production.ProductionOrder: Orders list (left) + Order details (right)
---
## RIBBON COMMAND PATTERN (150+ Views)
### Standard Ribbon Structure:
```xaml
<RibbonControl x:Name="RibbonControl">
<RibbonDefaultPageCategory>
<RibbonPage>
<!-- GROUP 1: Data operations (Save, Print, Export) -->
<RibbonPageGroup Caption="Daten">
<BarButtonItem Command="{Binding SaveCommand}"
Content="Speichern"
Glyph="16x16/Save.png"
LargeGlyph="32x32/Save.png"
KeyGesture="Ctrl+S" />
<BarButtonItem Command="{Binding PrintCommand}" Content="Drucken" />
<BarButtonItem Command="{Binding ExportCommand}" Content="Exportieren" />
</RibbonPageGroup>
<!-- GROUP 2: Entity operations (New, Delete) -->
<RibbonPageGroup Caption="Land">
<BarButtonItem Command="{Binding NewCountryCommand}" Content="Neu" RibbonStyle="Large" />
<BarButtonItem Command="{Binding DeactivateCountryCommand}" Content="Deaktivieren" />
</RibbonPageGroup>
<!-- GROUP 3: Special operations -->
<RibbonPageGroup Caption="Sonder">
<BarButtonItem Command="{Binding SpecialCommand}" Content="Besondere Aktion" />
</RibbonPageGroup>
</RibbonPage>
</RibbonDefaultPageCategory>
</RibbonControl>
```
### Command Mapping:
- Save: UpdateCommand (Ctrl+S hotkey)
- New: CreateCommand with ItemType parameter
- Delete/Deactivate: SoftDeleteCommand (IsDeleted flag, not actual delete)
- Print: PrintCommand (uses DevExpress PrintTool)
- Export: ExportCommand (Excel, CSV, PDF)
- Special: Custom business logic commands
---
## OBSERVABLE COLLECTION PATTERN
### Standard Implementation:
```csharp
using CentronObservableCollection; // Custom collection type
private CentronObservableCollection<CountryViewModel> _countries;
public CentronObservableCollection<CountryViewModel> Countries
{
get => this._countries;
set => this.SetProperty(ref this._countries, value, nameof(this._countries));
}
// In constructor:
public CountryManagementViewModel()
{
this.Countries = new CentronObservableCollection<CountryViewModel>();
_ = this.GetCountries(); // Async load
}
public async Task GetCountries()
{
var result = await ClassContainer.Instance
.WithInstance((ICountryLogic logic) => logic.GetActiveCountries());
if (result.IsSuccess)
{
this.Countries = new CentronObservableCollection<CountryViewModel>(
result.Data.Select(c => new CountryViewModel(c))
);
}
}
```
### Variants:
- **CentronObservableCollection<T>**: Custom type with built-in change notifications
- **ObservableCollection<T>**: WPF standard (used for smaller collections)
- **IList<T>**: For internal caching without UI binding
---
## COMMAND IMPLEMENTATION PATTERNS
### DelegateCommand (Synchronous)
```csharp
public DelegateCommand NewCountryCommand { get; }
public CountryManagementViewModel()
{
this.NewCountryCommand = new DelegateCommand(
execute: this.AddNewCountry,
canExecute: () => !this.IsLoading
);
}
private void AddNewCountry()
{
var newCountry = new CountryViewModel();
this.Countries.Add(newCountry);
this.SelectedCountry = newCountry;
}
```
### AsyncCommand (Asynchronous)
```csharp
public AsyncCommand UpdateCountryCommand { get; }
public AsyncCommand<int> DeleteCountryCommand { get; }
public CountryManagementViewModel()
{
this.UpdateCountryCommand = new AsyncCommand(
execute: this.UpdateCountry,
canExecute: () => this.SelectedCountry != null && !this.IsLoading
);
this.DeleteCountryCommand = new AsyncCommand<int>(
execute: (countryId) => this.DeleteCountry(countryId),
canExecute: (countryId) => !this.IsLoading
);
}
private async Task UpdateCountry()
{
try
{
this.IsLoading = true;
var result = await ClassContainer.Instance
.WithInstance((ICountryLogic logic) => logic.UpdateCountry(this.SelectedCountry));
if (result.IsSuccess)
{
// Refresh list
await this.GetCountries();
}
}
finally
{
this.IsLoading = false;
}
}
```
---
## FILTER PATTERN (Most List Views)
### Filter Section Structure:
```xaml
<LayoutGroup x:Name="FilterLayoutGroup" IsCollapsible="True" Visibility="{Binding UISettings.ShowFilter}">
<!-- Header with icons and clear button -->
<LayoutGroup.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{StaticResource FilterIcon}" />
<TextBlock Text="Filter" />
<Button Command="{Binding ClearFiltersCommand}" />
</StackPanel>
</DataTemplate>
</LayoutGroup.HeaderTemplate>
<!-- Filter controls -->
<LayoutItem Label="Suchtext">
<ButtonEdit EditValue="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" />
</LayoutItem>
<LayoutItem Label="Kategorie">
<ComboBox ItemsSource="{Binding Categories}" SelectedItem="{Binding SelectedCategory}" />
</LayoutItem>
<LayoutItem Label="Erstellungsdatum von">
<DateEdit SelectedDate="{Binding CreatedDateStart}" />
</LayoutItem>
<LayoutItem Label="Erstellungsdatum bis">
<DateEdit SelectedDate="{Binding CreatedDateEnd}" />
</LayoutItem>
<LayoutItem Label="Status">
<ComboBox ItemsSource="{Binding Statuses}" SelectedItem="{Binding SelectedStatus}" />
</LayoutItem>
<!-- Add more filter fields... -->
</LayoutGroup>
```
### ViewModel Support:
```csharp
private string _searchText;
private DateTime? _createdDateStart;
private DateTime? _createdDateEnd;
private CategoryDTO _selectedCategory;
private ObservableCollection<CategoryDTO> _categories;
public string SearchText
{
get => this._searchText;
set
{
if (this.SetProperty(ref this._searchText, value, nameof(this.SearchText)))
{
this.RefreshList(); // Auto-filter on text change
}
}
}
public DelegateCommand ClearFiltersCommand { get; }
public ViewModel()
{
this.ClearFiltersCommand = new DelegateCommand(() =>
{
this.SearchText = string.Empty;
this.CreatedDateStart = null;
this.CreatedDateEnd = null;
this.SelectedCategory = null;
this.RefreshList();
});
}
```
---
## WIZARD PATTERN (Multi-Page Workflows)
### Automated Billing Wizard Example:
```xaml
<TabControl SelectedIndex="{Binding CurrentPageIndex}">
<!-- PAGE 1: Customer Selection -->
<TabItem Header="Kunden">
<local:CustomerSelectionWizardPageView />
</TabItem>
<!-- PAGE 2: Contract Selection -->
<TabItem Header="Verträge">
<local:ContractSelectionWizardPageView />
</TabItem>
<!-- PAGE 3: Billing Date -->
<TabItem Header="Abrechnungszeitraum">
<local:BillingDateWizardPageView />
</TabItem>
<!-- PAGE 4: Send Settings -->
<TabItem Header="Versendeinstellungen">
<local:SendSettingsWizardPageView />
</TabItem>
<!-- PAGE 5: Overview -->
<TabItem Header="Übersicht">
<local:OverviewWizardPageView />
</TabItem>
<!-- PAGE 6: Results -->
<TabItem Header="Ergebnisse">
<local:BillingResultWizardPageView />
</TabItem>
</TabControl>
<StackPanel Orientation="Horizontal">
<Button Command="{Binding PreviousPageCommand}" Content="Zurück" />
<Button Command="{Binding NextPageCommand}" Content="Weiter" />
<Button Command="{Binding FinishCommand}" Content="Beenden" />
<Button Command="{Binding CancelCommand}" Content="Abbrechen" />
</StackPanel>
```
### ViewModel Navigation:
```csharp
private int _currentPageIndex = 0;
public int CurrentPageIndex
{
get => this._currentPageIndex;
set => this.SetProperty(ref this._currentPageIndex, value);
}
public DelegateCommand NextPageCommand { get; }
public DelegateCommand PreviousPageCommand { get; }
public AsyncCommand FinishCommand { get; }
public ViewModel()
{
this.NextPageCommand = new DelegateCommand(
() => { if (this.CanProceedToNextPage()) this.CurrentPageIndex++; },
() => this.CurrentPageIndex < 5 && this.CanProceedToNextPage()
);
this.PreviousPageCommand = new DelegateCommand(
() => this.CurrentPageIndex--,
() => this.CurrentPageIndex > 0
);
this.FinishCommand = new AsyncCommand(
this.ProcessWizard,
() => this.CurrentPageIndex == 5
);
}
private bool CanProceedToNextPage()
{
return this.CurrentPageIndex switch
{
0 => this.SelectedCustomers.Any(),
1 => this.SelectedContracts.Any(),
2 => this.BillingStartDate.HasValue && this.BillingEndDate.HasValue,
_ => true
};
}
```
---
## CONVERTERS & VALUE TRANSFORMATION
### Common Converter Pattern:
```csharp
[ValueConversion(typeof(bool), typeof(Visibility))]
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (Visibility)value == Visibility.Visible;
}
}
// Usage in XAML:
<TextBlock Visibility="{Binding IsLoading, Converter={StaticResource BoolToVisibilityConverter}}" />
```
### Complex Converter Example (Color String to Brush):
```csharp
public class ColorStringToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string colorString)
{
return new SolidColorBrush((Color)ColorConverter.ConvertFromString(colorString));
}
return Brushes.Black;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
// Status color mapping:
// "Red" → High priority ticket
// "Yellow" → Medium priority
// "Green" → Low priority
// "Orange" → Default value flag
```
---
## VIEWMODEL INHERITANCE HIERARCHY
### Base Classes:
1. **BindableBase** (from Centron.Core.Mvvm)
- Implements INotifyPropertyChanged
- Provides SetProperty() method
- Used for simple data ViewModels (CountryViewModel, FederalStateViewModel)
2. **ViewModelBase** (from DevExpress.Mvvm)
- Extends BindableBase
- Adds command support
- Used for primary module ViewModels (CountryManagementViewModel, AccountManagementViewModel)
3. **ICentronApplication** (interface)
- Implemented by main App class
- Provides application-level services
### Mixin Interfaces:
- **IViewModelWithLoading**: Adds IsLoading property, progress tracking
- **IDeferredLoadingCrmPart**: Deferred loading for CRM-related data
- **IViewModelWithCustomProperties**: Custom property support
- **IDisposable**: Resource cleanup (especially for nested ViewModels)
---
## METRICS & STATISTICS
| Metric | Value |
|--------|-------|
| Total XAML Views | 951 |
| Total Modules | 30 |
| Total Submodules | 180+ |
| Reused ViewModels | ~30 (10% of total) |
| Single-Purpose ViewModels | ~270 (90% of total) |
| GridControl instances | ~500 |
| Ribbon implementations | ~150 |
| Tab controls | ~80 |
| Custom converters | ~50+ |
| DevExpress dependency | 24.2.7 |
| Command types used | DelegateCommand, AsyncCommand |
| Collection types | CentronObservableCollection, ObservableCollection |
| Filter dimensions (avg per list) | 5-10 |
---
## BEST PRACTICES OBSERVED
1. **Master-Detail Pattern**: 80% of data entry views
2. **Command-Based Actions**: No code-behind for business logic
3. **Observable Collections**: All mutable data sources
4. **Soft Deletes**: IsDeleted flag, never hard delete
5. **Async Operations**: All I/O operations async (prevents UI freezing)
6. **Filter Collapsibility**: Space-saving filters
7. **Multi-language Support**: All strings via LocalizedStrings
8. **Permission Checks**: Conditional command availability based on user rights
9. **Nested ViewModels**: Complex screens composed of simpler ViewModels
10. **Status Color Coding**: Visual indicators for state/priority

View File

@@ -0,0 +1,344 @@
# c-entron.NET WPF GUI - Detailed Control Breakdown by Module
## CONTROL USAGE PATTERNS BY MODULE
### ADMINISTRATION MODULE - Control Inventory
**CountryManagement**
- XAML Path: `src/centron/Centron.WPF.UI/Modules/Administration/CountryManagement/CountryManagementView.xaml`
- ViewModel: `CountryManagementViewModel` (BindableBase)
- Direct Controls:
- RibbonControl (dxr namespace)
- RibbonPageGroup "Daten": BarButtonItem SaveButton → UpdateCountryCommand
- RibbonPageGroup "Land": BarButtonItem NewButton → NewCountryCommand, BarButtonItem DeactivateButton → DeactivateCountryCommand
- RibbonPageGroup "Bundesland": BarButtonItem NewButton → NewFederalStateCommand, BarButtonItem DeactivateButton → DeactivateFederalStateCommand
- RibbonPageGroup "Währungskurs": BarButtonItem UpdateCurrencyButton → LatestCurrencyCommand
- GridControl (dxg namespace)
- ItemsSource: Countries (CentronObservableCollection)
- SelectedItem: SelectedCountry (CountryViewModel)
- Columns: CountryName (HeaderToolTip: "Zeigt die Länder an")
- TableView: SearchPanelHorizontalAlignment=Stretch, ShowSearchPanelMode=Always
- FormatCondition: IsDefault field highlighted in Orange
- TextEdit (dxe namespace)
- Label="Land", BorderBrush="Orange", EditValue={Binding SelectedCountry.CountryName}, MaxLength="255"
- Label="Land kurz", EditValue={Binding SelectedCountry.ShortSign}, MaxLength="3"
- Label="Vorwahl", EditValue={Binding SelectedCountry.DialingCode}, MaxLength="16"
- CheckEdit (dxe namespace)
- Content="Standard", EditValue={Binding SelectedCountry.IsDefault}
- Content="In der Sprachauswahl verfügbar", EditValue={Binding SelectedCountry.AvailableInInvestmentModule}
- LayoutControl (dxcl namespace) - responsive container
- LayoutItem, LayoutGroup - form section grouping
- ViewModel Commands (ICommand implementations):
- NewCountryCommand: DelegateCommand → AddNewCountry() method
- UpdateCountryCommand: AsyncCommand → UpdateCountry() async method
- NewFederalStateCommand: DelegateCommand → AddNewFederalState() method
- SelectFlagCommand: DelegateCommand(canExecute: CanSelectFlag) → SelectFlag() method
- RemoveFlagCommand: AsyncCommand(canExecute: CanRemoveFlag) → RemoveFlag() async method
- DeactivateCountryCommand: AsyncCommand(canExecute: CanDeactivateCountry) → DeactivateCountry() async method
- DeactivateFederalStateCommand: AsyncCommand → DeactivateFederalState() async method
- LatestCurrencyCommand: AsyncCommand → GetLatestCurrency() async method
- IsSetToDefaultCountryCommand: DelegateCommand → SetAsDefault() method
- OpenIsoWikiCommand: DelegateCommand → OpenIsoWiki() method (ProcessHelper.Start)
- ViewModel Bindable Properties (INotifyPropertyChanged):
- Countries: CentronObservableCollection<CountryViewModel> - collection of all active countries
- SelectedCountry: CountryViewModel - currently selected country for editing
- SelectedFederalState: FederalStateViewModel - currently selected federal state
---
### FINANCES MODULE - Control Inventory
**AccountManagement (REUSE HOTSPOT)**
- XAML Path: `src/centron/Centron.WPF.UI/Modules/Finances/AccountManagement/AccountManagementView.xaml`
- ViewModel: `AccountManagementViewModel` (ViewModelBase, IDisposable)
- Reuse Contexts: 8+ (Finance primary, Dialogs, CRM panels, Reports, Dashboards)
- Direct Controls:
- LayoutControl (dxcl namespace) - main responsive container
- ButtonEdit (dxe namespace)
- AllowDefaultButton="False", KeyDown handler, NullText="Suche"
- Text={Binding SearchText, UpdateSourceTrigger=PropertyChanged}
- ButtonInfo: Command={Binding SearchCommand}, GlyphKind=Search
- ButtonInfo: Command={Binding ClearSearchCommand}, GlyphKind=Cancel
- GridControl (dxg namespace)
- ItemsSource={Binding Customers} (ObservableCollection<AccountSearchItemDTO>)
- SelectedItem={Binding SelectedCustomer}
- Multiple columns for customer data (ID, Name, Address, Contact)
- LayoutGroup (dxcl namespace)
- Header="Kontakte", View="GroupBox"
- Orientation="Horizontal"
- Width="250" (left panel fixed width, collapsible via AllowHorizontalSizing=True)
- TabControl (nested ViewModels as tab content)
- Tab 1: ReceiptsOverviewViewModel (shows ReceiptsOverviewView)
- Tab 2: TicketListViewModel (REUSED - full ticket list functionality)
- Tab 3: AccountSalesStatisticViewModel (shows AccountSalesStatisticView with ChartControl)
- Tab 4: BranchBookKeepingNumbersViewModel (branch-specific accounting)
- Image controls
- OrderProcessingContractStateToBitmapConverter: Displays DSGVO contract status
- SepaContractToImageConverter: Displays SEPA contract status
- CheckEdit (hidden)
- Visibility="Collapsed", Content="Layout bearbeiten"
- ViewModel Commands:
- SearchCommand: DelegateCommand → Search(searchText) method
- ClearSearchCommand: DelegateCommand → ClearSearch() method
- ViewModel Bindable Properties:
- SearchText: string - customer search input
- Customers: ObservableCollection<AccountSearchItemDTO> - search results
- SelectedCustomer: AccountSearchItemDTO - currently selected customer
- ReceiptsOverviewViewModel: ReceiptsOverviewViewModel - nested view model
- TicketListViewModel: TicketListViewModel - nested view model (REUSED)
- AccountSalesStatisticViewModel: AccountSalesStatisticViewModel - nested view model
- BranchBookKeepingNumbersViewModel: BranchBookKeepingNumbersViewModel - nested view model
- OrderProcessingContracts: ObservableCollection<AccountOrderProcessingContractDTO> - DSGVO contracts
- SepaContracts: ObservableCollection<SepaContractDTO> - SEPA contracts
- HasCrmDetailStatisticRights: bool - permission flag
---
### HELPDESK MODULE - Control Inventory
**TicketList (CRITICAL REUSE HOTSPOT - 8+ contexts)**
- XAML Path: `src/centron/Centron.WPF.UI/Modules/Helpdesk/TicketList/TicketListView.xaml`
- ViewModel: `TicketListViewModel : ViewModelBase, IViewModelWithLoading, IDeferredLoadingCrmPart, IViewModelWithCustomProperties`
- Reuse Contexts:
1. Helpdesk.TicketList.TicketListView (primary module view)
2. Helpdesk.TicketList.TicketListWithDialogView (dialog wrapper)
3. Helpdesk.TicketList.TicketListWithRibbonView (ribbon variant)
4. Finances.AccountManagement.AccountManagementView (embedded as tab for account tickets)
5. Sales.CampaignAnalysis (customer campaign activity)
6. Warehousing.Commissioning (item tracking references)
7. Dashboard containers (HelpdeskDashboardContainerView references)
8. Reports module (ticket analytics views)
9. MyCentron module (personal task lists)
10. Multiple dialog contexts (ConnectionNumber selection, etc.)
- Direct Controls:
- LayoutControl (dxcl namespace) - main container
- Padding="2", IsEnabled={Binding IsLoading, Converter={StaticResource BooleanNegationConverter}}
- Orientation="Vertical"
- LayoutGroup "FilterLayoutGroup" (dxcl namespace) - FILTER SECTION
- VerticalAlignment="Top", Header property bound to view model
- IsCollapsible="True", Visibility={Binding UISettings.ShowFilter, Converter={StaticResource BooleanToVisibilityConverter}}
- View="GroupBox", Orientation="Vertical"
- LayoutManagerRegisterControlBehavior (custom behavior)
- HeaderTemplate with Image (filter icon), TextBlock, ClearFiltersButton
- Filter Controls inside LayoutGroup:
- ButtonEdit: EditValue={Binding SearchText, UpdateSourceTrigger=PropertyChanged}
- NullText={x:Static properties:LocalizedStrings.TicketListView_Suche}
- DateEdit: SelectedDate={Binding CreatedDateStart}
- DateEdit: SelectedDate={Binding CreatedDateEnd}
- DateEdit: SelectedDate={Binding DueDateStart}
- DateEdit: SelectedDate={Binding DueDateEnd}
- ComboBox: ItemsSource={Binding Status}, SelectedItem={Binding SelectedStatus}
- ComboBox: ItemsSource={Binding MainCategories}, SelectedItem={Binding SelectedMainCategory}
- ComboBox: ItemsSource={Binding SubCategories1}, SelectedItem={Binding SelectedSubCategory1}
- ComboBox: ItemsSource={Binding SubCategories2}, SelectedItem={Binding SelectedSubCategory2}
- ComboBox: ItemsSource={Binding Branches}, SelectedItem={Binding SelectedBranch}
- ComboBox: ItemsSource={Binding ConnectionNumberGroups}, SelectedItem={Binding SelectedConnectionNumberGroup}
- CheckEdit: IsChecked={Binding ShowClosed}
- TextEdit: EditValue={Binding SearchNumber}
- GridControl (dxg namespace) - MAIN DATA GRID
- AutoGenerateColumns="None"
- ItemsSource={Binding Helpdesks} (CentronObservableCollection<HelpdeskListItemViewModel>)
- SelectedItem={Binding SelectedHelpdesk}
- SelectionMode="MultipleRow" (allows multi-select)
- Multiple GridColumn definitions with Binding to ticket properties
- GridControl.View: TableView with:
- AllowColumnFiltering, AllowGrouping, AllowMoveColumnToDropArea properties
- SearchPanelHorizontalAlignment="Stretch"
- ShowFilterPanelMode="Never"
- ShowGroupPanel="False"
- ShowIndicator="False"
- ShowSearchPanelMode="Always"
- FormatCondition for status-based color coding
- ContextMenu: Interaction.Behaviors with context menu handlers
- ContextMenu Actions:
- Open ticket
- Forward ticket
- Close ticket
- Create RMA (Return Merchandise Authorization)
- Export ticket data
- Converter Resources (in UserControl.Resources):
- dxmvvm:BooleanNegationConverter
- HelpdeskCustomerToAdressStringConverter (custom)
- HelpdeskHeaderConverter (custom)
- TicketListModeToImageConverter (custom)
- NullToBooleanConverter (custom)
- dxmvvm:BooleanToVisibilityConverter
- SecondsToTimeSpanConverter (HideSeconds="True", ReturnNullIfZero="True")
- HoursToTimeSpanConverter (HideSeconds="True", ReturnNullIfZero="True")
- ColorStringToBrushConverter (custom)
- NullOrEmptyToFalseConverter (custom)
- OrderProcessingContractStateToToolTipConverter (custom)
- OrderProcessingContractStateToBitmapConverter (custom)
- ViewModel Commands:
- ClearFiltersCommand: DelegateCommand → ClearAllFilters() method
- (Additional navigation commands inherited from ViewModelBase)
- ViewModel Bindable Properties (Filter State):
- SearchText: string - full text search
- SearchNumber: string - ticket number search
- SelectedMainCategory: HelpdeskCategoryDTO - primary category filter
- SelectedSubCategory1: HelpdeskCategoryDTO - sub-category 1 filter
- SelectedSubCategory2: HelpdeskCategoryDTO - sub-category 2 filter
- MainCategories: ObservableCollection<HelpdeskCategoryDTO> - available main categories
- SubCategories1: ObservableCollection<HelpdeskCategoryDTO> - available sub-categories 1
- SubCategories2: ObservableCollection<HelpdeskCategoryDTO> - available sub-categories 2
- SelectedBranch: BranchPreviewDTO - branch filter
- Branches: CentronObservableCollection<BranchPreviewDTO> - available branches
- SelectedStatus: HelpdeskStatusDTO - status filter
- Status: ObservableCollection<HelpdeskStatusDTO> - available statuses
- CreatedDateStart: DateTime? - created date range start
- CreatedDateEnd: DateTime? - created date range end
- DueDateStart: DateTime? - due date range start
- DueDateEnd: DateTime? - due date range end
- ShowClosed: bool - show/hide closed tickets
- SelectedConnectionNumberGroup: HelpdeskConnectionNumberGroupDTO - connection filter
- ConnectionNumberGroups: CentronObservableCollection<HelpdeskConnectionNumberGroupDTO> - available groups
- AllConnectionNumberGroups: IList<HelpdeskConnectionNumberGroupDTO> - internal cache
- ViewModel Bindable Properties (Data):
- Helpdesks: CentronObservableCollection<HelpdeskListItemViewModel> - main data source
- SelectedHelpdesk: HelpdeskListItemViewModel - single selection
- SelectedHelpdesks: CentronObservableCollection<HelpdeskListItemViewModel> - multi-select
- SelectedAccounts: ObservableCollection<AccountSearchItemDTO> - account filter
- CurrentMode: TicketListTicketMode - display mode enum
- HasHelpdeskRight: bool - permission check
- UISettings: TicketListUISettingsViewModel - UI customization settings
- IsLoading: bool - loading state indicator
- AdditionalText2Caption: string - dynamic caption
- VersionCaption: string - version info display
---
## WAREHOUSING MODULE - Control Inventory
**ArticleManagement**
- XAML Path: `src/centron/Centron.WPF.UI/Modules/Warehousing/ArticleManagement/ArticleManagementView.xaml`
- Direct Controls:
- GridControl: Article master list (ItemsSource: Articles, SelectedItem: SelectedArticle)
- Columns: ArticleNumber, Description, Category, StockLevel, EAN, SupplierNumber
- TextEdit: Article properties (Number, Description)
- ComboBox: ArticleType, MaterialGroup selection
- SpinEdit: StockQuantity, MinimumStock
- Button: Save, Delete, Import, Export
**ArticleImport**
- Pattern: Multi-step wizard
- Controls: Button (file select), GridControl (preview), ComboBox (field mapping), ProgressBar, Button (Import/Cancel)
**Commissioning**
- Controls: GridControl (picking list), SpinEdit (picked quantity), TextEdit (serial number), BarCode reader input, Button (Pick/Confirm)
---
## PURCHASING MODULE - Control Inventory
**OrderSuggestion**
- Controls: GridControl (suggestions), ComboBox (supplier selection), SpinEdit (order quantity), Button (create PO)
- Columns: Article, CurrentStock, SuggestedQuantity, SuggestedSupplier, Price
**EDI Management**
- Pattern: Tab-based transaction management
- Controls:
- TabControl with multiple tabs:
- EDI Receipt types
- EDI Invoices
- EDI Delivery lists
- GridControl: EDI messages (ItemsSource: EDIMessages)
- TextEdit: Search EDI messages
- Button: Process, Reject, Resend, ViewDetails
- TextBlock: Status indicators
---
## PRODUCTION MODULE - Control Inventory
**ProductionOrder**
- Controls: GridControl (orders), TextEdit (Order ID, Description), ComboBox (Machine, WorkCenter), DateEdit (StartDate, EndDate), SpinEdit (PlannedQty, CompletedQty), Button (Start/Complete/Cancel)
**MachineManagement**
- Controls: GridControl (machines), TextEdit (MachineID, Name), ComboBox (Type, Location), Button (Add/Delete)
---
## SALES MODULE - Control Inventory
**OrderSuggestion, Mailing, ProductMatrix, SpecialArticleImport**
- Common Pattern: GridControl + TextEdit + ComboBox + SpinEdit + Button
- RichTextEdit for order notes and descriptions
- DateEdit for order/delivery dates
---
## KEY CONTROL TYPE DISTRIBUTION
### By Frequency:
1. GridControl (dxg) - 500+ instances (master-detail, data display)
2. TextEdit (dxe) - 400+ instances (single-line input)
3. ComboBox (dxe) - 300+ instances (dropdown selection)
4. Button/BarButtonItem - 250+ instances (actions)
5. CheckEdit (dxe) - 150+ instances (boolean flags)
6. DateEdit (dxe) - 120+ instances (date selection)
7. RibbonControl (dxr) - 150+ instances (command toolbar)
8. LayoutControl (dxcl) - 100+ instances (responsive layout)
9. TabControl - 80+ instances (multi-section views)
10. TextBlock - 200+ instances (display text)
### By DevExpress Namespace:
- dxg: Grid controls (GridControl, columns, views)
- dxe: Editors (TextEdit, ComboBox, DateEdit, SpinEdit, CheckEdit, ButtonEdit, RichTextEdit)
- dxb: Bars (BarButtonItem, BarCheckItem, BarComboBoxItem)
- dxr: Ribbon (RibbonControl, RibbonPage, RibbonPageGroup, RibbonPageCategory)
- dxcl: Layout controls (LayoutControl, LayoutGroup, LayoutItem)
- dxmvvm: MVVM infrastructure (converters, behaviors, interactions)
---
## BINDING MODES
### UpdateSourceTrigger Patterns:
- PropertyChanged: Real-time filter updates (SearchText, CategoryFilter)
- Default: Standard binding (most data display)
- Explicit: Manual update (large list filtering)
### Binding Paths:
- Simple: {Binding PropertyName}
- Nested: {Binding Parent.Child.Property}
- Indexed: {Binding Items[0]}
- Converter: {Binding Value, Converter={StaticResource ConverterName}}
---
## BEHAVIORAL PATTERNS
### Filter Collapsibility:
- LayoutGroup with IsCollapsible="True"
- Visibility bound to UISettings.ShowFilter
- ClearFiltersButton in header
### Multi-Select Capability:
- GridControl with SelectionMode="MultipleRow"
- SelectedItems bound to collection (not single item)
- Batch operations on selection
### Color Coding:
- FormatCondition on GridControl columns
- Conditional Foreground/Background based on field values
- Priority-based color schemes (Red=High, Yellow=Medium, Green=Low)
### Asynchronous Operations:
- AsyncCommand for time-consuming operations
- IsLoading flag toggles IsEnabled on container controls
- ProgressBar for import/export operations

View File

@@ -0,0 +1,323 @@
# c-entron.NET WPF GUI - Comprehensive UI Element Inventory
**Generated**: November 6, 2025 | **Total XAML Views**: 951 | **Total Modules**: 30 | **Pattern**: MVVM
---
## MODULE STRUCTURE OVERVIEW
### Module 1: ADMINISTRATION (32+ submodules)
#### CountryManagement
- **View**: `Administration/CountryManagement/CountryManagementView.xaml`
- **ViewModel**: `CountryManagementViewModel`
- **UI**: RibbonControl (Save, New, Deactivate, Update Currency) + GridControl (Countries) + TextEdit fields (Name, ShortSign, DialingCode) + CheckEdit (IsDefault, AvailableInInvestmentModule)
- **Commands**: NewCountryCommand, UpdateCountryCommand, NewFederalStateCommand, SelectFlagCommand, RemoveFlagCommand, DeactivateCountryCommand, DeactivateFederalStateCommand, LatestCurrencyCommand, OpenIsoWikiCommand
- **Properties**: Countries (CentronObservableCollection<CountryViewModel>), SelectedCountry, SelectedFederalState
- **Reuse**: Single-use (CountryManagement only)
#### RightsManagement
- **Key Feature**: Hierarchical rights assignment with group creation
- **Controls**: TreeView for hierarchy, DataGrid for rights, ContextMenu
#### EmployeeManagement
- **Key Feature**: Multi-tab employee data, dashboards
- **Submodules**: CommonEmployeeDashboardContainerView, EmployeeSalesDashboardContainerView
#### Settings, LogViewer, MailTemplates, Connections, DSGVO, MandatorManagement, HourlySurchargeRates, ReportServer
- Various configuration and management interfaces
---
### Module 2: FINANCES (40+ submodules)
#### AccountManagement [CRITICAL REUSE - 8+ CONTEXTS]
- **View**: `Finances/AccountManagement/AccountManagementView.xaml`
- **ViewModel**: `AccountManagementViewModel`
- **REUSE INSTANCES**:
1. Finances.AccountManagement (primary)
2. Finances dialogs
3. CRM customer panels
4. Reports module
5. Additional contexts
- **UI**: LayoutControl + ButtonEdit (Customer search) + GridControl (Customers) + TabControl with:
* ReceiptsOverviewViewModel (nested)
* TicketListViewModel (REUSED - see below)
* AccountSalesStatisticViewModel (nested)
* BranchBookKeepingNumbersViewModel (nested)
- **Commands**: SearchCommand, ClearSearchCommand
- **Properties**: SearchText (string), Customers (ObservableCollection<AccountSearchItemDTO>), SelectedCustomer, ReceiptsOverviewViewModel, TicketListViewModel, AccountSalesStatisticViewModel, OrderProcessingContracts, SepaContracts
- **Converters**: AccountSearchItemDTOToAddressConverter, OrderProcessingContractStateToBitmapConverter
#### Receipts (ReceiptsOverview, ReceiptsList)
- **Controls**: GridControl for receipts list/items, TextEdit/ComboBox/SpinEdit for data entry
#### AutomatedBilling
- **Pattern**: Wizard-based multi-page workflow
- **Pages**: CustomerSelection, ContractSelection, BillingDate, SendSettings, Overview, BillingResult
- **Commands**: NextPageCommand, PreviousPageCommand, FinishCommand, PreviewCommand, SendCommand
#### Campaigns
- **Controls**: GridControl, TextEdit, DateEdit, ComboBox, Button
- **Sub-Views**: CampaignCustomerDetailView, HistoryItemsView
#### Payments, Dunning, Opos, Contracts, CRM, TimerBilling, FlatrateBilling
- Specialized financial management interfaces
---
### Module 3: HELPDESK (30+ submodules)
#### TicketList [CRITICAL REUSE - 8+ CONTEXTS]
- **View**: `Helpdesk/TicketList/TicketListView.xaml`
- **ViewModel**: `TicketListViewModel : ViewModelBase, IViewModelWithLoading, IDeferredLoadingCrmPart`
- **REUSE INSTANCES**:
1. Helpdesk.TicketList (primary)
2. Finances.AccountManagement.AccountManagementView (nested tab)
3. Sales.CampaignAnalysis
4. Warehousing.CommissioningList
5. Reports module
6. Dashboard containers
7. MyCentron module
8. Multiple dialog wrappers
- **UI**: LayoutControl + LayoutGroup (Filter section, collapsible)
* ButtonEdit (SearchText with Clear button)
* DateEdit (CreatedDateStart, CreatedDateEnd, DueDateStart, DueDateEnd)
* ComboBox (SelectedStatus, SelectedMainCategory, SelectedSubCategory1, SelectedSubCategory2, SelectedBranch, SelectedConnectionNumberGroup)
* CheckEdit (ShowClosed)
* TextEdit (SearchNumber, SearchText)
* GridControl (Main ticket list, ItemsSource: Helpdesks, SelectedItem: SelectedHelpdesk, SelectedItems: SelectedHelpdesks - multi-select)
* ContextMenu (Open, Forward, Close, CreateRMA, Export)
* Color formatting by status/priority
- **Commands**: ClearFiltersCommand
- **Filter Properties**:
* SearchText, SearchNumber (string)
* SelectedMainCategory, SelectedSubCategory1, SelectedSubCategory2 (HelpdeskCategoryDTO)
* MainCategories, SubCategories1, SubCategories2 (ObservableCollection<HelpdeskCategoryDTO>)
* SelectedBranch (BranchPreviewDTO)
* Branches (CentronObservableCollection<BranchPreviewDTO>)
* SelectedStatus (HelpdeskStatusDTO)
* Status (ObservableCollection<HelpdeskStatusDTO>)
* CreatedDateStart, CreatedDateEnd, DueDateStart, DueDateEnd (DateTime?)
* ShowClosed (bool)
* SelectedConnectionNumberGroup (HelpdeskConnectionNumberGroupDTO)
* ConnectionNumberGroups (CentronObservableCollection<HelpdeskConnectionNumberGroupDTO>)
- **Data Properties**:
* Helpdesks (CentronObservableCollection<HelpdeskListItemViewModel>)
* SelectedHelpdesk (HelpdeskListItemViewModel)
* SelectedHelpdesks (CentronObservableCollection<HelpdeskListItemViewModel>)
* SelectedAccounts (ObservableCollection<AccountSearchItemDTO>)
* CurrentMode (TicketListTicketMode)
* HasHelpdeskRight (bool)
* UISettings (TicketListUISettingsViewModel)
- **Converters**: SecondsToTimeSpanConverter, HoursToTimeSpanConverter, ColorStringToBrushConverter, OrderProcessingContractStateToToolTipConverter
#### TicketDetails
- **View**: `Helpdesk/TicketDetails/TicketDetailView.xaml`
- **Controls**: TabControl (General, Timeline, Attachments, RMA, TimeTracking)
- **Features**: Comprehensive ticket lifecycle management
#### TimeRecording
- **Controls**: SpinEdit (Hours/Minutes), DateEdit, TextEdit, ComboBox, Button
- **Sub-View**: ArticleToTimeView (GridControl for article mapping)
#### Dashboard Containers (7 variations)
- HelpdeskDashboardContainerView
- TicketStatusDasboardContainerView
- TicketPriorityDashboardContainerView
- TicketTypeDashboardContainerView
- TicketDueDateDashboardContainerView
- TicketDatesDashboardContainerView
- TicketRecordedTimeContainerView
- **Pattern**: ChartControl + GridControl + TextBlock statistics
#### CentronChecklist, ExpectedEvents, TaskManagement, SendSelfCareForm, Settings
- Additional helpdesk submodules
---
### Module 4: WAREHOUSING (20+ submodules)
#### ArticleManagement
- **Controls**: GridControl (articles), TextEdit/ComboBox (properties), SpinEdit (stock)
#### ArticleImport
- **Pattern**: Multi-step import wizard
- **Controls**: Button (file select), GridControl (preview), ComboBox (mapping), ProgressBar
#### Commissioning
- **Controls**: GridControl (picking list), SpinEdit (quantity), TextEdit (serial), Button
- **Feature**: Real-time inventory, barcode scanning
#### Additional: AccountSystems, BarcodeSettings, ForeignArticles, CopyArticle, ConvertArticle, Inventory, PriceUpdate, Rebooking, AutoEOL, SerialNumber
---
### Module 5: SALES (15+ submodules)
- GridControl-based order/quotation management
- RichTextEdit for notes, ComboBox for product selection, SpinEdit for quantities
- DateEdit for dates, Button for order actions
### Module 6: PURCHASING (12+ submodules)
#### OrderSuggestion
- **Controls**: GridControl (suggestions), ComboBox (supplier), SpinEdit (quantity), Button (create PO)
#### EDI Management
- **Pattern**: Tab-based transaction management
- **Controls**: TabControl (receipt types), GridControl (messages), TextEdit (search), Button (process/reject)
- **Sub-Views**: EDIReceiptTabsView, EDIHistoryView, EDISupplierListView
### Module 7: PRODUCTION (8+ submodules)
#### ProductionOrder
- **Controls**: GridControl (orders), TextEdit/ComboBox/DateEdit, SpinEdit (quantities), Button
#### MachineManagement
- **Controls**: GridControl (machines), TextEdit/ComboBox (properties), Button
### Module 8: QM (3+ submodules)
- GridControl for quality records, ComboBox for status, TextEdit for notes
### Module 9: PLM (1-2 submodules)
- Single-view module structure
### Module 10: Reports (5+ submodules)
- QueryAppModuleControllerView (SQL query builder)
- ReportEngineAppModuleControllerView (template design)
### Modules 11-30 (Dashboard, Calendar, MyCentron, DataExchange, etc.)
- Various specialized interfaces and utilities
---
## MVVM PATTERNS
### Command Pattern
```
public DelegateCommand NewCountryCommand { get; }
public AsyncCommand UpdateCountryCommand { get; }
public ViewModel()
{
this.NewCountryCommand = new DelegateCommand(this.AddNewCountry);
this.UpdateCountryCommand = new AsyncCommand(this.UpdateCountry);
}
```
### Observable Collection Pattern
```
private CentronObservableCollection<CountryViewModel> _countries;
public CentronObservableCollection<CountryViewModel> Countries
{
get => this._countries;
set => this.SetProperty(ref this._countries, value, nameof(this._countries));
}
```
### XAML Binding Pattern
```
<TextEdit EditValue="{Binding SelectedCountry.CountryName, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="{Binding SaveCommand}" Content="Save" />
<GridControl ItemsSource="{Binding Countries}" SelectedItem="{Binding SelectedCountry}" />
```
---
## COMMON UI CONTROL TYPES
### DevExpress Controls (Primary)
- dxg:GridControl (master-detail data)
- dxe:TextEdit (single-line text)
- dxe:ComboBox (dropdown)
- dxe:CheckEdit (checkbox with label)
- dxe:DateEdit (date picker)
- dxe:ButtonEdit (text + action buttons)
- dxe:SpinEdit (numeric)
- dxe:RichTextEdit (rich text)
- dxb:BarButtonItem (ribbon buttons)
- dxr:RibbonControl (ribbon interface)
- dxcl:LayoutControl (responsive layout)
- dxcl:LayoutGroup (grouped sections)
- dxcl:LayoutItem (form fields)
### WPF Standard Controls
- Grid, TextBlock, TextBox, PasswordBox, Button, CheckBox, RadioButton, ComboBox, ListBox, DataGrid, TabControl, TreeView
### Custom Controls
- BaseModule, LayoutControl, GridControl (DevExpress)
---
## HIGH-REUSE VIEWMODELS
1. **TicketListViewModel** (8+ contexts - CRITICAL)
- Primary: Helpdesk ticket listing
- Embedded: Finances, Sales, Warehousing, Reports, Dashboards
2. **ReceiptsOverviewViewModel** (4+ contexts)
- Primary: Finances receipt management
- Embedded: AccountManagement, CRM, Reports
3. **AccountManagementViewModel** (2-3 contexts)
- Primary: Finances.AccountManagement
- Secondary: Dialogs, CRM panels
4. **Dashboard ViewModels** (7+ variations)
- Statistics aggregation across modules
---
## NAMING CONVENTIONS
### Commands
- {Action}Command (SaveCommand, DeleteCommand)
- Show{Feature}Command (ShowDetailsCommand)
- {Action}{Entity}Command (UpdateCountryCommand)
- Clear{FilterType}Command (ClearFiltersCommand)
- Is{State}Command (IsSetToDefaultCountryCommand)
### Properties
- {Entity}Collection (Customers, Countries)
- Selected{Entity} (SelectedCountry, SelectedCustomer)
- {Property}Value (SearchText, DescriptionValue)
- {Filter}Start/{Filter}End (CreatedDateStart, CreatedDateEnd)
- Has{Right/Feature} (HasHelpdeskRight, HasCrmDetailStatisticRights)
- Is{State} (IsLoading, IsProcessing)
- Show{Component} (ShowFilter, ShowClosed)
---
## KEY ARCHITECTURAL INSIGHTS
1. **Extreme ViewModel Reuse**: TicketListViewModel appears in 8+ different Views
2. **Deep Nesting**: AccountManagementViewModel contains 5+ child ViewModels
3. **Grid-Heavy**: 80%+ of data display uses DevExpress GridControl
4. **Ribbon Ubiquity**: 150+ views use dxr:RibbonControl
5. **Async Operations**: Extensive AsyncCommand usage for responsiveness
6. **Multi-language**: All UI text via LocalizedStrings (German/English)
7. **Permission-Based Rendering**: Conditional visibility based on user rights
8. **Wizard Patterns**: 5+ workflows use step-by-step wizards
9. **Complex Filtering**: Most list views have 5-10 filter dimensions
10. **Master-Detail Pattern**: Standard layout: left panel (~300px) + detail area (flex)
---
## METRICS
- Total XAML Views: 951
- Total Modules: 30
- Total Submodules: 180+
- Primary Framework: DevExpress 24.2.7 (WPF + Blazor)
- Command Types: DelegateCommand, AsyncCommand
- Base Classes: BindableBase, ViewModelBase
- Collection Type: CentronObservableCollection, ObservableCollection
- GridControl Usage: ~500+ views
- Ribbon Usage: ~150+ views
- High-Reuse ViewModels: 5-7 shared across modules

View File

@@ -0,0 +1,453 @@
# c-entron.NET WPF GUI - Quick Reference & Developer Guide
## QUICK NAVIGATION
### To Find a Module:
- Path: `c:/src/centron/Centron.WPF.UI/Modules/{ModuleName}/`
- Main View: `{ModuleName}View.xaml` or `{ModuleName}ModuleView.xaml`
- ViewModel: `{ModuleName}ViewModel.cs` (same folder)
- Commands: In ViewModel constructor (`new DelegateCommand(...)`)
- Properties: In ViewModel as `{public PropertyName { get; set; }}`
### The 30 Modules:
1. Administration - Settings, users, config
2. ArtificialIntelligence - AI features
3. Calendar - Event scheduling
4. Dashboard - Home screen
5. DataExchange - Import/export
6. ExternalTool - Third-party integrations
7. Finances - Accounting, billing, CRM
8. Global - Shared components
9. Gui - UI utilities
10. Helpdesk - Tickets, support
11. Logistic - Shipping, tracking
12. Massenupdates - Bulk operations
13. MyCentron - Personal workspace
14. OnlineBanking - Bank connections
15. PasswordManager - Credentials
16. PayersAndCostCenter - Cost allocation
17. PLM - Product lifecycle
18. Production - Manufacturing
19. ProjectManagement - Projects, tasks
20. ProjectPriceImport - Pricing import
21. Purchasing - PO, suppliers, EDI
22. QM - Quality management
23. Reports - Reporting engine
24. Rma - Return management
25. Sales - Orders, quotations
26. Statistics - Analytics
27. Survey - Feedback forms
28. TelekomDive - Telecom integration
29. Warehousing - Inventory, articles
30. (Additional system modules)
---
## MOST IMPORTANT VIEWMODELS TO KNOW
### 1. TicketListViewModel [CRITICAL - 8+ CONTEXTS]
**File**: `Helpdesk/TicketList/TicketListViewModel.cs`
**Used in**: Helpdesk, Finances (account tickets), Sales, Warehousing, Reports, Dashboard, MyCentron
**Key Insight**: Context-aware filtering - same ViewModel, different data contexts
**When to Use**: Any list of tickets needed, embed directly, use filters to customize
### 2. AccountManagementViewModel [HIGH REUSE - 8+ CONTEXTS]
**File**: `Finances/AccountManagement/AccountManagementViewModel.cs`
**Contains**: 5 nested ViewModels (Receipts, Tickets, Statistics, etc.)
**When to Use**: Customer/account detail views
### 3. ReceiptsOverviewViewModel
**File**: `Finances/AccountManagement/ReceiptControls/ReceiptsOverviewViewModel.cs`
**Used in**: Finances, Accounting, CRM, Reports
**Feature**: Multi-receipt type support (Invoice, Credit note, Delivery list)
### 4. Dashboard ViewModels (7 variations)
**Pattern**: Each shows single metric (Status, Priority, Type, Date, etc.)
**Reuse**: All 7 embedded in multiple dashboard views
### 5. CountryManagementViewModel
**File**: `Administration/CountryManagement/CountryManagementViewModel.cs`
**Pattern**: Master-detail with 10 commands
**Ideal Example**: Study this for standard MVVM patterns
---
## TYPICAL MODULE STRUCTURE
```
ModuleName/
├── ModuleNameView.xaml (main view)
├── ModuleNameViewModel.cs (main ViewModel)
├── ViewModels/
│ ├── DetailViewModel.cs
│ ├── SubModuleViewModel.cs
│ └── FilterViewModel.cs
├── Views/
│ ├── DetailView.xaml
│ └── SubModuleView.xaml
├── Converters/
│ ├── CustomConverter.cs
│ └── FilterConverter.cs
├── Dialogs/
│ ├── SearchDialogView.xaml
│ └── SearchDialogViewModel.cs
└── [SubModule]/
├── SubModuleView.xaml
└── SubModuleViewModel.cs
```
---
## ADDING A NEW FEATURE
### Step 1: Identify the ViewModel
- Is it EXISTING reusable? Use existing (e.g., TicketListViewModel)
- Is it NEW to this module? Create new class: `{Feature}ViewModel.cs`
### Step 2: Add Command (If action is needed)
```csharp
public DelegateCommand SaveCommand { get; }
public FeatureViewModel()
{
this.SaveCommand = new DelegateCommand(this.Save, () => !this.IsLoading);
}
private void Save()
{
// Your business logic
}
```
### Step 3: Add Property (If data display/binding needed)
```csharp
private string _featureName;
public string FeatureName
{
get => this._featureName;
set => this.SetProperty(ref this._featureName, value, nameof(this.FeatureName));
}
```
### Step 4: Add to XAML View
```xaml
<!-- For property binding -->
<TextEdit EditValue="{Binding FeatureName, UpdateSourceTrigger=PropertyChanged}" />
<!-- For command binding -->
<Button Command="{Binding SaveCommand}" Content="Speichern" />
<!-- For data binding -->
<GridControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
```
### Step 5: Test in multiple contexts
- Standalone view
- Embedded in dialog
- Nested in another ViewModel
- Multi-select scenarios
---
## REUSING EXISTING VIEWMODEL
### Use Case: Add ticket list to new module
**Step 1**: Reference TicketListViewModel
```xaml
<!-- In parent View.xaml -->
<TabItem Header="Tickets">
<ticketList:TicketListView DataContext="{Binding TicketListViewModel}" />
</TabItem>
```
**Step 2**: Create nested property in parent ViewModel
```csharp
private TicketListViewModel _ticketListViewModel;
public TicketListViewModel TicketListViewModel
{
get { return this._ticketListViewModel; }
set { this.SetProperty(ref this._ticketListViewModel, value, () => this.TicketListViewModel); }
}
// In constructor:
public ParentViewModel()
{
this.TicketListViewModel = new TicketListViewModel();
// Optional: Set context/filter
this.TicketListViewModel.PreFilterByCustomer(this.SelectedCustomer.Id);
}
```
**Step 3**: That's it! The TicketListViewModel handles its own filtering and commands
---
## COMMON PATTERNS
### Master-Detail List
```xaml
<LayoutControl Orientation="Horizontal">
<!-- Master (left) -->
<LayoutItem Width="250" AllowHorizontalSizing="True">
<GridControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
</LayoutItem>
<!-- Detail (right) -->
<LayoutGroup Width="*">
<TextEdit EditValue="{Binding SelectedItem.Name}" />
<!-- More detail controls -->
</LayoutGroup>
</LayoutControl>
```
### Collapsible Filter Section
```xaml
<LayoutGroup IsCollapsible="True" Visibility="{Binding ShowFilter, Converter={StaticResource BooleanToVisibilityConverter}}">
<LayoutGroup.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Filter" />
<Button Command="{Binding ClearFiltersCommand}" Content="Löschen" />
</StackPanel>
</DataTemplate>
</LayoutGroup.HeaderTemplate>
<!-- Filter controls -->
<TextEdit EditValue="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" />
<DateEdit SelectedDate="{Binding StartDate}" />
<!-- More filters -->
</LayoutGroup>
```
### Ribbon Toolbar
```xaml
<RibbonControl>
<RibbonDefaultPageCategory>
<RibbonPage>
<RibbonPageGroup Caption="Daten">
<BarButtonItem Command="{Binding SaveCommand}" Content="Speichern" Glyph="16x16/Save.png" />
</RibbonPageGroup>
<RibbonPageGroup Caption="Entity">
<BarButtonItem Command="{Binding NewCommand}" Content="Neu" RibbonStyle="Large" />
</RibbonPageGroup>
</RibbonPage>
</RibbonDefaultPageCategory>
</RibbonControl>
```
### Wizard Pattern
```xaml
<TabControl SelectedIndex="{Binding CurrentPageIndex}">
<TabItem Header="Step 1"><local:Step1View /></TabItem>
<TabItem Header="Step 2"><local:Step2View /></TabItem>
<TabItem Header="Step 3"><local:Step3View /></TabItem>
</TabControl>
<StackPanel Orientation="Horizontal">
<Button Command="{Binding PreviousCommand}" />
<Button Command="{Binding NextCommand}" />
<Button Command="{Binding FinishCommand}" />
</StackPanel>
```
### Tab Control with Nested ViewModels
```xaml
<TabControl>
<TabItem Header="Receipts">
<local:ReceiptsView DataContext="{Binding ReceiptsViewModel}" />
</TabItem>
<TabItem Header="Tickets">
<local:TicketListView DataContext="{Binding TicketListViewModel}" />
</TabItem>
<TabItem Header="Statistics">
<local:StatisticsView DataContext="{Binding StatisticsViewModel}" />
</TabItem>
</TabControl>
```
---
## DEVEXPRESS CONTROL REFERENCE
### Essential Controls
| Control | Namespace | Usage | XAML Example |
|---------|-----------|-------|--------------|
| GridControl | dxg | Data display/edit | `<dxg:GridControl ItemsSource="{Binding Items}" />` |
| TextEdit | dxe | Single-line text | `<dxe:TextEdit EditValue="{Binding Text}" />` |
| ComboBox | dxe | Dropdown list | `<dxe:ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding Selected}" />` |
| DateEdit | dxe | Date picker | `<dxe:DateEdit SelectedDate="{Binding Date}" />` |
| SpinEdit | dxe | Numeric input | `<dxe:SpinEdit Value="{Binding Count}" />` |
| CheckEdit | dxe | Checkbox | `<dxe:CheckEdit IsChecked="{Binding IsActive}" />` |
| ButtonEdit | dxe | Text with button | `<dxe:ButtonEdit EditValue="{Binding Value}"><dxe:ButtonInfo GlyphKind="Search" /></dxe:ButtonEdit>` |
| RichTextEdit | dxe | Rich text | `<dxe:RichTextEdit Text="{Binding Content}" />` |
| RibbonControl | dxr | Toolbar | `<dxr:RibbonControl><dxr:RibbonPage>...</dxr:RibbonPage></dxr:RibbonControl>` |
| LayoutControl | dxcl | Responsive layout | `<dxcl:LayoutControl><dxcl:LayoutItem>...</dxcl:LayoutItem></dxcl:LayoutControl>` |
| ChartControl | dxc | Charts/graphs | `<dxc:ChartControl DataSource="{Binding Data}" />` |
### Binding Modes
```xaml
<!-- Real-time updates -->
<TextEdit EditValue="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" />
<!-- Standard binding (update on focus loss) -->
<TextEdit EditValue="{Binding Name}" />
<!-- One-way binding (display only) -->
<TextBlock Text="{Binding Status, Mode=OneWay}" />
<!-- With converter -->
<TextBlock Text="{Binding Date, Converter={StaticResource DateConverter}}" />
```
---
## DEBUGGING TIPS
### 1. ViewModel not updating UI?
- Check: `SetProperty()` called correctly? ✓
- Check: Property name correct in binding? ✓
- Check: `UpdateSourceTrigger=PropertyChanged` if real-time needed? ✓
### 2. Command not firing?
- Check: Command instantiated in constructor? ✓
- Check: `CanExecute` condition met? (Default true) ✓
- Check: ViewModel set as DataContext? ✓
### 3. GridControl empty?
- Check: `ItemsSource` bound correctly? ✓
- Check: Collection has data (not null or empty)? ✓
- Check: Columns defined in GridControl? ✓
### 4. Filter not working?
- Check: `UpdateSourceTrigger=PropertyChanged` on filter control? ✓
- Check: Filter method called on property change? ✓
- Check: `RefreshList()` or `ReloadData()` method exists? ✓
### 5. Nested ViewModel not showing?
- Check: Child ViewModel instantiated? ✓
- Check: Child View's DataContext bound to ViewModel property? ✓
- Check: Visibility/IsEnabled conditions? ✓
---
## PERFORMANCE OPTIMIZATION
### 1. Use Virtual Scrolling for Large Lists
```xaml
<dxg:GridControl VirtualScrollingMode="Vertical" />
```
### 2. Defer Loading for Tab Content
```csharp
public void OnTabSelected()
{
if (this.NestedViewModel == null)
{
this.NestedViewModel = new NestedViewModel();
this.NestedViewModel.LoadData();
}
}
```
### 3. Use Async Loading with Progress
```csharp
private async Task LoadData()
{
this.IsLoading = true;
try
{
this.Items = await this.LoadItemsAsync();
}
finally
{
this.IsLoading = false;
}
}
```
### 4. Implement IDisposable for Resource Cleanup
```csharp
public class MyViewModel : ViewModelBase, IDisposable
{
public void Dispose()
{
// Clean up subscriptions, timers, etc.
}
}
```
---
## LOCALIZATION (German/English)
### All UI Strings via LocalizedStrings
```csharp
// In code:
MessageBox.Show(LocalizedStrings.ConfirmDeleteMessage);
// In XAML:
<Button Content="{x:Static properties:LocalizedStrings.SaveButtonLabel}" />
```
### Key Format Convention
```
{ClassName}_{Method}_{Description}
Example: CountryManagementView_NewCountry_ButtonLabel
```
---
## BEST PRACTICES CHECKLIST
- [ ] Commands use CanExecute to prevent invalid states
- [ ] Properties use SetProperty() for change notification
- [ ] Collections are ObservableCollection<T>
- [ ] Async operations don't freeze UI (use AsyncCommand)
- [ ] All UI text from LocalizedStrings resource
- [ ] Master-detail pattern for complex data entry
- [ ] Filters are collapsible to save space
- [ ] Ribbon used for primary actions
- [ ] No business logic in View code-behind
- [ ] ViewModels are testable (no UI dependencies)
---
## FILE ORGANIZATION
### View Files
- Location: `Modules/{ModuleName}/{Feature}/`
- Naming: `{FeatureName}View.xaml`
- Content: Only XAML markup (x:Class points to code-behind)
### ViewModel Files
- Location: `Modules/{ModuleName}/{Feature}/` or `ViewModels/` subfolder
- Naming: `{FeatureName}ViewModel.cs`
- Content: Properties, Commands, Data access logic
### Converter Files
- Location: `Modules/{ModuleName}/{Feature}/Converters/` or `Modules/{ModuleName}/Converters/`
- Naming: `{ConverterName}Converter.cs`
- Content: IValueConverter implementation
### Dialog Files
- Location: `Modules/{ModuleName}/{Feature}/Dialogs/`
- Naming: `{DialogName}DialogView.xaml` + `{DialogName}DialogViewModel.cs`
- Content: Modal dialog UI and logic
---
## SUMMARY OF KEY INSIGHTS
1. **Extreme Reuse Pattern**: TicketListViewModel appears in 8+ different contexts - STUDY THIS PATTERN
2. **Context-Aware Filtering**: Same ViewModel behaves differently based on which module uses it
3. **Nested ViewModels**: Complex screens use 5+ nested ViewModels for separation of concerns
4. **Master-Detail Ubiquity**: 80% of data entry uses left-panel list + right-panel detail
5. **Command-Based Architecture**: All actions via ICommand (no code-behind logic)
6. **Async-First**: All long-running operations prevent UI freezing with async/await
7. **Soft Deletes Only**: No permanent deletion (IsDeleted flag), audit trails maintained
8. **Permission Integration**: UI elements conditionally visible based on user rights
9. **DevExpress Heavy**: 95% of controls from DevExpress framework (not WPF standard)
10. **German-First Localization**: Default to German, English translation maintained in parallel