Mondaltrans

This commit is contained in:
2025-04-23 15:00:30 +02:00
parent 885c4ef2a7
commit 2119c3e61b
6 changed files with 1270 additions and 2 deletions

View File

@@ -0,0 +1,525 @@
Imports Chilkat
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Public Class cModalTransIMPORT
' VB.NET Klasse zur vollständigen Abbildung der Declaration Data laut Modaltrans API
Public Class cMT_IMP_CustomsDeclarationRequest
Public Property auto_send As Boolean?
Public Property badge_code As String
Public Property service_code As String
Public Property doc_type As String
Public Property declaration_type As String
Public Property commercial_ref As String
Public Property ducr As String
Public Property mucr As String
Public Property ducr_part As String
Public Property declarant_eori As String
Public Property declarant_name As String
Public Property declarant_address As String
Public Property declarant_city_name As String
Public Property declarant_country_id As String
Public Property declarant_postcode As String
Public Property declarant_rep As String
Public Property export_country_id As String
Public Property consignor_eori As String
Public Property consignor_name As String
Public Property consignor_address As String
Public Property consignor_city_name As String
Public Property consignor_country_id As String
Public Property consignor_postcode As String
Public Property multiple_consignor As Boolean?
Public Property import_country_id As String
Public Property consignee_eori As String
Public Property consignee_name As String
Public Property consignee_address As String
Public Property consignee_city_name As String
Public Property consignee_country_id As String
Public Property consignee_postcode As String
Public Property multiple_consignee As Boolean?
Public Property invoice_amount As Decimal?
Public Property invoice_curr As String
Public Property goods_location As String
Public Property border_transport_type As String
Public Property border_vehicle_coun As String
Public Property border_vehicle_code As String
Public Property inland_transport_type As String
Public Property container_no As String
Public Property gvms_interested As Boolean?
Public Property freight_amount As Decimal?
Public Property freight_curr As String
Public Property payment_method As String
Public Property carrier_eori As String
Public Property carrier_name As String
Public Property carrier_address As String
Public Property carrier_city_name As String
Public Property carrier_country_id As String
Public Property carrier_postcode As String
Public Property total_packages As Integer
Public Property nature_of_transaction As String
Public Property premises_code As String
Public Property first_dan_no As String
Public Property second_dan_no As String
Public Property insurance_amount As Decimal?
Public Property other_amounts As Decimal?
Public Property airport_code As String
Public Property apportment_indicator As String
Public Property total_gross_weight As Decimal?
Public Property total_net_weight As Decimal?
Public Property airfreight_cost As Decimal?
Public Property insurance_curr As String
Public Property other_amounts_curr As String
Public Property vat_adjustment As Decimal?
Public Property vat_adjustment_curr As String
Public Property discount_amount As Decimal?
Public Property discount_curr As String
Public Property discount_rate As Decimal?
Public Property warehouse_type As String
Public Property incoterm As String
Public Property incoterm_location As String
Public Property trader_ref As String
Public Property arrival_transport_type As String
Public Property guarantee_code As String
Public Property guarantee_reference As String
Public Property evrim_xml As String
Public Property goods_attributes As List(Of cMT_IMP_GoodsItem)
Public Property parties_attributes As List(Of cMT_IMP_PartyAttribute)
Public Property trader_additions_attributes As List(Of cMT_IMP_TraderAddition)
End Class
Public Class cMT_IMP_GoodsItem
Public Property commodity As String
Public Property consignee_name As String
Public Property sender_name As String
Public Property packs_attributes As List(Of cMT_IMP_PackAttribute)
End Class
Public Class cMT_IMP_PackAttribute
Public Property pack_type As String
Public Property notes As String
End Class
Public Class cMT_IMP_PartyAttribute
Public Property name As String
Public Property eori As String
Public Property role As String
End Class
Public Class cMT_IMP_TraderAddition
Public Property field As String
Public Property value As String
Public Property type As String
Public Property description As String
End Class
Public Class cMT_IMP_CustomsDeclarationResponse
Public Property status As String
Public Property declarationId As String
Public Property message As String
' Optional: wenn die API weitere Felder liefert
Public Property referenceNumber As String
Public Property createdAt As DateTime?
Public Property updatedAt As DateTime?
Public Property declaration_data As cMT_IMP_CustomsDeclarationRequest
End Class
Public Class cModaltransApiClient_IMPORT
Private baseUrl As String = "https://app.modaltrans.com"
Private http As New Chilkat.Http()
Private authToken As String
Public Sub New()
VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat()
http.SetRequestHeader("Content-Type", "application/json")
End Sub
' 📤 Senden der Zollanmeldung
Public Function SendDeclaration(request As cMT_IMP_CustomsDeclarationRequest) As cMT_IMP_CustomsDeclarationResponse
Dim result As New cMT_IMP_CustomsDeclarationResponse()
If Not cModalTransBase.Authenticate(authToken) Then
result.status = "Error"
result.message = "❌ Authentifizierung fehlgeschlagen."
Console.WriteLine(result.message)
Return result
End If
http.SetRequestHeader("Authorization", "Bearer " & authToken)
Dim jsonPayload As String = JsonConvert.SerializeObject(New With {.declaration_data = request})
Dim url As String = baseUrl & "/api/v1/customs_declarations"
Dim resp As Chilkat.HttpResponse = http.PostJson(url, jsonPayload)
If resp Is Nothing Then
result.status = "Error"
result.message = "❌ Fehler beim Senden: " & http.LastErrorText
Console.WriteLine(result.message)
Return result
End If
Select Case resp.StatusCode
Case 201 ' Created
Try
result = JsonConvert.DeserializeObject(Of cMT_IMP_CustomsDeclarationResponse)(resp.BodyStr)
result.status = "Success"
Console.WriteLine("✅ Zollanmeldung erfolgreich erstellt.")
Catch ex As Exception
result.status = "Error"
result.message = "❌ Fehler beim Parsen der Erfolgsantwort: " & ex.Message
Console.WriteLine(result.message)
End Try
Case 400
result.status = "Bad Request"
result.message = resp.BodyStr
Console.WriteLine("⚠️ Ungültige Anfrage (400): " & result.message)
Case 401
result.status = "Unauthorized"
result.message = "❌ Nicht autorisiert (401)"
Console.WriteLine(result.message)
Case 422
result.status = "Validation Error"
result.message = resp.BodyStr
Console.WriteLine("⚠️ Validierungsfehler (422): " & result.message)
Case Else
result.status = "Error"
result.message = $"❌ Unerwarteter Fehler: {resp.StatusCode}" & vbCrLf & resp.BodyStr
Console.WriteLine(result.message)
End Select
Return result
End Function
' 📥 Zollanmeldung abrufen
Public Function GetDeclaration(declarationId As String) As cMT_IMP_CustomsDeclarationRequest
If Not cModalTransBase.Authenticate(authToken) Then
Console.WriteLine("❌ Authentifizierung fehlgeschlagen.")
Return Nothing
End If
http.SetRequestHeader("Authorization", "Bearer " & authToken)
Dim url As String = $"{baseUrl}/api/v1/customs_declarations/{declarationId}"
Dim responseStr As String = http.QuickGetStr(url)
If Not http.LastMethodSuccess Then
Console.WriteLine("❌ Fehler beim Abrufen: " & http.LastErrorText)
Return Nothing
End If
Dim statusCode As Integer = http.LastStatus
Select Case statusCode
Case 200
Try
Dim json = JsonConvert.DeserializeObject(Of JObject)(responseStr)
Dim data = json.SelectToken("declaration_data")
Dim result = data.ToObject(Of cMT_IMP_CustomsDeclarationRequest)()
Console.WriteLine("✅ Zollanmeldung erfolgreich abgerufen.")
Return result
Catch ex As Exception
Console.WriteLine("❌ Fehler beim Parsen: " & ex.Message)
End Try
Case 404
Console.WriteLine("⚠️ Zollanmeldung nicht gefunden (404).")
Case 401
Console.WriteLine("❌ Nicht autorisiert (401).")
Case Else
Console.WriteLine($"❌ Unerwarteter Fehler: {statusCode}")
Console.WriteLine(responseStr)
End Select
Return Nothing
End Function
Public Function ListDeclarationsFromDate(fromDate As DateTime, Optional page As Integer = 1) As List(Of cMT_IMP_CustomsDeclarationResponse)
Dim declarations As New List(Of cMT_IMP_CustomsDeclarationResponse)()
If Not cModalTransBase.Authenticate(authToken) Then
Throw New Exception("Authentifizierung fehlgeschlagen")
End If
http.SetRequestHeader("Authorization", "Bearer " & authToken)
Dim url As String = $"{baseUrl}/api/v1/customs_declarations?from_date={fromDate:yyyy-MM-dd}&page={page}"
Dim responseStr As String = http.QuickGetStr(url)
If http.LastMethodSuccess Then
Try
' Optional: falls die Antwort als { data: [ ... ] } zurückkommt
Dim json = JsonConvert.DeserializeObject(Of JObject)(responseStr)
Dim dataArray = json.SelectToken("data")
If dataArray IsNot Nothing Then
declarations = dataArray.ToObject(Of List(Of cMT_IMP_CustomsDeclarationResponse))()
Else
' Falls direkt eine Liste zurückkommt
declarations = JsonConvert.DeserializeObject(Of List(Of cMT_IMP_CustomsDeclarationResponse))(responseStr)
End If
Catch ex As Exception
Throw New Exception("Fehler beim Parsen der Antwort: " & ex.Message)
End Try
Else
Throw New Exception("Fehler beim Abruf: " & http.LastErrorText)
End If
Return declarations
End Function
End Class
'--------------------------------------------------------------------------------------------------
Public Shared Sub CreateAndSendMinimalImportDeclaration(LRN)
' Objekt mit allen notwendigen Pflichtfeldern befüllen
Dim importRequest As New cMT_IMP_CustomsDeclarationRequest With {
.doc_type = "import",
.declaration_type = "IMA",
.declarant_eori = "GB123456789000",
.declarant_name = "Demo Importer Ltd.",
.export_country_id = "TR",
.consignor_name = "Nimbo Teknoloji Ltd.",
.consignor_address = "Techno Street 12",
.consignor_city_name = "Istanbul",
.consignor_country_id = "TR",
.consignor_postcode = "34000",
.import_country_id = "GB",
.consignee_name = "Demo Importer Ltd.",
.consignee_address = "Import Road 34",
.consignee_city_name = "London",
.consignee_country_id = "GB",
.consignee_postcode = "W1A 1AA",
.goods_location = "GBFXT",
.border_transport_type = "3", ' z.B. Straße
.total_packages = 5,
.trader_ref = LRN,
.ducr = LRN
}
' API-Client erstellen (mit Benutzer & Passwort in der Klasse eingebaut)
Dim client As New cModaltransApiClient_IMPORT()
' Senden und Ergebnis anzeigen
Dim response As cMT_IMP_CustomsDeclarationResponse = client.SendDeclaration(importRequest)
If response IsNot Nothing Then
Console.WriteLine("Status: " & response.status)
Console.WriteLine("Message: " & response.message)
Console.WriteLine("Declaration ID: " & response.declarationId)
Else
Console.WriteLine("Keine Antwort erhalten.")
End If
End Sub
Public Shared Function ceateAndSend_IMP_FromSENDUNG(LRN As String, SND As cSendungen) As Boolean
If SND.tblSnd_AvisoID <= 0 Then Return False
Dim AVISO As cAviso = (New cAvisoDAL).LesenAviso(SND.tblSnd_AvisoID, "")
Return ceateAndSend_IMP_FromSENDUNG(LRN, SND, AVISO)
End Function
Public Shared Function ceateAndSend_IMP_FromSENDUNG(LRN As String, SND As cSendungen, AVISO As cAviso) As Boolean
' Objekt mit allen notwendigen Pflichtfeldern befüllen
Dim MT_IMP As New cMT_IMP_CustomsDeclarationRequest With {
.doc_type = "import",
.declaration_type = "IMD", ' IMA-_> Arrived
.declarant_eori = VERAG_PROG_ALLGEMEIN.cAllgemein.UK_EORI_LTD,
.declarant_name = "VERAG-UNISPED Ltd",
.declarant_rep = "2",
.goods_location = "GBAUDEUDEUDEU",
.import_country_id = "GB",
.total_packages = 5,
.nature_of_transaction = "11", ' Kaufgeschäft 11 Outright purchase/sale
.trader_ref = LRN,
.ducr = LRN
}
Dim ioReference = LRN & Now.ToString("ddMMyyyy_HHmmss")
Select Case If(AVISO.Transportmittelart, "")
Case "CONTAINER"
MT_IMP.border_transport_type = "1" ' z.B. Ocean
MT_IMP.arrival_transport_type = "10"
Case Else
MT_IMP.border_transport_type = "6" ' z.B. 3 Straße '?6 RORO??
MT_IMP.arrival_transport_type = "30"
End Select
MT_IMP.inland_transport_type = "3" ' z.B. Straße '?6 RORO??
MT_IMP.border_vehicle_code = AVISO.LKW_Nr
MT_IMP.border_vehicle_coun = AVISO.LKW_Nationalitaet
If SND.tblSnd_EmpfaengerKdNr > 0 Then
Dim AD As New cAdressen(SND.tblSnd_EmpfaengerKdNr)
Dim KD As New cKunde(SND.tblSnd_EmpfaengerKdNr)
Dim CN As New VERAG_PROG_ALLGEMEIN.cRelayHub.cRelayHubAddress
CN.addressType = "CN"
MT_IMP.consignee_eori = If(KD.EORITIN, "")
MT_IMP.consignee_name = AD.Name_1
MT_IMP.consignee_address = AD.Straße
MT_IMP.consignee_postcode = AD.PLZ
MT_IMP.consignee_city_name = AD.Ort
MT_IMP.consignee_country_id = cProgramFunctions.getISO2Land(AD.LandKz)
End If
If SND.tblSnd_AbsenderKdNr > 0 Then
Dim AD As New cAdressen(SND.tblSnd_AbsenderKdNr)
Dim KD As New cKunde(SND.tblSnd_AbsenderKdNr)
Dim CZ As New VERAG_PROG_ALLGEMEIN.cRelayHub.cRelayHubAddress
MT_IMP.consignor_eori = If(KD.EORITIN, "")
MT_IMP.consignor_name = AD.Name_1
MT_IMP.consignor_address = AD.Straße
MT_IMP.consignor_postcode = AD.PLZ
MT_IMP.consignor_city_name = AD.Ort
MT_IMP.consignor_country_id = cProgramFunctions.getISO2Land(AD.LandKz)
MT_IMP.export_country_id = MT_IMP.consignor_country_id
End If
' API-Client erstellen (mit Benutzer & Passwort in der Klasse eingebaut)
Dim client As New cModaltransApiClient_IMPORT()
' Senden und Ergebnis anzeigen
Dim response As cMT_IMP_CustomsDeclarationResponse = client.SendDeclaration(MT_IMP)
If response IsNot Nothing Then
Console.WriteLine("Status: " & response.status)
Console.WriteLine("Message: " & response.message)
Console.WriteLine("Declaration ID: " & response.declarationId)
' Console.WriteLine("Declaration DUCR: " & response.declaration_data.ducr)
If response.status = "Success" Then
MsgBox(response.message)
Else
MsgBox(response.message)
Return False
End If
Return True
Else
MsgBox("Keine Antwort erhalten.")
Console.WriteLine("Keine Antwort erhalten.")
End If
Return False
End Function
Public Shared Function ceateAndSend_EXP_FromSENDUNG(LRN As String, SND As cSendungen) As Boolean
If SND.tblSnd_AvisoID <= 0 Then Return False
Dim AVISO As cAviso = (New cAvisoDAL).LesenAviso(SND.tblSnd_AvisoID, "")
Return ceateAndSend_EXP_FromSENDUNG(LRN, SND, AVISO)
End Function
Public Shared Function ceateAndSend_EXP_FromSENDUNG(LRN As String, SND As cSendungen, AVISO As cAviso) As Boolean
' Objekt mit allen notwendigen Pflichtfeldern befüllen
Dim MT_IMP As New cMT_IMP_CustomsDeclarationRequest With {
.doc_type = "export",
.declaration_type = "EXA", ' IMA-_> Arrived
.declarant_eori = VERAG_PROG_ALLGEMEIN.cAllgemein.UK_EORI_LTD,
.declarant_name = "VERAG-UNISPED Ltd",
.declarant_rep = "2",
.goods_location = "GBAUDEUDEUDEU",
.total_packages = 5,
.nature_of_transaction = "11", ' Kaufgeschäft 11 Outright purchase/sale
.trader_ref = LRN,
.ducr = LRN
}
Dim ioReference = LRN & Now.ToString("ddMMyyyy_HHmmss")
Select Case If(AVISO.Transportmittelart, "")
Case "CONTAINER"
MT_IMP.border_transport_type = "1" ' z.B. Ocean
MT_IMP.arrival_transport_type = "10"
Case Else
MT_IMP.border_transport_type = "6" ' z.B. 3 Straße '?6 RORO??
MT_IMP.arrival_transport_type = "30"
End Select
MT_IMP.inland_transport_type = "3" ' z.B. Straße '?6 RORO??
MT_IMP.border_vehicle_code = AVISO.LKW_Nr
MT_IMP.border_vehicle_coun = AVISO.LKW_Nationalitaet
If SND.tblSnd_EmpfaengerKdNr > 0 Then
Dim AD As New cAdressen(SND.tblSnd_EmpfaengerKdNr)
Dim KD As New cKunde(SND.tblSnd_EmpfaengerKdNr)
Dim CN As New VERAG_PROG_ALLGEMEIN.cRelayHub.cRelayHubAddress
CN.addressType = "CN"
MT_IMP.consignee_eori = If(KD.EORITIN, "")
MT_IMP.consignee_name = AD.Name_1
MT_IMP.consignee_address = AD.Straße
MT_IMP.consignee_postcode = AD.PLZ
MT_IMP.consignee_city_name = AD.Ort
MT_IMP.consignee_country_id = cProgramFunctions.getISO2Land(AD.LandKz)
End If
If SND.tblSnd_AbsenderKdNr > 0 Then
Dim AD As New cAdressen(SND.tblSnd_AbsenderKdNr)
Dim KD As New cKunde(SND.tblSnd_AbsenderKdNr)
Dim CZ As New VERAG_PROG_ALLGEMEIN.cRelayHub.cRelayHubAddress
MT_IMP.consignor_eori = If(KD.EORITIN, "")
MT_IMP.consignor_name = AD.Name_1
MT_IMP.consignor_address = AD.Straße
MT_IMP.consignor_postcode = AD.PLZ
MT_IMP.consignor_city_name = AD.Ort
MT_IMP.consignor_country_id = cProgramFunctions.getISO2Land(AD.LandKz)
MT_IMP.export_country_id = MT_IMP.consignor_country_id
MT_IMP.import_country_id = MT_IMP.consignor_country_id 'muss lt. API mitgegeben werden
End If
' API-Client erstellen (mit Benutzer & Passwort in der Klasse eingebaut)
Dim client As New cModaltransApiClient_IMPORT()
' Senden und Ergebnis anzeigen
Dim response As cMT_IMP_CustomsDeclarationResponse = client.SendDeclaration(MT_IMP)
If response IsNot Nothing Then
Console.WriteLine("Status: " & response.status)
Console.WriteLine("Message: " & response.message)
Console.WriteLine("Declaration ID: " & response.declarationId)
Return True
Else
Console.WriteLine("Keine Antwort erhalten.")
End If
Return False
End Function
End Class