CBAM kafka, NCTS Fremd(Tobb), realyhub

This commit is contained in:
2025-10-23 11:33:14 +02:00
parent e0c06d3c2f
commit 6d1e68157d
22 changed files with 1973 additions and 23 deletions

View File

@@ -61,6 +61,7 @@ Partial Class usrCntlATLAS_EZA
Me.VERAGIMPORTFormatToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.ToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem()
Me.EZAIDToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.VERAGFormatÖffnen2025V1ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
CType(Me.SplitContainer, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainer.Panel1.SuspendLayout()
Me.SplitContainer.SuspendLayout()
@@ -447,7 +448,7 @@ Partial Class usrCntlATLAS_EZA
'
'DateiimportToolStripMenuItem
'
Me.DateiimportToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.DynamicAutomotiveXLSToolStripMenuItem, Me.GEZEXLSXToolStripMenuItem, Me.MEYLEXLSXToolStripMenuItem, Me.FressnapToolStripMenuItem, Me.VERAGIMPORTFormatToolStripMenuItem})
Me.DateiimportToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.DynamicAutomotiveXLSToolStripMenuItem, Me.GEZEXLSXToolStripMenuItem, Me.MEYLEXLSXToolStripMenuItem, Me.FressnapToolStripMenuItem, Me.VERAGIMPORTFormatToolStripMenuItem, Me.VERAGFormatÖffnen2025V1ToolStripMenuItem})
Me.DateiimportToolStripMenuItem.Name = "DateiimportToolStripMenuItem"
Me.DateiimportToolStripMenuItem.Size = New System.Drawing.Size(87, 20)
Me.DateiimportToolStripMenuItem.Text = "Datei-Import"
@@ -455,31 +456,31 @@ Partial Class usrCntlATLAS_EZA
'DynamicAutomotiveXLSToolStripMenuItem
'
Me.DynamicAutomotiveXLSToolStripMenuItem.Name = "DynamicAutomotiveXLSToolStripMenuItem"
Me.DynamicAutomotiveXLSToolStripMenuItem.Size = New System.Drawing.Size(238, 22)
Me.DynamicAutomotiveXLSToolStripMenuItem.Size = New System.Drawing.Size(244, 22)
Me.DynamicAutomotiveXLSToolStripMenuItem.Text = "Dynamic Automotive (XLSX)"
'
'GEZEXLSXToolStripMenuItem
'
Me.GEZEXLSXToolStripMenuItem.Name = "GEZEXLSXToolStripMenuItem"
Me.GEZEXLSXToolStripMenuItem.Size = New System.Drawing.Size(238, 22)
Me.GEZEXLSXToolStripMenuItem.Size = New System.Drawing.Size(244, 22)
Me.GEZEXLSXToolStripMenuItem.Text = "GEZE (XLSX)"
'
'MEYLEXLSXToolStripMenuItem
'
Me.MEYLEXLSXToolStripMenuItem.Name = "MEYLEXLSXToolStripMenuItem"
Me.MEYLEXLSXToolStripMenuItem.Size = New System.Drawing.Size(238, 22)
Me.MEYLEXLSXToolStripMenuItem.Size = New System.Drawing.Size(244, 22)
Me.MEYLEXLSXToolStripMenuItem.Text = "MEYLE (XLSX)"
'
'FressnapToolStripMenuItem
'
Me.FressnapToolStripMenuItem.Name = "FressnapToolStripMenuItem"
Me.FressnapToolStripMenuItem.Size = New System.Drawing.Size(238, 22)
Me.FressnapToolStripMenuItem.Size = New System.Drawing.Size(244, 22)
Me.FressnapToolStripMenuItem.Text = "Fressnapf (XLSX)"
'
'VERAGIMPORTFormatToolStripMenuItem
'
Me.VERAGIMPORTFormatToolStripMenuItem.Name = "VERAGIMPORTFormatToolStripMenuItem"
Me.VERAGIMPORTFormatToolStripMenuItem.Size = New System.Drawing.Size(238, 22)
Me.VERAGIMPORTFormatToolStripMenuItem.Size = New System.Drawing.Size(244, 22)
Me.VERAGIMPORTFormatToolStripMenuItem.Text = "VERAG-IMPORT-Format (XLSX)"
'
'ToolStripMenuItem1
@@ -495,6 +496,12 @@ Partial Class usrCntlATLAS_EZA
Me.EZAIDToolStripMenuItem.Size = New System.Drawing.Size(109, 22)
Me.EZAIDToolStripMenuItem.Text = "EZA ID"
'
'VERAGFormatÖffnen2025V1ToolStripMenuItem
'
Me.VERAGFormatÖffnen2025V1ToolStripMenuItem.Name = "VERAGFormatÖffnen2025V1ToolStripMenuItem"
Me.VERAGFormatÖffnen2025V1ToolStripMenuItem.Size = New System.Drawing.Size(244, 22)
Me.VERAGFormatÖffnen2025V1ToolStripMenuItem.Text = "VERAG-Format öffnen (2025-V1)"
'
'usrCntlATLAS_EZA
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
@@ -556,4 +563,5 @@ Partial Class usrCntlATLAS_EZA
Friend WithEvents MEYLEXLSXToolStripMenuItem As ToolStripMenuItem
Friend WithEvents FressnapToolStripMenuItem As ToolStripMenuItem
Friend WithEvents VERAGIMPORTFormatToolStripMenuItem As ToolStripMenuItem
Friend WithEvents VERAGFormatÖffnen2025V1ToolStripMenuItem As ToolStripMenuItem
End Class

