EXG Auto Ncts

This commit is contained in:
2026-10-14 16:56:50 +02:00
parent ea85aed73d
commit d78bba81e3
9 changed files with 1138 additions and 275 deletions

View File

@@ -5147,6 +5147,197 @@ OPTION (MAXRECURSION 1000);", "AVISO") '
Return Nothing
End Function
Private Sub Button61_Click(sender As Object, e As EventArgs) Handles Button61.Click
Dim referenz As String = InputBox("Bitte EXG-Referenz eingeben (mit % am Ende):", "NCTS-Test aus EXG", "4801/26033344%")
If String.IsNullOrWhiteSpace(referenz) Then Exit Sub
VERAG_PROG_ALLGEMEIN.cAllgemein.FIRMA = "UNISPED"
VERAG_PROG_ALLGEMEIN.cAllgemein.NIEDERLASSUNG = "SUB"
Try
Dim saveFile = TestNCTSFromEXG(referenz.Trim(), True, "T1")
MsgBox("NCTS-Test erfolgreich!" & vbCrLf & saveFile)
Process.Start(saveFile)
Catch ex As Exception
MsgBox("Fehler beim NCTS-Test:" & vbCrLf & ex.Message)
End Try
End Sub
Shared Function GET_IDsByBezugsNr(bezugsNr As String) As List(Of Integer)
Dim ids As New List(Of Integer)
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
Using cmd As New SqlCommand("SELECT exg_Id FROM tblDakosy_EXG WHERE exg_ObjectName LIKE @bezugsNr ORDER BY exg_ObjectName", conn)
cmd.Parameters.AddWithValue("@bezugsNr", bezugsNr.Replace("[", "[[]").Replace("%", "[%]").Replace("_", "[_]") & "[_]EXG[0-9]%")
Using dr = cmd.ExecuteReader()
While dr.Read()
ids.Add(Convert.ToInt32(dr("exg_Id")))
End While
End Using
End Using
End Using
Return ids
End Function
Shared Function TestNCTSFromEXG(bezugsNrEXG As String, Optional sendFTP As Boolean = False, Optional nctsArt As String = "T1") As String
Dim exgIds As List(Of Integer) = GET_IDsByBezugsNr(bezugsNrEXG)
If exgIds.Count = 0 Then
Throw New Exception("Keine EXG-Gestellungen gefunden für: " & bezugsNrEXG)
End If
Console.WriteLine("EXG-Test: " & exgIds.Count & " Gestellungen gefunden.")
Dim BezugsNr As String = "TEST_EXG_" & Now.ToString("MMddHHmmss")
Dim NCTS_OUT As New DAKOSY_Worker.cDakosyNCTSOut004
Dim DY_ANM As New cDakosy_Zollanmeldungen
Dim firma As String = ""
Dim niederlassung As String = ""
Dim firstEXG As Boolean = True
NCTS_OUT.ncts_ObjectName = BezugsNr
'EXG-Daten laden und NCTS befüllen
For Each exgId In exgIds.Distinct()
Dim EXG As New DAKOSY_Worker.cDakosyEXG
EXG.exg_Id = exgId
If Not EXG.LOAD(True) Then Throw New Exception("EXG nicht gefunden: " & exgId)
If EXG.exg_POSITION Is Nothing OrElse EXG.exg_POSITION.Count = 0 Then Throw New Exception("EXG ohne Positionen: " & exgId)
If firstEXG Then
firma = EXG.exg_firma
niederlassung = EXG.exg_niederlassung
firstEXG = False
Else
If firma <> EXG.exg_firma OrElse niederlassung <> EXG.exg_niederlassung Then
Throw New Exception("EXG-Datensätze gehören zu unterschiedlichen Firmen oder Niederlassungen.")
End If
End If
DAKOSY_Worker.cDakosyNCTSOut004.fillNCTS_WithEXG(NCTS_OUT, EXG, BezugsNr) '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Console.WriteLine("TEST NCTS: EXG übernommen: " & EXG.exg_ObjectName)
Dim HC = NCTS_OUT.ncts_HOUSE_CONSIGNMENT.Last()
Console.WriteLine("EXG: " & EXG.exg_ObjectName)
Console.WriteLine("EXG Versender: " & Convert.ToString(EXG.exg_Consignor_Name))
Console.WriteLine("EXG Empfänger: " & Convert.ToString(EXG.exg_Consignee_Name))
Console.WriteLine("NCTS Versender: " & Convert.ToString(HC.nctsHC_Consignor_Name))
Console.WriteLine("NCTS Empfänger: " & Convert.ToString(HC.nctsHC_Consignee_Name))
Next
If NCTS_OUT.ncts_HOUSE_CONSIGNMENT Is Nothing OrElse NCTS_OUT.ncts_HOUSE_CONSIGNMENT.Count = 0 Then
Throw New Exception("Keine NCTS-House-Consignments erzeugt.")
End If
'Neue Zollanmeldung erstellen
DY_ANM.dy_ART = nctsArt
DY_ANM.dy_BezugsNr = BezugsNr
If Not DY_ANM.SAVE() OrElse DY_ANM.dy_Id <= 0 Then
Throw New Exception("NCTS-Zollanmeldung konnte nicht erstellt werden.")
End If
'NCTS mit der neuen Zollanmeldung verknüpfen
NCTS_OUT.ncts_ObjectName = BezugsNr
NCTS_OUT.ncts_dyaAnmID = DY_ANM.dy_Id
NCTS_OUT.ncts_Trans_Referenz = BezugsNr & "_" & Now.ToString("ddMMyyHHmmSS") 'Eindeutig
NCTS_OUT.ncts_Erstellung_SB = DY_ANM.dy_Erstellung_SB
NCTS_OUT.ncts_LetzteBearbeitung = Now
NCTS_OUT.ncts_LetzteBearbeitung_SB = DY_ANM.dy_LetzteBearbeitung_SB
NCTS_OUT.ncts_firma = If(firma, "VERAG")
NCTS_OUT.ncts_niederlassung = If(niederlassung, "SUB")
'CheckNCTSStringLengths(NCTS_OUT)
If Not NCTS_OUT.SAVE_ALL() Then
Throw New Exception("NCTS-Daten konnten nicht gespeichert werden. DY-ID: " & DY_ANM.dy_Id)
End If
'NCTS-XML erstellen
Dim saveFile As String = ""
'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
If Not cDakosyNCTSOut004.generateVersandanmeldungNCTSDE_004(NCTS_OUT, saveFile, "CREATE", Application.StartupPath, "NCTS") Then
Throw New Exception("NCTS-XML konnte nicht erzeugt werden.")
End If
If String.IsNullOrWhiteSpace(saveFile) OrElse Not System.IO.File.Exists(saveFile) Then
Throw New Exception("NCTS-XML-Datei fehlt.")
End If
'Optional an DAKOSY senden
If sendFTP Then
If cDakosyFunftions.send_Data_To_Dakosy_FTP(saveFile, BezugsNr, DY_ANM.dy_Id, firma) Then
DAKOSY_Worker.cDakosy_Statusmeldungen.InsertStatusMeldung(DY_ANM, DAKOSY_Worker.cDY_Statusliste.S_03)
DY_ANM.UPDATE_DATA()
DY_ANM.UPDATE_AVISO_SND(DY_ANM.dy_SendungsId)
Else
DAKOSY_Worker.cDakosy_Statusmeldungen.InsertStatusMeldung(DY_ANM, DAKOSY_Worker.cDY_Statusliste.S_09)
Throw New Exception("NCTS-FTP-Versand fehlgeschlagen. DY-ID: " & DY_ANM.dy_Id)
End If
End If
Console.WriteLine("TEST NCTS: " & BezugsNr & " / DY-ID: " & DY_ANM.dy_Id)
Return saveFile
End Function
Private Shared Sub CheckNCTSStringLengths(NCTS_OUT As cDakosyNCTSOut004)
Using conn = VERAG_PROG_ALLGEMEIN.SQL.GetNewOpenConnectionFMZOLL
Dim lengths As New Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase)
Using cmd As New SqlClient.SqlCommand("
SELECT c.name, t.name AS DataType, c.max_length
FROM sys.columns c
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE c.object_id = OBJECT_ID('dbo.tblDakosy_NCTSOut004')
AND t.name IN ('varchar', 'nvarchar', 'char', 'nchar')", conn)
Using dr = cmd.ExecuteReader()
While dr.Read()
Dim maxLen As Integer = CInt(dr("max_length"))
If maxLen = -1 Then Continue While
Dim dataType As String = CStr(dr("DataType"))
If dataType = "nvarchar" OrElse dataType = "nchar" Then maxLen \= 2
lengths.Add(CStr(dr("name")), maxLen)
End While
End Using
End Using
Dim errors As New List(Of String)
For Each prop In NCTS_OUT.GetType().GetProperties()
If prop.PropertyType IsNot GetType(String) OrElse Not prop.CanRead Then Continue For
If prop.GetIndexParameters().Length > 0 Then Continue For
If Not lengths.ContainsKey(prop.Name) Then Continue For
Dim value As String = TryCast(prop.GetValue(NCTS_OUT, Nothing), String)
If value Is Nothing Then Continue For
Dim maxLen As Integer = lengths(prop.Name)
Dim actualBytes As Integer = System.Text.Encoding.GetEncoding(1252).GetByteCount(value)
If actualBytes > maxLen Then
errors.Add(prop.Name & ": " & actualBytes & "/" & maxLen & " Bytes - " & value.Substring(0, Math.Min(value.Length, 100)))
End If
Next
If errors.Count > 0 Then
MsgBox("Zu lange NCTS-Felder:" & vbCrLf & String.Join(vbCrLf, errors))
Throw New Exception("Zu lange NCTS-Felder:" & vbCrLf & String.Join(vbCrLf, errors))
End If
If lengths.Count = 0 Then
Throw New Exception("Keine Spalten für tblDakosy_NCTSOut004 gefunden. Datenbank oder Schema prüfen.")
End If
End Using
End Sub
End Class