diff --git a/DDMonorepo.sln b/DDMonorepo.sln index dc0ee726..5f01bae5 100644 --- a/DDMonorepo.sln +++ b/DDMonorepo.sln @@ -25,8 +25,6 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Messaging", "Message\Messag EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DDTestService", "DDTestService\DDTestService.vbproj", "{63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}" EndProject -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Variables", "Variables\Variables.vbproj", "{836C9ADE-E04E-4E1E-B17A-201E68014790}" -EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Config", "Modules.Config\Config.vbproj", "{44982F9B-6116-44E2-85D0-F39650B1EF99}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Controls", "Controls", "{F98C0329-C004-417F-B2AB-7466E88D8220}" @@ -76,6 +74,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "JobRunner", "Service.JobRun EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "LookupControlGui", "LookupControlGui\LookupControlGui.vbproj", "{B65E24B3-D334-455D-A0BF-B33B8358B013}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "MonoDiag", "LoggerDiag\MonoDiag.vbproj", "{3D437957-B90B-4D8F-9219-6D19B0C90994}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -110,10 +110,6 @@ Global {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}.Debug|Any CPU.Build.0 = Debug|Any CPU {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1}.Release|Any CPU.Build.0 = Release|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Debug|Any CPU.Build.0 = Debug|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Release|Any CPU.ActiveCfg = Release|Any CPU - {836C9ADE-E04E-4E1E-B17A-201E68014790}.Release|Any CPU.Build.0 = Release|Any CPU {44982F9B-6116-44E2-85D0-F39650B1EF99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44982F9B-6116-44E2-85D0-F39650B1EF99}.Debug|Any CPU.Build.0 = Debug|Any CPU {44982F9B-6116-44E2-85D0-F39650B1EF99}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -186,6 +182,10 @@ Global {B65E24B3-D334-455D-A0BF-B33B8358B013}.Debug|Any CPU.Build.0 = Debug|Any CPU {B65E24B3-D334-455D-A0BF-B33B8358B013}.Release|Any CPU.ActiveCfg = Release|Any CPU {B65E24B3-D334-455D-A0BF-B33B8358B013}.Release|Any CPU.Build.0 = Release|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D437957-B90B-4D8F-9219-6D19B0C90994}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -198,7 +198,6 @@ Global {EAF0EA75-5FA7-485D-89C7-B2D843B03A96} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {AF664D85-0A4B-4BAB-A2F8-83110C06553A} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {63B0EAA3-8BF5-46DA-9040-15E781F4C3B1} = {7AF3F9C2-C939-4A08-95C1-0453207E298A} - {836C9ADE-E04E-4E1E-B17A-201E68014790} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {44982F9B-6116-44E2-85D0-F39650B1EF99} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} {3DCD6D1A-C830-4241-B7E4-27430E7EA483} = {F98C0329-C004-417F-B2AB-7466E88D8220} {991D0231-4623-496D-8BD0-9CA906029CBC} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC} @@ -217,6 +216,7 @@ Global {7386AB04-DF8D-4DFB-809D-1FAC8212CB7E} = {CC368D6A-6AC4-4EB9-A092-14700FABEF7A} {926E6474-5613-4373-BB99-B101158B91EF} = {7AF3F9C2-C939-4A08-95C1-0453207E298A} {B65E24B3-D334-455D-A0BF-B33B8358B013} = {CC368D6A-6AC4-4EB9-A092-14700FABEF7A} + {3D437957-B90B-4D8F-9219-6D19B0C90994} = {8FFE925E-8B84-45F1-93CB-32B1C96F41EB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C1BE4090-A0FD-48AF-86CB-39099D14B286} diff --git a/DDZUGFeRDService/ThreadRunner.vb b/DDZUGFeRDService/ThreadRunner.vb index 45dbb8d5..d1ffbe67 100644 --- a/DDZUGFeRDService/ThreadRunner.vb +++ b/DDZUGFeRDService/ThreadRunner.vb @@ -20,6 +20,7 @@ Public Class ThreadRunner Private _successDirectory As String Private _errorDirectory As String Private _originalEmailDirectory As String + Private _attachmentDirectory As String Private _zugferd As ZUGFeRDInterface Private _jobArguments As WorkerArgs Private _mssql As MSSQLServer @@ -148,6 +149,9 @@ Public Class ThreadRunner Case ZUGFERD_REJECTED_EML args.RejectedEmailDirectory = row.Item("FOLDER_PATH") + Case ZUGFERD_ATTACHMENTS + args.AttachmentsSubDirectory = row.Item("FOLDER_PATH") + End Select Next diff --git a/Filesystem/Encryption.vb b/Filesystem/Encryption.vb index b7a3b95b..1ec620de 100644 --- a/Filesystem/Encryption.vb +++ b/Filesystem/Encryption.vb @@ -1,5 +1,6 @@ Imports System.IO Imports System.Security.Cryptography +Imports System.Text.Encoding Imports DigitalData.Modules.Logging ''' @@ -19,8 +20,6 @@ Public Class Encryption Private ReadOnly _password As String Private _logger As Logger - - Public Sub New(LogConfig As LogConfig, Password As String) _logger = LogConfig.GetLogger() @@ -31,13 +30,24 @@ Public Class Encryption _password = Password End Sub - Public Async Function EncryptAsync(oPlainTextBytes As Byte()) As Task(Of Byte()) + Public Async Function EncryptAsync(PlainTextBytes As Byte()) As Task(Of Byte()) Return Await Task.Run(Function() As Byte() - Return Encrypt(oPlainTextBytes) + Return Encrypt(PlainTextBytes) End Function) End Function - Public Function Encrypt(oPlainTextBytes As Byte()) As Byte() + Public Function Encrypt(PlainText As String) As String + Try + Dim oBytes As Byte() = UTF8.GetBytes(PlainText) + Dim oEncrypted As Byte() = Encrypt(oBytes) + Return UTF8.GetString(oEncrypted) + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Public Function Encrypt(PlainTextBytes As Byte()) As Byte() Try ' Salt and IV is randomly generated each time, but is preprended to encrypted cipher text ' so that the same Salt and IV values can be used when decrypting. @@ -53,7 +63,7 @@ Public Class Encryption Using oEncryptor = oSymmetricKey.CreateEncryptor(oKeyBytes, oIvStringBytes) Using oMemoryStream = New MemoryStream() Using oCryptoStream = New CryptoStream(oMemoryStream, oEncryptor, CryptoStreamMode.Write) - oCryptoStream.Write(oPlainTextBytes, 0, oPlainTextBytes.Length) + oCryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length) oCryptoStream.FlushFinalBlock() ' Create the final bytes as a concatenation of the random salt bytes, the random iv bytes and the cipher bytes. Dim oCipherTextBytes = oSaltStringBytes @@ -79,16 +89,27 @@ Public Class Encryption End Function) End Function - Public Function Decrypt(cipherTextBytesWithSaltAndIv As Byte()) As Byte() + Public Function Decrypt(CipherTextPlainWithSaltAndIv As String) As String + Try + Dim oBytes As Byte() = UTF8.GetBytes(CipherTextPlainWithSaltAndIv) + Dim oDecrypted As Byte() = Decrypt(oBytes) + Return UTF8.GetString(oDecrypted) + Catch ex As Exception + _logger.Error(ex) + Throw ex + End Try + End Function + + Public Function Decrypt(CipherTextBytesWithSaltAndIv As Byte()) As Byte() Try ' Get the complete stream of bytes that represent: ' [32 bytes of Salt] + [32 bytes of IV] + [n bytes of CipherText] ' Get the saltbytes by extracting the first 32 bytes from the supplied cipherText bytes. - Dim oSaltStringBytes = cipherTextBytesWithSaltAndIv.Take(KEY_SIZE / 8).ToArray() + Dim oSaltStringBytes = CipherTextBytesWithSaltAndIv.Take(KEY_SIZE / 8).ToArray() ' Get the IV bytes by extracting the next 32 bytes from the supplied cipherText bytes. - Dim oIvStringBytes = cipherTextBytesWithSaltAndIv.Skip(KEY_SIZE / 8).Take(KEY_SIZE / 8).ToArray() + Dim oIvStringBytes = CipherTextBytesWithSaltAndIv.Skip(KEY_SIZE / 8).Take(KEY_SIZE / 8).ToArray() ' Get the actual cipher text bytes by removing the first 64 bytes from the cipherText string. - Dim oCipherTextBytes = cipherTextBytesWithSaltAndIv.Skip((KEY_SIZE / 8) * 2).Take(cipherTextBytesWithSaltAndIv.Length - ((KEY_SIZE / 8) * 2)).ToArray() + Dim oCipherTextBytes = CipherTextBytesWithSaltAndIv.Skip((KEY_SIZE / 8) * 2).Take(CipherTextBytesWithSaltAndIv.Length - ((KEY_SIZE / 8) * 2)).ToArray() Using oPassword = New Rfc2898DeriveBytes(_password, oSaltStringBytes, DERIVATION_ITERATIONS) Dim oKeyBytes = oPassword.GetBytes(KEY_SIZE / 8) diff --git a/GUIs.ClientSuite/ApplicationEvents.vb b/GUIs.ClientSuite/ApplicationEvents.vb index c581efb4..e3e9c513 100644 --- a/GUIs.ClientSuite/ApplicationEvents.vb +++ b/GUIs.ClientSuite/ApplicationEvents.vb @@ -13,6 +13,7 @@ Namespace My Private _Logger As Logger Private _BaseUserConfigPath As String = Windows.Forms.Application.UserAppDataPath + Private _BaseLocalUserConfigPath As String = Windows.Forms.Application.LocalUserAppDataPath Private _BaseMachineConfigPath As String = Windows.Forms.Application.CommonAppDataPath Public Sub App_Startup() Handles Me.Startup @@ -20,11 +21,11 @@ Namespace My ' System Config files like Service Url will be saved in %LocalAppdata% so they will remain on the machine Dim oSystemConfigManager As New ConfigManager(Of ClassConfig)(oLogConfig, - Windows.Forms.Application.UserAppDataPath, - Windows.Forms.Application.CommonAppDataPath) + _BaseLocalUserConfigPath, + _BaseMachineConfigPath) ' Layout files will be saved in %Appdata% (Roaming) so they will be syncronized with the user profile - Dim oUIConfigPath = IO.Path.Combine(Windows.Forms.Application.UserAppDataPath, ClassConstants.FOLDER_NAME_LAYOUT) + Dim oUIConfigPath = IO.Path.Combine(_BaseUserConfigPath, ClassConstants.FOLDER_NAME_LAYOUT) Dim oUIConfigManager As New ConfigManager(Of ClassUIConfig)(oLogConfig, oUIConfigPath, oUIConfigPath) LogConfig = oLogConfig diff --git a/GUIs.ClientSuite/ClassPanelManager.vb b/GUIs.ClientSuite/ClassPanelManager.vb index 123e831e..a127fde9 100644 --- a/GUIs.ClientSuite/ClassPanelManager.vb +++ b/GUIs.ClientSuite/ClassPanelManager.vb @@ -40,9 +40,8 @@ Public Class PanelManager Private Sub View_DocumentDeactivated(sender As Object, e As DocumentEventArgs) Dim oDocument As BaseDocument = e.Document - ' TODO: oDocument.Control can be nothing - Dim oHashcode As Integer = oDocument.Control.GetHashCode + ' TODO: oDocument.Control can be nothing If oDocument Is Nothing Then Exit Sub End If @@ -51,7 +50,7 @@ Public Class PanelManager For Each oPanel As DockPanel In _dockManager.Panels Dim oTag As Integer = oPanel.Tag - If oTag = oHashcode Then + If oTag = oDocument.Control.GetHashCode Then oPanel.Hide() End If Next diff --git a/GUIs.ClientSuite/ClientSuite.vbproj b/GUIs.ClientSuite/ClientSuite.vbproj index f10fbcc8..4232a45d 100644 --- a/GUIs.ClientSuite/ClientSuite.vbproj +++ b/GUIs.ClientSuite/ClientSuite.vbproj @@ -69,6 +69,7 @@ + @@ -86,9 +87,9 @@ ..\packages\FirebirdSql.EntityFrameworkCore.Firebird.6.4.0\lib\netstandard2.0\FirebirdSql.EntityFrameworkCore.Firebird.dll + - False - ..\Modules.Logging\bin\Debug\NLog.dll + ..\packages\NLog.4.5.11\lib\net45\NLog.dll ..\packages\jacobslusser.ScintillaNET.3.6.3\lib\net40\ScintillaNET.dll @@ -101,6 +102,7 @@ + @@ -168,10 +170,16 @@ Form - + + frmWorkflowOverview.vb + + + Form + + frmWorkflowStep.vb - + Form @@ -197,6 +205,20 @@ + + GridOverview.vb + + + UserControl + + + NavControlOverview.vb + + + UserControl + + + DockManagerTest.vb @@ -330,7 +352,10 @@ frmFormDesigner.vb - + + frmWorkflowOverview.vb + + frmWorkflowStep.vb @@ -339,6 +364,12 @@ DocumentPanel.vb + + GridOverview.vb + + + NavControlOverview.vb + DockManagerTest.vb @@ -490,7 +521,17 @@ - + + + + + + + + + + + \ No newline at end of file diff --git a/GUIs.ClientSuite/Common/ClassCommonViews.vb b/GUIs.ClientSuite/Common/ClassCommonViews.vb index ae25cbf6..9cb0a812 100644 --- a/GUIs.ClientSuite/Common/ClassCommonViews.vb +++ b/GUIs.ClientSuite/Common/ClassCommonViews.vb @@ -51,4 +51,26 @@ Public Class ClassCommonViews Throw ex End Try End Function + + Public Async Function VWIDB_GUI_WF_OVERVIEW(UserId As Int64, FormId As Int64) As Task(Of DataTable) + Try + My.Channel.CreateDatabaseRequest("Load Control Data", True) + + Dim oSQL As String = $"SELECT * FROM VWIDB_GUI_WF_OVERVIEW WHERE USERID = {UserId} AND FORMID = {FormId}" + Dim oResult = Await My.Channel.ReturnDatatableAsync(oSQL) + Dim oTable = oResult.Table + + If Not oResult.OK Then + _Logger.Error(New ApplicationException(oResult.ErrorMessage)) + Return Nothing + End If + + My.Channel.CloseDatabaseRequest() + + Return oResult.Table + Catch ex As Exception + _Logger.Error(ex) + Throw ex + End Try + End Function End Class diff --git a/GUIs.ClientSuite/ModuleWorkflow/GridOverview.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.Designer.vb new file mode 100644 index 00000000..15a1c6bd --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.Designer.vb @@ -0,0 +1,74 @@ + _ +Partial Class GridOverview + Inherits System.Windows.Forms.UserControl + + 'UserControl überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + _ + Private Sub InitializeComponent() + Me.GridControl = New DevExpress.XtraGrid.GridControl() + Me.gvOverview = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView() + CType(Me.GridControl, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'GridControl + ' + Me.GridControl.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridControl.Location = New System.Drawing.Point(0, 0) + Me.GridControl.MainView = Me.gvOverview + Me.GridControl.Name = "GridControl" + Me.GridControl.Size = New System.Drawing.Size(626, 461) + Me.GridControl.TabIndex = 1 + Me.GridControl.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.gvOverview, Me.GridView1}) + ' + 'gvOverview + ' + Me.gvOverview.GridControl = Me.GridControl + Me.gvOverview.Name = "gvOverview" + Me.gvOverview.OptionsFind.AlwaysVisible = True + Me.gvOverview.OptionsView.GroupDrawMode = DevExpress.XtraGrid.Views.Grid.GroupDrawMode.Office + Me.gvOverview.OptionsView.ShowGroupedColumns = True + Me.gvOverview.OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.[True] + ' + 'GridView1 + ' + Me.GridView1.GridControl = Me.GridControl + Me.GridView1.Name = "GridView1" + ' + 'GridOverview + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.GridControl) + Me.Name = "GridOverview" + Me.Size = New System.Drawing.Size(626, 461) + CType(Me.GridControl, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.gvOverview, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents GridControl As DevExpress.XtraGrid.GridControl + Friend WithEvents gvOverview As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView +End Class diff --git a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.resx b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.resx similarity index 100% rename from GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.resx rename to GUIs.ClientSuite/ModuleWorkflow/GridOverview.resx diff --git a/GUIs.ClientSuite/ModuleWorkflow/GridOverview.vb b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.vb new file mode 100644 index 00000000..9020cd81 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/GridOverview.vb @@ -0,0 +1,27 @@ +Public Class GridOverview + Private _DataSource As List(Of WorkflowItem) + + Public Property DataSource As List(Of WorkflowItem) + Get + Return _DataSource + End Get + Set(value As List(Of WorkflowItem)) + _DataSource = value + GridControl.DataSource = value + + If Not IsNothing(value) Then + ApplyStyles() + End If + End Set + End Property + + Private Sub ApplyStyles() + With gvOverview.Columns.Item("StateImage") + .VisibleIndex = 0 + .MaxWidth = 20 + .OptionsColumn.ShowCaption = False + End With + gvOverview.Columns.Item("Process").VisibleIndex = 1 + gvOverview.Columns.Item("State").Visible = False + End Sub +End Class diff --git a/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.Designer.vb new file mode 100644 index 00000000..56bf792f --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.Designer.vb @@ -0,0 +1,60 @@ + _ +Partial Class NavControlOverview + Inherits System.Windows.Forms.UserControl + + 'UserControl überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + _ + Private Sub InitializeComponent() + Me.NavBarControl = New DevExpress.XtraNavBar.NavBarControl() + Me.NavBarGroup1 = New DevExpress.XtraNavBar.NavBarGroup() + CType(Me.NavBarControl, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'NavBarControl + ' + Me.NavBarControl.ActiveGroup = Me.NavBarGroup1 + Me.NavBarControl.Dock = System.Windows.Forms.DockStyle.Fill + Me.NavBarControl.Groups.AddRange(New DevExpress.XtraNavBar.NavBarGroup() {Me.NavBarGroup1}) + Me.NavBarControl.Location = New System.Drawing.Point(0, 0) + Me.NavBarControl.Name = "NavBarControl" + Me.NavBarControl.Size = New System.Drawing.Size(150, 150) + Me.NavBarControl.TabIndex = 0 + Me.NavBarControl.Text = "NavBarControl1" + ' + 'NavBarGroup1 + ' + Me.NavBarGroup1.Caption = "Workflow" + Me.NavBarGroup1.Expanded = True + Me.NavBarGroup1.Name = "NavBarGroup1" + ' + 'NavControlOverview + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.Controls.Add(Me.NavBarControl) + Me.Name = "NavControlOverview" + CType(Me.NavBarControl, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents NavBarControl As DevExpress.XtraNavBar.NavBarControl + Friend WithEvents NavBarGroup1 As DevExpress.XtraNavBar.NavBarGroup +End Class diff --git a/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.resx b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.vb b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.vb new file mode 100644 index 00000000..d2150829 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/NavControlOverview.vb @@ -0,0 +1,40 @@ +Imports DevExpress.XtraNavBar + +Public Class NavControlOverview + Private _DataSource As List(Of WorkflowItem) + + Public Property DataSource As List(Of WorkflowItem) + Get + Return _DataSource + End Get + Set(value As List(Of WorkflowItem)) + _DataSource = value + + 'TODO: Update Navbar Items + If Not IsNothing(value) Then + UpdateItems(value) + End If + + End Set + End Property + + Private Sub UpdateItems(WorkflowItems As List(Of WorkflowItem)) + Dim oTotalItems = WorkflowItems.Count + Dim oGroupedItems = WorkflowItems.GroupBy(Function(Item As WorkflowItem) + Return Item.Process + End Function) + + AddItem("Alle Workflows", oTotalItems) + + For Each oGroupedItem As IGrouping(Of String, WorkflowItem) In oGroupedItems + AddItem(oGroupedItem.Key, oGroupedItem.Count) + Next + End Sub + + Private Sub AddItem(Title As String, Count As Integer) + Dim oItem = New NavBarItem() With { + .Caption = $"{Title} ({Count})" + } + NavBarControl.Groups.First().ItemLinks.Add(oItem) + End Sub +End Class diff --git a/GUIs.ClientSuite/ModuleWorkflow/WorkflowDetail.vb b/GUIs.ClientSuite/ModuleWorkflow/WorkflowDetail.vb new file mode 100644 index 00000000..089ffd99 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/WorkflowDetail.vb @@ -0,0 +1,3 @@ +Public Class WorkflowDetail + Public Property Title +End Class diff --git a/GUIs.ClientSuite/ModuleWorkflow/WorkflowItem.vb b/GUIs.ClientSuite/ModuleWorkflow/WorkflowItem.vb new file mode 100644 index 00000000..5b34c9b2 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/WorkflowItem.vb @@ -0,0 +1,39 @@ +Imports System.ComponentModel +Imports DigitalData.GUIs.ClientSuite + +Public Class WorkflowItem + Implements INotifyPropertyChanged + + Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged + + Private _state As String + + Public Property Title As String + Public Property CreatedAt As DateTime + Public Property Process As String + + Public Property IconMap As Dictionary(Of String, String) + Public Property StateImage As Image + Public Property State As String + Get + Return _state + End Get + Set(value As String) + _state = value + StateImage = GetIcon(value, IconMap) + End Set + End Property + + Public Sub New(IconMap As Dictionary(Of String, String)) + Me.IconMap = IconMap + End Sub + + Private Function GetIcon(StateName As String, IconMap As Dictionary(Of String, String)) As Image + If IconMap.ContainsKey(StateName) Then + Dim IconName = IconMap.Item(StateName) + Return My.Resources.ResourceManager.GetObject(IconName) + Else + Return Nothing + End If + End Function +End Class diff --git a/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.Designer.vb new file mode 100644 index 00000000..dfcaaf9a --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.Designer.vb @@ -0,0 +1,337 @@ + +Partial Class frmWorkflowOverview + Inherits DigitalData.GUIs.ClientSuite.Base.BaseRibbonForm + + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmWorkflowOverview)) + Dim TableColumnDefinition1 As DevExpress.XtraEditors.TableLayout.TableColumnDefinition = New DevExpress.XtraEditors.TableLayout.TableColumnDefinition() + Dim TableColumnDefinition2 As DevExpress.XtraEditors.TableLayout.TableColumnDefinition = New DevExpress.XtraEditors.TableLayout.TableColumnDefinition() + Dim TableColumnDefinition3 As DevExpress.XtraEditors.TableLayout.TableColumnDefinition = New DevExpress.XtraEditors.TableLayout.TableColumnDefinition() + Dim TableRowDefinition1 As DevExpress.XtraEditors.TableLayout.TableRowDefinition = New DevExpress.XtraEditors.TableLayout.TableRowDefinition() + Dim TableRowDefinition2 As DevExpress.XtraEditors.TableLayout.TableRowDefinition = New DevExpress.XtraEditors.TableLayout.TableRowDefinition() + Dim TableRowDefinition3 As DevExpress.XtraEditors.TableLayout.TableRowDefinition = New DevExpress.XtraEditors.TableLayout.TableRowDefinition() + Dim TableSpan1 As DevExpress.XtraEditors.TableLayout.TableSpan = New DevExpress.XtraEditors.TableLayout.TableSpan() + Dim TileViewItemElement1 As DevExpress.XtraGrid.Views.Tile.TileViewItemElement = New DevExpress.XtraGrid.Views.Tile.TileViewItemElement() + Dim WindowsUIButtonImageOptions1 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() + Dim WindowsUIButtonImageOptions2 As DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions = New DevExpress.XtraBars.Docking2010.WindowsUIButtonImageOptions() + Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl() + Me.BarCheckItem1 = New DevExpress.XtraBars.BarCheckItem() + Me.BarCheckItem2 = New DevExpress.XtraBars.BarCheckItem() + Me.BarCheckItem3 = New DevExpress.XtraBars.BarCheckItem() + Me.RibbonPageCategory1 = New DevExpress.XtraBars.Ribbon.RibbonPageCategory() + Me.RibbonPage3 = New DevExpress.XtraBars.Ribbon.RibbonPage() + Me.RibbonPageGroup3 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() + Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() + Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage() + Me.SplitContainerControl1 = New DevExpress.XtraEditors.SplitContainerControl() + Me.NavControlOverview = New DigitalData.GUIs.ClientSuite.NavControlOverview() + Me.GridWorkflowDetails = New DevExpress.XtraGrid.GridControl() + Me.tvDetails = New DevExpress.XtraGrid.Views.Tile.TileView() + Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl() + Me.WindowsUIButtonPanel1 = New DevExpress.XtraBars.Docking2010.WindowsUIButtonPanel() + Me.LayoutControlGroup1 = New DevExpress.XtraLayout.LayoutControlGroup() + Me.SimpleLabelItem1 = New DevExpress.XtraLayout.SimpleLabelItem() + Me.LayoutControlItem2 = New DevExpress.XtraLayout.LayoutControlItem() + Me.SimpleLabelItem2 = New DevExpress.XtraLayout.SimpleLabelItem() + Me.SimpleLabelItem3 = New DevExpress.XtraLayout.SimpleLabelItem() + Me.GridOverview = New DigitalData.GUIs.ClientSuite.GridOverview() + CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SplitContainerControl1.SuspendLayout() + CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.LayoutControl1.SuspendLayout() + CType(Me.LayoutControlGroup1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SimpleLabelItem1, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.LayoutControlItem2, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SimpleLabelItem2, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.SimpleLabelItem3, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'RibbonControl1 + ' + Me.RibbonControl1.ExpandCollapseItem.Id = 0 + Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.BarCheckItem1, Me.BarCheckItem2, Me.BarCheckItem3}) + Me.RibbonControl1.Location = New System.Drawing.Point(0, 0) + Me.RibbonControl1.MaxItemId = 7 + Me.RibbonControl1.Name = "RibbonControl1" + Me.RibbonControl1.PageCategories.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageCategory() {Me.RibbonPageCategory1}) + Me.RibbonControl1.Size = New System.Drawing.Size(1134, 146) + Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1 + ' + 'BarCheckItem1 + ' + Me.BarCheckItem1.Caption = "Alle" + Me.BarCheckItem1.CheckStyle = DevExpress.XtraBars.BarCheckStyles.Radio + Me.BarCheckItem1.Id = 3 + Me.BarCheckItem1.ImageOptions.Image = CType(resources.GetObject("BarCheckItem1.ImageOptions.Image"), System.Drawing.Image) + Me.BarCheckItem1.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem1.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarCheckItem1.Name = "BarCheckItem1" + ' + 'BarCheckItem2 + ' + Me.BarCheckItem2.Caption = "Aktuell verantwortlich" + Me.BarCheckItem2.CheckStyle = DevExpress.XtraBars.BarCheckStyles.Radio + Me.BarCheckItem2.Id = 4 + Me.BarCheckItem2.ImageOptions.Image = CType(resources.GetObject("BarCheckItem2.ImageOptions.Image"), System.Drawing.Image) + Me.BarCheckItem2.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem2.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarCheckItem2.Name = "BarCheckItem2" + ' + 'BarCheckItem3 + ' + Me.BarCheckItem3.Caption = "Beteiligt" + Me.BarCheckItem3.CheckStyle = DevExpress.XtraBars.BarCheckStyles.Radio + Me.BarCheckItem3.Id = 6 + Me.BarCheckItem3.ImageOptions.Image = CType(resources.GetObject("BarCheckItem3.ImageOptions.Image"), System.Drawing.Image) + Me.BarCheckItem3.ImageOptions.LargeImage = CType(resources.GetObject("BarCheckItem3.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarCheckItem3.Name = "BarCheckItem3" + ' + 'RibbonPageCategory1 + ' + Me.RibbonPageCategory1.Name = "RibbonPageCategory1" + Me.RibbonPageCategory1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage3}) + Me.RibbonPageCategory1.Text = "Worflows" + ' + 'RibbonPage3 + ' + Me.RibbonPage3.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup3}) + Me.RibbonPage3.Name = "RibbonPage3" + Me.RibbonPage3.Text = "Allgemein" + ' + 'RibbonPageGroup3 + ' + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarCheckItem1) + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarCheckItem3) + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarCheckItem2) + Me.RibbonPageGroup3.Name = "RibbonPageGroup3" + Me.RibbonPageGroup3.Text = "Verantwortlichkeit" + ' + 'RibbonStatusBar1 + ' + Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 702) + Me.RibbonStatusBar1.Name = "RibbonStatusBar1" + Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1 + Me.RibbonStatusBar1.Size = New System.Drawing.Size(1134, 21) + ' + 'RibbonPage2 + ' + Me.RibbonPage2.Name = "RibbonPage2" + Me.RibbonPage2.Text = "RibbonPage2" + ' + 'SplitContainerControl1 + ' + Me.SplitContainerControl1.Dock = System.Windows.Forms.DockStyle.Fill + Me.SplitContainerControl1.Location = New System.Drawing.Point(0, 146) + Me.SplitContainerControl1.Name = "SplitContainerControl1" + Me.SplitContainerControl1.Panel1.Controls.Add(Me.GridOverview) + Me.SplitContainerControl1.Panel1.Controls.Add(Me.NavControlOverview) + Me.SplitContainerControl1.Panel1.Text = "Panel1" + Me.SplitContainerControl1.Panel2.Controls.Add(Me.GridWorkflowDetails) + Me.SplitContainerControl1.Panel2.Controls.Add(Me.LayoutControl1) + Me.SplitContainerControl1.Panel2.Text = "Panel2" + Me.SplitContainerControl1.Size = New System.Drawing.Size(1134, 556) + Me.SplitContainerControl1.SplitterPosition = 841 + Me.SplitContainerControl1.TabIndex = 5 + Me.SplitContainerControl1.Text = "SplitContainerControl1" + ' + 'NavControlOverview + ' + Me.NavControlOverview.DataSource = Nothing + Me.NavControlOverview.Dock = System.Windows.Forms.DockStyle.Left + Me.NavControlOverview.Location = New System.Drawing.Point(0, 0) + Me.NavControlOverview.Name = "NavControlOverview" + Me.NavControlOverview.Size = New System.Drawing.Size(185, 556) + Me.NavControlOverview.TabIndex = 1 + ' + 'GridWorkflowDetails + ' + Me.GridWorkflowDetails.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridWorkflowDetails.Location = New System.Drawing.Point(0, 166) + Me.GridWorkflowDetails.MainView = Me.tvDetails + Me.GridWorkflowDetails.MenuManager = Me.RibbonControl1 + Me.GridWorkflowDetails.Name = "GridWorkflowDetails" + Me.GridWorkflowDetails.Size = New System.Drawing.Size(281, 390) + Me.GridWorkflowDetails.TabIndex = 1 + Me.GridWorkflowDetails.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.tvDetails}) + ' + 'tvDetails + ' + Me.tvDetails.GridControl = Me.GridWorkflowDetails + Me.tvDetails.Name = "tvDetails" + Me.tvDetails.OptionsTiles.ItemSize = New System.Drawing.Size(248, 123) + Me.tvDetails.OptionsTiles.LayoutMode = DevExpress.XtraGrid.Views.Tile.TileViewLayoutMode.List + Me.tvDetails.TileColumns.Add(TableColumnDefinition1) + Me.tvDetails.TileColumns.Add(TableColumnDefinition2) + Me.tvDetails.TileColumns.Add(TableColumnDefinition3) + TableRowDefinition1.Length.Value = 15.0R + TableRowDefinition2.Length.Value = 13.0R + TableRowDefinition3.Length.Value = 13.0R + Me.tvDetails.TileRows.Add(TableRowDefinition1) + Me.tvDetails.TileRows.Add(TableRowDefinition2) + Me.tvDetails.TileRows.Add(TableRowDefinition3) + TableSpan1.ColumnSpan = 2 + TableSpan1.RowSpan = 2 + Me.tvDetails.TileSpans.Add(TableSpan1) + TileViewItemElement1.ImageOptions.ImageAlignment = DevExpress.XtraEditors.TileItemContentAlignment.MiddleCenter + TileViewItemElement1.ImageOptions.ImageScaleMode = DevExpress.XtraEditors.TileItemImageScaleMode.ZoomInside + TileViewItemElement1.Text = "element1" + TileViewItemElement1.TextAlignment = DevExpress.XtraEditors.TileItemContentAlignment.MiddleCenter + Me.tvDetails.TileTemplate.Add(TileViewItemElement1) + ' + 'LayoutControl1 + ' + Me.LayoutControl1.Controls.Add(Me.WindowsUIButtonPanel1) + Me.LayoutControl1.Dock = System.Windows.Forms.DockStyle.Top + Me.LayoutControl1.Location = New System.Drawing.Point(0, 0) + Me.LayoutControl1.Name = "LayoutControl1" + Me.LayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = New System.Drawing.Rectangle(1186, 56, 650, 400) + Me.LayoutControl1.Root = Me.LayoutControlGroup1 + Me.LayoutControl1.Size = New System.Drawing.Size(281, 166) + Me.LayoutControl1.TabIndex = 0 + Me.LayoutControl1.Text = "LayoutControl1" + ' + 'WindowsUIButtonPanel1 + ' + WindowsUIButtonImageOptions1.Image = CType(resources.GetObject("WindowsUIButtonImageOptions1.Image"), System.Drawing.Image) + WindowsUIButtonImageOptions2.Image = CType(resources.GetObject("WindowsUIButtonImageOptions2.Image"), System.Drawing.Image) + Me.WindowsUIButtonPanel1.Buttons.AddRange(New DevExpress.XtraEditors.ButtonPanel.IBaseButton() {New DevExpress.XtraBars.Docking2010.WindowsUIButton("Verlängerung", True, WindowsUIButtonImageOptions1, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False), New DevExpress.XtraBars.Docking2010.WindowsUIButton("Kündigung", True, WindowsUIButtonImageOptions2, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, True, Nothing, True, False, True, Nothing, -1, False)}) + Me.WindowsUIButtonPanel1.ContentAlignment = System.Drawing.ContentAlignment.MiddleLeft + Me.WindowsUIButtonPanel1.Location = New System.Drawing.Point(12, 96) + Me.WindowsUIButtonPanel1.Name = "WindowsUIButtonPanel1" + Me.WindowsUIButtonPanel1.Size = New System.Drawing.Size(257, 55) + Me.WindowsUIButtonPanel1.TabIndex = 0 + Me.WindowsUIButtonPanel1.Text = "WindowsUIButtonPanel1" + ' + 'LayoutControlGroup1 + ' + Me.LayoutControlGroup1.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.[True] + Me.LayoutControlGroup1.GroupBordersVisible = False + Me.LayoutControlGroup1.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.SimpleLabelItem1, Me.LayoutControlItem2, Me.SimpleLabelItem2, Me.SimpleLabelItem3}) + Me.LayoutControlGroup1.Name = "Root" + Me.LayoutControlGroup1.Size = New System.Drawing.Size(281, 166) + Me.LayoutControlGroup1.TextVisible = False + ' + 'SimpleLabelItem1 + ' + Me.SimpleLabelItem1.AllowHotTrack = False + Me.SimpleLabelItem1.AppearanceItemCaption.Font = New System.Drawing.Font("Segoe UI", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.SimpleLabelItem1.AppearanceItemCaption.ForeColor = System.Drawing.SystemColors.MenuHighlight + Me.SimpleLabelItem1.AppearanceItemCaption.Options.UseFont = True + Me.SimpleLabelItem1.AppearanceItemCaption.Options.UseForeColor = True + Me.SimpleLabelItem1.Location = New System.Drawing.Point(0, 0) + Me.SimpleLabelItem1.Name = "SimpleLabelItem1" + Me.SimpleLabelItem1.Size = New System.Drawing.Size(261, 34) + Me.SimpleLabelItem1.Text = "Vertragsnr. 4711" + Me.SimpleLabelItem1.TextSize = New System.Drawing.Size(151, 30) + ' + 'LayoutControlItem2 + ' + Me.LayoutControlItem2.Control = Me.WindowsUIButtonPanel1 + Me.LayoutControlItem2.Location = New System.Drawing.Point(0, 84) + Me.LayoutControlItem2.Name = "LayoutControlItem2" + Me.LayoutControlItem2.Size = New System.Drawing.Size(261, 62) + Me.LayoutControlItem2.TextSize = New System.Drawing.Size(0, 0) + Me.LayoutControlItem2.TextVisible = False + ' + 'SimpleLabelItem2 + ' + Me.SimpleLabelItem2.AllowHotTrack = False + Me.SimpleLabelItem2.AppearanceItemCaption.Font = New System.Drawing.Font("Segoe UI", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.SimpleLabelItem2.AppearanceItemCaption.Options.UseFont = True + Me.SimpleLabelItem2.Location = New System.Drawing.Point(0, 59) + Me.SimpleLabelItem2.Name = "SimpleLabelItem2" + Me.SimpleLabelItem2.Size = New System.Drawing.Size(261, 25) + Me.SimpleLabelItem2.Text = "Sunshine GmbH" + Me.SimpleLabelItem2.TextSize = New System.Drawing.Size(151, 21) + ' + 'SimpleLabelItem3 + ' + Me.SimpleLabelItem3.AllowHotTrack = False + Me.SimpleLabelItem3.AppearanceItemCaption.Font = New System.Drawing.Font("Segoe UI", 12.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.SimpleLabelItem3.AppearanceItemCaption.Options.UseFont = True + Me.SimpleLabelItem3.Location = New System.Drawing.Point(0, 34) + Me.SimpleLabelItem3.Name = "SimpleLabelItem3" + Me.SimpleLabelItem3.Size = New System.Drawing.Size(261, 25) + Me.SimpleLabelItem3.Text = "Objekt: Haus Nr. 9" + Me.SimpleLabelItem3.TextSize = New System.Drawing.Size(151, 21) + ' + 'GridOverview1 + ' + Me.GridOverview.Dock = System.Windows.Forms.DockStyle.Fill + Me.GridOverview.Location = New System.Drawing.Point(185, 0) + Me.GridOverview.Name = "GridOverview1" + Me.GridOverview.Size = New System.Drawing.Size(656, 556) + Me.GridOverview.TabIndex = 2 + ' + 'frmWorkflowOverview + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(1134, 723) + Me.Controls.Add(Me.SplitContainerControl1) + Me.Controls.Add(Me.RibbonStatusBar1) + Me.Controls.Add(Me.RibbonControl1) + Me.Name = "frmWorkflowOverview" + Me.Ribbon = Me.RibbonControl1 + Me.StatusBar = Me.RibbonStatusBar1 + Me.Text = "Workflow Übersicht" + CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).EndInit() + Me.SplitContainerControl1.ResumeLayout(False) + CType(Me.GridWorkflowDetails, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.tvDetails, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).EndInit() + Me.LayoutControl1.ResumeLayout(False) + CType(Me.LayoutControlGroup1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SimpleLabelItem1, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.LayoutControlItem2, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SimpleLabelItem2, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.SimpleLabelItem3, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents RibbonControl1 As DevExpress.XtraBars.Ribbon.RibbonControl + Friend WithEvents RibbonStatusBar1 As DevExpress.XtraBars.Ribbon.RibbonStatusBar + Friend WithEvents RibbonPage2 As DevExpress.XtraBars.Ribbon.RibbonPage + Friend WithEvents RibbonPageCategory1 As DevExpress.XtraBars.Ribbon.RibbonPageCategory + Friend WithEvents RibbonPage3 As DevExpress.XtraBars.Ribbon.RibbonPage + Friend WithEvents RibbonPageGroup3 As DevExpress.XtraBars.Ribbon.RibbonPageGroup + Friend WithEvents SplitContainerControl1 As DevExpress.XtraEditors.SplitContainerControl + Friend WithEvents GridWorkflowDetails As DevExpress.XtraGrid.GridControl + Friend WithEvents LayoutControl1 As DevExpress.XtraLayout.LayoutControl + Friend WithEvents LayoutControlGroup1 As DevExpress.XtraLayout.LayoutControlGroup + Friend WithEvents BarCheckItem1 As DevExpress.XtraBars.BarCheckItem + Friend WithEvents BarCheckItem2 As DevExpress.XtraBars.BarCheckItem + Friend WithEvents BarCheckItem3 As DevExpress.XtraBars.BarCheckItem + Friend WithEvents WindowsUIButtonPanel1 As DevExpress.XtraBars.Docking2010.WindowsUIButtonPanel + Friend WithEvents SimpleLabelItem1 As DevExpress.XtraLayout.SimpleLabelItem + Friend WithEvents LayoutControlItem2 As DevExpress.XtraLayout.LayoutControlItem + Friend WithEvents SimpleLabelItem2 As DevExpress.XtraLayout.SimpleLabelItem + Friend WithEvents SimpleLabelItem3 As DevExpress.XtraLayout.SimpleLabelItem + Friend WithEvents tvDetails As DevExpress.XtraGrid.Views.Tile.TileView + Friend WithEvents NavControlOverview As NavControlOverview + Friend WithEvents GridOverview As GridOverview +End Class diff --git a/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.resx b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.resx new file mode 100644 index 00000000..8a96f180 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.resx @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1w5 + 6BYAAADzSURBVDhPpdA9CsJAEAVglYBYeQYPoJ2tBxDEMq2FJ5BASsVrWNhqmc4rKHgJsbAXTKXre2En + TNZJESw+iPPzzKTlnPuLWWyifJhtT23YwdPbQwfMuhUwBhdgzaxbAbEauMISIm8BZ5B+bAWkvvmBunPe + wJnUCujDCy5Qdw57nOn/BPiQBA6gzxGssZfoHb3MW4cwADlHY429EURlAH50YQM3uMMU5BxZLl4b2OMM + Z7nTY8AR9D/RCniO/OYza3qGMgbkqvCANcg5E694bWCPMzKfl9/Af4fwnLlXeW29EwZY54QyvRMG6HPq + 5HqnEtCca30Bw6t+WSTe8moAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAYdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1w5 + 6BYAAAJ9SURBVFhHxdbNq41RFMfx461wURSljExuESJCoRiR7kAmTBhgoJiJgUxu/gKGElJckpFEGVFC + XiciRt4Zka6IPL6/2/Oc1l7P2veeczs9Bp/u2WuvtfY+z8s+t1UUxX8VBpvUGhi8kbMR1/EZv/EFN7EJ + Ub50XRMGsQZ/UAQU34Be1GQ3cB5Ro8ol9KImu4EniJpUnqIXNdkNvIJvUDmHlfA1c7AWZ/EXvu41fE24 + gWXI3ctBKGcX7sA+bHexGxNwFL5WPZcgWS8ZlAbgi2UYM3DMxCLHMQ3fTKyi3sl6yaA0Fc/gi+9hOr6b + WOQHZuG2iYl6qneyXjIwdCltsVzDahfLWQ/l29ge1NaqBUr6pp9gG5zEVhfLUd4JM1avPtTWqgWMzfiF + qom+/QEzHs1BrCo/q8cWRGuMugHRG3EK97EQeg78YpEHWIQzqD35VhjEZESFtxAt6CnP1qmXetrYCB9Y + gP14jI+YBzuvRrkzoqL5pbA9dU6op3pr3O5ZfZiN09ChYpu9wV7ofm7HJPjXy9MBpcNoMfbhHey81tBa + WnNkA3PxEjYpR6/XNhfzNL/OxSI67udrA0MmOJarUM1FE7MuQPPKi+a9ISXriI0mc3ZgCg5Bt0ixtzgC + 3aKdZawTw9pAdGZHXkCLi+6xamWm+Tyx/KvnRflRH+trVdipfujyHzYxS7+CV6C8aL6m9k9ikKRfQF3e + 56h2rtNND5vN06W3r6jyVad6m5eslwzEJetp9q+R9RCX8cjEPNWrT7uvXS8ZiElcjm4f0Bz1WYGuNtDp + sdup9vFs10sGUiXhJ6JG46V+XW3gA6JG4/UeY2+gaWGwSWGwSWGwOUXrHy0ANvXoR9wdAAAAAElFTkSu + QmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAATdEVYdFRpdGxlAFBlb3BsZTtBc3NpZ25+WIkkAAAA + 4ElEQVQ4T6XRPQ4BURQF4ClEr1FrSSSiokLPGuxEQqbQWIRFSKYXCWuwAmoKRJ5zJu/Ke/fd0Si+MRnn + nMxP5pz7S3nI81wbwAHu3hFGkGStgRpcwClXqEOUtwbaoMuiA1HeGhiDVaYJRHlrYA1WmfhflLcGhvAG + XeY1vtwobw3QHvQAryXZqgF+sidImeet2arIYOF/S1UDNIeT1wvKTspkDTRgA99v7sNSrhzoww5ewNve + QheaCIbliAxM4QHyzCGWl7ooZOCsSiF5aeFI8gg3VdL0SDLwU1gAjvjzIvsAqlQYjVXYUosAAAAASUVO + RK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAATdEVYdFRpdGxlAFBlb3BsZTtBc3NpZ25+WIkkAAAB + 0UlEQVRYR8XWsStFYRgG8DNIGQyKrIrFwG69UhSD8sfIcON2B2UmBnZlMCoWVjYZlBSxIWUg5HgenXP6 + vu88597zHjeGX3K+732fx7mUKI7jf+V902w2y5iFXbiDj8Q97ME8qBmpSoENiNvYATWbYy0wDSpQWQC1 + w2MtwNeuwpR9UDs81gKXoMKUK1A7PNYCL6DClGdQOzzWAiqoyBuoHR5LgRqooFY4o3ZlLAU2QYW0whm1 + K2MpsAoqpBXOqF0ZS4FheAQVpPAuZ9SujKUA1UGFKYugdnisBcZAhSm8q3Z4rAXoEFSg6wjUbE6VAuPw + CiqYeMY7ajanSgGagXcIw/mMZ2pGqlqgGx4gLPAEPFMzUtUCNABLwN+JE1iGQVB3C1kLTMB68EzZBt5V + Z54yBYagARfA18x/v0ZA3SX++X0B73KmNtc4iKCefM0pKtAHW8BA93OmY+gB9z71whmk91aSEIbHaWBI + FRiF62RJkVOYhK7EFJxDeh6Gly7QDzfOonY+E+4zFV66wFqwzCr9rMPwQmEBy0+vMJhvQIYpYQG11CJ9 + A6VLhAVug4VVFJXIPndXWODXggC3RHj2wyvQCSIkLaHO/qQAsYR63vkCNnH0DUZ2qvqAgwutAAAAAElF + TkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAcdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1Vz + ZXKTe2BJAAAA8klEQVQ4T6XQvw7BUBQG8BKJmPoMHoDN6gEsxq4GTyCiI29hMBgx9jFIvIQY7BKduL6v + uac5vU6HxvBL6vz59DRyzv3FLDZRPqwO2xbs4OntoQ1m3QoYgQuwZtatgEQNXGEOHW8GZ5B+YgWkvvmB + unPewJnUCojhBReoO4c9zsQ/AT5kCUfQ5wjW2FvqHb3MWwfQBzlHY429IXTKAPzowgZucIcJyDmyXLw2 + sMcZznKnx4AT6H+iBfAc+c1n1vQMZQzIVeEBa5Bzxl7x2sAeZ2Q+L7+B/w7hOVOv8tp6JwywzglleicM + 0OfUyfVOJaA5F30Bv8maeRXqkFsAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAcdEVYdFRpdGxlAFRlYW07UGVvcGxlO0dyb3VwO1Vz + ZXKTe2BJAAACnklEQVRYR8XVz4tPYRTH8cEoP4YaRalZ2UwRIkINxYo0C9mwYYGFYqexkI38BSwsJKTM + kKyk1KwoIT83IlZ+syKNRuTr/dE9+jzPPHfmmsXX4lXfc+55zrlz73Of6Wi1Wv9VMdlOSTAweMptxHV8 + xA98wg1sQl4batf4HJcEFIa1+IlWgfIb4PWN1viskAQUhQsoNQqX4PWN1viskAQUhUfVojqP4fWN1vis + kAQUhRfVopLzWAWvl3lYh3P4hXzdS58VkoAiWY66d3kMqtmFW/DNdhu7MQVHkK9Vz6U+T5KAAumvFuRG + 0IWjlis5jpn4YrnQ7/MkCSiQGXhSLXB3MAtfLVfyDXNx03KinjN8niQBBUGP0hfLNazJcnXWQ/We2+Oz + QhJQFPSXfoA3OImtWa6O6k5YrF6zfVZIAorcZnxHNNFff8Di8RzE6uq3emzxOS4JKMzpiziNu1gE7YN8 + WMk9LMZZjNn5LgkoDp1aaHEYRmlgbjjrq16dngtJQFEP9uMh3mMB/AbUqO6MCLq+LOupc0I91bvHZ0ZR + N85Ah4o3e4W90PvcjmnIP6+cDigdRkuwD2/g1zVDs7r/3AA/5uM5vKiOPq9tWS6n631ZrkTH/ULdwJAl + J3IVWjNoOXexeqKqK13PDalYR2zpYp0dmI5D0CtS7jUOQ69oZ5VrYkQ3UDqzS55Bw0XvWGtljv2eWj0B + 7RfVl/q4z393Y7VwIr3Q4x+wnNN/wSvo9b7jSQJr5PQfUI/3KeLOdbpps3mdHr1/oqrXui6fkUsCinPa + zfln5O7jMh5YLqf1fT7HJQGFbgX+dYPWUZ+VPiskAUWu6bHbVHI8hySgyI2i1GiyRn1WSAKK3DuUGk3W + W58VxiTarZhsp2KynYrJ9ml1/AZUr3hglRjmdgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAARdEVYdFRpdGxlAFJlc2V0O1VuZG87E4EW/wAAAYJJ + REFUWEfFlj1Ow2AMhnsAJK7TIdyEEzDCUhYmDsEpunOTbhyAgakSW/BTpdVr1+nHh6gzPFLs+LWdfL+r + cRwXJXVWkjorSZ2VOGMYhhZrY2NsjZ2xn+AZH++IybQHtB44IxNM3BlvxpcxNiCGWDRnubQeOMMCXqLA + eDD4wqzYJdCgdfm0HjjDAhBqE8/GtxGT/xa05OhqAGiC7rPi78ajwVjfTvCMj3cxnhynP6H1wBmT4Mhn + sD+MJ+PGOH1RgHfEEKtahuMwJ7QeOEMEERLeG7HgHMTGJpiYrh44IwgUvioWaYFGc7A61loPnBEEyqsR + C7RgOOKc2Gg9cEYIjmRLtAUTU3NstR44IwRn9DbB6lD9TuuBM0LwHD1NsERVu9d64AwL+G8Wb6B7CIBT + TUVMJE3aQ/ckBI5UFbGULu1+c/xpGQK/LR67ZRvREbZNFZdtxUc4OOIdgIR81VUPI2WR4zhSfiHJoPuy + K9kcZZfSFoz19a7lS5A6K0mdlaTOOsbVD4kgpriFBNvrAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAApdEVYdFRpdGxlAFJlbW92ZTtEZWxldGU7QmFycztS + aWJib247U3RhbmRhcmQ7Y1ZIMAAAAUFJREFUWEfFlUEOwjAMBHlYheBjSLw8xJKN3N1N43AIhxFi8Xp8 + KOqttfZXZLgTGe5Ehjuh4DgO5C6yKnfcj1AAC16d5p/424xvFx0ZCsSCYOUI6qInoKAPqwXfRZ0sUgy7 + 6DIo6IMPKCJXR4zkwQN9py9GHzLeqaRQR8zktpN8FNiQs3JESW6gj4IYdCpHlOUG+ijIw87siCtOcgN9 + FGDB+eUIkhvoo0CVnJUjpNxAHwWqlKgcMZQb6KNAlRKzB87I/w4CfRSoklORB8Mj0EeBKnVW5IE8An0U + iNIv8oCOQB8FUJjJ7YGbPZinI9BHQRquyGO2fAT6KPDBFXlQOgJ9FPSh2etYyYPZEfPXsdEHR4uu5MFl + F10UBF6gBUWGXfRQkPHiqjyQXXRQgPTSMy9YhLq4n4LdyHAnMtyJDPfRbh/esgzdHdsY9wAAAABJRU5E + rkJggg== + + + \ No newline at end of file diff --git a/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.vb new file mode 100644 index 00000000..e23d0981 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowOverview.vb @@ -0,0 +1,51 @@ +Imports System.ComponentModel +Imports DevExpress.Utils + +Public Class frmWorkflowOverview + Private WorkflowItems As BindingList(Of WorkflowItem) + Private WorkflowDetails As BindingList(Of WorkflowDetail) + + Private Async Sub frmWorkflowOverview_Load(sender As Object, e As EventArgs) Handles MyBase.Load + Dim oDatatable As DataTable + Dim oWorkflows As New List(Of WorkflowItem) + + Dim oIconMap As New Dictionary(Of String, String) From { + {"Start", "ampel_gruen"}, + {"not started", "ampel_rot"} + } + + Try + oDatatable = Await My.Common.Views.VWIDB_GUI_WF_OVERVIEW(70, 104) + + For Each oRow As DataRow In oDatatable.Rows + oWorkflows.Add(New WorkflowItem(oIconMap) With { + .Title = oRow.Item("REQUEST_TITLE"), + .State = oRow.Item("STATETITLE"), + .Process = oRow.Item("PROCESS_NAME") + }) + Next + Catch ex As Exception + ShowErrorMessage(ex) + End Try + + GridOverview.DataSource = oWorkflows + NavControlOverview.DataSource = oWorkflows + + + + + + 'gvOverview.GroupFormat = "[#image]{1} {2}" + 'With gvOverview.Columns.Item("CreatedAt") + ' .OptionsFilter.FilterPopupMode = DevExpress.XtraGrid.Columns.FilterPopupMode.DateAlt + ' .GroupInterval = DevExpress.XtraGrid.ColumnGroupInterval.DateRange + ' .SortOrder = DevExpress.Data.ColumnSortOrder.Descending + ' .Group() + 'End With + + End Sub + + Private Sub frmWorkflowOverview_Shown(sender As Object, e As EventArgs) Handles Me.Shown + RibbonControl1.SelectPage(RibbonPage3) + End Sub +End Class \ No newline at end of file diff --git a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.Designer.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.Designer.vb similarity index 100% rename from GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.Designer.vb rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.Designer.vb diff --git a/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.resx b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.vb b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.vb similarity index 98% rename from GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.vb rename to GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.vb index 255e9629..afe6c3cc 100644 --- a/GUIs.ClientSuite/FormWorkflow/frmWorkflowStep.vb +++ b/GUIs.ClientSuite/ModuleWorkflow/frmWorkflowStep.vb @@ -1,5 +1,4 @@ Imports DevExpress.XtraLayout -Imports DigitalData.GUIs.ClientSuite Imports DigitalData.GUIs.ClientSuite.Controls Public Class frmWorkflowStep diff --git a/GUIs.ClientSuite/My Project/Resources.Designer.vb b/GUIs.ClientSuite/My Project/Resources.Designer.vb index e47024a1..a23044d4 100644 --- a/GUIs.ClientSuite/My Project/Resources.Designer.vb +++ b/GUIs.ClientSuite/My Project/Resources.Designer.vb @@ -60,6 +60,36 @@ Namespace My.Resources End Set End Property + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property ampel_gelb() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("ampel_gelb", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property ampel_gruen() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("ampel_gruen", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property ampel_rot() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("ampel_rot", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + ''' ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. ''' diff --git a/GUIs.ClientSuite/My Project/Resources.resx b/GUIs.ClientSuite/My Project/Resources.resx index 7b7aa66a..c8fa5830 100644 --- a/GUIs.ClientSuite/My Project/Resources.resx +++ b/GUIs.ClientSuite/My Project/Resources.resx @@ -118,25 +118,31 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\iconfinder_Gowalla_324477.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ComboBox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\TextBox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\iconfinder_Gowalla_324477.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\DatePicker.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ComboBox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\user_16xLG.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\CheckBox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\StatusAnnotations_Complete_and_ok_32xLG.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ampel-gelb.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ampel-gruen.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ampel-rot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/GUIs.ClientSuite/My Project/licenses.licx b/GUIs.ClientSuite/My Project/licenses.licx index b7fe4078..89071046 100644 --- a/GUIs.ClientSuite/My Project/licenses.licx +++ b/GUIs.ClientSuite/My Project/licenses.licx @@ -1,16 +1,16 @@ -DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraNavBar.NavBarControl, DevExpress.XtraNavBar.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraDataLayout.DataLayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraTreeList.TreeList, DevExpress.XtraTreeList.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraBars.Docking2010.DocumentManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.Navigation.OfficeNavigationBar, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraTabbedMdi.XtraTabbedMdiManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraVerticalGrid.PropertyGridControl, DevExpress.XtraVerticalGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a -DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraVerticalGrid.PropertyGridControl, DevExpress.XtraVerticalGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraDataLayout.DataLayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.Utils.MVVM.MVVMContext, DevExpress.Utils.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.Navigation.OfficeNavigationBar, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraTreeList.TreeList, DevExpress.XtraTreeList.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraNavBar.NavBarControl, DevExpress.XtraNavBar.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/GUIs.ClientSuite/Resources/ampel-gelb.png b/GUIs.ClientSuite/Resources/ampel-gelb.png new file mode 100644 index 00000000..5d51423e Binary files /dev/null and b/GUIs.ClientSuite/Resources/ampel-gelb.png differ diff --git a/GUIs.ClientSuite/Resources/ampel-gruen.png b/GUIs.ClientSuite/Resources/ampel-gruen.png new file mode 100644 index 00000000..fe34e2a5 Binary files /dev/null and b/GUIs.ClientSuite/Resources/ampel-gruen.png differ diff --git a/GUIs.ClientSuite/Resources/ampel-rot.png b/GUIs.ClientSuite/Resources/ampel-rot.png new file mode 100644 index 00000000..97dae97a Binary files /dev/null and b/GUIs.ClientSuite/Resources/ampel-rot.png differ diff --git a/GUIs.ClientSuite/Workers/HeartbeatWorker.vb b/GUIs.ClientSuite/Workers/HeartbeatWorker.vb index 7bba52ba..892b90bd 100644 --- a/GUIs.ClientSuite/Workers/HeartbeatWorker.vb +++ b/GUIs.ClientSuite/Workers/HeartbeatWorker.vb @@ -1,47 +1,44 @@ Imports System.Timers -Imports DigitalData.GUIs.ClientSuite Imports DigitalData.GUIs.ClientSuite.Base -Imports DigitalData.Modules.EDMIAPI.IDBServiceReference Imports DigitalData.Modules.Logging + Namespace Workers Public Class HeartbeatWorker Inherits BaseClass Implements IWorker - Private _Channel As IIDBServiceChannel - Public Event OnlineChanged As OnlineChangedEventHandler Public Delegate Sub OnlineChangedEventHandler(sender As Object, Online As Boolean) Public ReadOnly Property Interval As Integer = 4000 Implements IWorker.Interval + Public ReadOnly Property Name As String = "Heartbeat Worker" Implements IWorker.Name Public Sub New(LogConfig As LogConfig) MyBase.New(LogConfig) End Sub Public Sub Setup() Implements IWorker.Setup - _Channel = My.ChannelFactory.CreateChannel() - _Channel.Open() + Logger.Debug("Starting {0}", "HeartbeatWorker") End Sub - Public Async Sub Callback(manager As WorkerManager, e As ElapsedEventArgs) Implements IWorker.Callback + Public Async Sub Callback(Manager As WorkerManager, e As ElapsedEventArgs) Implements IWorker.Callback Try - Logger.Debug("Checking if Service is up...") - - If _Channel.State = ServiceModel.CommunicationState.Faulted Then - _Channel = My.ChannelFactory.CreateChannel() + If My.Channel.State = ServiceModel.CommunicationState.Faulted Then + My.Channel = My.ChannelFactory.CreateChannel() End If ' Connect to service and send hearbeat request - Dim oResult = Await _Channel.HeartbeatAsync() + Dim oResult = Await My.Channel.HeartbeatAsync() Logger.Debug("Service is online") SetOnlineState(True) Catch ex As Exception + Logger.Debug("Service is offline!") Logger.Error(ex) + Manager.StopWorkers() SetOnlineState(False) Finally My.Application.Service.LastChecked = DateTime.Now @@ -49,7 +46,7 @@ Namespace Workers End Sub Public Sub Teardown() Implements IWorker.Teardown - ' TODO: Close channel gracefully + Logger.Debug("Stopping {0}", Name) End Sub Private Sub SetOnlineState(NewState As Boolean) diff --git a/GUIs.ClientSuite/Workers/IWorker.vb b/GUIs.ClientSuite/Workers/IWorker.vb index 9405ca10..3a967712 100644 --- a/GUIs.ClientSuite/Workers/IWorker.vb +++ b/GUIs.ClientSuite/Workers/IWorker.vb @@ -3,6 +3,7 @@ Namespace Workers Public Interface IWorker ReadOnly Property Interval As Integer + ReadOnly Property Name As String Sub Setup() Sub Teardown() diff --git a/GUIs.ClientSuite/Workers/WorkerManager.vb b/GUIs.ClientSuite/Workers/WorkerManager.vb index e48e1fa9..e3407bc7 100644 --- a/GUIs.ClientSuite/Workers/WorkerManager.vb +++ b/GUIs.ClientSuite/Workers/WorkerManager.vb @@ -6,6 +6,14 @@ Namespace Workers Public Class WorkerManager Inherits BaseClass + ''' + ''' Holds information about a worker + ''' + Class WorkerState + Public Worker As IWorker + Public Timer As Timer + End Class + ''' ''' List of workers that will be started. ''' @@ -13,52 +21,73 @@ Namespace Workers GetType(HeartbeatWorker), GetType(WorkflowOverviewWorker) } - Private Workers As New List(Of IWorker) - Private TimerList As New List(Of Timer) + Private Workers As New List(Of WorkerState) Public Sub New(LogConfig As LogConfig, SyncronizingObject As frmMain) MyBase.New(LogConfig) - Workers = CreateWorkers() - - For Each oWorker As IWorker In Workers - Dim oTimer = New Timer(oWorker.Interval) With { - .SynchronizingObject = SyncronizingObject, - .Enabled = True - } - - AddHandler oTimer.Elapsed, Sub(sender As Object, e As ElapsedEventArgs) - Try - oWorker.Callback(Me, e) - Catch ex As Exception - Logger.Warn("Worker {0} threw an error in callback.", oWorker.GetType.Name) - End Try - End Sub - - TimerList.Add(oTimer) - Next + Workers = CreateWorkers(SyncronizingObject) End Sub Public Function GetWorker(Of T)() As T - For Each oWorker In Workers - If TypeOf oWorker Is T Then - Return oWorker + For Each oWorkerState As WorkerState In Workers + If TypeOf oWorkerState.Worker Is T Then + Return oWorkerState.Worker End If Next Return Nothing End Function - Private Function CreateWorkers() As List(Of IWorker) - Dim oWorkers As New List(Of IWorker) + Public Sub StopWorkers() + Logger.Debug("Stopping all workers..") + For Each oWorkerState In Workers + oWorkerState.Timer.Stop() + + Try + oWorkerState.Worker.Teardown() + Catch ex As Exception + Logger.Warn("Worker {0} threw an error during teardown.", oWorkerState.Worker.Name) + End Try + Next + Logger.Debug("All workers stopped.") + End Sub + + Private Function CreateTimer(Worker As IWorker, SyncronizingObject As frmMain) + Dim oTimer = New Timer(Worker.Interval) With { + .SynchronizingObject = SyncronizingObject, + .Enabled = True + } + + AddHandler oTimer.Elapsed, Sub(sender As Object, e As ElapsedEventArgs) + Try + Worker.Callback(Me, e) + Catch ex As Exception + Logger.Warn("Worker {0} threw an error in callback.", Worker.Name) + Logger.Error(ex) + End Try + End Sub + + Return oTimer + End Function + + Private Function CreateWorkers(SyncronizingObject As frmMain) As List(Of WorkerState) + Dim oWorkers As New List(Of WorkerState) For Each oWorkerType In WorkerTypes + Dim oWorker As IWorker = Activator.CreateInstance(oWorkerType, New Object() {LogConfig}) + Try - Dim oWorker As IWorker = Activator.CreateInstance(oWorkerType, New Object() {LogConfig}) oWorker.Setup() - oWorkers.Add(oWorker) + + Dim oWorkerState As New WorkerState() With { + .Worker = oWorker, + .Timer = CreateTimer(oWorker, SyncronizingObject) + } + + oWorkers.Add(oWorkerState) Catch ex As Exception - Logger.Warn("Worker {0} threw an error while creating. Skipping.", oWorkerType.Name) + Logger.Warn("Worker {0} threw an error during setup. Skipping.", oWorker.Name) Logger.Error(ex) Continue For End Try diff --git a/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb b/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb index e7578624..1e70e8be 100644 --- a/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb +++ b/GUIs.ClientSuite/Workers/WorkflowOverviewWorker.vb @@ -12,6 +12,7 @@ Namespace Workers End Sub Public ReadOnly Property Interval As Integer = 60000 Implements IWorker.Interval + Public ReadOnly Property Name As String = "WorkflowOverview Worker" Implements IWorker.Name Public Sub Setup() Implements IWorker.Setup Throw New NotImplementedException() diff --git a/GUIs.ClientSuite/frmConfigUser.vb b/GUIs.ClientSuite/frmConfigUser.vb index 620653b4..80c884bf 100644 --- a/GUIs.ClientSuite/frmConfigUser.vb +++ b/GUIs.ClientSuite/frmConfigUser.vb @@ -22,7 +22,8 @@ Public Class frmConfigUser End Sub Private Sub btnAppFolder_Click(sender As Object, e As EventArgs) Handles btnAppFolder.Click - Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)) + Dim oAppData = Application.LocalUserAppDataPath + Process.Start(oAppData) End Sub Private Sub chkLogErrorsOnly_CheckedChanged(sender As Object, e As EventArgs) Handles chkLogErrorsOnly.CheckedChanged diff --git a/GUIs.ClientSuite/frmMain.Designer.vb b/GUIs.ClientSuite/frmMain.Designer.vb index 05fcebf0..d8636b59 100644 --- a/GUIs.ClientSuite/frmMain.Designer.vb +++ b/GUIs.ClientSuite/frmMain.Designer.vb @@ -21,11 +21,10 @@ Partial Class frmMain 'Do not modify it using the code editor. Private Sub InitializeComponent() - Me.components = New System.ComponentModel.Container() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMain)) - Dim PushTransition1 As DevExpress.Utils.Animation.PushTransition = New DevExpress.Utils.Animation.PushTransition() + Dim PushTransition2 As DevExpress.Utils.Animation.PushTransition = New DevExpress.Utils.Animation.PushTransition() Me.RibbonControl = New DevExpress.XtraBars.Ribbon.RibbonControl() - Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu(Me.components) + Me.MainMenu = New DevExpress.XtraBars.Ribbon.ApplicationMenu() Me.BarButtonExit = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonUserSettings = New DevExpress.XtraBars.BarButtonItem() Me.BarButtonConnectionSettings = New DevExpress.XtraBars.BarButtonItem() @@ -51,13 +50,14 @@ Partial Class frmMain Me.RibbonPageGroup6 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonStatusBar = New DevExpress.XtraBars.Ribbon.RibbonStatusBar() - Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager(Me.components) - Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView(Me.components) - Me.DockManager = New DevExpress.XtraBars.Docking.DockManager(Me.components) + Me.DocumentManager = New DevExpress.XtraBars.Docking2010.DocumentManager() + Me.TabbedView1 = New DevExpress.XtraBars.Docking2010.Views.Tabbed.TabbedView() + Me.DockManager = New DevExpress.XtraBars.Docking.DockManager() Me.MainNav = New DevExpress.XtraBars.Navigation.OfficeNavigationBar() Me.NavbarItemHome = New DevExpress.XtraBars.Navigation.NavigationBarItem() Me.NavbarItemSearch = New DevExpress.XtraBars.Navigation.NavigationBarItem() Me.NavbarItemWorkflow = New DevExpress.XtraBars.Navigation.NavigationBarItem() + Me.BarButtonItem5 = New DevExpress.XtraBars.BarButtonItem() CType(Me.RibbonControl, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.MainMenu, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.DocumentManager, System.ComponentModel.ISupportInitialize).BeginInit() @@ -70,15 +70,15 @@ Partial Class frmMain ' Me.RibbonControl.ApplicationButtonDropDownControl = Me.MainMenu Me.RibbonControl.ExpandCollapseItem.Id = 0 - Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.BarButtonExit, Me.BarButtonUserSettings, Me.LabelCurrentUser, Me.LabelCurrentMachine, Me.LabelCurrentVersion, Me.BarButtonItem1, Me.SkinDropDownButtonItem1, Me.BarButtonDeleteControl, Me.BarButtonConnectionSettings, Me.LabelCurrentLanguage, Me.BarButtonItem2, Me.BarWorkspaceMenuItem1, Me.LabelServiceOnline, Me.BarButtonUserManager, Me.LabelServiceOffline, Me.BarButtonItem3, Me.BarButtonFormDesigner, Me.BarButtonItem4}) + Me.RibbonControl.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl.ExpandCollapseItem, Me.BarButtonExit, Me.BarButtonUserSettings, Me.LabelCurrentUser, Me.LabelCurrentMachine, Me.LabelCurrentVersion, Me.BarButtonItem1, Me.SkinDropDownButtonItem1, Me.BarButtonDeleteControl, Me.BarButtonConnectionSettings, Me.LabelCurrentLanguage, Me.BarButtonItem2, Me.BarWorkspaceMenuItem1, Me.LabelServiceOnline, Me.BarButtonUserManager, Me.LabelServiceOffline, Me.BarButtonItem3, Me.BarButtonFormDesigner, Me.BarButtonItem4, Me.BarButtonItem5}) Me.RibbonControl.Location = New System.Drawing.Point(0, 0) - Me.RibbonControl.MaxItemId = 25 + Me.RibbonControl.MaxItemId = 26 Me.RibbonControl.MdiMergeStyle = DevExpress.XtraBars.Ribbon.RibbonMdiMergeStyle.Always Me.RibbonControl.Name = "RibbonControl" Me.RibbonControl.PageHeaderItemLinks.Add(Me.SkinDropDownButtonItem1) Me.RibbonControl.PageHeaderItemLinks.Add(Me.BarWorkspaceMenuItem1) Me.RibbonControl.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPageStart, Me.RibbonPageAdmin}) - Me.RibbonControl.Size = New System.Drawing.Size(1139, 146) + Me.RibbonControl.Size = New System.Drawing.Size(1139, 143) Me.RibbonControl.StatusBar = Me.RibbonStatusBar ' 'MainMenu @@ -181,7 +181,7 @@ Partial Class frmMain 'WorkspaceManager1 ' Me.WorkspaceManager1.TargetControl = Me - Me.WorkspaceManager1.TransitionType = PushTransition1 + Me.WorkspaceManager1.TransitionType = PushTransition2 ' 'LabelServiceOnline ' @@ -223,7 +223,7 @@ Partial Class frmMain ' 'BarButtonItem4 ' - Me.BarButtonItem4.Caption = "Workflow Test" + Me.BarButtonItem4.Caption = "Workflow Step" Me.BarButtonItem4.Id = 24 Me.BarButtonItem4.ImageOptions.Image = CType(resources.GetObject("BarButtonItem4.ImageOptions.Image"), System.Drawing.Image) Me.BarButtonItem4.ImageOptions.LargeImage = CType(resources.GetObject("BarButtonItem4.ImageOptions.LargeImage"), System.Drawing.Image) @@ -241,6 +241,7 @@ Partial Class frmMain Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem3) Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem2) Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem4) + Me.RibbonPageGroup3.ItemLinks.Add(Me.BarButtonItem5) Me.RibbonPageGroup3.Name = "RibbonPageGroup3" Me.RibbonPageGroup3.Text = "DEBUG" ' @@ -270,10 +271,10 @@ Partial Class frmMain Me.RibbonStatusBar.ItemLinks.Add(Me.LabelCurrentLanguage) Me.RibbonStatusBar.ItemLinks.Add(Me.LabelServiceOnline) Me.RibbonStatusBar.ItemLinks.Add(Me.LabelServiceOffline) - Me.RibbonStatusBar.Location = New System.Drawing.Point(0, 556) + Me.RibbonStatusBar.Location = New System.Drawing.Point(0, 546) Me.RibbonStatusBar.Name = "RibbonStatusBar" Me.RibbonStatusBar.Ribbon = Me.RibbonControl - Me.RibbonStatusBar.Size = New System.Drawing.Size(1139, 21) + Me.RibbonStatusBar.Size = New System.Drawing.Size(1139, 31) ' 'DocumentManager ' @@ -297,7 +298,7 @@ Partial Class frmMain ' Me.MainNav.Dock = System.Windows.Forms.DockStyle.Bottom Me.MainNav.Items.AddRange(New DevExpress.XtraBars.Navigation.NavigationBarItem() {Me.NavbarItemHome, Me.NavbarItemSearch, Me.NavbarItemWorkflow}) - Me.MainNav.Location = New System.Drawing.Point(0, 511) + Me.MainNav.Location = New System.Drawing.Point(0, 501) Me.MainNav.Name = "MainNav" Me.MainNav.Size = New System.Drawing.Size(1139, 45) Me.MainNav.TabIndex = 4 @@ -318,6 +319,14 @@ Partial Class frmMain Me.NavbarItemWorkflow.Name = "NavbarItemWorkflow" Me.NavbarItemWorkflow.Text = "Workflow" ' + 'BarButtonItem5 + ' + Me.BarButtonItem5.Caption = "Workflow Overview" + Me.BarButtonItem5.Id = 25 + Me.BarButtonItem5.ImageOptions.Image = CType(resources.GetObject("BarButtonItem5.ImageOptions.Image"), System.Drawing.Image) + Me.BarButtonItem5.ImageOptions.LargeImage = CType(resources.GetObject("BarButtonItem5.ImageOptions.LargeImage"), System.Drawing.Image) + Me.BarButtonItem5.Name = "BarButtonItem5" + ' 'frmMain ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -377,4 +386,5 @@ Partial Class frmMain Friend WithEvents RibbonPageGroup1 As DevExpress.XtraBars.Ribbon.RibbonPageGroup Friend WithEvents BarButtonFormDesigner As DevExpress.XtraBars.BarButtonItem Friend WithEvents BarButtonItem4 As DevExpress.XtraBars.BarButtonItem + Friend WithEvents BarButtonItem5 As DevExpress.XtraBars.BarButtonItem End Class diff --git a/GUIs.ClientSuite/frmMain.resx b/GUIs.ClientSuite/frmMain.resx index ed5110e8..9a7f64cc 100644 --- a/GUIs.ClientSuite/frmMain.resx +++ b/GUIs.ClientSuite/frmMain.resx @@ -446,6 +446,26 @@ Ixl2CEPBSIYdwlAwkmGHMBSMZNghDKWWbpVS4o3v1CEMRSNDD5B2gN71YvgpPhq3GLYfdNj1nbYYth90 +O8BevftiO/Wx/Vxj1/qP1v5Vm9f/a6aB8wD5gHzgPVxJoYjMRwnlhd3GhRitUujhAAAAABJRU5ErkJg gg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAALHRFWHRUaXRsZQBEb2N1bWVu + dDtNYXA7U2NoZW1lO0RpYWdyYW07SGllcmFyO05ldE4PKkQAAAB1SURBVDhPzczBDYAwDEPRLsg6DMAS + jMC1x24X9CVAbWKgqBcOTwjXTjKzITKclmKK7yEEUGP4HkIANYbvIQRQY/geQgA1hu8hBFBj+B5CUMs5 + 20G+o/mpBm8eD/A9XQOXtQfmbbUahZ7s9sCX7CcHRsiwn6Ud+yzVdNjXwB0AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAALHRFWHRUaXRsZQBEb2N1bWVu + dDtNYXA7U2NoZW1lO0RpYWdyYW07SGllcmFyO05ldE4PKkQAAADDSURBVFhH7dKxDcIwEAXQLMg6DMAS + jEDrku0OHGEJRU+HIwWncfFS/IT/r2CJiFMxHImhXG7P2IEdwlAwkmGHMBSMZNghDAUjGXYIQ8FIhh3C + UDCSYYcwFIxk2CEMBSMZdghDwUiGHcJQMJJhhzAUjGTYIQyllm6VUuKN79QhDEUjQw+QdoDe9WL4KT4a + txi2H3TY9Z22GLYfdPjvAXr37Yjv1sf1cY9f6j9b+VZvX/2umgfMA+YB84D1cSaGIzEcJ5YXdxoUYrVL + o4QAAAAASUVORK5CYII= diff --git a/GUIs.ClientSuite/frmMain.vb b/GUIs.ClientSuite/frmMain.vb index 74d30656..8a664370 100644 --- a/GUIs.ClientSuite/frmMain.vb +++ b/GUIs.ClientSuite/frmMain.vb @@ -37,11 +37,11 @@ Public Class frmMain End Sub Private Sub HandleOnlineChanged(sender As Object, Online As Boolean) + SetOnlineLabel(Online) If Online = False Then - + MessageBox.Show($"Application will be closed now.{vbNewLine}Reason: Service is offline.", "Critical Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Application.Exit() End If - SetOnlineLabel(Online) End Sub Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load @@ -222,4 +222,11 @@ Public Class frmMain } oForm.Show() End Sub + + Private Sub BarButtonItem5_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem5.ItemClick + Dim oForm As New frmWorkflowOverview() With { + .MdiParent = DocumentManager.MdiParent + } + oForm.Show() + End Sub End Class \ No newline at end of file diff --git a/GUIs.ClientSuite/packages.config b/GUIs.ClientSuite/packages.config index cd1527a3..55fed1f5 100644 --- a/GUIs.ClientSuite/packages.config +++ b/GUIs.ClientSuite/packages.config @@ -3,5 +3,6 @@ + \ No newline at end of file diff --git a/GUIs.Test.TestGUI/Form1.Designer.vb b/GUIs.Test.TestGUI/Form1.Designer.vb index e744c1bb..6ac95de9 100644 --- a/GUIs.Test.TestGUI/Form1.Designer.vb +++ b/GUIs.Test.TestGUI/Form1.Designer.vb @@ -43,6 +43,9 @@ Partial Class Form1 Me.TextBox1 = New System.Windows.Forms.TextBox() Me.Label6 = New System.Windows.Forms.Label() Me.Button4 = New System.Windows.Forms.Button() + Me.Button6 = New System.Windows.Forms.Button() + Me.ListBox1 = New System.Windows.Forms.ListBox() + Me.Button7 = New System.Windows.Forms.Button() CType(Me.GridControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() @@ -228,11 +231,40 @@ Partial Class Form1 Me.Button4.Text = "Test Background Worker Logging" Me.Button4.UseVisualStyleBackColor = True ' + 'Button6 + ' + Me.Button6.Location = New System.Drawing.Point(683, 143) + Me.Button6.Name = "Button6" + Me.Button6.Size = New System.Drawing.Size(75, 23) + Me.Button6.TabIndex = 23 + Me.Button6.Text = "Get Logs" + Me.Button6.UseVisualStyleBackColor = True + ' + 'ListBox1 + ' + Me.ListBox1.FormattingEnabled = True + Me.ListBox1.Location = New System.Drawing.Point(683, 172) + Me.ListBox1.Name = "ListBox1" + Me.ListBox1.Size = New System.Drawing.Size(355, 303) + Me.ListBox1.TabIndex = 24 + ' + 'Button7 + ' + Me.Button7.Location = New System.Drawing.Point(764, 143) + Me.Button7.Name = "Button7" + Me.Button7.Size = New System.Drawing.Size(75, 23) + Me.Button7.TabIndex = 25 + Me.Button7.Text = "Clear Logs" + Me.Button7.UseVisualStyleBackColor = True + ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(1050, 487) + Me.Controls.Add(Me.Button7) + Me.Controls.Add(Me.ListBox1) + Me.Controls.Add(Me.Button6) Me.Controls.Add(Me.Button4) Me.Controls.Add(Me.Label6) Me.Controls.Add(Me.TextBox1) @@ -284,4 +316,7 @@ Partial Class Form1 Friend WithEvents TextBox1 As TextBox Friend WithEvents Label6 As Label Friend WithEvents Button4 As Button + Friend WithEvents Button6 As Button + Friend WithEvents ListBox1 As ListBox + Friend WithEvents Button7 As Button End Class diff --git a/GUIs.Test.TestGUI/Form1.vb b/GUIs.Test.TestGUI/Form1.vb index a41b5a2a..dcde0760 100644 --- a/GUIs.Test.TestGUI/Form1.vb +++ b/GUIs.Test.TestGUI/Form1.vb @@ -41,6 +41,7 @@ Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load MyLogger = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "MAIN") + MyLogger.Debug = True Logger = MyLogger.GetLogger() Dim MySecondLogger = New LogConfig(LogConfig.PathType.CurrentDirectory, Nothing, "MAIN2") @@ -169,4 +170,21 @@ Public Class Form1 bw1.RunWorkerAsync() End Sub + Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click + Logger.Error(New ApplicationException("Some Error occurred!")) + + ListBox1.Items.Clear() + For Each oLog In MyLogger.Logs + ListBox1.Items.Add(oLog) + Next + End Sub + + Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click + MyLogger.ClearLogs() + + ListBox1.Items.Clear() + For Each oLog In MyLogger.Logs + ListBox1.Items.Add(oLog) + Next + End Sub End Class diff --git a/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb b/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb index 70336604..adc6be79 100644 --- a/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb +++ b/GUIs.Test.ZUGFeRDTest/Form1.Designer.vb @@ -29,6 +29,17 @@ Partial Class Form1 Me.Button3 = New System.Windows.Forms.Button() Me.Button4 = New System.Windows.Forms.Button() Me.txtMD5Checksum = New System.Windows.Forms.TextBox() + Me.Button5 = New System.Windows.Forms.Button() + Me.GroupBox1 = New System.Windows.Forms.GroupBox() + Me.GroupBox2 = New System.Windows.Forms.GroupBox() + Me.GroupBox3 = New System.Windows.Forms.GroupBox() + Me.txtPropName = New System.Windows.Forms.TextBox() + Me.GroupBox4 = New System.Windows.Forms.GroupBox() + Me.Button6 = New System.Windows.Forms.Button() + Me.GroupBox1.SuspendLayout() + Me.GroupBox2.SuspendLayout() + Me.GroupBox3.SuspendLayout() + Me.GroupBox4.SuspendLayout() Me.SuspendLayout() ' 'OpenFileDialog1 @@ -37,7 +48,7 @@ Partial Class Form1 ' 'Button1 ' - Me.Button1.Location = New System.Drawing.Point(12, 12) + Me.Button1.Location = New System.Drawing.Point(6, 19) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(221, 23) Me.Button1.TabIndex = 0 @@ -54,55 +65,128 @@ Partial Class Form1 ' 'Button2 ' - Me.Button2.Location = New System.Drawing.Point(12, 122) + Me.Button2.Location = New System.Drawing.Point(6, 19) Me.Button2.Name = "Button2" Me.Button2.Size = New System.Drawing.Size(221, 23) Me.Button2.TabIndex = 2 - Me.Button2.Text = "Validate Single File" + Me.Button2.Text = "Validate PDF" Me.Button2.UseVisualStyleBackColor = True ' 'Button3 ' - Me.Button3.Location = New System.Drawing.Point(12, 151) + Me.Button3.Location = New System.Drawing.Point(6, 48) Me.Button3.Name = "Button3" Me.Button3.Size = New System.Drawing.Size(221, 23) Me.Button3.TabIndex = 3 - Me.Button3.Text = "Load Single File" + Me.Button3.Text = "Validate and Serialize PDF" Me.Button3.UseVisualStyleBackColor = True ' 'Button4 ' - Me.Button4.Location = New System.Drawing.Point(12, 193) + Me.Button4.Location = New System.Drawing.Point(6, 19) Me.Button4.Name = "Button4" Me.Button4.Size = New System.Drawing.Size(221, 23) Me.Button4.TabIndex = 4 - Me.Button4.Text = "MD5Chcksum" + Me.Button4.Text = "Create MD5 Checksum for PDF" Me.Button4.UseVisualStyleBackColor = True ' 'txtMD5Checksum ' Me.txtMD5Checksum.DataBindings.Add(New System.Windows.Forms.Binding("Text", Global.ZUGFeRDTest.My.MySettings.Default, "MD5Cheksum", True, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)) - Me.txtMD5Checksum.Location = New System.Drawing.Point(12, 222) + Me.txtMD5Checksum.Location = New System.Drawing.Point(6, 49) Me.txtMD5Checksum.Name = "txtMD5Checksum" - Me.txtMD5Checksum.Size = New System.Drawing.Size(360, 20) + Me.txtMD5Checksum.Size = New System.Drawing.Size(348, 20) Me.txtMD5Checksum.TabIndex = 5 Me.txtMD5Checksum.Text = Global.ZUGFeRDTest.My.MySettings.Default.MD5Cheksum ' + 'Button5 + ' + Me.Button5.Location = New System.Drawing.Point(6, 48) + Me.Button5.Name = "Button5" + Me.Button5.Size = New System.Drawing.Size(221, 23) + Me.Button5.TabIndex = 6 + Me.Button5.Text = "Open Input Folder" + Me.Button5.UseVisualStyleBackColor = True + ' + 'GroupBox1 + ' + Me.GroupBox1.Controls.Add(Me.Button1) + Me.GroupBox1.Controls.Add(Me.Button5) + Me.GroupBox1.Location = New System.Drawing.Point(12, 12) + Me.GroupBox1.Name = "GroupBox1" + Me.GroupBox1.Size = New System.Drawing.Size(360, 92) + Me.GroupBox1.TabIndex = 7 + Me.GroupBox1.TabStop = False + Me.GroupBox1.Text = "Run Job like in ZUGFeRD Service" + ' + 'GroupBox2 + ' + Me.GroupBox2.Controls.Add(Me.Button2) + Me.GroupBox2.Controls.Add(Me.Button3) + Me.GroupBox2.Location = New System.Drawing.Point(12, 110) + Me.GroupBox2.Name = "GroupBox2" + Me.GroupBox2.Size = New System.Drawing.Size(360, 90) + Me.GroupBox2.TabIndex = 8 + Me.GroupBox2.TabStop = False + Me.GroupBox2.Text = "Run Functions on a single file (needs Breakpoint)" + ' + 'GroupBox3 + ' + Me.GroupBox3.Controls.Add(Me.Button4) + Me.GroupBox3.Controls.Add(Me.txtMD5Checksum) + Me.GroupBox3.Location = New System.Drawing.Point(12, 206) + Me.GroupBox3.Name = "GroupBox3" + Me.GroupBox3.Size = New System.Drawing.Size(360, 85) + Me.GroupBox3.TabIndex = 9 + Me.GroupBox3.TabStop = False + Me.GroupBox3.Text = "Open PDF and calculate Checksum" + ' + 'txtPropName + ' + Me.txtPropName.Location = New System.Drawing.Point(6, 48) + Me.txtPropName.Name = "txtPropName" + Me.txtPropName.Size = New System.Drawing.Size(348, 20) + Me.txtPropName.TabIndex = 10 + ' + 'GroupBox4 + ' + Me.GroupBox4.Controls.Add(Me.Button6) + Me.GroupBox4.Controls.Add(Me.txtPropName) + Me.GroupBox4.Location = New System.Drawing.Point(12, 297) + Me.GroupBox4.Name = "GroupBox4" + Me.GroupBox4.Size = New System.Drawing.Size(360, 122) + Me.GroupBox4.TabIndex = 11 + Me.GroupBox4.TabStop = False + Me.GroupBox4.Text = "GroupBox4" + ' + 'Button6 + ' + Me.Button6.Location = New System.Drawing.Point(6, 19) + Me.Button6.Name = "Button6" + Me.Button6.Size = New System.Drawing.Size(221, 23) + Me.Button6.TabIndex = 11 + Me.Button6.Text = "Find and Extract XML Path Value" + Me.Button6.UseVisualStyleBackColor = True + ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(916, 435) - Me.Controls.Add(Me.txtMD5Checksum) - Me.Controls.Add(Me.Button4) - Me.Controls.Add(Me.Button3) - Me.Controls.Add(Me.Button2) + Me.Controls.Add(Me.GroupBox4) + Me.Controls.Add(Me.GroupBox3) + Me.Controls.Add(Me.GroupBox2) + Me.Controls.Add(Me.GroupBox1) Me.Controls.Add(Me.ListBox1) - Me.Controls.Add(Me.Button1) Me.Name = "Form1" Me.Text = "Form1" + Me.GroupBox1.ResumeLayout(False) + Me.GroupBox2.ResumeLayout(False) + Me.GroupBox3.ResumeLayout(False) + Me.GroupBox3.PerformLayout() + Me.GroupBox4.ResumeLayout(False) + Me.GroupBox4.PerformLayout() Me.ResumeLayout(False) - Me.PerformLayout() End Sub @@ -113,4 +197,11 @@ Partial Class Form1 Friend WithEvents Button3 As Button Friend WithEvents Button4 As Button Friend WithEvents txtMD5Checksum As TextBox + Friend WithEvents Button5 As Button + Friend WithEvents GroupBox1 As GroupBox + Friend WithEvents GroupBox2 As GroupBox + Friend WithEvents GroupBox3 As GroupBox + Friend WithEvents txtPropName As TextBox + Friend WithEvents GroupBox4 As GroupBox + Friend WithEvents Button6 As Button End Class diff --git a/GUIs.Test.ZUGFeRDTest/Form1.vb b/GUIs.Test.ZUGFeRDTest/Form1.vb index b48244f8..e03630b5 100644 --- a/GUIs.Test.ZUGFeRDTest/Form1.vb +++ b/GUIs.Test.ZUGFeRDTest/Form1.vb @@ -109,7 +109,11 @@ Public Class Form1 Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click My.Settings.Save() Dim result = checkMD5(txtMD5Checksum.Text) - MsgBox("Done") + If IsNothing(result) Then + MsgBox("Could not calculate MD5 Checksum") + Else + txtMD5Checksum.Text = result + End If End Sub Public Function checkMD5(ByVal filename As String) As String Try @@ -128,6 +132,29 @@ Public Class Form1 Catch ex As Exception Return Nothing End Try - End Function + + Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click + Process.Start("\\dd-sto01\DD-STO01-A2\SharedObjects\Public\Projekte\Test\Import\ZUGFerD\Email_in") + End Sub + + Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click + Dim oResult = OpenFileDialog1.ShowDialog() + + If oResult = DialogResult.OK Then + Dim oDoc = _zugferd.ValidateZUGFeRDFile(OpenFileDialog1.FileName) + Dim oZUGFERD As CrossIndustryDocumentType = _zugferd.SerializeZUGFeRDDocument(oDoc) + Dim oPropName As String = txtPropName.Text + + Try + Dim oExtractor = New PropertyValues(_logConfig) + Dim oValue As List(Of Object) = oExtractor.GetPropValue(oZUGFERD, oPropName) + Dim oFinalValue As List(Of Object) = oExtractor.GetFinalPropValue(oValue) + Console.WriteLine() + + Catch ex As Exception + MsgBox(ex.Message) + End Try + End If + End Sub End Class diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb index 96da49a9..07a9af46 100644 --- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb +++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb @@ -8,6 +8,7 @@ Imports System.Text.RegularExpressions Imports System.Xml Imports DigitalData.Modules.Database Imports DigitalData.Modules.Interfaces +Imports DigitalData.Modules.Interfaces.Exceptions Imports DigitalData.Modules.Jobs.Exceptions Imports DigitalData.Modules.Logging Imports FirebirdSql.Data.FirebirdClient @@ -20,6 +21,7 @@ Public Class ImportZUGFeRDFiles Public Const ZUGFERD_SUCCESS = "ZUGFeRD Success" Public Const ZUGFERD_EML = "ZUGFeRD Eml" Public Const ZUGFERD_REJECTED_EML = "ZUGFeRD Eml Rejected" + Public Const ZUGFERD_ATTACHMENTS = "ZUGFeRD Attachments" Private _logger As Logger Private _logConfig As LogConfig @@ -226,7 +228,10 @@ Public Class ImportZUGFeRDFiles Dim oZUGFeRDCount As Integer = 0 ' Set the default Move Directory Dim oMoveDirectory As String = args.SuccessDirectory + ' Create file lists Dim oFileGroupFiles As List(Of FileInfo) = oFileGroup.Value + Dim oFileAttachmentFiles As New List(Of FileInfo) + Dim oFileGroupId As String = oFileGroup.Key Dim oMissingProperties As New List(Of String) Dim oMD5CheckSum As String = String.Empty @@ -238,6 +243,9 @@ Public Class ImportZUGFeRDFiles For Each oFile In oFileGroupFiles Dim oDocument As CrossIndustryDocumentType + ' Start a global group counter for each file + Dim oGlobalGroupCounter = 0 + ' Clear missing properties for the new file oMissingProperties = New List(Of String) oCurrentFileCount += 1 @@ -245,6 +253,7 @@ Public Class ImportZUGFeRDFiles ' Only pdf files are allowed from here on If Not oFile.Name.EndsWith(".pdf") Then _logger.Debug("Skipping non-pdf file {0}", oFile.Name) + oFileAttachmentFiles.Add(oFile) Continue For End If @@ -252,9 +261,23 @@ Public Class ImportZUGFeRDFiles Try oDocument = _zugferd.ExtractZUGFeRDFile(oFile.FullName) - Catch ex As Exception - _logger.Warn("File is not a valid ZUGFeRD document! Skipping.") - Continue For + Catch ex As ZUGFeRDExecption + Select Case ex.ErrorType + Case ZUGFeRDInterface.ErrorType.NoZugferd + _logger.Warn("File is not a valid ZUGFeRD document! Skipping.") + oFileAttachmentFiles.Add(oFile) + Continue For + + Case ZUGFeRDInterface.ErrorType.NoValidZugferd + _logger.Warn("File is an Incorrectly formatted ZUGFeRD document!") + Throw New InvalidFerdException() + + Case Else + _logger.Warn("Unexpected Error occurred while extracting ZUGFeRD Information from file {0}", oFile.FullName) + Throw ex + End Select + + End Try oMD5CheckSum = CreateMD5(oFile.FullName) @@ -298,7 +321,6 @@ Public Class ImportZUGFeRDFiles Function(Item) Item) _logger.Debug("Found {0} properties grouped in {1} group(s)", args.PropertyMap.Count - oDefaultProperties.Count, oGroupedProperties.Count) - ' Iterate through groups to get group scope and group items For Each oGroup In oGroupedProperties Dim oGroupScope As String = oGroup.Key @@ -309,8 +331,20 @@ Public Class ImportZUGFeRDFiles ' get properties as a nested object, see `oPropertyList` For Each oProperty As KeyValuePair(Of String, XmlItemProperty) In oGroup - Dim oPropertyValues As List(Of Object) = oPropertyExtractor.GetPropValue(oDocument, oProperty.Key) + Dim oPropertyValues As List(Of Object) + Try + oPropertyValues = oPropertyExtractor.GetPropValue(oDocument, oProperty.Key) + Catch ex As Exception + _logger.Warn("Unknown error occurred while fetching property {0} in group {1}:", oProperty.Value.Description, oGroupScope) + _logger.Error(ex) + oPropertyValues = New List(Of Object) + End Try + + ' Flatten result value + oPropertyValues = oPropertyExtractor.GetFinalPropValue(oPropertyValues) + + ' Add to list oPropertyList.Add(oProperty.Value, oPropertyValues) ' check the first batch of values to determine the row count @@ -319,46 +353,6 @@ Public Class ImportZUGFeRDFiles End If Next - ' check for rows that are empty in every column - ' this happens when a grouped row is not filled - ' e.g. a row in a invoice that is just a note - _logger.Debug("Done Fetching Property values.") - Dim oIndexesToRemove As New List(Of Integer) - - For oRowIndex = 0 To oRowCount - 1 - Dim oColumnIsEmpty = False - - For Each oRow In oPropertyList - Dim oValue As List(Of Object) = oRow.Value - 'Dim oValue As List(Of Object) = oRow.Value.Item(oRowIndex) - oColumnIsEmpty = oValue.Count = 0 - Next - - If oColumnIsEmpty Then - oIndexesToRemove.Add(oRowIndex) - End If - Next - - _logger.Debug("Removing {0} empty rows.", oIndexesToRemove) - - - ' order indexes to remove descending to avoid indexOutOfRange errors - If oIndexesToRemove.Count > 0 Then - oIndexesToRemove = oIndexesToRemove. - OrderByDescending(Function(oIndex) oIndex). - ToList() - End If - - ' now remove all empty rows. - For Each oIndex In oIndexesToRemove - For Each oRow In oPropertyList - oRow.Value.RemoveAt(oIndex) - Next - Next - - ' decrease row count by rows removed - oRowCount -= oIndexesToRemove.Count - ' Structure of oPropertyList ' [ # Propertyname # Row 1 # Row 2 ' PositionsMenge: [BilledQuantity1, BilledQuantity2, ...], @@ -371,21 +365,13 @@ Public Class ImportZUGFeRDFiles For Each oColumn As KeyValuePair(Of XmlItemProperty, List(Of Object)) In oPropertyList Dim oTableName As String = oColumn.Key.TableName Dim oPropertyDescription As String = oColumn.Key.Description - Dim oPropertyValue = oColumn.Value.Item(oRowIndex) - Dim oRowCounter = oRowIndex + 1 + Dim oRowCounter = oRowIndex + oGlobalGroupCounter + 1 + + ' Returns nothing if oColumn.Value contains an empty list + Dim oPropertyValue = oColumn.Value.ElementAtOrDefault(oRowIndex) _logger.Debug("Processing property {0}.", oPropertyDescription) - If TypeOf oPropertyValue Is List(Of Object) Then - Select Case oPropertyValue.Count - Case 0 - oPropertyValue = String.Empty - Case Else - Dim oList As List(Of Object) = DirectCast(oPropertyValue, List(Of Object)) - oPropertyValue = oList.Item(0) - End Select - End If - If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then If oColumn.Key.IsRequired Then _logger.Warn("Property {0} is empty or not found but was required. Continuing with Empty String.", oPropertyDescription) @@ -414,30 +400,47 @@ Public Class ImportZUGFeRDFiles _firebird.ExecuteNonQueryWithConnection(oCommand, oConnection, Firebird.TransactionMode.ExternalTransaction, oTransaction) Next Next + + oGlobalGroupCounter += oRowCount Next ' Iterate through default properties For Each Item As KeyValuePair(Of String, XmlItemProperty) In oDefaultProperties - Dim oPropertyValueList As List(Of Object) = oPropertyExtractor.GetPropValue(oDocument, Item.Key) + Dim oPropertyValueList As List(Of Object) Dim oPropertyDescription As String = Item.Value.Description Dim oPropertyValue As Object = Nothing - If IsNothing(oPropertyValueList) Then - oPropertyValue = Nothing - ElseIf TypeOf oPropertyValueList Is List(Of Object) Then - Select Case oPropertyValueList.Count - Case 0 - oPropertyValue = Nothing - Case Else - oPropertyValue = oPropertyValueList.First() + Try + oPropertyValueList = oPropertyExtractor.GetPropValue(oDocument, Item.Key) + Catch ex As Exception + _logger.Warn("Unknown error occurred while fetching property {0} in group {1}:", oPropertyDescription, Item.Value.GroupScope) + _logger.Error(ex) + oPropertyValueList = New List(Of Object) + End Try - ' This should hopefully show config errors - If TypeOf oPropertyValue Is List(Of Object) Then - _logger.Warn("Property with Description {0} may be configured incorrectly", oPropertyDescription) + Try + If IsNothing(oPropertyValueList) Then + oPropertyValue = Nothing + ElseIf TypeOf oPropertyValueList Is List(Of Object) Then + Select Case oPropertyValueList.Count + Case 0 oPropertyValue = Nothing - End If - End Select - End If + Case Else + Dim oList As List(Of Object) = DirectCast(oPropertyValueList, List(Of Object)) + oPropertyValue = oList.Item(0) + + ' This should hopefully show config errors + If TypeOf oPropertyValue Is List(Of Object) Then + _logger.Warn("Property with Description {0} may be configured incorrectly", oPropertyDescription) + oPropertyValue = Nothing + End If + End Select + End If + Catch ex As Exception + _logger.Warn("Unknown error occurred while processing property {0}:", oPropertyDescription) + _logger.Error(ex) + oPropertyValue = Nothing + End Try If IsNothing(oPropertyValue) OrElse String.IsNullOrEmpty(oPropertyValue) Then If Item.Value.IsRequired Then @@ -493,6 +496,20 @@ Public Class ImportZUGFeRDFiles Dim oBody = "

The invoice attached to your email has already been processed in our system.

" Dim oEmailData = MoveAndRenameEmailToRejected(args, oFileGroupId) AddToEmailQueue(oFileGroupId, oBody, oEmailData) + + Catch ex As InvalidFerdException + _logger.Error(ex) + + oMoveDirectory = args.ErrorDirectory + + Dim oBody = """ +

Your email contained a ZUGFeRD document but it was incorrectly formatted.

+

Possible reasons include:

    +
  • Amount value has incorrect format (25,01 instead of 25.01)
  • +

+ """ + Dim oEmailData = MoveAndRenameEmailToRejected(args, oFileGroupId) + AddToEmailQueue(oFileGroupId, oBody, oEmailData) Catch ex As TooMuchFerdsException _logger.Error(ex) @@ -526,14 +543,16 @@ Public Class ImportZUGFeRDFiles oConnection.Close() ' Move all files of the current group - For Each oFile In oFileGroupFiles - _filesystem.MoveTo(oFile.FullName, oMoveDirectory) - _logger.Info("Finished processing file {0}", oFile.Name) - _logger.Info("File moved to {0}", oMoveDirectory) - Next - - _logger.Info("Finished processing file group {0}", oFileGroupId) - _logger.EndBlock() + Try + MoveFiles(args, oFileGroupFiles, oFileAttachmentFiles, oMoveDirectory) + _logger.Info("Finished processing file group {0}", oFileGroupId) + Catch ex As Exception + _logger.Warn("Could not move files!") + _logger.Error(ex) + Throw ex + Finally + _logger.EndBlock() + End Try End Try Next End If @@ -546,6 +565,25 @@ Public Class ImportZUGFeRDFiles End Try End Sub + Private Sub MoveFiles(Args As WorkerArgs, Files As List(Of FileInfo), AttachmentFiles As List(Of FileInfo), MoveDirectory As String) + For Each oFile In Files + Dim oFinalMoveDirectory As String = MoveDirectory + + If AttachmentFiles.Contains(oFile) Then + oFinalMoveDirectory = Path.Combine(MoveDirectory, Args.AttachmentsSubDirectory) + + If Not Directory.Exists(oFinalMoveDirectory) Then + Directory.CreateDirectory(oFinalMoveDirectory) + End If + End If + + _filesystem.MoveTo(oFile.FullName, oFinalMoveDirectory) + _logger.Info("Finished processing file {0}", oFile.Name) + _logger.Info("File moved to {0}", oFinalMoveDirectory) + Next + End Sub + + Private Function CreateBodyForMissingProperties(OriginalFilename As String, MissingProperties As List(Of String)) Dim oBody = $"

The following file is not ZUGFeRD-compliant: {OriginalFilename}

" diff --git a/Jobs/EDMI/ZUGFeRD/PropertyValues.vb b/Jobs/EDMI/ZUGFeRD/PropertyValues.vb index 7baabe41..31c6bfc6 100644 --- a/Jobs/EDMI/ZUGFeRD/PropertyValues.vb +++ b/Jobs/EDMI/ZUGFeRD/PropertyValues.vb @@ -1,4 +1,5 @@ Imports System.Collections.Generic +Imports System.Linq Imports System.Reflection Imports System.Text.RegularExpressions Imports DigitalData.Modules.Logging @@ -59,7 +60,7 @@ Public Class PropertyValues If IsArray(Obj) And Not oHasIndex Then Dim oCurrentPart As String = oPart - Dim oSplitString As String() = New String() {"." & oCurrentPart & "."} + Dim oSplitString As String() = New String() {oCurrentPart & "."} Dim oPathFragments = PropertyName.Split(oSplitString, StringSplitOptions.None) Dim oResults As New List(Of Object) @@ -71,10 +72,6 @@ Public Class PropertyValues For Each oArrayItem In Obj Dim oResult As List(Of Object) = GetPropValue(oArrayItem, oPathFragments(1)) - 'If Not IsNothing(oResult) AndAlso oResult.Count > 0 Then - ' oResults.Add(oResult.Item(0)) - 'End If - If Not IsNothing(oResult) Then oResults.Add(oResult) End If @@ -87,6 +84,38 @@ Public Class PropertyValues Return New List(Of Object) From {Obj} End Function + Public Function GetFinalPropValue(List As List(Of Object)) As List(Of Object) + Dim oResult As New List(Of Object) + + For Each Item In List + Dim oItemValue = DoGetFinalPropValue(Item) + + If Not IsNothing(oItemValue) Then + oResult.Add(oItemValue) + End If + Next + + Return oResult + End Function + + Private Function DoGetFinalPropValue(Value As Object) As String + If TypeOf Value Is List(Of Object) Then + Dim oList = DirectCast(Value, List(Of Object)) + Dim oCount = oList.Count + + Select Case oCount + Case 0 + Return Nothing + Case Else + Return DoGetFinalPropValue(oList.First()) + End Select + + Return DoGetFinalPropValue(Value) + Else + Return Value.ToString + End If + End Function + Private Function GetIndex(Prop As String) As Integer If Regex.IsMatch(Prop, _indexPattern) Then Dim oMatch = _indexRegex.Match(Prop) diff --git a/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb index 68c39324..71b3f456 100644 --- a/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb +++ b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb @@ -6,6 +6,7 @@ Public Class WorkerArgs Public ErrorDirectory As String Public OriginalEmailDirectory As String Public RejectedEmailDirectory As String + Public AttachmentsSubDirectory As String Public PropertyMap As Dictionary(Of String, XmlItemProperty) Public InsertIntoSQLServer As Boolean @@ -15,6 +16,7 @@ Public Class WorkerArgs ErrorDirectory = Nothing OriginalEmailDirectory = Nothing RejectedEmailDirectory = Nothing + AttachmentsSubDirectory = Nothing PropertyMap = New Dictionary(Of String, XmlItemProperty) InsertIntoSQLServer = False End Sub diff --git a/Jobs/Exceptions.vb b/Jobs/Exceptions.vb index f73d2d47..d8be37c0 100644 --- a/Jobs/Exceptions.vb +++ b/Jobs/Exceptions.vb @@ -21,6 +21,14 @@ Public Class Exceptions End Sub End Class + Public Class InvalidFerdException + Inherits ApplicationException + + Public Sub New() + MyBase.New("ZUGFeRD document found but was not formatted correctly") + End Sub + End Class + Public Class NoFerdsException Inherits ApplicationException diff --git a/LoggerDiag/App.config b/LoggerDiag/App.config new file mode 100644 index 00000000..5534e287 --- /dev/null +++ b/LoggerDiag/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LoggerDiag/DummyConfig.vb b/LoggerDiag/DummyConfig.vb new file mode 100644 index 00000000..8fe9c12d --- /dev/null +++ b/LoggerDiag/DummyConfig.vb @@ -0,0 +1,3 @@ +Public Class DummyConfig + Public SomeSetting As String = "Default_Value" +End Class diff --git a/Variables/Variables.vbproj b/LoggerDiag/MonoDiag.vbproj similarity index 55% rename from Variables/Variables.vbproj rename to LoggerDiag/MonoDiag.vbproj index 90fa3e59..c374a4ff 100644 --- a/Variables/Variables.vbproj +++ b/LoggerDiag/MonoDiag.vbproj @@ -4,30 +4,34 @@ Debug AnyCPU - {836C9ADE-E04E-4E1E-B17A-201E68014790} - Library - DigitalData.Modules.Variables - DigitalData.Modules.Variables + {3D437957-B90B-4D8F-9219-6D19B0C90994} + WinExe + MonoDiag.My.MyApplication + MonoDiag + MonoDiag 512 - Windows + WindowsForms v4.6.1 + true + AnyCPU true full true true bin\Debug\ - DigitalData.Modules.Variables.xml + MonoDiag.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + AnyCPU pdbonly false true true bin\Release\ - DigitalData.Modules.Variables.xml + MonoDiag.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 @@ -43,8 +47,27 @@ On + + + + + + + + + + ..\packages\NLog.4.5.11\lib\net45\NLog.dll + + + + + + + + + @@ -57,14 +80,22 @@ + + - - + + + Form + + + frmMain.vb + Form + True @@ -82,6 +113,10 @@ + + frmMain.vb + + VbMyResourcesResXFileCodeGenerator Resources.Designer.vb @@ -99,6 +134,18 @@ My Settings.Designer.vb
+ + + + + + {44982f9b-6116-44e2-85d0-f39650b1ef99} + Config + + + {903b2d7d-3b80-4be9-8713-7447b704e1b0} + Logging + \ No newline at end of file diff --git a/LoggerDiag/My Project/Application.Designer.vb b/LoggerDiag/My Project/Application.Designer.vb new file mode 100644 index 00000000..a12c37f8 --- /dev/null +++ b/LoggerDiag/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' Dieser Code wurde von einem Tool generiert. +' Laufzeitversion:4.0.30319.42000 +' +' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +' der Code erneut generiert wird. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'HINWEIS: Diese Datei wird automatisch generiert und darf nicht direkt bearbeitet werden. Wenn Sie Änderungen vornehmen möchten + ' oder in dieser Datei Buildfehler auftreten, wechseln Sie zum Projekt-Designer. + ' (Wechseln Sie dazu zu den Projekteigenschaften, oder doppelklicken Sie auf den Knoten "Mein Projekt" im + ' Projektmappen-Explorer). Nehmen Sie auf der Registerkarte "Anwendung" entsprechende Änderungen vor. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.MonoDiag.frmMain + End Sub + End Class +End Namespace diff --git a/Variables/My Project/Application.myapp b/LoggerDiag/My Project/Application.myapp similarity index 80% rename from Variables/My Project/Application.myapp rename to LoggerDiag/My Project/Application.myapp index 758895de..739ea6fe 100644 --- a/Variables/My Project/Application.myapp +++ b/LoggerDiag/My Project/Application.myapp @@ -1,10 +1,10 @@  - false + true + frmMain false 0 true 0 - 1 true - + \ No newline at end of file diff --git a/Variables/My Project/AssemblyInfo.vb b/LoggerDiag/My Project/AssemblyInfo.vb similarity index 82% rename from Variables/My Project/AssemblyInfo.vb rename to LoggerDiag/My Project/AssemblyInfo.vb index 4b2458e2..5af86104 100644 --- a/Variables/My Project/AssemblyInfo.vb +++ b/LoggerDiag/My Project/AssemblyInfo.vb @@ -8,17 +8,17 @@ Imports System.Runtime.InteropServices ' Werte der Assemblyattribute überprüfen - + - - + + 'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird. - + ' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: ' diff --git a/Variables/My Project/Resources.Designer.vb b/LoggerDiag/My Project/Resources.Designer.vb similarity index 95% rename from Variables/My Project/Resources.Designer.vb rename to LoggerDiag/My Project/Resources.Designer.vb index 1c9f8325..b31b1912 100644 --- a/Variables/My Project/Resources.Designer.vb +++ b/LoggerDiag/My Project/Resources.Designer.vb @@ -39,7 +39,7 @@ Namespace My.Resources Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager Get If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Modules.Variables.Resources", GetType(Resources).Assembly) + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("MonoDiag.Resources", GetType(Resources).Assembly) resourceMan = temp End If Return resourceMan diff --git a/Variables/My Project/Resources.resx b/LoggerDiag/My Project/Resources.resx similarity index 100% rename from Variables/My Project/Resources.resx rename to LoggerDiag/My Project/Resources.resx diff --git a/Variables/My Project/Settings.Designer.vb b/LoggerDiag/My Project/Settings.Designer.vb similarity index 93% rename from Variables/My Project/Settings.Designer.vb rename to LoggerDiag/My Project/Settings.Designer.vb index c9f54ee0..b2d12459 100644 --- a/Variables/My Project/Settings.Designer.vb +++ b/LoggerDiag/My Project/Settings.Designer.vb @@ -64,9 +64,9 @@ Namespace My Friend Module MySettingsProperty _ - Friend ReadOnly Property Settings() As Global.DigitalData.Modules.Variables.My.MySettings + Friend ReadOnly Property Settings() As Global.MonoDiag.My.MySettings Get - Return Global.DigitalData.Modules.Variables.My.MySettings.Default + Return Global.MonoDiag.My.MySettings.Default End Get End Property End Module diff --git a/Variables/My Project/Settings.settings b/LoggerDiag/My Project/Settings.settings similarity index 100% rename from Variables/My Project/Settings.settings rename to LoggerDiag/My Project/Settings.settings diff --git a/LoggerDiag/My Project/licenses.licx b/LoggerDiag/My Project/licenses.licx new file mode 100644 index 00000000..824a99fc --- /dev/null +++ b/LoggerDiag/My Project/licenses.licx @@ -0,0 +1 @@ +DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/LoggerDiag/frmMain.Designer.vb b/LoggerDiag/frmMain.Designer.vb new file mode 100644 index 00000000..14cf6f4f --- /dev/null +++ b/LoggerDiag/frmMain.Designer.vb @@ -0,0 +1,122 @@ + _ +Partial Class frmMain + Inherits System.Windows.Forms.Form + + 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Wird vom Windows Form-Designer benötigt. + Private components As System.ComponentModel.IContainer + + 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. + 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. + 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. + _ + Private Sub InitializeComponent() + Me.GridControlLogs = New DevExpress.XtraGrid.GridControl() + Me.GridView1 = New DevExpress.XtraGrid.Views.Grid.GridView() + Me.btnRefresh = New System.Windows.Forms.Button() + Me.Button1 = New System.Windows.Forms.Button() + Me.TextBox1 = New System.Windows.Forms.TextBox() + Me.Label1 = New System.Windows.Forms.Label() + Me.Button2 = New System.Windows.Forms.Button() + CType(Me.GridControlLogs, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'GridControlLogs + ' + Me.GridControlLogs.Dock = System.Windows.Forms.DockStyle.Right + Me.GridControlLogs.Location = New System.Drawing.Point(251, 0) + Me.GridControlLogs.MainView = Me.GridView1 + Me.GridControlLogs.Name = "GridControlLogs" + Me.GridControlLogs.Size = New System.Drawing.Size(888, 679) + Me.GridControlLogs.TabIndex = 0 + Me.GridControlLogs.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.GridView1}) + ' + 'GridView1 + ' + Me.GridView1.GridControl = Me.GridControlLogs + Me.GridView1.Name = "GridView1" + ' + 'btnRefresh + ' + Me.btnRefresh.Location = New System.Drawing.Point(12, 12) + Me.btnRefresh.Name = "btnRefresh" + Me.btnRefresh.Size = New System.Drawing.Size(233, 35) + Me.btnRefresh.TabIndex = 1 + Me.btnRefresh.Text = "Refresh Logs" + Me.btnRefresh.UseVisualStyleBackColor = True + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(12, 53) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(233, 32) + Me.Button1.TabIndex = 2 + Me.Button1.Text = "Read Config" + Me.Button1.UseVisualStyleBackColor = True + ' + 'TextBox1 + ' + Me.TextBox1.Location = New System.Drawing.Point(12, 143) + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.Size = New System.Drawing.Size(233, 20) + Me.TextBox1.TabIndex = 3 + ' + 'Label1 + ' + Me.Label1.AutoSize = True + Me.Label1.Location = New System.Drawing.Point(9, 127) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(109, 13) + Me.Label1.TabIndex = 4 + Me.Label1.Text = "Value of Test-Setting:" + ' + 'Button2 + ' + Me.Button2.Location = New System.Drawing.Point(12, 91) + Me.Button2.Name = "Button2" + Me.Button2.Size = New System.Drawing.Size(233, 33) + Me.Button2.TabIndex = 5 + Me.Button2.Text = "Save Config" + Me.Button2.UseVisualStyleBackColor = True + ' + 'frmMain + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(1139, 679) + Me.Controls.Add(Me.Button2) + Me.Controls.Add(Me.Label1) + Me.Controls.Add(Me.TextBox1) + Me.Controls.Add(Me.Button1) + Me.Controls.Add(Me.btnRefresh) + Me.Controls.Add(Me.GridControlLogs) + Me.MinimumSize = New System.Drawing.Size(1155, 718) + Me.Name = "frmMain" + Me.Text = "Digital Data Diagnose" + CType(Me.GridControlLogs, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.GridView1, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents GridControlLogs As DevExpress.XtraGrid.GridControl + Friend WithEvents GridView1 As DevExpress.XtraGrid.Views.Grid.GridView + Friend WithEvents btnRefresh As Button + Friend WithEvents Button1 As Button + Friend WithEvents TextBox1 As TextBox + Friend WithEvents Label1 As Label + Friend WithEvents Button2 As Button +End Class diff --git a/LoggerDiag/frmMain.resx b/LoggerDiag/frmMain.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/LoggerDiag/frmMain.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/LoggerDiag/frmMain.vb b/LoggerDiag/frmMain.vb new file mode 100644 index 00000000..2fc491b3 --- /dev/null +++ b/LoggerDiag/frmMain.vb @@ -0,0 +1,62 @@ +Imports System.IO +Imports DigitalData.Modules.Config +Imports DigitalData.Modules.Logging + +Public Class frmMain + Public LogConfig As LogConfig + Public Logger As Logger + Public Config As ConfigManager(Of DummyConfig) + + + Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load + LogConfig = New LogConfig(LogConfig.PathType.AppData) With { + .Debug = True + } + + Dim productName As String = My.Application.Info.ProductName + Dim companyName As String = My.Application.Info.CompanyName + + Dim appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + Dim basePath = Path.Combine(appDataDir, companyName, productName, "Log") + + Logger = LogConfig.GetLogger() + Logger.Info("Initializing Config") + Logger.Info("Logging Path: {0}", basePath) + Logger.Info("UserConfig.xml Path: {0}", Application.UserAppDataPath) + Logger.Info("ComputerConfig.xml Path: {0}", Application.CommonAppDataPath) + + Config = New ConfigManager(Of DummyConfig)(LogConfig, Application.UserAppDataPath, Application.CommonAppDataPath) + + RefreshLogs() + End Sub + + Private Sub RefreshLogs() + GridControlLogs.DataSource = LogConfig.Logs + End Sub + + Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click + RefreshLogs() + End Sub + + Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click + Try + Logger.Info("Value of TestSetting is: {0}", Config.Config.SomeSetting) + TextBox1.Text = Config.Config.SomeSetting + RefreshLogs() + Catch ex As Exception + Logger.Error(ex) + RefreshLogs() + End Try + End Sub + + Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click + Try + Config.Config.SomeSetting = TextBox1.Text + Config.Save() + RefreshLogs() + Catch ex As Exception + Logger.Error(ex) + RefreshLogs() + End Try + End Sub +End Class diff --git a/LoggerDiag/packages.config b/LoggerDiag/packages.config new file mode 100644 index 00000000..f89fa324 --- /dev/null +++ b/LoggerDiag/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Modules.Config/ConfigManager.vb b/Modules.Config/ConfigManager.vb index 0791a6f1..96daa001 100644 --- a/Modules.Config/ConfigManager.vb +++ b/Modules.Config/ConfigManager.vb @@ -33,6 +33,18 @@ Public Class ConfigManager(Of T) ''' Public ReadOnly Property Config As T + Public ReadOnly Property UserConfigPath As String + Get + Return _UserPath + End Get + End Property + + Public ReadOnly Property ComputerConfigPath As String + Get + Return _ComputerPath + End Get + End Property + ''' ''' Creates a new instance of the ConfigManager ''' @@ -112,7 +124,9 @@ Public Class ConfigManager(Of T) Dim oType As Type = GetType(T) Dim oExcludedAttributeTypes = IIf(IsNothing(ExcludedAttributeTypes), New List(Of Type), ExcludedAttributeTypes) Dim oProperties = oType.GetProperties(). - Where(Function(p) p.CanRead And p.CanWrite). + Where(Function(p) + Return p.CanRead And p.CanWrite + End Function). Where(Function(p) For Each oAttributeType As Type In oExcludedAttributeTypes If Attribute.IsDefined(p, oAttributeType) Then @@ -164,6 +178,7 @@ Public Class ConfigManager(Of T) _Logger.Warn("Computer config could not be loaded!") End Try Else + _Logger.Debug("Computer config does not exist.") _ForceUserConfig = True End If @@ -190,6 +205,8 @@ Public Class ConfigManager(Of T) _Logger.Error(ex) _Logger.Warn("User config could not be loaded!") End Try + Else + _Logger.Debug("User config does not exist.") End If Return Config @@ -246,6 +263,7 @@ Public Class ConfigManager(Of T) oFileStream.Flush() End Using Catch ex As Exception + _Logger.Warn("Could not save config to {0}", Path) _Logger.Error(ex) Throw ex End Try @@ -273,6 +291,7 @@ Public Class ConfigManager(Of T) Return oConfig Catch ex As Exception + _Logger.Warn("Could not load config from {0}", Path) _Logger.Error(ex) Throw ex End Try diff --git a/Modules.Interfaces/ZUGFeRDInterface.vb b/Modules.Interfaces/ZUGFeRDInterface.vb index 3f2cf8e0..e8b43eff 100644 --- a/Modules.Interfaces/ZUGFeRDInterface.vb +++ b/Modules.Interfaces/ZUGFeRDInterface.vb @@ -14,7 +14,8 @@ Public Class ZUGFeRDInterface Public Enum ErrorType NoValidFile - ExtractionFailed + NoZugferd + NoValidZugferd End Enum Public Sub New(LogConfig As LogConfig) @@ -33,7 +34,7 @@ Public Class ZUGFeRDInterface Dim oXmlDocument = ValidateZUGFeRDFile(Path) If IsNothing(oXmlDocument) Then - Throw New ZUGFeRDExecption(ErrorType.ExtractionFailed, "Datei ist kein gültiges ZUGFeRD Format.") + Throw New ZUGFeRDExecption(ErrorType.NoZugferd, "Datei ist keine ZUGFeRD Datei.") End If Return SerializeZUGFeRDDocument(oXmlDocument) @@ -70,7 +71,7 @@ Public Class ZUGFeRDInterface If Not oProcessOutput.ToLower.Contains(ZUGFERD_CONVERTER_SUCCESS_MESSAGE.ToLower) Then _logger.Warn("File {0} is not a valid ZUGFeRD File!", Path) - Throw New ZUGFeRDExecption(ErrorType.NoValidFile, "Datei ist kein gültiges ZUGFeRD Format.") + Throw New ZUGFeRDExecption(ErrorType.NoZugferd, "Datei ist keine ZUGFeRD Datei.") End If Try @@ -93,7 +94,7 @@ Public Class ZUGFeRDInterface Return oSerializer.Deserialize(oReader) Catch ex As Exception _logger.Error(ex) - Throw ex + Throw New ZUGFeRDExecption(ErrorType.NoValidZugferd, "Datei ist eine ungültige ZUGFeRD Datei.") End Try End Function End Class diff --git a/Modules.Logging/LogConfig.vb b/Modules.Logging/LogConfig.vb index 2fb378e0..c76847f3 100644 --- a/Modules.Logging/LogConfig.vb +++ b/Modules.Logging/LogConfig.vb @@ -4,7 +4,7 @@ Imports NLog.Config Imports NLog.Targets ''' LogConfig -''' 0.0.0.7 +''' 0.0.1.0 ''' 02.10.2018 ''' ''' Module that writes file-logs to different locations: @@ -100,6 +100,7 @@ Public Class LogConfig Private Const TARGET_ERROR As String = "errorTarget" Private Const TARGET_DETAIL As String = "detailTarget" Private Const TARGET_DEBUG As String = "debugTarget" + Private Const TARGET_MEMORY As String = "memoryTarget" Private Const DATE_FORMAT_LONG As String = "${longdate}" Private Const DATE_FORMAT_DEFAULT As String = "${date:format=yyyy-MM-dd HH\:mm\:ss}" @@ -110,6 +111,7 @@ Public Class LogConfig Private Const LOG_FORMAT_DEFAULT As String = LOG_FORMAT_BASE & " >> ${message}" Private Const LOG_FORMAT_EXCEPTION As String = LOG_FORMAT_BASE & " >> ${exception:format=Message}${newline}${exception:format=StackTrace}" Private Const LOG_FORMAT_DEBUG As String = LOG_FORMAT_BASE_LONG_DATE & " >> ${message}" + Private Const LOG_FORMAT_MEMORY As String = LOG_FORMAT_BASE_LONG_DATE & " >> ${message}${newline}${exception:format=Message}${newline}${exception:format=StackTrace}" Private Const FOLDER_NAME_LOG = "Log" Private Const FILE_NAME_ACCESS_TEST = "accessTest.txt" @@ -158,6 +160,22 @@ Public Class LogConfig End Set End Property + ''' + ''' Returns Logs in Memory as List(Of String) if Debug is enabled + ''' Returns an empty list if debug is disabled + ''' + ''' A list of log messages + Public ReadOnly Property Logs As List(Of String) + Get + If Debug = False Then + Return New List(Of String) + End If + + Dim oTarget = config.FindTargetByName(Of MemoryTarget)(TARGET_MEMORY) + Return oTarget?.Logs.ToList() + End Get + End Property + ''' ''' Initializes a new LogConfig object with a logpath and optinally a filename-suffix. ''' @@ -239,6 +257,14 @@ Public Class LogConfig Return LogFactory.GetLogger(Of Logger)(ClassName) End Function + ''' + ''' Clears the internal log + ''' + Public Sub ClearLogs() + Dim oTarget = config.FindTargetByName(Of MemoryTarget)(TARGET_MEMORY) + oTarget?.Logs.Clear() + End Sub + ''' ''' Gets the fully qualified name of the class invoking the calling method, ''' including the namespace but Not the assembly. @@ -288,6 +314,7 @@ Public Class LogConfig config.AddTarget(TARGET_ERROR, GetErrorLogTarget(basePath)) config.AddTarget(TARGET_DEFAULT, GetDefaultLogTarget(basePath)) config.AddTarget(TARGET_DEBUG, GetDebugLogTarget(basePath)) + config.AddTarget(TARGET_MEMORY, GetMemoryDebugTarget()) ' Add default rules AddDefaultRules(config) @@ -333,6 +360,7 @@ Public Class LogConfig ' Add debug rule, if configured If Debug Then config.AddRuleForOneLevel(LogLevel.Debug, TARGET_DEBUG) + config.AddRuleForAllLevels(TARGET_MEMORY) End If ' Reload all running loggers @@ -402,5 +430,17 @@ Public Class LogConfig Return debugLog End Function + + Private Function GetMemoryDebugTarget() As MemoryTarget + Dim memoryLog As New MemoryTarget() With { + .Layout = LOG_FORMAT_MEMORY, + .Name = TARGET_MEMORY, + .OptimizeBufferReuse = True + } + + Return memoryLog + End Function + + #End Region End Class diff --git a/Modules.Logging/My Project/AssemblyInfo.vb b/Modules.Logging/My Project/AssemblyInfo.vb index 7df792a5..3f292b18 100644 --- a/Modules.Logging/My Project/AssemblyInfo.vb +++ b/Modules.Logging/My Project/AssemblyInfo.vb @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - + diff --git a/Variables/CurrentApplication.vb b/Variables/CurrentApplication.vb deleted file mode 100644 index 897b50ec..00000000 --- a/Variables/CurrentApplication.vb +++ /dev/null @@ -1,3 +0,0 @@ -Public Class CurrentApplication - Public IDBServiceOnline As Boolean = False -End Class diff --git a/Variables/CurrentUser.vb b/Variables/CurrentUser.vb deleted file mode 100644 index b8a60f73..00000000 --- a/Variables/CurrentUser.vb +++ /dev/null @@ -1,9 +0,0 @@ -Public Class CurrentUser - Public USER_GUID As String - Public USER_NAME As String - Public ReadOnly USER_LOGIN As DateTime - - Public Sub New() - USER_LOGIN = DateTime.Now - End Sub -End Class diff --git a/Variables/My Project/Application.Designer.vb b/Variables/My Project/Application.Designer.vb deleted file mode 100644 index 8ab460ba..00000000 --- a/Variables/My Project/Application.Designer.vb +++ /dev/null @@ -1,13 +0,0 @@ -'------------------------------------------------------------------------------ -' -' Dieser Code wurde von einem Tool generiert. -' Laufzeitversion:4.0.30319.42000 -' -' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -' der Code erneut generiert wird. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On -