Greenpulse DYEZA
This commit is contained in:
177
DAKOSY_Worker/DAKOSY/ATLAS/EZA/cDakosyEZA_Greenpulse.vb
Normal file
177
DAKOSY_Worker/DAKOSY/ATLAS/EZA/cDakosyEZA_Greenpulse.vb
Normal file
@@ -0,0 +1,177 @@
|
||||
Imports System.Globalization
|
||||
Imports Newtonsoft.Json
|
||||
Imports VERAG_PROG_ALLGEMEIN
|
||||
|
||||
Public Class cDakosyEZA_Greenpulse
|
||||
|
||||
' ==========================================================
|
||||
' BuildByMrn_DY: Erzeugt Kafka-Objekt aus cDakosyEZA (DY)
|
||||
' ==========================================================
|
||||
Public Shared Function BuildByMrn(eza As cDakosyEZA) As cATEZ_Greenpulse_KafkaDecs
|
||||
If eza Is Nothing Then Throw New ArgumentNullException(NameOf(eza))
|
||||
|
||||
' --- Adressen (Heuristik: CN=Importer, CZ=Exporter, DT=Declarant) ---
|
||||
Dim importer = GuessAddressByType(eza.eza_ADRESSEN, {"CN", "IM", "IMP"})
|
||||
Dim exporter = GuessAddressByType(eza.eza_ADRESSEN, {"CZ", "EX", "EXP"})
|
||||
Dim declarant = GuessAddressByType(eza.eza_ADRESSEN, {"DT", "DEC", "ANM", "DECLARANT"})
|
||||
|
||||
' --- Rechnungsdaten (Unterlagen N380) ---
|
||||
Dim inv = eza.eza_UNTERLAGEN?.FirstOrDefault(Function(u) SafeStr(u.ezaUl_Art).Equals("N380", StringComparison.OrdinalIgnoreCase) _
|
||||
AndAlso Not String.IsNullOrWhiteSpace(SafeStr(u.ezaUl_Nummer)))
|
||||
|
||||
' --- Kopf/Zielschema ---
|
||||
Dim dest As New cATEZ_Greenpulse_KafkaDecs With {
|
||||
.Declaration = New cATEZ_Greenpulse_KafkaDecs.DeclarationNode With {
|
||||
.DeclarationSourceId = SafeStr(eza.eza_ANR), ' interne Bezugsnr./ANR
|
||||
.DeclarationNo = SafeStr(eza.eza_MRN), ' MRN, falls vorhanden
|
||||
.DeclarationDate = ToDateYMD(FirstNonEmpty(eza.eza_Anmeldedatum, eza.eza_Erstellung)),
|
||||
.RequestedProcedure = SafeStr(eza.eza_VerfahrenBeantragtCode), ' z.B. "40"
|
||||
.PreviousProcedure = "", ' ggf. unten aus Position ableiten
|
||||
.Goods = New List(Of cATEZ_Greenpulse_KafkaDecs.GoodItem)()
|
||||
},
|
||||
.Parties = New cATEZ_Greenpulse_KafkaDecs.PartiesNode With {
|
||||
.ImporterIdentificationNumber = FirstNonEmptyStr(importer?.ezaAd_TeilnehmerEORI, importer?.ezaAd_AdressCode),
|
||||
.ExporterIdentificationNumber = FirstNonEmptyStr(exporter?.ezaAd_TeilnehmerEORI, exporter?.ezaAd_AdressCode),
|
||||
.ReportingDeclarantEORINumber = FirstNonEmptyStr(declarant?.ezaAd_TeilnehmerEORI, declarant?.ezaAd_AdressCode),
|
||||
.TypeOfRepresentation = SafeStr(eza.eza_VertretungsVerhaeltnisCode)
|
||||
},
|
||||
.Commercial = New cATEZ_Greenpulse_KafkaDecs.CommercialNode With {
|
||||
.InvoiceNumbers = If(inv IsNot Nothing, SafeStr(inv.ezaUl_Nummer), ""),
|
||||
.InvoiceDate = If(inv IsNot Nothing, ToDateYMD(inv.ezaUl_DatumAusstellung), "")
|
||||
},
|
||||
.ExporterDetails = New cATEZ_Greenpulse_KafkaDecs.ExporterDetailsNode With {
|
||||
.ExporterTitle = FirstNonEmptyStr(exporter?.ezaAd_NameFirma1, exporter?.ezaAd_NameFirma2),
|
||||
.ExporterEmail = "",
|
||||
.ExporterPhone = ""
|
||||
},
|
||||
.ImporterDetails = New cATEZ_Greenpulse_KafkaDecs.ImporterDetailsNode With {
|
||||
.ImporterTitle = FirstNonEmptyStr(importer?.ezaAd_NameFirma1, importer?.ezaAd_NameFirma2),
|
||||
.ImporterEmail = "",
|
||||
.ImporterPhone = "",
|
||||
.ImporterCountryCodeOrMemberState = SafeStr(importer?.ezaAd_LandCode),
|
||||
.ImporterSubdivision = "",
|
||||
.ImporterCity = SafeStr(importer?.ezaAd_Ort),
|
||||
.ImporterStreet = MergeStreet(importer),
|
||||
.ImporterStreetAdditional = SafeStr(importer?.ezaAd_StrasseHausNr2),
|
||||
.ImporterAddressNumber = "",
|
||||
.ImporterPostCode = SafeStr(importer?.ezaAd_PLZ),
|
||||
.ImporterPoBox = "",
|
||||
.ImporterCoordinateLongitudeX = "",
|
||||
.ImporterCoordinateLatitudeY = ""
|
||||
}
|
||||
}
|
||||
|
||||
' --- Warenpositionen -> Goods ---
|
||||
If eza.eza_WARENPOS IsNot Nothing Then
|
||||
For Each wp In eza.eza_WARENPOS
|
||||
Dim gi As New cATEZ_Greenpulse_KafkaDecs.GoodItem With {
|
||||
.CommodityCode = SafeStr(wp.ezaWP_WarennummerEZT),
|
||||
.OriginCountryCode = SafeStr(wp.ezaWP_UrsprungslandCode),
|
||||
.NetMass = ToInvariantStr(wp.ezaWP_Eigenmasse),
|
||||
.TypeOfMeasurementUnit = UnitCodeToKafkaName(FirstNonEmptyStr(wp.ezaWP_WarenMasseinheit1, wp.ezaWP_AHStatMengeMasseinheit, "KGM")),
|
||||
.SpecialProcedures = New cATEZ_Greenpulse_KafkaDecs.SpecialProceduresNode With {
|
||||
.MemberStateAutharization = SafeStr(importer?.ezaAd_LandCode), ' Heuristik
|
||||
.DischargeBillWaiver = "",
|
||||
.Authorisation = FirstNonEmptyStr(wp.ezaWP_Bewilligungsnummer, eza.eza_BewilligungsIDZLAVUV),
|
||||
.StartTime = "",
|
||||
.EndTime = "",
|
||||
.Deadline = ""
|
||||
}
|
||||
}
|
||||
dest.Declaration.Goods.Add(gi)
|
||||
Next
|
||||
End If
|
||||
|
||||
' --- Previous/Requested Procedure ggf. aus erster Position ziehen ---
|
||||
Dim wp0 = eza.eza_WARENPOS?.FirstOrDefault()
|
||||
If wp0 IsNot Nothing Then
|
||||
If String.IsNullOrWhiteSpace(dest.Declaration.RequestedProcedure) Then
|
||||
dest.Declaration.RequestedProcedure = SafeStr(wp0.ezaWP_Zollverfahren)
|
||||
End If
|
||||
dest.Declaration.PreviousProcedure = SafeStr(wp0.ezaWP_VerfahrensCodeVorangegangenesVerfahren)
|
||||
End If
|
||||
|
||||
Return dest
|
||||
End Function
|
||||
|
||||
' JSON-Wrapper
|
||||
Public Shared Function BuildJsonByMrn(eza As cDakosyEZA, Optional pretty As Boolean = True) As String
|
||||
Dim obj = BuildByMrn(eza)
|
||||
Return obj.ToJson(pretty)
|
||||
End Function
|
||||
|
||||
' -----------------------------
|
||||
' Helper (ggf. einmalig zentral)
|
||||
' -----------------------------
|
||||
Private Shared Function GuessAddressByType(list As List(Of cDakosy_EZA_Adressen), types As IEnumerable(Of String)) As cDakosy_EZA_Adressen
|
||||
If list Is Nothing Then Return Nothing
|
||||
Dim setTypes = New HashSet(Of String)(types.Select(Function(t) t.ToUpperInvariant()))
|
||||
Dim hit = list.FirstOrDefault(Function(a) setTypes.Contains(SafeStr(a.ezaAd_AdressTyp).ToUpperInvariant()))
|
||||
If hit IsNot Nothing Then Return hit
|
||||
Dim hitEori = list.FirstOrDefault(Function(a) Not String.IsNullOrWhiteSpace(SafeStr(a.ezaAd_TeilnehmerEORI)))
|
||||
If hitEori IsNot Nothing Then
|
||||
Return hitEori
|
||||
Else
|
||||
Return list.FirstOrDefault()
|
||||
End If
|
||||
End Function
|
||||
|
||||
Private Shared Function MergeStreet(addr As cDakosy_EZA_Adressen) As String
|
||||
If addr Is Nothing Then Return ""
|
||||
Dim s1 = SafeStr(addr.ezaAd_StrasseHausNr1)
|
||||
Dim s2 = SafeStr(addr.ezaAd_StrasseHausNr2)
|
||||
If s2 <> "" Then Return (s1 & " " & s2).Trim()
|
||||
Return s1
|
||||
End Function
|
||||
|
||||
Private Shared Function UnitCodeToKafkaName(code As String) As String
|
||||
Select Case SafeStr(code).ToUpperInvariant()
|
||||
Case "KGM" : Return "Kilograms"
|
||||
Case "TNE", "T" : Return "Tonnes"
|
||||
Case "LTR" : Return "Litres"
|
||||
Case "NAR", "NMB" : Return "Number of items"
|
||||
Case Else : Return code
|
||||
End Select
|
||||
End Function
|
||||
|
||||
Private Shared Function ToDateYMD(value As Object) As String
|
||||
If value Is Nothing Then Return ""
|
||||
Dim dt As DateTime
|
||||
If DateTime.TryParse(SafeStr(value), dt) Then
|
||||
Return dt.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)
|
||||
End If
|
||||
Return ""
|
||||
End Function
|
||||
|
||||
Private Shared Function ToInvariantStr(value As Object) As String
|
||||
If value Is Nothing Then Return ""
|
||||
If TypeOf value Is IFormattable Then
|
||||
Return DirectCast(value, IFormattable).ToString(Nothing, CultureInfo.InvariantCulture)
|
||||
End If
|
||||
Return Convert.ToString(value, CultureInfo.InvariantCulture)
|
||||
End Function
|
||||
|
||||
Private Shared Function SafeStr(o As Object) As String
|
||||
If o Is Nothing Then Return ""
|
||||
Dim s = Convert.ToString(o).Trim()
|
||||
Return If(s, "")
|
||||
End Function
|
||||
|
||||
Private Shared Function FirstNonEmpty(ParamArray values() As Object) As Object
|
||||
For Each v In values
|
||||
If v IsNot Nothing AndAlso Not String.IsNullOrWhiteSpace(SafeStr(v)) Then
|
||||
Return v
|
||||
End If
|
||||
Next
|
||||
Return Nothing
|
||||
End Function
|
||||
|
||||
Private Shared Function FirstNonEmptyStr(ParamArray values() As Object) As String
|
||||
For Each v In values
|
||||
Dim s = SafeStr(v)
|
||||
If Not String.IsNullOrWhiteSpace(s) Then Return s
|
||||
Next
|
||||
Return ""
|
||||
End Function
|
||||
|
||||
End Class
|
||||
Reference in New Issue
Block a user