Analyse Results
This commit is contained in:
@@ -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`
|
||||
@@ -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)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user