Jonathan Jenne 64a9ea2464 wip
2021-08-23 16:35:28 +02:00

376 lines
15 KiB
VB.net

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