Jonathan Jenne d165817f8a WIP
2021-08-11 16:17:59 +02:00

294 lines
12 KiB
VB.net

Imports System.IO
Imports System.Globalization
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraGrid.Columns
Imports DevExpress.XtraRichEdit
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Config
Imports DigitalData.Controls.SQLConfig
Imports DigitalData.GUIs.Common
Imports EDIDocumentImport.DocumentInfo
Imports EDIDocumentImport.DocumentPositions
Imports DevExpress.XtraEditors
Public Class frmMain
Public LogConfig As LogConfig
Public Logger As Logger
Public ConfigManager As ConfigManager(Of Config)
Public Database As MSSQLServer
Public DocumentLoader As DocumentLoader
Public GridBuilder As GridBuilder
Public Winline As WinLineInfo
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")
ConfigManager = New ConfigManager(Of Config)(LogConfig, Application.UserAppDataPath, Application.CommonAppDataPath, Application.StartupPath)
Logger = LogConfig.GetLogger()
' 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 WinLineInfo(LogConfig, Database, 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 = Now.Year
' Initialize Grids
GridBuilder = New GridBuilder(New List(Of GridView) From {GridViewFiles, GridViewPositions})
GridBuilder.WithDefaults()
' Construct classes related to the xml data
DocumentLoader = New DocumentLoader(LogConfig, ConfigManager.Config, Database, Winline)
Catch ex As Exception
Logger.Error(ex)
MsgBox(ex.Message, MsgBoxStyle.Critical, Text)
End Try
End Sub
Private Sub btnLoadDocuments_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnLoadDocuments.ItemClick
Try
If DocumentLoader.LoadFiles() = True Then
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
RichEditXml.LoadDocument(oDocument.FullName, DocumentFormat.PlainText)
Try
Select Case oDocument.Type
Case DocumentType.Order
ShowDocument(oDocument, oDocument.Data, oDocument.DataOriginal)
End Select
Catch ex As Xml.XmlException
Dim oMessage As String = $"Fehler beim Verarbeiten des Dokuments {oDocument.Name}:{vbNewLine}{ex.Message}"
MsgBox(oMessage, MsgBoxStyle.Critical, Text)
Logger.Error(ex)
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, Text)
Logger.Error(ex)
End Try
End Sub
Private Sub ShowDocument(pDocument As Document, pData As Orders.MESOWebService, pDataOriginal As Orders.MESOWebService)
Dim oHead As Orders.MESOWebServiceEXIMVRG_ordersT025 = pData.Items.
Where(Function(i) TypeOf i Is Orders.MESOWebServiceEXIMVRG_ordersT025).
FirstOrDefault()
Dim oHeadOriginal As Orders.MESOWebServiceEXIMVRG_ordersT025 = pDataOriginal.Items.
Where(Function(i) TypeOf i Is Orders.MESOWebServiceEXIMVRG_ordersT025).
FirstOrDefault()
Dim oPositions As List(Of Orders.MESOWebServiceEXIMVRG_ordersT026) = pData.Items.
Where(Function(i) TypeOf i Is Orders.MESOWebServiceEXIMVRG_ordersT026).
Select(Of Orders.MESOWebServiceEXIMVRG_ordersT026)(Function(i) i).
ToList()
Dim oPositionsOriginal As List(Of Orders.MESOWebServiceEXIMVRG_ordersT026) = pDataOriginal.Items.
Where(Function(i) TypeOf i Is Orders.MESOWebServiceEXIMVRG_ordersT026).
Select(Of Orders.MESOWebServiceEXIMVRG_ordersT026)(Function(i) i).
ToList()
' ====== Head Data ======
' Original, Unreplaced Data
txtCustomerGLN.Text = oHeadOriginal.Fakt_Kontonummer
txtDeliveryAddressGLN.Text = oHeadOriginal.Lief_Kontonummer
' Regular Data from EDI
txtBELEGKEY.Text = oHead.BELEGKEY
txtRunningNumber.Text = oHead.Laufnummer
txtOrderIssuer.Text = oHead.Fakt_Ansprechpartner
txtOrderNumber.Text = oHead.AuftragsBestellnummer
dateOrderDate.EditValue = oHead.Datum_AuftragBestellung
Dim oMandator = Winline.Mandators.
Where(Function(m) m.Id = pDocument.Mandator.Id).
SingleOrDefault()
If oMandator Is Nothing Then
cmbMandator.ErrorText = "Dieses Feld muss ausgefüllt werden!"
cmbMandator.EditValue = Nothing
Else
cmbMandator.EditValue = oMandator
End If
If oHead.Fakt_Kontonummer = oHeadOriginal.Fakt_Kontonummer Then
cmbCustomer.ErrorText = "Dieses Feld muss ausgefüllt werden!"
cmbCustomer.EditValue = Nothing
Else
cmbCustomer.EditValue = Winline.Accounts.
Where(Function(oAccount) oAccount.Id = oHead.Fakt_Kontonummer And oAccount.Mandator = cmbMandator.EditValue).
SingleOrDefault()
End If
If oHead.Lief_Kontonummer = oHeadOriginal.Lief_Kontonummer Then
cmbDeliveryAddress.ErrorText = "Dieses Feld muss ausgefüllt werden!"
cmbDeliveryAddress.EditValue = Nothing
Else
cmbDeliveryAddress.EditValue = Winline.Accounts.
Where(Function(oAccount) oAccount.Id = oHead.Lief_Kontonummer And oAccount.Mandator = cmbMandator.EditValue).
SingleOrDefault()
End If
' TODO
'cmbMandator.EditValue = Winline.Mandators.
' Where(Function(m) m.Id = "SIVT").
' SingleOrDefault()
'cmbCustomer.EditValue = Winline.Accounts.
' Where(Function(oAccount) oAccount.Id = oHead.Fakt_Kontonummer And oAccount.Mandator = cmbMandator.EditValue).
' SingleOrDefault()
' ====== Position Data ======
Dim oPositionList As New List(Of OrderPosition)
For Each oPosition In oPositions
Dim oPositionOriginal = oPositionsOriginal.
Where(Function(p) p.Zeilennummer = oPosition.Zeilennummer).
SingleOrDefault()
oPositionList.Add(New OrderPosition With {
.ArticleNumber = oPosition.Artikelnummer,
.RowNumber = oPosition.Zeilennummer,
.ArticleDescription = oPosition.Bezeichnung,
.ArticleNumberVendor = oPosition.Lieferantenartikelnummer,
.EDIPrice = oPosition.Einzelpreis,
.WinLinePrice = 0,
.Price = 0,
.Amount = oPosition.Menge_bestellt,
.EuropeanArticleNumber = oPositionOriginal.Artikelnummer
})
Next
LoadViewAndColumns(GridViewPositions, DocumentType.Order)
GridControlPositions.DataSource = oPositionList
GridViewPositions.BestFitColumns()
End Sub
Public Sub LoadViewAndColumns(pView As GridView, pDocumentType As DocumentType)
Dim oColumns As List(Of GridColumn)
' Create columns list depending on DocumentType
Select Case pDocumentType
Case DocumentType.Order
oColumns = New List(Of GridColumn) From {
ColumnRowNumber,
ColumnArticleNumber,
ColumnArticleNumberVendor,
ColumnEuropeanArticleNumber,
ColumnArticleDescription,
ColumnEDIPrice,
ColumnWinLinePrice,
ColumnPrice
}
Case Else
oColumns = New List(Of GridColumn)
End Select
' Reset the grid
pView.GridControl.DataSource = Nothing
pView.GridControl.ForceInitialize()
' Add and adjust columns
pView.Columns.AddRange(oColumns.ToArray())
pView.BestFitColumns()
' Set columns readonly that need it
Dim oReadOnlyColumns = oColumns.
Except(DocumentPositions.WritableColumns).
ToList()
For Each oColumn As GridColumn In GridViewPositions.Columns
If oReadOnlyColumns.Contains(oColumn) Then
oColumn.OptionsColumn.ReadOnly = True
oColumn.OptionsColumn.AllowEdit = False
Else
oColumn.Caption &= " *"
End If
Next
End Sub
Private Sub BarButtonItem1_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem1.ItemClick
Process.Start(ConfigManager.Config.InputDirectory)
End Sub
Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick
Process.Start(ConfigManager.Config.OutputDirectory)
End Sub
Private Sub BarButtonItem3_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem3.ItemClick
Dim oUserConfigDirectory = New FileInfo(ConfigManager.UserConfigPath).Directory
Process.Start(oUserConfigDirectory.FullName)
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
MsgBox("Mach et!")
End Sub
Private Sub BarButtonItem8_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem8.ItemClick
Process.Start(LogConfig.LogDirectory)
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
End Class