Greenpulse DYEZA

This commit is contained in:
2025-09-08 13:46:33 +02:00
parent 504a1b7967
commit fe0f9d9bab
7 changed files with 1142 additions and 877 deletions

View File

@@ -475,6 +475,50 @@ list.Add(New VERAG_PROG_ALLGEMEIN.SQLVariable("eza_BezugsnummerBEAnteilZL", eza_
Return Nothing
End Function
Shared Function LOADByMRN(MRN As String, loadALL As Boolean, Optional checkValidStatus As Boolean = False) As cDakosyEZA
Try
Dim EZA As New cDakosyEZA
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Using conn As SqlConnection = SQL.GetNewOpenConnectionFMZOLL()
' Using cmd As New SqlCommand("SELECT TOP 1 * FROM (SELECT * FROM tblDakosy_EZA WHERE eza_ObjectName LIKE @bezugsNr " & If(checkValidStatus, " AND eza_status BETWEEN 40 and 90 ", "") & " ) AS T order by eza_status desc, (SELECT top 1 dySt_ts FROM [tblDakosy_Statusmeldungen] WHERE eza_dyaAnmID=dySt_dyId order by dySt_ts desc) desc,eza_LetzteBearbeitung desc ", conn)
Using cmd As New SqlCommand("SELECT TOP 1 * FROM tblDakosy_EZA WHERE isnull(eza_MRN,eza_ANR) LIKE @MRN " & If(checkValidStatus, " AND eza_status BETWEEN 40 and 90 ", "") & " order by eza_LetzteBearbeitung desc ", conn)
' MsgBox("SELECT TOP 1 * FROM tblDakosy_EZA WHERE eza_ObjectName Like " & bezugsNr & " " & If(checkValidStatus, " And eza_status BETWEEN 40 And 90 ", "") & " order by eza_status desc, (SELECT top 1 dySt_ts FROM [tblDakosy_Statusmeldungen] inner join tblDakosy_Zollanmeldungen on dy_id = dySt_dyId WHERE eza_dyaAnmID=dy_id order by dySt_ts desc) desc,eza_LetzteBearbeitung desc ")
cmd.Parameters.AddWithValue("@MRN", MRN)
Dim dr = cmd.ExecuteReader()
If dr.Read Then
For Each l In EZA.getParameterList()
Dim propInfo As PropertyInfo = EZA.GetType.GetProperty(l.Scalarvariable)
If dr.Item(l.Text) Is DBNull.Value Then
propInfo.SetValue(EZA, Nothing)
Else
propInfo.SetValue(EZA, dr.Item(l.Text))
End If
Next
If loadALL Then
EZA.LOAD_Unterlagen()
EZA.LOAD_Warenposition()
EZA.LOAD_Adressen()
EZA.LOAD_Aufschub()
EZA.LOAD_BEAnteilZLAVUV()
EZA.LOAD_SumABeendigungsAnteil()
End If
dr.Close()
Return EZA
End If
dr.Close()
End Using
End Using
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
Return Nothing
End Function
Public Function UPDATE_Status(status As Integer) As String
If eza_Id > 0 Then

View 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