From 1366343cdf8789a1c33acb8fa0ed240048e6d304 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Wed, 17 Nov 2021 16:25:00 +0100 Subject: [PATCH] Improve Validation, Report, Transfer document with selected mandator --- .../Reports/OrderReport.Designer.vb | 35 +++++++++++-- MultiTool.Form/frmImportMain.vb | 6 ++- MultiTool.Form/frmRowEditor.vb | 50 +++++++++++-------- MultiTool.Shared/Constants.vb | 3 ++ MultiTool.Shared/Documents/DocumentLoader.vb | 22 +++++--- MultiTool.Shared/Documents/DocumentRow.vb | 41 ++++++++++++--- MultiTool.Shared/Winline/WebService.vb | 6 +-- 7 files changed, 119 insertions(+), 44 deletions(-) diff --git a/MultiTool.Form/Reports/OrderReport.Designer.vb b/MultiTool.Form/Reports/OrderReport.Designer.vb index ad2b6b6..e0234a6 100644 --- a/MultiTool.Form/Reports/OrderReport.Designer.vb +++ b/MultiTool.Form/Reports/OrderReport.Designer.vb @@ -84,6 +84,9 @@ Partial Public Class OrderReport Me.GroupFooter1 = New DevExpress.XtraReports.UI.GroupFooterBand() Me.label2 = New DevExpress.XtraReports.UI.XRLabel() Me.ObjectDataSource1 = New DevExpress.DataAccess.ObjectBinding.ObjectDataSource(Me.components) + Me.XrTableRow4 = New DevExpress.XtraReports.UI.XRTableRow() + Me.XrTableCell11 = New DevExpress.XtraReports.UI.XRTableCell() + Me.XrTableCell12 = New DevExpress.XtraReports.UI.XRTableCell() CType(Me.XrTable2, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.XrTable1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.table3, System.ComponentModel.ISupportInitialize).BeginInit() @@ -274,7 +277,7 @@ Partial Public Class OrderReport 'Detail ' Me.Detail.Controls.AddRange(New DevExpress.XtraReports.UI.XRControl() {Me.XrTable2, Me.XrTable1}) - Me.Detail.HeightF = 50.0! + Me.Detail.HeightF = 75.0! Me.Detail.KeepTogether = True Me.Detail.Name = "Detail" ' @@ -284,8 +287,8 @@ Partial Public Class OrderReport Me.XrTable2.LocationFloat = New DevExpress.Utils.PointFloat(354.8623!, 0!) Me.XrTable2.Name = "XrTable2" Me.XrTable2.Padding = New DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 96.0!) - Me.XrTable2.Rows.AddRange(New DevExpress.XtraReports.UI.XRTableRow() {Me.XrTableRow3, Me.XrTableRow5}) - Me.XrTable2.SizeF = New System.Drawing.SizeF(288.9166!, 50.0!) + Me.XrTable2.Rows.AddRange(New DevExpress.XtraReports.UI.XRTableRow() {Me.XrTableRow3, Me.XrTableRow5, Me.XrTableRow4}) + Me.XrTable2.SizeF = New System.Drawing.SizeF(288.9166!, 75.0!) Me.XrTable2.StylePriority.UseForeColor = False ' 'XrTableRow3 @@ -628,6 +631,29 @@ Partial Public Class OrderReport Me.ObjectDataSource1.DataSource = GetType(MultiTool.[Shared].ReportSource) Me.ObjectDataSource1.Name = "ObjectDataSource1" ' + 'XrTableRow4 + ' + Me.XrTableRow4.Cells.AddRange(New DevExpress.XtraReports.UI.XRTableCell() {Me.XrTableCell11, Me.XrTableCell12}) + Me.XrTableRow4.Name = "XrTableRow4" + Me.XrTableRow4.Weight = 1.0R + ' + 'XrTableCell11 + ' + Me.XrTableCell11.Font = New System.Drawing.Font("Arial", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.XrTableCell11.Multiline = True + Me.XrTableCell11.Name = "XrTableCell11" + Me.XrTableCell11.StylePriority.UseFont = False + Me.XrTableCell11.Text = "Bestellt von" + Me.XrTableCell11.Weight = 1.0R + ' + 'XrTableCell12 + ' + Me.XrTableCell12.ExpressionBindings.AddRange(New DevExpress.XtraReports.UI.ExpressionBinding() {New DevExpress.XtraReports.UI.ExpressionBinding("BeforePrint", "Text", "[Head].[Text5]")}) + Me.XrTableCell12.Multiline = True + Me.XrTableCell12.Name = "XrTableCell12" + Me.XrTableCell12.Text = "XrTableCell12" + Me.XrTableCell12.Weight = 1.0R + ' 'OrderReport ' Me.Bands.AddRange(New DevExpress.XtraReports.UI.Band() {Me.TopMargin, Me.BottomMargin, Me.ReportHeader, Me.Detail, Me.DetailReport}) @@ -713,4 +739,7 @@ Partial Public Class OrderReport Friend WithEvents XrTableCell7 As DevExpress.XtraReports.UI.XRTableCell Friend WithEvents XrTableCell8 As DevExpress.XtraReports.UI.XRTableCell Friend WithEvents XrLabel3 As DevExpress.XtraReports.UI.XRLabel + Friend WithEvents XrTableRow4 As DevExpress.XtraReports.UI.XRTableRow + Friend WithEvents XrTableCell11 As DevExpress.XtraReports.UI.XRTableCell + Friend WithEvents XrTableCell12 As DevExpress.XtraReports.UI.XRTableCell End Class diff --git a/MultiTool.Form/frmImportMain.vb b/MultiTool.Form/frmImportMain.vb index 2956721..67f1da3 100644 --- a/MultiTool.Form/frmImportMain.vb +++ b/MultiTool.Form/frmImportMain.vb @@ -422,7 +422,7 @@ Public Class frmImportMain SplitContainerGrids.Enabled = False Dim oDocument As Document = GridViewFiles.GetRow(GridViewFiles.FocusedRowHandle) - Await WebService.TransferDocumentToWinline(oDocument) + Await WebService.TransferDocumentToWinline(oDocument, lookupMandator.EditValue) MsgBox(My.Resources.frmImportMainExtra.Datei_erfolgreich_in_die_WinLine_übertragen, MsgBoxStyle.Information, Text) Catch ex As HttpRequestException @@ -565,9 +565,11 @@ Public Class frmImportMain Dim oMapperConfig As New Mapper(LogConfig) Dim oHeadMapper = oMapperConfig.GetMapper(Of ReportHead)(New Dictionary(Of String, String) From { + {"Fakt_Kontonummer[External]", "Text1"}, {"Fakt_Kontonummer[Final]", "Text2"}, {"Auftrags-Bestellnummer", "Text3"}, - {"Datum_Auftrag-Bestellung", "Text4"} + {"Datum_Auftrag-Bestellung", "Text4"}, + {"Bestellt_von", "Text5"} }) Dim oPositionMapper = oMapperConfig.GetMapper(Of ReportPosition)(New Dictionary(Of String, String) From { diff --git a/MultiTool.Form/frmRowEditor.vb b/MultiTool.Form/frmRowEditor.vb index ebab0bf..b773d91 100644 --- a/MultiTool.Form/frmRowEditor.vb +++ b/MultiTool.Form/frmRowEditor.vb @@ -1,14 +1,15 @@ -Imports DevExpress.XtraGrid.Views.Grid +Imports System.Globalization Imports MultiTool.Shared.Documents Imports MultiTool.Shared.Documents.DocumentRow -Imports DevExpress.XtraEditors.Repository Imports MultiTool.Shared.Winline +Imports MultiTool.Shared.Schemas +Imports MultiTool.Shared.Constants Imports DigitalData.Modules.Language -Imports DevExpress.XtraEditors.Controls -Imports System.Globalization -Imports DevExpress.XtraEditors Imports DigitalData.Modules.Logging -Imports MultiTool.Shared.Schemas +Imports DevExpress.XtraEditors +Imports DevExpress.XtraEditors.Repository +Imports DevExpress.XtraEditors.Controls +Imports DevExpress.XtraGrid.Views.Grid Public Class frmRowEditor Private ReadOnly LogConfig As LogConfig @@ -29,10 +30,6 @@ Public Class frmRowEditor Private ReadOnly DocumentKindPicker As New RepositoryItemSearchLookUpEdit Private ReadOnly ReadOnlyEditor As New RepositoryItemTextEdit - - 'Private ReadOnly MaskDateEditor As New RepositoryItemTextEdit - 'Private ReadOnly DatePicker As New RepositoryItemDateEdit - Private Const COL_KEY = "KEY" Private Const COL_VALUE_ORIGINAL = "VALUE_ORIGINAL" Private Const COL_VALUE_EXTERNAL = "VALUE_EXTERNAL" @@ -45,7 +42,6 @@ Public Class frmRowEditor End Property Public Sub New(pLogConfig As LogConfig, pColumns As List(Of String), pDocumentRow As DocumentRow, pMandator As Mandator, pWinline As WinlineData, pTable As Schema.Table) - ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() LogConfig = pLogConfig @@ -105,11 +101,12 @@ Public Class frmRowEditor Dim oField = _DocumentRow.Fields. Where(Function(f) f.Key = oColumnName). SingleOrDefault() + Dim oColumn = _Table.Columns. Where(Function(c) c.Name = oColumnName). SingleOrDefault() - ' Only Show Columns that are set to visible true + ' Only Show Columns that are set to visible If oColumn?.Config?.IsVisible = False Then Continue For End If @@ -160,6 +157,13 @@ Public Class frmRowEditor If Not oFieldValue.Final.Equals(oGridValue) Then Dim oValue = Utils.NotNull(oRow.Item(COL_VALUE_FINAL), String.Empty).ToString + + ' If new value is not empty, any error will be removed. + ' Could cause problems in the future because a value might not equal to 'no error'. + If oValue <> String.Empty Then + oFieldValue.Error = FieldError.None + End If + oFieldValue.Final = oValue.Trim() If _DocumentRow.Fields.ContainsKey(oField.Key) Then @@ -222,15 +226,16 @@ Public Class frmRowEditor Where(Function(c) c.Name = oKey). SingleOrDefault() + If oColumn Is Nothing Then Exit Sub End If - If oColumn.Config?.Function.Name = "GLN" Then + If oColumn.Config?.Function?.Name = FUNCTION_GLN Then e.RepositoryItem = AccountPicker End If - If oColumn.Config?.Function.Name = "EAN" Then + If oColumn.Config?.Function?.Name = FUNCTION_EAN Then e.RepositoryItem = ArticlePicker End If @@ -249,22 +254,25 @@ Public Class frmRowEditor Dim oKey As String = oDataRow.Item(COL_KEY) Dim oValue As String = oDataRow.Item(COL_VALUE_FINAL) Dim oColumn = _Table.Columns. - Where(Function(c) c.Name = oKey). - SingleOrDefault() + Where(Function(c) c.Name = oKey). + SingleOrDefault() + Dim oField = _DocumentRow.Fields. + Where(Function(f) f.Key = oKey). + SingleOrDefault() If e.Column.FieldName = COL_VALUE_FINAL Then - If oColumn Is Nothing Then + If oColumn IsNot Nothing Then If oColumn.Config?.IsReadOnly Then e.Appearance.BackColor = Color.LightGray End If + End If - If oColumn.Config?.IsRequired AndAlso e.CellValue.ToString.Length = 0 Then - e.Appearance.BackColor = Color.LightCoral - End If + If oField.Value.HasError Then + e.Appearance.BackColor = Color.LightCoral End If End If - If oColumn.Config?.IsRequired AndAlso oValue.ToString.Length = 0 Then + If oField.Value.HasError Then e.Appearance.BackColor = Color.LightCoral End If End Sub diff --git a/MultiTool.Shared/Constants.vb b/MultiTool.Shared/Constants.vb index 86742af..cf39f07 100644 --- a/MultiTool.Shared/Constants.vb +++ b/MultiTool.Shared/Constants.vb @@ -7,6 +7,9 @@ EAN = 2 End Enum + Public Const FUNCTION_GLN = "GLN" + Public Const FUNCTION_EAN = "EAN" + Public Const SCHEMA_TYPE_DATE = "xs:date" Public Const SCHEMA_TYPE_INTEGER = "xs:integer" Public Const SCHEMA_TYPE_DECIMAL = "xs:decimal" diff --git a/MultiTool.Shared/Documents/DocumentLoader.vb b/MultiTool.Shared/Documents/DocumentLoader.vb index c9f6efc..9d4b6cb 100644 --- a/MultiTool.Shared/Documents/DocumentLoader.vb +++ b/MultiTool.Shared/Documents/DocumentLoader.vb @@ -137,7 +137,15 @@ Namespace Documents ' The first level of Elements are the document Rows Dim oTopLevelElements As List(Of XElement) = oRootElement.Elements.ToList Dim oDocumentRows As New List(Of DocumentRow) - + Dim oSortKey As Integer = 0 + + ' TODO: Somehow add all fields in the correct order + ' + ' Right now, the method of + ' - first the filled field from xml + ' - then the rest from schema + ' + ' leads to unordered fields. For Each oTopLevelElement As XElement In oTopLevelElements Dim oFields As New Dictionary(Of String, DocumentRow.FieldValue) Dim oSubElements = oTopLevelElement.Descendants().ToList() @@ -145,15 +153,12 @@ Namespace Documents Where(Function(t) t.Name = oTopLevelElement.Name). FirstOrDefault() - - - - For Each oSubElement As XElement In oSubElements Dim oSchemaField = oTable.Columns. Where(Function(c) c.Name = oSubElement.Name). SingleOrDefault() + Dim oRequired = oSchemaField.IsRequired Dim oValue = oSubElement.Value.Trim() ' TODO: Needed when we have time for date times @@ -165,12 +170,13 @@ Namespace Documents oFields.Add(oSubElement.Name.ToString, New DocumentRow.FieldValue With { .Original = oValue, .Final = oValue, - .DataType = oSchemaField.DataType + .DataType = oSchemaField.DataType, + .Required = oRequired }) Next - ' TODO: All fields in the schema should be generated, + ' All fields in the schema are generated, ' only creating the ones with values leads to wrong visual cues when asking for ' docs/rows/fields with errors For Each oColumn In oTable.Columns @@ -190,10 +196,12 @@ Namespace Documents ' Create a DocumentRow object for each Top Level Element Dim oRow = New DocumentRow With { + .SortKey = oSortKey, .Name = oTopLevelElement.Name.ToString, .Fields = oFields } + oSortKey += 1 oDocumentRows.Add(oRow) Next diff --git a/MultiTool.Shared/Documents/DocumentRow.vb b/MultiTool.Shared/Documents/DocumentRow.vb index 4727dc4..c5fded6 100644 --- a/MultiTool.Shared/Documents/DocumentRow.vb +++ b/MultiTool.Shared/Documents/DocumentRow.vb @@ -1,16 +1,37 @@ Namespace Documents Public Class DocumentRow + Implements IComparable + + ''' + ''' GUID to match DocumentRow with Row from Grid/DataTable + ''' + Public Property Id As New Guid + ''' + ''' Counter to ensure consistency and order when writing XML + ''' + Public Property SortKey As Integer ''' ''' Tabellen/Elementname aus XML ''' Public Property Name As String - Public Property Id As New Guid Public Property Fields As Dictionary(Of String, FieldValue) Public ReadOnly Property HasErrors As Boolean Get - Return Fields.Any(Function(f) f.Value.HasError) + If Errors.Count > 0 Then + Return True + Else + Return False + End If + End Get + End Property + + Public ReadOnly Property Errors As List(Of String) + Get + Return Fields. + Where(Function(f) f.Value.HasError). + Select(Function(f) f.Key).ToList() End Get End Property @@ -18,6 +39,10 @@ Id = Guid.NewGuid() End Sub + Public Function CompareTo(other As Object) As Integer Implements IComparable.CompareTo + Return SortKey.CompareTo(DirectCast(other, DocumentRow).SortKey) + End Function + Public Enum FieldError None MissingValue @@ -26,16 +51,16 @@ End Enum Public Class FieldValue - Public [Error] As FieldError = FieldError.None - - Public Original As String = "" - Public External As String = "" - Public Final As String = "" Public Property DataType As Constants.ColumnType = Constants.ColumnType.String + Public Property [Error] As FieldError = FieldError.None + Public Property Original As String = "" + Public Property External As String = "" + Public Property Final As String = "" + Public Property Required As Boolean = False Public ReadOnly Property HasError As Boolean Get - Return [Error] <> FieldError.None + Return [Error] <> FieldError.None Or (Required = True And Final = String.Empty) End Get End Property diff --git a/MultiTool.Shared/Winline/WebService.vb b/MultiTool.Shared/Winline/WebService.vb index 106bad9..c7b56a5 100644 --- a/MultiTool.Shared/Winline/WebService.vb +++ b/MultiTool.Shared/Winline/WebService.vb @@ -22,7 +22,7 @@ Namespace Winline AppDataPath = pAppDataPath End Sub - Public Async Function TransferDocumentToWinline(pDocument As Document) As Task(Of Boolean) + Public Async Function TransferDocumentToWinline(pDocument As Document, pMandator As Mandator) As Task(Of Boolean) Dim oBytes As Byte() = GetBytesFromDocument(pDocument) Dim oWS As Config.WebServiceConfig = Config.Webservice @@ -163,8 +163,6 @@ Namespace Winline "Fakt_Name" } - - Using oStream As New IO.MemoryStream() Dim w = XmlWriter.Create(oStream) @@ -175,6 +173,8 @@ Namespace Winline w.WriteAttributeString("option", pDocument.Option) w.WriteAttributeString("printVoucher", pDocument.PrintVoucher) + pDocument.Rows.Sort() + For Each oRow In pDocument.Rows w.WriteStartElement(oRow.Name)