Imports System.IO Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraGrid.Columns Imports DevExpress.XtraRichEdit Imports DevExpress.XtraEditors Imports DevExpress.XtraReports.UI Imports DevExpress.DataAccess.ObjectBinding Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Database Imports DigitalData.Modules.Config Imports DigitalData.Controls.SQLConfig Imports DigitalData.GUIs.Common Imports ImporterShared.Documents Imports ImporterShared.Winline Imports ImporterShared.Schemas Imports ImporterForm.Positions Public Class frmMain Public LogConfig As LogConfig Public Logger As Logger Public ConfigManager As ConfigManager(Of ImporterShared.Config) Public Database As MSSQLServer Public DocumentLoader As DocumentLoader Public GridBuilder As GridBuilder Public Winline As Data Public WebService As WebService Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load Try txtVersion.Caption = String.Format(txtVersion.Caption, Application.ProductVersion) LogConfig = New LogConfig(LogConfig.PathType.AppData, Nothing, Nothing, "Digital Data", "EDI Document Importer") Logger = LogConfig.GetLogger() Logger.Info("EDI Document Importer, Version [{0}]", Application.ProductVersion) ConfigManager = New ConfigManager(Of ImporterShared.Config)(LogConfig, Application.UserAppDataPath, Application.CommonAppDataPath, Application.StartupPath) ' If ConnectionString does not exist, show SQL Config Form If ConfigManager.Config.ConnectionString = String.Empty Then Dim oForm As New frmSQLConfig(LogConfig) With { .FormTitle = "EDI Document Importer" } Dim oResult = oForm.ShowDialog() If oResult = DialogResult.OK Then ConfigManager.Config.ConnectionString = oForm.ConnectionString ConfigManager.Save() End If End If ' Initialize Database Dim oConnectionString = MSSQLServer.DecryptConnectionString(ConfigManager.Config.ConnectionString) Database = New MSSQLServer(LogConfig, oConnectionString) Winline = New Data(LogConfig, Database, ConfigManager.Config) WebService = New WebService(LogConfig, ConfigManager.Config) ' Load WinLine Data Winline.Mandators.Clear() Winline.LoadMandators() Winline.LoadEconomicYears() For Each oMandator In Winline.Mandators Winline.LoadAccounts(oMandator) Next ' Load data for UI Fields cmbMandator.Properties.DataSource = Winline.Mandators cmbCustomer.Properties.DataSource = Winline.Accounts cmbDeliveryAddress.Properties.DataSource = Winline.Accounts cmbYears.Properties.Items.AddRange(Winline.Years) cmbYears.SelectedItem = ConfigManager.Config.GetYear() ' Initialize Grids GridBuilder = New GridBuilder(New List(Of GridView) From {GridViewFiles, GridViewPositions}) GridBuilder.WithDefaults() PositionGrid.LoadPositionViewAndColumns(GridViewPositions, DocumentType.Order) ' Construct classes related to the xml data DocumentLoader = New DocumentLoader(LogConfig, Winline) Catch ex As Exception Logger.Error(ex) Dim oMessage = GetErrorMessage(ex, "Fehler beim Laden der Anwendung") MsgBox(oMessage, MsgBoxStyle.Critical, Text) End Try End Sub #Region "Helpers" Private Function GetValidationMessage(FieldName As String) As String Return $"Das Feld '{FieldName}' muss ausgefüllt werden!" End Function Private Function GetErrorMessage(pException As Exception, pErrorText As String) Return $"{pErrorText}:{vbNewLine}{vbNewLine}{pException.Message}" End Function Private Function GetFocusedDocument() As Document Dim oRowHandles = GridViewFiles.GetSelectedRows().ToList() Dim oDocument As Document = GridViewFiles.GetRow(oRowHandles.First()) Return oDocument End Function Private Function GetFocusedPosition() As Position Dim oRowHandles = GridViewPositions.GetSelectedRows().ToList() Dim oPosition As Position = GridViewPositions.GetRow(oRowHandles.First()) Return oPosition End Function Private Sub TryOpenDirectory(pPath As String, pDisplayName As String) If Directory.Exists(pPath) Then Process.Start(pPath) Else MsgBox($"{pDisplayName} nicht konfiguriert oder nicht gefunden!", MsgBoxStyle.Exclamation, Text) End If End Sub #End Region Private Sub btnLoadDocuments_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnLoadDocuments.ItemClick Try If DocumentLoader.LoadFiles(ConfigManager.Config.InputDirectory) = True Then RibbonGroupData.Enabled = True RibbonGroupDocument.Enabled = True RibbonGroupPositions.Enabled = True LayoutControlHead.Enabled = True GridControlPositions.Enabled = True btnReloadDocument.Enabled = True GridControlFiles.DataSource = DocumentLoader.Files txtFilesLoaded.Caption = $"{DocumentLoader.Files.Count} Dokumente geladen" End If Catch ex As Exception Dim oMessage = ex.Message If ex.InnerException IsNot Nothing Then oMessage &= vbNewLine & vbNewLine & ex.InnerException.Message End If MsgBox(oMessage, MsgBoxStyle.Critical, Text) End Try End Sub Private Sub GridViewFiles_FocusedRowChanged(sender As Object, e As DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs) Handles GridViewFiles.FocusedRowChanged Dim oDocument As Document = GridViewFiles.GetRow(e.FocusedRowHandle) If oDocument Is Nothing Then Exit Sub End If ShowDocument(oDocument) End Sub Private Sub ShowDocument(pDocument As Document) ' Load XML File in the sidebar RichEditXml.LoadDocument(pDocument.FullName, DocumentFormat.PlainText) If pDocument.Mandator Is Nothing Then Dim oForm As New frmMandatorSelection() With { .Mandators = Winline.Mandators, .SelectedMandator = Nothing } Dim oResult = oForm.ShowDialog() If oResult <> DialogResult.OK Then Exit Sub End If pDocument.Mandator = oForm.SelectedMandator.Id End If Try Select Case pDocument.Type Case DocumentType.Order ShowOrderDocument(pDocument) End Select Catch ex As Xml.XmlException Dim oMessage = GetErrorMessage(ex, "Fehler beim Laden des Dokuments") MsgBox(oMessage, MsgBoxStyle.Critical, Text) Logger.Error(ex) Catch ex As Exceptions.NoMandatorException Dim oMessage = GetErrorMessage(ex, "Fehler beim Laden des Dokuments") MsgBox(oMessage, MsgBoxStyle.Critical, Text) Logger.Error(ex) Catch ex As Exception Dim oMessage = GetErrorMessage(ex, "Fehler beim Laden des Dokuments") MsgBox(oMessage, MsgBoxStyle.Critical, Text) Logger.Error(ex) End Try End Sub Private Sub ShowOrderDocument(pDocument As Document) If pDocument.Mandator Is Nothing Then Throw New Exceptions.NoMandatorException("Es konnte kein Mandant gefunden werden") End If Dim oData As Orders.Input.MESOWebService = DirectCast(pDocument.Data, Orders.Input.MESOWebService) Dim oDataOriginal As Orders.Input.MESOWebService = DirectCast(pDocument.DataOriginal, Orders.Input.MESOWebService) Dim oHead = Orders.Helpers.GetOrderHead(oData) Dim oHeadOriginal = Orders.Helpers.GetOrderHead(oDataOriginal) ' --- Head Data -------------------------------------------------------------------------------------- ' Original, Unreplaced Data txtCustomerGLN.Text = oHeadOriginal.Fakt_Kontonummer txtDeliveryAddressGLN.Text = oHeadOriginal.Lief_Kontonummer ' Regular Data from EDI txtRunningNumber.Text = oHead.Laufnummer txtOrderIssuer.Text = oHead.Fakt_Ansprechpartner txtOrderNumber.Text = oHead.AuftragsBestellnummer ' TODO: Get Doc Kind from Winline Class cmdDocumentKind.Text = oHead.Belegart txtDocumentReference.Text = oHead.Auftragsreferenz dateOrderDate.EditValue = oHead.Datum_AuftragBestellung ' --- Find Mandator -------------------------------------------------------------------------------------- Dim oMandator = Winline.Mandators. Where(Function(m) m.Id = pDocument.Mandator). SingleOrDefault() cmbMandator.EditValue = oMandator ' --- Find Accounts -------------------------------------------------------------------------------------- ' FAKTURA If oHead.Fakt_Kontonummer = oHeadOriginal.Fakt_Kontonummer Then cmbCustomer.ErrorText = GetValidationMessage("Faktura Konto") cmbCustomer.EditValue = Nothing Else Dim oMatchingAccounts = Winline.Accounts. Where(Function(oAccount) oAccount.Mandator = oMandator.Id). Where(Function(oAccount) oAccount.Id = oHead.Fakt_Kontonummer) If oMatchingAccounts.Count() > 1 Then Throw New Exceptions.MultipleAccountsException("Für die Kontonummer wurden mehrere Konten gefunden.") End If If oMatchingAccounts.Count() = 0 Then Throw New Exceptions.NoAccountException("Für die Kontonummer wurde kein Konto gefunden.") End If cmbCustomer.EditValue = oMatchingAccounts.SingleOrDefault() End If ' DEVLIERY If oHead.Lief_Kontonummer = oHeadOriginal.Lief_Kontonummer Then cmbDeliveryAddress.ErrorText = GetValidationMessage("Lieferanten Konto") cmbDeliveryAddress.EditValue = Nothing Else Dim oMatchingAccounts = Winline.Accounts. Where(Function(oAccount) oAccount.Mandator = oMandator.Id). Where(Function(oAccount) oAccount.Id = oHead.Lief_Kontonummer) If oMatchingAccounts.Count() > 1 Then Throw New Exceptions.MultipleAccountsException("Für die Kontonummer wurden mehrere Konten gefunden.") End If If oMatchingAccounts.Count() = 0 Then Throw New Exceptions.NoAccountException("Für die Kontonummer wurde kein Konto gefunden.") End If cmbDeliveryAddress.EditValue = oMatchingAccounts.SingleOrDefault() End If Dim oPositionList = PositionData.Load(oData, oDataOriginal) GridControlPositions.DataSource = oPositionList GridViewPositions.BestFitColumns() End Sub Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick TryOpenDirectory(ConfigManager.Config.InputDirectory, "Eingangsverzeichnis") End Sub Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick TryOpenDirectory(ConfigManager.Config.OutputDirectory, "Ausgangsverzeichnis") End Sub Private Sub BarButtonItem3_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem3.ItemClick Dim oUserConfigDirectory = New FileInfo(ConfigManager.UserConfigPath).Directory TryOpenDirectory(oUserConfigDirectory.FullName, "Konfigurationsverzeichnis") End Sub Private Sub checkShowXml_CheckedChanged(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles checkShowXml.CheckedChanged SplitContainerControl3.Collapsed = Not checkShowXml.Checked End Sub Private Sub BarButtonItem4_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem4.ItemClick Dim oDocument As Document = GetFocusedDocument() If oDocument Is Nothing Then Exit Sub End If WebService.TransferDocumentToWinLine(oDocument) End Sub Private Sub BarButtonItem8_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem8.ItemClick TryOpenDirectory(LogConfig.LogDirectory, "Logverzeichnis") End Sub Private Sub cmbAccount_Validating(sender As BaseEdit, e As System.ComponentModel.CancelEventArgs) Handles cmbCustomer.Validating, cmbDeliveryAddress.Validating If sender.EditValue Is Nothing Then sender.ErrorText = "Dieses Feld muss ausgefüllt werden!" Else sender.ErrorText = "" End If End Sub Private Sub btnPreviewReport_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnPreviewReport.ItemClick Dim oDocument As Document = GetFocusedDocument() If oDocument Is Nothing Then Exit Sub End If Dim oReport As New OrderReport() Dim oDataSource = New DevExpress.DataAccess.ObjectBinding.ObjectDataSource With { .DataSource = New Orders.ReportSource With { .Head = Orders.Helpers.GetOrderHead(oDocument.Data), .Positions = Orders.Helpers.GetOrderPositions(oDocument.Data) } } oDataSource.Fill() oReport.DataSource = oDataSource Dim oReportPrintTool As New ReportPrintTool(oReport) oReportPrintTool.ShowPreview() End Sub Private Sub btnReloadDocument_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnReloadDocument.ItemClick Dim oDocument As Document = GetFocusedDocument() If oDocument Is Nothing Then Exit Sub End If ShowDocument(oDocument) End Sub Private Sub btnDeletePosition_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnDeletePosition.ItemClick Dim oPosition = GetFocusedPosition() If oPosition Is Nothing Then MsgBox("Bitte wählen Sie eine Position aus!", MsgBoxStyle.Exclamation, Text) Exit Sub End If Dim oResult = MsgBox($"Wollen Sie die ausgewählte Position Artikel [{oPosition.ArticleNumber}] wirklich löschen?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo, Text) If oResult = MsgBoxResult.Yes Then GridViewPositions.DeleteSelectedRows() MsgBox("Position gelöscht") End If End Sub Private Sub BarButtonItem7_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem7.ItemClick MsgBox("Mach et!") End Sub End Class