This commit is contained in:
2025-04-24 17:01:07 +02:00
parent 9226209672
commit a2a6140785
2 changed files with 110 additions and 165 deletions

View File

@@ -6,9 +6,16 @@ Imports System.IO
Imports System.Text
Public Class cTelotecAPI
'SPI SWAGGER::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'https://accscustomsapi.teloweb.at/accscustomsapi120/swagger/index.html
Public API_KEY = "YlcbZryXuKPSzQTzkGIJK9UdScGuSnhBBji94Z7A8UMoWPR0qDvVOvmlWNuUCMrQ" 'VERAG
Public BASE_URL = "https://accscustomsapi.teloweb.at/accscustomsapi120"
Dim TELOTEC_JSON As String = "\\datenarchiv\Datenarchiv\TELOTEC\ECHTSYSTEM\Nachrichtendaten_Ablage_JSON" ' <-- Deinen Pfad hier setzen
Dim TELOTEC_ATTACHMENT_PATH As String = "\\datenarchiv\Datenarchiv\TELOTEC\ECHTSYSTEM\Nachrichtendaten_Ablage_PDF" '
Sub Main()
Console.WriteLine("ACCS Customs API Demo")
@@ -16,6 +23,9 @@ Public Class cTelotecAPI
PostStoreTADeclarations(taRequest)
Dim messages As List(Of TAMessage) = GetTAMessages()
Console.WriteLine("Nachrichten: " & messages.Count)
End Sub
Function getAPIKEY(Firma) As String
@@ -147,34 +157,63 @@ Public Class cTelotecAPI
End If
Console.WriteLine("📡 HTTP-Statuscode: " & resp.StatusCode)
'If resp.StatusCode <> 200 Then
' Console.WriteLine("❌ Fehler: Erwartet wurde Statuscode 200, erhalten: " & resp.StatusCode)
' Console.WriteLine("Antworttext:")
' Console.WriteLine(resp.BodyStr)
' Return messages
'End If
If resp.StatusCode <> 200 Then
Console.WriteLine("❌ Fehler: Erwartet wurde Statuscode 200, erhalten: " & resp.StatusCode)
Console.WriteLine("Antworttext:")
Console.WriteLine("❌ Fehler: HTTP-Statuscode " & resp.StatusCode)
Console.WriteLine(resp.BodyStr)
Return messages
End If
Dim json As New JsonObject()
Dim success As Boolean = json.Load(resp.BodyStr)
If Not success Then
Console.WriteLine("❌ Fehler beim Parsen der JSON-Antwort:")
Console.WriteLine(json.LastErrorText)
Return messages
End If
Dim msgArray As JsonArray = json.ArrayOf("messages")
If msgArray Is Nothing Then
Console.WriteLine("⚠️ 'messages' war null oder nicht vorhanden.")
Return messages
Return New List(Of TAMessage)()
End If
Dim jsonText As String = resp.BodyStr
SaveJsonResponseToFile(jsonText, TELOTEC_JSON)
' Übergabe an Parserfunktion
Return ParseTAMessagesJson(jsonText)
End Function
Public Function ParseTAMessagesFromFile(filePath As String) As List(Of TAMessage)
Dim messages As New List(Of TAMessage)()
If Not File.Exists(filePath) Then
Console.WriteLine("❌ Datei nicht gefunden: " & filePath)
Return messages
End If
Try
Dim jsonText As String = File.ReadAllText(filePath, Encoding.UTF8)
Return ParseTAMessagesJson(jsonText)
Catch ex As Exception
Console.WriteLine("❌ Fehler beim Lesen/Verarbeiten der Datei: " & ex.Message)
End Try
Return messages
End Function
Public Function ParseTAMessagesJson(jsonText As String) As List(Of TAMessage)
Dim messages As New List(Of TAMessage)()
Dim json As New Chilkat.JsonObject()
If Not json.Load(jsonText) Then
Console.WriteLine("❌ Fehler beim Parsen des JSON.")
Return messages
End If
Dim msgArray As Chilkat.JsonArray = json.ArrayOf("messages")
If msgArray Is Nothing Then Return messages
Dim serializer As New JavaScriptSerializer()
Console.WriteLine("✅ Empfangene Nachrichten: " & msgArray.Size)
For i As Integer = 0 To msgArray.Size - 1
Dim jmsg As Chilkat.JsonObject = msgArray.ObjectAt(i)
Dim msg As New TAMessage()
@@ -183,6 +222,15 @@ Public Class cTelotecAPI
msg.externalReference = jmsg.StringOf("externalReference")
msg.msgType = jmsg.StringOf("msgType")
' 💾 Attachment speichern
Dim attachmentB64 As String = jmsg.StringOf("attachment")
If Not String.IsNullOrWhiteSpace(attachmentB64) AndAlso attachmentB64.ToString <> "null" Then
SaveAttachmentBase64(attachmentB64, TELOTEC_ATTACHMENT_PATH, msg.lrn)
End If
Dim contentObj As Chilkat.JsonObject = jmsg.ObjectOf("declarationContent")
If Not contentObj Is Nothing Then
Dim decl As New TADeclaration()
@@ -252,6 +300,13 @@ Public Class cTelotecAPI
If arr2 IsNot Nothing Then decl.guarantee = ParseGuarantee(arr2)
msg.declarationContent = decl
'PARSE TO cTELANMEUNG
'-------------------------------
Else
Console.WriteLine("⚠️ Keine declarationContent für Nachricht: " & msg.lrn)
End If
@@ -262,8 +317,31 @@ Public Class cTelotecAPI
Return messages
End Function
Public Sub SaveAttachmentBase64(base64String As String, ByVal TELOTEC_ATTACHMENT_PATH As String, filePrefix As String)
Try
If String.IsNullOrWhiteSpace(base64String) Then Exit Sub
Dim yearDir As String = Path.Combine(TELOTEC_ATTACHMENT_PATH, Date.Now.Year.ToString())
Dim dayDir As String = Path.Combine(yearDir, Date.Now.ToString("yyyy-MM-dd"))
Directory.CreateDirectory(dayDir)
' ❗Unerlaubte Zeichen im Dateinamen ersetzen
Dim invalidChars() As Char = Path.GetInvalidFileNameChars()
For Each ch In invalidChars
filePrefix = filePrefix.Replace(ch, "_"c)
Next
Dim fileName As String = filePrefix & "_" & Date.Now.ToString("HHmmss") & ".pdf"
Dim filePath As String = Path.Combine(dayDir, fileName)
Dim fileBytes() As Byte = Convert.FromBase64String(base64String)
File.WriteAllBytes(filePath, fileBytes)
Console.WriteLine("📄 PDF gespeichert unter: " & filePath)
Catch ex As Exception
Console.WriteLine("❌ Fehler beim Speichern des Attachments: " & ex.Message)
End Try
End Sub
Public Sub SaveJsonResponseToFile(jsonText As String, ByVal TELOTEC_JSON As String)
Try
@@ -283,7 +361,7 @@ Public Class cTelotecAPI
End Sub
Function SafeParseDate(value As String) As Date?
If String.IsNullOrWhiteSpace(value) Then
If String.IsNullOrWhiteSpace(value) OrElse value = "null" Then
Return Nothing
End If
Return Date.Parse(value)
@@ -382,7 +460,7 @@ Public Class cTelotecAPI
Public Property interfaceReferenceId As String
Public Property ifcCustomerId As String
Public Property dec2_ID As Integer
Public Property anmeldedatum As Date
Public Property anmeldedatum As Object
Public Property lrn As String
Public Property mrn As String
Public Property totNet As Decimal
@@ -391,21 +469,21 @@ Public Class cTelotecAPI
Public Property flugInfo As String
Public Property fillPackList_IND As Boolean
Public Property memo As String
Public Property erstellDatum As Date
Public Property erstellDatum As Object
Public Property erstellPersonalID As String
Public Property declarationType As String
Public Property additionalDeclarationType As String
Public Property tirCarnetNumber As String
Public Property presentationOfTheGoodsDateAndTime As Date
Public Property presentationOfTheGoodsDateAndTime As Object
Public Property security As Integer
Public Property reducedDatasetIndicator As Boolean
Public Property specificCircumstanceIndicator As String
Public Property communicationLanguageAtDeparture As String
Public Property bindingItinerary As Boolean
Public Property limitDate As Date
Public Property declarationAcceptanceDate As Date
Public Property releaseDate As Date
Public Property writeOffDate As Date
Public Property limitDate As Object
Public Property declarationAcceptanceDate As Object
Public Property releaseDate As Object
Public Property writeOffDate As Object
Public Property countryOfDispatch As String
Public Property countryOfDestination As String
Public Property containerIndicator As Boolean
@@ -425,7 +503,7 @@ Public Class cTelotecAPI
Public Property customsOfficeOfDeparture As String
Public Property customsOfficeOfDestinationDeclared As String
Public Property customsOfficeOfPresentation As String
Public Property controlResult_Date As Date
Public Property controlResult_Date As Object
Public Property controlResult_ControlledBy As String
Public Property controlResult_Text As String
Public Property controlResult_Code As String
@@ -524,7 +602,7 @@ Public Class cTelotecAPI
Public Class TransitOffice
Public Property sequenceNumber As Integer
Public Property referenceNumber As String
Public Property arrivalDateAndTimeEstimated As Date
Public Property arrivalDateAndTimeEstimated As Object
End Class
Public Class DepartureTransportMeans
@@ -603,139 +681,6 @@ Public Class cTelotecAPI
'Public Function ConvertTAMessageToTelotec(msg As TAMessage) As cTelotec_Anmeldung
' Dim telotec As New cTelotec_Anmeldung()
' With msg
' If .declarationContent IsNot Nothing Then
' Dim decl = .declarationContent
' telotec.telanm_ART = "TA"
' telotec.telanm_BezugsNr = .lrn
' telotec.telanm_CRN = .mrn
' telotec.MsgType = .msgType
' telotec.Refs_LRN = .lrn
' telotec.Refs_CRN = .mrn
' telotec.Mandant_ID = decl.mandant_ID
' telotec.Referenz_ID = decl.interfaceReferenceId
' telotec.dec_CreatePersonalID = decl.erstellPersonalID
' telotec.dec_CreateDate = decl.erstellDatum
' telotec.dec_Template_ID = decl.template_ID
' telotec.dec_TotNet = decl.totNet
' telotec.dec_TotNetSplit_IND = decl.totNetSplit_IND
' telotec.dec_FillPackList_IND = decl.fillPackList_IND
' telotec.dec_Memo = decl.memo
' telotec.Hea_DecTy = decl.declarationType
' telotec.Hea_Simp = decl.reducedDatasetIndicator
' telotec.Hea_DecDT = decl.declarationAcceptanceDate
' telotec.Hea_WoffD = decl.writeOffDate
' telotec.Hea_AccDT = decl.declarationAcceptanceDate
' telotec.Hea_ProArrDT = decl.presentationOfTheGoodsDateAndTime
' telotec.Hea_PlaDepDT = decl.presentationOfTheGoodsDateAndTime
' telotec.Hea_TotGross = decl.grossMass
' telotec.Hea_PayMet = decl.methodOfPayment
' telotec.Hea_SecInd = decl.security
' telotec.Hea_DestLNG = decl.countryOfDestination
' telotec.Hea_DepLNG = decl.countryOfDispatch
' telotec.Transp_InMo = decl.inlandModeOfTransport
' telotec.Transp_BordMo = decl.modeOfTransportAtTheBorder
' telotec.Transp_ContInd = decl.containerIndicator
' telotec.Transp_DepIdnt = SafeFirst(decl.departureTransportMeans, Function(dt) dt.identificationNumber)
' telotec.Transp_DepNat = SafeFirst(decl.departureTransportMeans, Function(dt) dt.nationality)
' ' Consignor/Consignee
' telotec.ConorTra_Na = SafeGetName(decl.consignor)
' telotec.ConorTra_Strt = decl.consignor?.streetAndNumber
' telotec.ConorTra_Pst = decl.consignor?.postcode
' telotec.ConorTra_Cty = decl.consignor?.city
' telotec.ConorTra_Ctry = decl.consignor?.country
' telotec.ConorTra_TIN = decl.consignor?.identificationNumber
' telotec.ConeeTra_Na = SafeGetName(decl.consignee)
' telotec.ConeeTra_Strt = decl.consignee?.streetAndNumber
' telotec.ConeeTra_Pst = decl.consignee?.postcode
' telotec.ConeeTra_Cty = decl.consignee?.city
' telotec.ConeeTra_Ctry = decl.consignee?.country
' telotec.ConeeTra_TIN = decl.consignee?.identificationNumber
' telotec.Represent_Na = decl.representative?.contactPersonName
' telotec.Represent_RIN = decl.representative?.identificationNumber
' telotec.Locs_Disp = decl.countryOfDispatch
' telotec.Locs_Dest = decl.countryOfDestination
' telotec.Locs_GdsLoc = decl.locationOfGoods_PlaceOfGoods
' telotec.Locs_GdsLocCd = decl.locationOfGoods_CustomsOffice
' ' HouseConsignments inkl. ConsignmentItems und Packaging
' If decl.houseConsignment IsNot Nothing Then
' telotec.HouseConsignments = New List(Of cTelotec_HouseConsignment)()
' For Each hc In decl.houseConsignment
' Dim newHc As New cTelotec_HouseConsignment()
' newHc.CountryOfDispatch = hc.countryOfDispatch
' newHc.CountryOfDestination = hc.countryOfDestination
' newHc.GrossMass = hc.grossMass
' newHc.ReferenceNumberUCR = hc.referenceNumberUCR
' newHc.MethodOfPayment = hc.methodOfPayment
' If hc.consignmentItem IsNot Nothing Then
' newHc.ConsignmentItems = New List(Of cTelotec_ConsignmentItem)()
' For Each item In hc.consignmentItem
' Dim newItem As New cTelotec_ConsignmentItem()
' newItem.GoodsItemNumber = item.goodsItemNumber
' newItem.DeclarationGoodsItemNumber = item.declarationGoodsItemNumber
' newItem.DeclarationType = item.declarationType
' newItem.CountryOfDispatch = item.countryOfDispatch
' newItem.CountryOfDestination = item.countryOfDestination
' newItem.DescriptionOfGoods = item.descriptionOfGoods
' newItem.GrossMass = item.grossMass
' newItem.NetMass = item.netMass
' newItem.MethodOfPayment = item.methodOfPayment
' newItem.ReferenceNumberUCR = item.referenceNumberUCR
' If item.packaging IsNot Nothing Then
' newItem.Packaging = New List(Of cTelotec_Packaging)()
' For Each pack In item.packaging
' Dim newPack As New cTelotec_Packaging()
' newPack.TypeOfPackages = pack.typeOfPackages
' newPack.NumberOfPackages = pack.numberOfPackages
' newPack.ShippingMarks = pack.shippingMarks
' newItem.Packaging.Add(newPack)
' Next
' End If
' newHc.ConsignmentItems.Add(newItem)
' Next
' End If
' telotec.HouseConsignments.Add(newHc)
' Next
' End If
' End If
' End With
' telotec.telanm_LetzteBearbeitung = Now
' telotec.telanm_Erstellung = Now
' telotec.telanm_Erstellung_SB = VERAG_PROG_ALLGEMEIN.cAllgemein.USRID
' telotec.telanm_LetzteBearbeitung_SB = VERAG_PROG_ALLGEMEIN.cAllgemein.USRID
' telotec.ComIndicator = True
' telotec.initData()
' Return telotec
'End Function
'Private Function SafeFirst(Of T, R)(list As List(Of T), selector As Func(Of T, R)) As R
' If list Is Nothing OrElse list.Count = 0 Then Return Nothing
' Return selector(list(0))
'End Function
'Private Function SafeGetName(party As Object) As String
' If party Is Nothing Then Return Nothing
' Return If(party?.consignorName, party?.consigneeName, "")
'End Function
End Class