View File

@@ -1773,7 +1773,395 @@ Public Class usrCntlATLAS_EZA
End Function
Private Sub VERAGIMPORTFormatToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles VERAGIMPORTFormatToolStripMenuItem.Click
ImportExcel_CustomsTemplate_V1()
End Sub
'================================================================================================================================
'================================================================================================================================
'================================================================================================================================
Public Function ImportExcel_CustomsTemplate_V1() As Boolean
' --- Dateiauswahl wie gehabt ---
Dim f As New frmImportFromAVISOAnhaenge(AVISO, SENDUNG)
f.ShowDialog(Me)
If f.DialogResult <> DialogResult.OK Then Return False
If f.LIST_FILES Is Nothing OrElse f.LIST_FILES.Count = 0 Then Return False
' --- ggf. vorhandene Positionen leeren ---
If EZA.eza_WARENPOS.Count > 0 Then
If vbYes = MsgBox("Sollen vorhandene Positionen gelöscht werden?", vbYesNo) Then
EZA.eza_WARENPOS.Clear()
End If
End If
Me.Cursor = Cursors.WaitCursor
Dim cnt As Integer = 0
For Each filePath As String In f.LIST_FILES
If Not (filePath.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) OrElse filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase)) Then
Continue For
End If
Dim xlApp As Excel.Application = Nothing
Dim wb As Excel.Workbook = Nothing
Dim ws As Excel.Worksheet = Nothing
Try
xlApp = New Excel.Application()
xlApp.DisplayAlerts = False
xlApp.CutCopyMode = False
wb = xlApp.Workbooks.Open(filePath)
ws = CType(wb.Worksheets(1), Excel.Worksheet)
wb.Activate()
' Falls Autofilter aktiv: ShowAllData() versuchen (optional)
Try
ws.ShowAllData()
Catch
End Try
' ---------- VERSIONSPRÜFUNG ----------
Dim versionTag As String = GetCellStr(ws, 2, 8) ' H2
If Not String.Equals(versionTag, "2025-V1", StringComparison.OrdinalIgnoreCase) Then
Throw New ApplicationException("Version nicht unterstützt (gefunden: '" & versionTag & "', erwartet: '2025-V1').")
End If
' ---------- 1) HEADER KEY/VALUE (A/B) ----------
Dim header As New Dictionary(Of String, String)(StringComparer.OrdinalIgnoreCase)
Dim usedRows As Integer = ws.UsedRange.Rows.Count
Dim r As Integer
For r = 3 To Math.Min(80, usedRows + 5)
Dim k As String = GetCellStr(ws, r, 1)
Dim v As String = GetCellStr(ws, r, 2)
If Not String.IsNullOrWhiteSpace(k) Then header(k) = v
Next
' ein paar Kopfwerte ins EZA (alle optional)
Dim HandelsRgNr As String = ""
If header.ContainsKey("Invoice No.") Then HandelsRgNr = header("Invoice No.")
If header.ContainsKey("Currency") Then EZA.eza_Rechnungswaehrung = header("Currency")
If header.ContainsKey("Delivery Terms (Incoterms)") Then EZA.eza_LieferbedingungCode = header("Delivery Terms (Incoterms)")
If header.ContainsKey("Total Gross Weight (kg)") Then EZA.eza_GesamtRohmasse = ToDoubleSafeVERAGTmpl(header("Total Gross Weight (kg)"))
If header.ContainsKey("Truck Plate (Tractor)") Then EZA.eza_KennzeichenNameBefoerderungsmittelAnkunft = header("Truck Plate (Tractor)")
' ---------- 2) CONSIGNOR / CONSIGNEE ----------
Dim rowCons As Integer = -1
Dim rowCee As Integer = -1
For r = 3 To Math.Min(80, usedRows + 5)
Dim aVal As String = GetCellStr(ws, r, 1)
If rowCons < 0 AndAlso String.Equals(aVal, "Consignor / Exporter", StringComparison.OrdinalIgnoreCase) Then rowCons = r
If rowCee < 0 AndAlso String.Equals(aVal, "Consignee / Importer", StringComparison.OrdinalIgnoreCase) Then rowCee = r
If rowCons > 0 AndAlso rowCee > 0 Then Exit For
Next
' Kundennummern nur ermitteln, wenn die Blöcke auch existieren
Dim kdnrImp As String = If(rowCee > 0, GetCellStr(ws, rowCee + 1, 6), "")
Dim kdnrCons As String = If(rowCons > 0, GetCellStr(ws, rowCons + 1, 6), "")
If rowCons > 0 Then
'Prüfen, ob Adresse schon vorhanden:
If Not EZA.eza_ADRESSEN.Any(Function(a) a.ezaAd_AdressTyp IsNot Nothing AndAlso a.ezaAd_AdressTyp.ToString().ToUpper() = "CZ") Then
Dim rr As Integer = rowCons + 1
Dim adrC As New cDakosy_EZA_Adressen()
adrC.ezaAd_AdressTyp = "CZ"
If Not String.IsNullOrWhiteSpace(kdnrCons) Then
' --- Daten aus Datenbank (cAdressen) laden ---
Dim AD As New cAdressen(kdnrCons)
Dim KD As New cKunde(kdnrCons)
adrC.ezaAd_NameFirma1 = AD.Name_1
adrC.ezaAd_LandCode = cProgramFunctions.getISO2Land(AD.LandKz)
adrC.ezaAd_PLZ = AD.PLZ
adrC.ezaAd_Ort = AD.Ort
adrC.ezaAd_StrasseHausNr1 = AD.Straße
If Not String.IsNullOrWhiteSpace(KD.EORITIN) Then adrC.ezaAd_TeilnehmerEORI = KD.EORITIN
Else
' --- Excel-Werte (alle optional) ---
Dim consCompany As String = GetCellStr(ws, rr, 1)
Dim consCountry As String = GetCellStr(ws, rr, 2).ToUpperInvariant()
Dim consZIP As String = GetCellStr(ws, rr, 3)
Dim consCity As String = GetCellStr(ws, rr, 4)
Dim consStreet As String = GetCellStr(ws, rr, 5)
If consCompany <> "" Then adrC.ezaAd_NameFirma1 = consCompany
If consCountry <> "" Then adrC.ezaAd_LandCode = consCountry
If consZIP <> "" Then adrC.ezaAd_PLZ = consZIP
If consCity <> "" Then adrC.ezaAd_Ort = consCity
If consStreet <> "" Then adrC.ezaAd_StrasseHausNr1 = consStreet
End If
EZA.eza_ADRESSEN.Add(adrC)
End If
End If
If rowCee > 0 Then
'Prüfen, ob Adresse schon vorhanden:
If Not EZA.eza_ADRESSEN.Any(Function(a) a.ezaAd_AdressTyp IsNot Nothing AndAlso a.ezaAd_AdressTyp.ToString().ToUpper() = "CN") Then
Dim rr As Integer = rowCee + 1
Dim adrE As New cDakosy_EZA_Adressen()
adrE.ezaAd_AdressTyp = "CN"
If Not String.IsNullOrWhiteSpace(kdnrImp) Then
' --- Daten aus Datenbank (cAdressen) laden ---
Dim AD As New cAdressen(kdnrImp)
Dim KD As New cKunde(kdnrImp)
adrE.ezaAd_NameFirma1 = AD.Name_1
adrE.ezaAd_LandCode = cProgramFunctions.getISO2Land(AD.LandKz)
adrE.ezaAd_PLZ = AD.PLZ
adrE.ezaAd_Ort = AD.Ort
adrE.ezaAd_StrasseHausNr1 = AD.Straße
If Not String.IsNullOrWhiteSpace(KD.EORITIN) Then adrE.ezaAd_TeilnehmerEORI = KD.EORITIN
Else
' --- Excel-Werte (alle optional) ---
Dim ceeCompany As String = GetCellStr(ws, rr, 1)
Dim ceeCountry As String = GetCellStr(ws, rr, 2).ToUpperInvariant()
Dim ceeZIP As String = GetCellStr(ws, rr, 3)
Dim ceeCity As String = GetCellStr(ws, rr, 4)
Dim ceeStreet As String = GetCellStr(ws, rr, 5)
If ceeCompany <> "" Then adrE.ezaAd_NameFirma1 = ceeCompany
If ceeCountry <> "" Then adrE.ezaAd_LandCode = ceeCountry
If ceeZIP <> "" Then adrE.ezaAd_PLZ = ceeZIP
If ceeCity <> "" Then adrE.ezaAd_Ort = ceeCity
If ceeStreet <> "" Then adrE.ezaAd_StrasseHausNr1 = ceeStreet
End If
EZA.eza_ADRESSEN.Add(adrE)
End If
End If
' ---------- 3) ITEM-TABELLE (optional) ----------
' Finde Titelzeile "Item Lines (add as many as needed)" in Spalte A
Dim rowItemsTitle As Integer = -1
For r = 10 To Math.Min(200, usedRows + 10)
If String.Equals(GetCellStr(ws, r, 1), "Item Lines (add as many as needed)", StringComparison.OrdinalIgnoreCase) Then
rowItemsTitle = r
Exit For
End If
Next
If rowItemsTitle > 0 Then
Dim rowHdr As Integer = rowItemsTitle + 1
Dim usedCols As Integer = ws.UsedRange.Columns.Count
' Header-Indices (alle optional)
Dim cLine As Integer = -1, cArticle As Integer = -1, cDesc As Integer = -1, cShortDesc As Integer = -1
Dim cHs As Integer = -1, cOrigin As Integer = -1, cPkgs As Integer = -1, cPkgType As Integer = -1
Dim cGross As Integer = -1, cNet As Integer = -1, cUnit As Integer = -1, cTotal As Integer = -1, cCurr As Integer = -1
Dim c As Integer
For c = 1 To usedCols
Dim h As String = GetCellStr(ws, rowHdr, c).ToLowerInvariant()
Select Case h
Case "line no.", "line no" : cLine = c
Case "article no.", "article no" : cArticle = c
Case "goods description" : cDesc = c
Case "short description" : cShortDesc = c
Case "hs code" : cHs = c
Case "origin country" : cOrigin = c
Case "packages" : cPkgs = c
Case "package type" : cPkgType = c
Case "gross weight (kg)" : cGross = c
Case "net weight (kg)" : cNet = c
Case "unit price" : cUnit = c
Case "total value" : cTotal = c
Case "currency" : cCurr = c
End Select
Next
' Datenzeilen lesen: ab rowHdr+1 bis zur ersten komplett leeren Zeile
Dim rData As Integer = rowHdr + 1
Dim lastRow As Integer = ws.UsedRange.Rows.Count + 5
While rData <= lastRow
Dim anyVal As Boolean = False
For c = 1 To usedCols
If GetCellStr(ws, rData, c) <> "" Then
anyVal = True
Exit For
End If
Next
If Not anyVal Then Exit While
' Werte nur holen, wenn es die Spalten gibt
Dim descTxt As String = If(cDesc > 0, GetCellStr(ws, rData, cDesc), "")
Dim hs As String = If(cHs > 0, GetCellStr(ws, rData, cHs), "")
' Wenn gar nichts Sinnvolles da ist, Zeile überspringen
If descTxt = "" AndAlso hs = "" AndAlso (cArticle <= 0 OrElse GetCellStr(ws, rData, cArticle) = "") Then
rData += 1
Continue While
End If
Dim pos As New cDakosy_EZA_Warenposition()
If cLine > 0 Then pos.ezaWP_PositionsNummer = GetCellStr(ws, rData, cLine)
If cArticle > 0 Then pos.ezaWP_Artikelnummer = GetCellStr(ws, rData, cArticle)
Dim shortTxt As String = If(cShortDesc > 0, GetCellStr(ws, rData, cShortDesc), "")
If shortTxt <> "" Then
pos.ezaWP_Warenbezeichnung = shortTxt
ElseIf descTxt <> "" Then
pos.ezaWP_Warenbezeichnung = descTxt
End If
If hs <> "" Then pos.ezaWP_WarennummerEZT = hs
' Optional: Zollartikel-Stammdaten überschreiben, wenn Kundennummer vorhanden
Dim Kdnr As String = If(Not String.IsNullOrWhiteSpace(kdnrImp), kdnrImp, If(Not String.IsNullOrWhiteSpace(kdnrCons), kdnrCons, ""))
If Kdnr <> "" Then
Try
Dim ZAL = cZollArtikel.GetListByKundenNr(Kdnr) ' Annahme: Methode vorhanden
' Artikelnummer als Schlüssel: nur wenn vorhanden
Dim artKey As String = If(cArticle > 0, GetCellStr(ws, rData, cArticle), "")
If Not String.IsNullOrWhiteSpace(artKey) AndAlso ZAL IsNot Nothing Then
Dim Artikel = cZollArtikel.FindZollArtikelByNummer(ZAL, artKey)
If Artikel IsNot Nothing Then
If Artikel.zollArt_Warenbeschreibung IsNot Nothing AndAlso Artikel.zollArt_Warenbeschreibung.ToString() <> "" Then
pos.ezaWP_Warenbezeichnung = Artikel.zollArt_Warenbeschreibung.ToString()
End If
If Artikel.zollArt_Warencodenummer IsNot Nothing AndAlso Artikel.zollArt_Warencodenummer.ToString() <> "" Then
pos.ezaWP_WarennummerEZT = Artikel.zollArt_Warencodenummer.ToString()
End If
End If
End If
Catch
' Stammdaten-Lookup ist optional; Fehler hier nicht fatal
End Try
End If
Dim origin As String = If(cOrigin > 0, GetCellStr(ws, rData, cOrigin).ToUpperInvariant(), "")
If origin.Length >= 2 Then pos.ezaWP_UrsprungslandCode = origin.Substring(0, 2)
If cPkgs > 0 Then
Dim pk As String = GetCellStr(ws, rData, cPkgs)
If pk <> "" Then pos.ezaWP_PackstueckAnzahl = pk
End If
If cPkgType > 0 Then
Dim pt As String = GetCellStr(ws, rData, cPkgType)
If pt <> "" Then pos.ezaWP_PackstueckArt = pt
End If
If cGross > 0 Then
Dim g As Double = ToDoubleSafeVERAGTmpl(GetCellStr(ws, rData, cGross))
If g > 0 Then pos.ezaWP_Rohmasse = g
End If
If cNet > 0 Then
Dim n As Double = ToDoubleSafeVERAGTmpl(GetCellStr(ws, rData, cNet))
If n > 0 Then pos.ezaWP_Eigenmasse = n
End If
If cTotal > 0 Then
Dim totalVal As Double = ToDoubleSafeVERAGTmpl(GetCellStr(ws, rData, cTotal))
pos.ezaWP_Artikelpreis = totalVal
End If
Dim curr As String = If(cCurr > 0, GetCellStr(ws, rData, cCurr).ToUpperInvariant(), "")
If curr = "" Then
If header.ContainsKey("Currency") Then
pos.ezaWP_ArtikelpreisWaehrung = header("Currency").ToUpperInvariant()
Else
pos.ezaWP_ArtikelpreisWaehrung = "EUR"
End If
Else
pos.ezaWP_ArtikelpreisWaehrung = curr
End If
If HandelsRgNr <> "" Then
Try
pos.ezaWP_UNTERLAGEN.Add(New DAKOSY_Worker.cDakosy_EZA_WarenpositionVorgelegteUnterlagen With {
.ezaWpUl_Art = "N380",
.ezaWpUl_Bereich = "4",
.ezaWpUl_VorlageKz = "J",
.ezaWpUl_Nummer = HandelsRgNr,
.ezaWpUl_DatumAusstellung = Nothing
})
Catch
End Try
End If
EZA.eza_WARENPOS.Add(pos)
cnt += 1
rData += 1
End While
End If ' rowItemsTitle > 0 (wenn nicht gefunden: Items optional Abschnitt wird einfach übersprungen)
Catch ex As Exception
MsgBox("FEHLER beim Einlesen (" & filePath & "):" & vbCrLf & ex.Message, vbCritical)
Finally
' --- COM sauber freigeben ---
Try
If wb IsNot Nothing Then wb.Close(False)
Catch
End Try
Try
If xlApp IsNot Nothing Then xlApp.Quit()
Catch
End Try
Try
If ws IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(ws)
Catch
End Try
Try
If wb IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wb)
Catch
End Try
Try
If xlApp IsNot Nothing Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp)
Catch
End Try
ws = Nothing : wb = Nothing : xlApp = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()
End Try
Next
' --- UI Refresh wie gehabt ---
Me.FindForm.SuspendLayout()
POSITIONEN.setValues(EZA, True)
btnPositionen.PerformClick()
Me.FindForm.ResumeLayout()
MsgBox(cnt & " Datensätze wurden eingelesen.")
Me.Cursor = Cursors.Default
Return True
End Function
Private Function GetCellStr(ws As Excel.Worksheet, r As Integer, c As Integer) As String
Try
Dim v = ws.Cells(r, c).Value
Return If(v IsNot Nothing, v.ToString().Trim(), "")
Catch
Return ""
End Try
End Function
Private Function ToDoubleSafeVERAGTmpl(v As Object) As Double
If v Is Nothing Then Return 0
Dim s As String = v.ToString().Trim().Replace(",", ".")
Dim d As Double
If Double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, d) Then
Return d
End If
Return 0
End Function
Private Sub VERAGFormatÖffnen2025V1ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles VERAGFormatÖffnen2025V1ToolStripMenuItem.Click
Try
' Zielpfad im Temp-Ordner festlegen
Dim tempFile As String = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "Customs_Clearance_Template_2025V1.xlsx")
' Ressource (als Binärdatei eingebunden) schreiben
System.IO.File.WriteAllBytes(tempFile, My.Resources.Customs_Clearance_Template)
' Datei mit dem Standardprogramm öffnen (z. B. Excel)
Process.Start(New ProcessStartInfo(tempFile) With {.UseShellExecute = True})
Catch ex As Exception
MsgBox("Fehler beim Öffnen der Vorlage: " & ex.Message, vbCritical)
End Try
End Sub
'================================================================================================================================
'================================================================================================================================
'================================================================================================================================
End Class