Files
SDL/VERAG_PROG_ALLGEMEIN/Schnittstellen/Modaltrans/cModalTransIMPORT.vb
2025-04-23 15:00:30 +02:00

525 lines
21 KiB
VB.net
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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