Files
SDL/VERAG_PROG_ALLGEMEIN/Schnittstellen/ATEZ/RELAYHUB/cRelayHub.vb

269 lines
13 KiB
VB.net

Imports Newtonsoft.Json
Public Class cRelayHub
Public Class cRelayHubDocument
Public Property type As String
Public Property base64String As String
Public Property filename As String
Public Property fileType As String
End Class
Public Class cRelayHubTransaction
Public Property ioPartner As String
Public Property ioDivision3 As String
Public Property ioReference As String
End Class
Public Class cRelayHubObjectIdentification
Public Property objectName As String
Public Property objectAlias As String
Public Property declarationType As String
Public Property referenceNumberOverlay As String ' <--- NEU
Public Property username As String ' <--- NEU
End Class
Public Class cRelayHubDv1CostAllocation
Public Property costType As String
Public Property costs As Decimal
Public Property currencyCode As String
End Class
Public Class cRelayHubAgentContact
Public Property contactPersonName As String
Public Property contactPersonPhoneNumber As String
Public Property contactPersonPosition As String
Public Property contactPersonEmail As String ' <--- NEU
End Class
Public Class cRelayHubCost
Public Property costAmount As String
Public Property costCurrency As String
End Class
Public Class cRelayHubHeaderData
Public Property agentContact As cRelayHubAgentContact
Public Property declarantIsConsignee As Boolean
Public Property representationRelationshipCode As String
Public Property inputTaxDeduction As String
Public Property procedureCodeRequested As String
Public Property goodsStatus As String
Public Property costs As List(Of cRelayHubCost)
Public Property transportMeansArrivalIdentity As String
Public Property transportMeansNationalityCode As String
Public Property previousAdministrativeReferenceType As String
Public Property previousAdministrativeReferenceNumber As String
Public Property destinationFederalState As String
Public Property destinationCountry As String
Public Property departureCountry As String
Public Property addressedCustomsOffice As String
Public Property dv1CostAllocation As cRelayHubDv1CostAllocation ' <--- NEU
End Class
Public Class cRelayHubAddress
Public Property addressType As String
Public Property participantEORI As String
Public Property participantSubsidiaryNumber As String
Public Property companyName As String
Public Property streetAndNumber As String
Public Property countryCode As String
Public Property postalCode As String
Public Property city As String
End Class
Public Class cRelayHubDeclaration
Public Property objectIdentification As cRelayHubObjectIdentification
Public Property headerData As cRelayHubHeaderData
Public Property addresses As List(Of cRelayHubAddress)
End Class
Public Class cRelayHubAdditionalData
Public Property transaction As cRelayHubTransaction
Public Property declaration As List(Of cRelayHubDeclaration)
End Class
Public Class cRelayHubJobOrderRequest
Public Property referenceNo As String
Public Property dispatchCountry As String
Public Property destinationCountry As String
Public Property regimeType As String
Public Property customer As String
Public Property documents As List(Of cRelayHubDocument)
Public Property additionalData As cRelayHubAdditionalData
End Class
Public Class cRelayHubJobOrderResponse
Public Property id As String
Public Property status As String
Public Property createdAt As String
Public Property referenceNo As String
End Class
Public Class cRelayHubApiResult
Public Property Success As Boolean
Public Property StatusCode As Integer
Public Property Message As String ' Zusammenfassung
Public Property Details As String ' Volltext/Fehlermeldung
Public Property Data As cRelayHubJobOrderResponse ' Nur bei 201
End Class
Public Class cRelayHub_sendToRelayHub_JobOrderRequest
Shared API_URL As String = "https://dev-relayhub.singlewindow.io/api/v1-0"
' Low-level Sender: holt Access-Token aus cRelayHubToken und sendet JSON
Private Shared Function SendJobOrder(jsonPayload As String) As Chilkat.HttpResponse
Dim http As New Chilkat.Http
http.SetRequestHeader("Accept", "application/json")
' *** Token aus der separaten Token-Klasse beziehen ***
Dim token As String = cRelayHubToken.GetValidAccessToken()
http.AuthToken = token ' -> setzt Authorization: Bearer <token>
Return http.PostJson2(API_URL & "/job-orders/init", "application/json", jsonPayload)
End Function
' Public API: erstellt Job-Order mit 401-Retry
Public Shared Function query_declarations(request As cRelayHubJobOrderRequest) As cRelayHubApiResult
Dim result As New cRelayHubApiResult()
Try
VERAG_PROG_ALLGEMEIN.cChilkat_Helper.UnlockCilkat()
Dim jsonPayload As String = JsonConvert.SerializeObject(request)
' 1. Versuch
Dim response As Chilkat.HttpResponse = SendJobOrder(jsonPayload)
If response Is Nothing Then
Return New cRelayHubApiResult With {
.Success = False, .StatusCode = 0, .Message = "Verbindungsfehler",
.Details = "Keine Antwort erhalten."
}
End If
' 401 → Token-Cache invalidieren und genau 1x erneut probieren
If response.StatusCode = 401 Then
' WICHTIG:
' Diese Methode sollte in cRelayHubToken als Public verfügbar sein:
' Public Shared Sub ResetTokenCache() : ClearToken() : End Sub
' → Falls noch nicht vorhanden, bitte dort ergänzen.
Try
cRelayHubToken.ResetTokenCache()
Catch
' Falls die Methode (noch) nicht existiert, kann man als Fallback
' hier eine kurze Wartezeit einbauen und anschließend erneut GetValidAccessToken() aufrufen.
' Threading.Thread.Sleep(100)
End Try
' Retry
response = SendJobOrder(jsonPayload)
If response Is Nothing Then
Return New cRelayHubApiResult With {
.Success = False, .StatusCode = 0, .Message = "Verbindungsfehler (nach Refresh)",
.Details = "Keine Antwort erhalten."
}
End If
End If
' Auswertung
result.StatusCode = response.StatusCode
Select Case response.StatusCode
Case 201
Try
Dim jobResponse As cRelayHubJobOrderResponse =
JsonConvert.DeserializeObject(Of cRelayHubJobOrderResponse)(response.BodyStr)
result.Success = True
result.Message = "Job Order erfolgreich erstellt"
result.Data = jobResponse
result.Details = $"ID: {jobResponse.id}, Referenz: {jobResponse.referenceNo}"
Catch ex As Exception
result.Success = False
result.StatusCode = 999
result.Message = "Antwort konnte nicht gelesen werden"
result.Details = ex.Message
End Try
Case 400 To 499
result.Success = False
result.Message = "Client-Fehler"
result.Details = response.BodyStr
Case 500 To 599
result.Success = False
result.Message = "Server-Fehler"
result.Details = response.BodyStr
Case Else
result.Success = False
result.Message = $"Unbekannter Fehler (Status {response.StatusCode})"
result.Details = response.BodyStr
End Select
Return result
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
Return New cRelayHubApiResult With {.Success = False, .StatusCode = 0, .Message = "Exception", .Details = ex.ToString()}
End Try
End Function
' Beispielfall
Function CreateSampleJobOrderRequest() As cRelayHubJobOrderRequest
Dim request As New cRelayHubJobOrderRequest With {
.referenceNo = "1001K",
.dispatchCountry = "TR",
.destinationCountry = "EN",
.regimeType = "IM",
.customer = "AVISO",
.documents = New List(Of cRelayHubDocument) From {
New cRelayHubDocument With {.type = "base64", .base64String = "SGVsbG8sIHRoaXMgaXMgYSBzYW1wbGUgYmFzZTY0IHN0cmluZy4=", .filename = "test.txt", .fileType = "invoice"},
New cRelayHubDocument With {.type = "base64", .base64String = "SGVsbG8sIHRoaXMgaXMgYSBzYW1wbGUgYmFzZTY0IHN0cmluZy4=", .filename = "test2.txt", .fileType = "atr"},
New cRelayHubDocument With {.type = "base64", .base64String = "SGVsbG8sIHRoaXMgaXMgYSBzYW1wbGUgYmFzZTY0IHN0cmluZy4=", .filename = "test3.txt", .fileType = "cmr"}
},
.additionalData = New cRelayHubAdditionalData With {
.transaction = New cRelayHubTransaction With {
.ioPartner = "VERA",
.ioDivision3 = "SUB",
.ioReference = "4803/25001763_1301250935SS/samimx"
},
.declaration = New List(Of cRelayHubDeclaration) From {
New cRelayHubDeclaration With {
.objectIdentification = New cRelayHubObjectIdentification With {
.objectName = "4803/25001763",
.objectAlias = "1349846",
.declarationType = "EZA-D"
},
.headerData = New cRelayHubHeaderData With {
.agentContact = New cRelayHubAgentContact With {
.contactPersonName = "AMANN",
.contactPersonPhoneNumber = "+49 123 456 789",
.contactPersonPosition = "Manager"
},
.declarantIsConsignee = True,
.representationRelationshipCode = "1",
.inputTaxDeduction = "true",
.procedureCodeRequested = "42",
.goodsStatus = "EU",
.costs = New List(Of cRelayHubCost) From {
New cRelayHubCost With {.costAmount = "25909.92", .costCurrency = "EUR"}
},
.transportMeansArrivalIdentity = "PB1552EC",
.transportMeansNationalityCode = "BG",
.previousAdministrativeReferenceType = "T1",
.previousAdministrativeReferenceNumber = "25TR160100001472M0",
.destinationFederalState = "07",
.destinationCountry = "DE",
.departureCountry = "TR"
},
.addresses = New List(Of cRelayHubAddress) From {
New cRelayHubAddress With {.addressType = "CZ", .participantEORI = "EORI12345", .participantSubsidiaryNumber = "001", .companyName = "SISECAM DIS TIC.A.S.", .streetAndNumber = "D-100 KARAYOLU CD.YAYLA MH.NO.70/C", .countryCode = "TR", .postalCode = "34949", .city = "TUZLA ISTANBUL"},
New cRelayHubAddress With {.addressType = "CN", .participantEORI = "EORI67890", .participantSubsidiaryNumber = "002", .companyName = "POLYNT COMPOSITES GERMANY GMBH", .streetAndNumber = "KIESELSTRASSE 2", .countryCode = "DE", .postalCode = "56357", .city = "MIEHLEN"}
}
}
}
}
}
Return request
End Function
End Class
End Class