Files
ADMIN/DAKOSY_Worker/cImporter_DakosyToVERAG.vb
2026-10-23 23:24:29 +02:00

963 lines
50 KiB
VB.net

Imports System.Data.SqlClient
Imports System.IO
Imports ClosedXML.Excel
Imports VERAG_PROG_ALLGEMEIN
Public Class cImporter_DakosyToVERAG
Private SQL As New VERAG_PROG_ALLGEMEIN.SQL
' ========================================================================
' MAIN ENTRY
' ========================================================================
Public Function ImportDakosyEZA(MRN As String, Optional overwrite As Boolean = True, Optional freshInsert As Boolean = False) As Boolean
If MRN Is Nothing Then Return False
If MRN = "" Then Return False
Dim EZA = cDakosyEZA.LOADByMRN(MRN, True)
If EZA IsNot Nothing Then Return ImportDakosyEZA(EZA, overwrite, freshInsert)
Return False
End Function
Public Function ImportDakosyEZA(eza As cDakosyEZA, Optional overwrite As Boolean = True, Optional freshInsert As Boolean = False) As Boolean
Try
If eza Is Nothing Then Return False
If String.IsNullOrWhiteSpace(eza.eza_MRN) AndAlso String.IsNullOrWhiteSpace(eza.eza_ANR) Then Return False
If If(eza.eza_MRN, "") = "" AndAlso eza.eza_ANR.ToString.StartsWith("ATA") Then ' Keine finale Anmeldung!
Return False
End If
' ================================================================
' DUPLIKATSPRÜFUNG
' ================================================================
If Not overwrite Then
If ExistsInVERAG(eza) Then Return False
End If
' ================================================================
' HEADER
' ================================================================
Dim ZA As cVERAG_CustomsDeclarations
If If(eza.eza_MRN, If(eza.eza_ANR, "")) = "" Then
ZA = New cVERAG_CustomsDeclarations
Else
ZA = cVERAG_CustomsDeclarations.loadByMRN(If(String.IsNullOrWhiteSpace(eza.eza_MRN), eza.eza_ANR, eza.eza_MRN), False)
End If
ZA.za_System = "DAKOSY"
ZA.za_CustomsSystem = "ATLAS"
ZA.za_REGIME = "IMPORT"
ZA.za_CustomsSystemCountry = "DE"
ZA.za_IsExternalSystem = False
ZA.za_IsFinalDeclaration = True
ZA.za_Firma = eza.eza_firma
ZA.za_Niederlassung = eza.eza_niederlassung
ZA.za_MRN = If(String.IsNullOrWhiteSpace(eza.eza_MRN), eza.eza_ANR, eza.eza_MRN)
ZA.za_LRN = eza.eza_ObjectName
VERAG_PROG_ALLGEMEIN.cProgramFunctions.tryGetFirmaNiederlassung(ZA.za_Firma, ZA.za_Niederlassung, "", ZA.za_LRN)
VERAG_PROG_ALLGEMEIN.cProgramFunctions.tryGetAvisoId_SndId_ByLRN(ZA.za_LRN, ZA.za_AvisoId, ZA.za_SendungsId)
Dim DY = cDakosy_Zollanmeldungen.LOADById(eza.eza_dyaAnmID)
If DY IsNot Nothing Then
If ZA.za_AvisoId Is Nothing AndAlso DY.dy_AvisoId IsNot Nothing Then ZA.za_AvisoId = DY.dy_AvisoId
If ZA.za_SendungsId Is Nothing AndAlso DY.dy_SendungsId IsNot Nothing Then ZA.za_SendungsId = DY.dy_SendungsId
End If
If eza.eza_Anmeldedatum IsNot Nothing AndAlso eza.eza_Anmeldedatum.ToString <> "" Then
ZA.za_DeclarationDate = CDate(eza.eza_Anmeldedatum)
ZA.za_ReleaseDate = CDate(eza.eza_Anmeldedatum)
Else
Dim dateumRelease As String = (New VERAG_PROG_ALLGEMEIN.SQL).DLookup("isnull(dySt_DakosyTransaktionsDatum,'')", "[tblDakosy_Statusmeldungen]", " dySt_status = 60 And dySt_dyId = '" & eza.eza_dyaAnmID & "' Order By [dySt_DakosyTransaktionsDatum] desc", "FMZOLL",)
If dateumRelease <> "" AndAlso IsDate(dateumRelease) Then
ZA.za_DeclarationDate = CDate(dateumRelease)
ZA.za_ReleaseDate = CDate(dateumRelease)
Else
ZA.za_DeclarationDate = ToNullableDate(If(eza.eza_Anmeldedatum, eza.eza_LetzteBearbeitung))
ZA.za_ReleaseDate = ToNullableDate(If(eza.eza_Anmeldedatum, eza.eza_LetzteBearbeitung))
End If
End If
ZA.za_MainProcedure = eza.eza_VerfahrenBeantragtCode
ZA.za_RepresentationCode = eza.eza_VertretungsVerhaeltnisCode
ZA.za_FiscalRepFlag = ToNullableBool(eza.eza_FiskalvertretungKz)
ZA.za_ApplicantVATNo = ToStringSafe(eza.eza_UstIdAnmelder)
ZA.za_ApplicantTaxOffice = ToStringSafe(eza.eza_FinanzamtAnmelder)
ZA.za_TaxDeduction = ToNullableBool(eza.eza_Vorsteuerabzug)
ZA.za_CountryDispatch = eza.eza_VersendungsLandCode
ZA.za_CountryDestination = eza.eza_Bestimmungsland
ZA.za_CountryDestinationState = eza.eza_Bestimmungsbundesland
ZA.za_ContainerNr1 = eza.eza_ContainerNr1
ZA.za_ContainerNr2 = eza.eza_ContainerNr2
ZA.za_ContainerNr3 = eza.eza_ContainerNr3
ZA.za_ContainerNr4 = eza.eza_ContainerNr4
ZA.za_ContainerNr5 = eza.eza_ContainerNr5
ZA.za_ContainerNr6 = eza.eza_ContainerNr6
ZA.za_ContainerNr7 = eza.eza_ContainerNr7
ZA.za_ContainerNr8 = eza.eza_ContainerNr8
ZA.za_ContainerNr9 = eza.eza_ContainerNr9
ZA.za_MeansOfTransport_Vehicle = eza.eza_KennzeichenNameBefoerderungsmittelAnkunft
ZA.za_MeansOfTransport_Nationality = eza.eza_BeförderungsmittelGrenzeStaatszugehörigkeitCode
ZA.za_MeansOfTransport_Type = eza.eza_BeförderungsmittelGrenzeArt
ZA.za_CountryImport = "DE"
ZA.za_WarehouseCode = eza.eza_Warenort
ZA.za_InvoiceAmount = eza.eza_Rechnungspreis
ZA.za_InvoiceCurrency = eza.eza_Rechnungswaehrung
ZA.za_DV1Flag = ToNullableBool(eza.eza_DV1Kz)
ZA.za_PrevDocument_No = eza.eza_VorpapierNr
ZA.za_PrevDocument_Type = eza.eza_VorpapierArtCode
ZA.za_Incoterms = eza.eza_LieferbedingungCode
ZA.za_IncotermsPlace = eza.eza_LieferbedingungOrt
ZA.za_Sachbearbeiter = eza.eza_AnmeldenderBearbeiterName
ZA.za_TotGrossMass = ToNullableDecimal(eza.eza_GesamtRohmasse)
ZA.za_TransportModeBorder = ToStringSafe(eza.eza_VerkehrszweigGrenze)
' ================================================================
' ADRESSEN
' ================================================================
If eza.eza_ADRESSEN IsNot Nothing Then
For Each p In eza.eza_ADRESSEN
Dim party As New cVERAG_CustomsDeclarations_Parties
party.zaParty_Role = p.ezaAd_AdressTyp
party.zaParty_EORI = p.ezaAd_TeilnehmerEORI
party.zaParty_EORI_NL = p.ezaAd_TeilnehmerNLNR
party.zaParty_Name = p.ezaAd_NameFirma1
party.zaParty_Street = p.ezaAd_StrasseHausNr1
party.zaParty_PostalCode = p.ezaAd_PLZ
party.zaParty_City = p.ezaAd_Ort
party.zaParty_Country = p.ezaAd_LandCode
'party.zaParty_TIN = p.
party.zaParty_VATNumber = p.ezaAd_UStIDAnmelder
party.zaParty_TaxOffice = p.ezaAd_FinanzamtIDAnmelder
If If(party.zaParty_EORI, "") <> "" Then
Dim AD As VERAG_PROG_ALLGEMEIN.cAdressen = cZOLL_IMPORT.getAdresseFromEORI(party.zaParty_EORI, "", "", True)
If AD IsNot Nothing Then
party.zaParty_Name = (If(AD.Name_1, "") & " " & If(AD.Name_2, "")).trim
party.zaParty_Country = VERAG_PROG_ALLGEMEIN.cProgramFunctions.getISO2Land(AD.LandKz)
party.zaParty_City = AD.Ort
party.zaParty_Street = AD.Straße
'party.ImporterAddressNumber = ""
party.zaParty_PostalCode = AD.PLZ
'party.ImporterEmail = AD.E_Mail
'party.ImporterPhone = AD.Telefon
End If
End If
ZA.Parties.Add(party)
Next
End If
' ================================================================
' ABGABEN
' ================================================================
If eza.eza_AUFSCHUB IsNot Nothing Then
For Each d In eza.eza_AUFSCHUB
If d.ezaAfb_PositionsNummer Is Nothing Then
Dim duty As New cVERAG_CustomsDeclarations_Duty
duty.zaDuty_ApplicationType = d.ezaAfb_ArtAufschubantrag
duty.zaDuty_AccountType = d.ezaAfb_Aufschubart
duty.zaDuty_AccountHeadCustoms = d.ezaAfb_HZA
duty.zaDuty_AccountNo = d.ezaAfb_KontoNr
duty.zaDuty_AccountEORI = d.ezaAfb_AufschubnehmerEORI
duty.zaDuty_AccountHolderName = d.AufschubnehmerName
duty.zaDuty_DutyType = d.ezaAfb_AbgabeArt
duty.zaDuty_BIN = d.ezaAfb_AufschuBIN
duty.zaDuty_AmountEUR = ToNullableDecimal(d.ezaAfb_Abgabenbetrag)
duty.zaDuty_AmountForeign = ToNullableDecimal(d.ezaAfb_Abgabenbetrag)
duty.zaDuty_Currency = "EUR"
duty.zaDuty_LimitDate = ToNullableDate(d.ezaAfb_Faelligkeit)
ZA.Duties.Add(duty)
End If
Next
End If
' ================================================================
' HEADER-UNTERLAGEN (ItemId = NULL)
' ================================================================
If eza.eza_UNTERLAGEN IsNot Nothing Then
For Each ul In eza.eza_UNTERLAGEN
Dim doc As New cVERAG_CustomsDeclarations_Document
doc.zaDoc_Section = ul.ezaUl_Bereich
doc.zaDoc_ItemId = Nothing
doc.zaDoc_Code = ul.ezaUl_Art
doc.zaDoc_Reference = ul.ezaUl_Nummer
doc.zaDoc_Date = ul.ezaUl_DatumAusstellung
ZA.Documents.Add(doc)
Next
End If
' ================================================================
' POSITIONEN + POSITIONS-UNTERLAGEN
' ================================================================
If eza.eza_WARENPOS IsNot Nothing Then
For Each wp In eza.eza_WARENPOS
Dim item As New cVERAG_CustomsDeclarations_Item
item.zaItem_PosNo = ToInt(wp.ezaWP_PositionsNummer)
item.zaItem_ArticleCode = wp.ezaWP_Artikelnummer
item.zaItem_HSCode = wp.ezaWP_WarennummerEZT
item.zaItem_HSAddition1 = wp.ezaWP_Warennummerzusatz1
item.zaItem_HSAddition2 = wp.ezaWP_Warennummerzusatz2
item.zaItem_HSAddCodes1 = wp.ezaWP_WarennummerZusatzCode1
item.zaItem_HSAddCodes2 = wp.ezaWP_WarennummerZusatzCode2
item.zaItem_HSAddCodes3 = wp.ezaWP_WarennummerZusatzCode3
item.zaItem_HSAddCodes4 = wp.ezaWP_WarennummerZusatzCode4
item.zaItem_HSAddCodes5 = wp.ezaWP_WarennummerZusatzCode5
item.zaItem_HSAddCodes6 = wp.ezaWP_WarennummerZusatzCode6
item.zaItem_HSAddCodes7 = wp.ezaWP_WarennummerZusatzCode7
item.zaItem_HSAddCodes8 = wp.ezaWP_WarennummerZusatzCode8
item.zaItem_HSAddCodes9 = wp.ezaWP_WarennummerZusatzCode9
item.zaItem_HSAddCodes10 = wp.ezaWP_WarennummerZusatzCode10
item.zaItem_Description = wp.ezaWP_Warenbezeichnung
item.zaItem_PrevProcedure = wp.ezaWP_VerfahrensCodeVorangegangenesVerfahren
item.zaItem_PreferentialCountry = wp.ezaWP_Praeferenzursprungsland
item.zaItem_MainProcedure = wp.ezaWP_AnmeldeVErfahren
item.zaItem_PackageColli = (wp.ezaWP_PackstueckAnzahl)
item.zaItem_PackageType = wp.ezaWP_PackstueckArt
Dim packageNumber As Integer
item.Packages.Add(New cVERAG_CustomsDeclarations_ItemPackage With {
.zaPkg_Type = item.zaItem_PackageType,
.zaPkg_Number = If(Integer.TryParse(item.zaItem_PackageColli, packageNumber), CType(packageNumber, Integer?), Nothing),
.zaPkg_Marks = item.zaItem_PackageMark
})
item.zaItem_GrossMass = ToNullableDecimal(wp.ezaWP_Rohmasse)
item.zaItem_NetMass = ToNullableDecimal(wp.ezaWP_Eigenmasse)
item.zaItem_InvoiceValueForeign = ToNullableDecimal(wp.ezaWP_Artikelpreis)
item.zaItem_InvoiceCurrency = wp.ezaWP_ArtikelpreisWaehrung
If If(wp.ezaWP_ArtikelpreisWaehrung, "") = "EUR" Then
item.zaItem_InvoiceValueEUR = ToNullableDecimal(wp.ezaWP_Artikelpreis)
End If
item.zaItem_CustomsValueEUR = ToNullableDecimal(wp.ezaWP_Zollwert)
item.zaItem_StatisticalValueEUR = ToNullableDecimal(wp.ezaWP_AHStatWert)
item.zaItem_OriginCountry = wp.ezaWP_UrsprungslandCode
item.zaItem_PreferenceCode = wp.ezaWP_BeguenstigungBenatragtCode
item.zaItem_PosAddition = If(wp.ezaWP_PositionsZusatz, "")
' -------------------------------
' POSITIONS-UNTERLAGEN
' -------------------------------
If wp.ezaWP_UNTERLAGEN IsNot Nothing Then
For Each ul In wp.ezaWP_UNTERLAGEN
Dim doc As New cVERAG_CustomsDeclarations_Document
doc.zaDoc_Section = ul.ezaWpUl_Bereich
doc.zaDoc_Code = ul.ezaWpUl_Art
doc.zaDoc_Reference = ul.ezaWpUl_Nummer
doc.zaDoc_Date = ToNullableDate(ul.ezaWpUl_DatumAusstellung)
doc.zaDoc_Presentation = ul.ezaWpUl_VorlageKz
doc.zaDoc_DepreciationAmount = (ul.ezaWpUl_AbschreibungsMenge)
doc.zaDoc_DepreciationUnitmeasurement = ul.ezaWpUl_AbschreibungsMengeMasseinheit
doc.zaDoc_DepreciationUnitmeasurementQualifier = ul.ezaWpUl_AbschreibungsMengeMasseinheitQualifier
item.Documents.Add(doc)
Next
End If
' ================================================================
' ABGABEN POS
' ================================================================
If eza.eza_AUFSCHUB IsNot Nothing Then
For Each d In eza.eza_AUFSCHUB
If d.ezaAfb_PositionsNummer IsNot Nothing AndAlso CInt(d.ezaAfb_PositionsNummer) = item.zaItem_PosNo Then
Dim duty As New cVERAG_CustomsDeclarations_Duty
duty.zaDuty_ApplicationType = d.ezaAfb_ArtAufschubantrag
duty.zaDuty_AccountType = d.ezaAfb_Aufschubart
duty.zaDuty_AccountHeadCustoms = d.ezaAfb_HZA
duty.zaDuty_AccountNo = d.ezaAfb_KontoNr
duty.zaDuty_AccountEORI = d.ezaAfb_AufschubnehmerEORI
duty.zaDuty_AccountHolderName = d.AufschubnehmerName
duty.zaDuty_DutyType = d.ezaAfb_AbgabeArt
duty.zaDuty_BIN = d.ezaAfb_AufschuBIN
duty.zaDuty_AmountEUR = ToNullableDecimal(d.ezaAfb_Abgabenbetrag)
duty.zaDuty_AmountForeign = ToNullableDecimal(d.ezaAfb_Abgabenbetrag)
duty.zaDuty_Currency = "EUR"
duty.zaDuty_LimitDate = ToNullableDate(d.ezaAfb_Faelligkeit)
duty.zaDuty_Prozentsatz = ToNullableDecimal(d.ezaAfb_Prozentsatz)
item.Duties.Add(duty)
End If
Next
End If
ZA.Items.Add(item)
Next
End If
' ================================================================
'CBAM WARNING
' ================================================================
If freshInsert Then
ZA.checkfreshCBAMWarning()
End If
' ================================================================
' SAVE
Dim saved = ZA.SAVE()
' ======KAFKA==========================================================
If saved AndAlso freshInsert Then cDakosyEZA_Greenpulse.INSERT_KAFKA(ZA)
' ================================================================
If saved Then
Try
UpdateBrokerManagementFileTETRAPAK(ZA)
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, "UpdateBrokerManagementFile")
End Try
End If
Return saved
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name)
Return False
End Try
End Function
Public Sub UpdateBrokerManagementFileTETRAPAK(ZA As cVERAG_CustomsDeclarations)
Const kundenNrTETRAPAK As Integer = 719649
Const prefix As String = "[TETRAPAK] "
Debug.WriteLine(prefix & "========== START BrokerManagementFile ==========")
Try
If ZA Is Nothing OrElse ZA.za_Id <= 0 Then
Debug.WriteLine(prefix & "ABBRUCH: Keine gültige Zollanmeldung")
Exit Sub
End If
'Zollanmeldung vollständig aus VERAG-Datenbank laden
Dim ZOLL As New cVERAG_CustomsDeclarations
ZOLL.za_Id = ZA.za_Id
ZOLL.LOAD()
If Not ZOLL.hasEntry Then
Throw New Exception("Zollanmeldung nicht gefunden. za_Id=" & ZA.za_Id)
End If
Debug.WriteLine(prefix & "ZA-ID: " & ZOLL.za_Id)
Debug.WriteLine(prefix & "MRN: " & Convert.ToString(ZOLL.za_MRN))
Debug.WriteLine(prefix & "LRN: " & Convert.ToString(ZOLL.za_LRN))
Debug.WriteLine(prefix & "AvisoId: " & Convert.ToString(ZOLL.za_AvisoId))
Debug.WriteLine(prefix & "SendungsId: " & Convert.ToString(ZOLL.za_SendungsId))
If Not ZOLL.za_SendungsId.HasValue OrElse ZOLL.za_SendungsId.Value <= 0 Then
Debug.WriteLine(prefix & "ABBRUCH: Keine SendungsId")
Exit Sub
End If
'Auftraggeber prüfen
Dim SND As New VERAG_PROG_ALLGEMEIN.cSendungen(ZOLL.za_SendungsId.Value)
Debug.WriteLine(prefix & "Auftraggeber: " & Convert.ToString(SND.tblSnd_Auftraggeber))
Debug.WriteLine(prefix & "Kundennummer: " & Convert.ToString(SND.tblSnd_AuftraggeberKdNr))
Dim kundenNr As Integer
If Not Integer.TryParse(Convert.ToString(SND.tblSnd_AuftraggeberKdNr), kundenNr) Then
Debug.WriteLine(prefix & "ABBRUCH: Ungültige Kundennummer")
Exit Sub
End If
If kundenNr <> kundenNrTETRAPAK Then
Debug.WriteLine(prefix & "ABBRUCH: Kein TETRAPAK-Auftraggeber")
Exit Sub
End If
'Warenpositionen aus tblVERAG_CustomsDeclarations_Items
Dim positionen = ZOLL.Items.OrderBy(Function(p) p.zaItem_PosNo).ToList()
If positionen.Count = 0 Then
Debug.WriteLine(prefix & "ABBRUCH: Keine Warenpositionen vorhanden")
Exit Sub
End If
Debug.WriteLine(prefix & "Warenpositionen: " & positionen.Count)
Debug.WriteLine(prefix & "Kopfabgaben: " & ZOLL.Duties.Count)
'Abgaben aus tblVERAG_CustomsDeclarations_Duties
'Positionen und Kopf getrennt behandeln
Dim gesamtZollPositionen As Decimal = 0D
Dim gesamtEustPositionen As Decimal = 0D
Dim gesamtZollKopf As Decimal = 0D
Dim gesamtEustKopf As Decimal = 0D
Dim anzahlPositionsabgaben As Integer = 0
For Each wp In positionen
Debug.WriteLine(prefix & "Position " & wp.zaItem_PosNo & " | ItemId=" & wp.zaItem_Id & " | Abgaben=" & wp.Duties.Count)
For Each duty In wp.Duties
Dim betrag As Decimal = If(duty.zaDuty_AmountEUR, 0D)
Dim art As String = If(duty.zaDuty_DutyType, "").Trim().ToUpperInvariant()
Select Case art
Case "A0000", "A00"
gesamtZollPositionen += betrag
Case "B0000", "B00"
gesamtEustPositionen += betrag
End Select
anzahlPositionsabgaben += 1
Debug.WriteLine(prefix & " Duty: " & art &
" | Betrag=" & betrag.ToString("0.00") &
" | ItemId=" & Convert.ToString(duty.zaDuty_zaItemId))
Next
Next
For Each duty In ZOLL.Duties
Dim betrag As Decimal = If(duty.zaDuty_AmountEUR, 0D)
Dim art As String = If(duty.zaDuty_DutyType, "").Trim().ToUpperInvariant()
Select Case art
Case "A0000", "A00"
gesamtZollKopf += betrag
Case "B0000", "B00"
gesamtEustKopf += betrag
End Select
Debug.WriteLine(prefix & "Kopfabgabe: " & art & " | Betrag=" & betrag.ToString("0.00"))
Next
Debug.WriteLine(prefix & "Positions-Zoll gesamt: " & gesamtZollPositionen.ToString("0.00"))
Debug.WriteLine(prefix & "Positions-EUSt gesamt: " & gesamtEustPositionen.ToString("0.00"))
Debug.WriteLine(prefix & "Kopf-Zoll gesamt: " & gesamtZollKopf.ToString("0.00"))
Debug.WriteLine(prefix & "Kopf-EUSt gesamt: " & gesamtEustKopf.ToString("0.00"))
'Bei fehlenden Positionsabgaben keine künstliche Verteilung
Dim nurKopfabgaben As Boolean = (anzahlPositionsabgaben = 0)
If nurKopfabgaben AndAlso positionen.Count > 1 AndAlso ZOLL.Duties.Count > 0 Then
Throw New Exception("BrokerManagementFile: Es sind " & positionen.Count &
" Warenpositionen vorhanden, aber nur Kopfabgaben gespeichert. " &
"Eine eindeutige Verteilung von Zoll/EUSt ist nicht möglich. ZA-ID=" & ZOLL.za_Id)
End If
If nurKopfabgaben AndAlso ZOLL.Duties.Count = 0 Then
Debug.WriteLine(prefix & "WARNUNG: Keine Abgaben in der Zollanmeldung gespeichert")
End If
If Not nurKopfabgaben Then
If ZOLL.Duties.Count > 0 Then
If gesamtZollPositionen <> gesamtZollKopf OrElse gesamtEustPositionen <> gesamtEustKopf Then
Debug.WriteLine(prefix & "WARNUNG: Positionssummen und Kopfsummen weichen voneinander ab")
Else
Debug.WriteLine(prefix & "OK: Positionssummen entsprechen den Kopfsummen")
End If
End If
End If
'Anhänge über AVISO und Sendung laden
Dim anhaenge As New List(Of VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge)
If ZOLL.za_AvisoId.HasValue AndAlso ZOLL.za_AvisoId.Value > 0 Then
VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge.LOAD_LIST_ByAviso(anhaenge, ZOLL.za_AvisoId.Value)
End If
Dim sendungsAnhaenge As New List(Of VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge)
VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge.LOAD_LIST_BySendung(sendungsAnhaenge, ZOLL.za_SendungsId.Value)
For Each anh In sendungsAnhaenge
If Not anhaenge.Any(Function(a) a.anh_docId = anh.anh_docId) Then anhaenge.Add(anh)
Next
Debug.WriteLine(prefix & "Anhänge gefunden: " & anhaenge.Count)
Dim dateienGefunden As Integer = 0
Dim dateienGespeichert As Integer = 0
For Each anh In anhaenge
Debug.WriteLine(prefix & "Prüfe Anhang: " & Convert.ToString(anh.anh_Art) & " | docId=" & anh.anh_docId)
If Not String.Equals(Convert.ToString(anh.anh_Art).Trim(), "BrokerManagementFile", StringComparison.OrdinalIgnoreCase) Then Continue For
If anh.anh_docId <= 0 Then Continue For
Dim pfad As String = (New VERAG_PROG_ALLGEMEIN.cDATENSERVER(anh.anh_docId)).GET_TOP1_PATH(False)
Debug.WriteLine(prefix & "Archivpfad: " & Convert.ToString(pfad))
If String.IsNullOrWhiteSpace(pfad) OrElse Not File.Exists(pfad) Then
Debug.WriteLine(prefix & "Übersprungen: Archivdatei nicht gefunden")
Continue For
End If
If Not String.Equals(Path.GetExtension(pfad), ".xlsx", StringComparison.OrdinalIgnoreCase) Then
Debug.WriteLine(prefix & "Übersprungen: Keine XLSX-Datei")
Continue For
End If
dateienGefunden += 1
Using wb As New XLWorkbook(pfad)
Dim ws = wb.Worksheet(1)
Dim letzteVerwendeteZeile = ws.LastRowUsed()
If letzteVerwendeteZeile Is Nothing Then
Debug.WriteLine("BrokerManagementFile ist leer: " & pfad)
End If
'Datenzeilen anhand Spalte A
Dim datenZeilen As New List(Of Integer)
Dim letzteZeile As Integer = letzteVerwendeteZeile.RowNumber()
For zeile As Integer = 2 To letzteZeile
If Not String.IsNullOrWhiteSpace(ws.Cell(zeile, "A").GetString()) Then datenZeilen.Add(zeile)
Next
Debug.WriteLine(prefix & "Excel-Zeilen: " & datenZeilen.Count)
Debug.WriteLine(prefix & "Zollpositionen: " & positionen.Count)
If datenZeilen.Count <> positionen.Count Then
Debug.WriteLine("BrokerManagementFile: Positionsanzahl stimmt nicht überein. Excel=" &
datenZeilen.Count & ", Zollanmeldung=" & positionen.Count & ", Datei=" & pfad)
End If
For i As Integer = 0 To positionen.Count - 1
Dim wp = positionen(i)
Dim zeile As Integer = datenZeilen(i)
Dim posNr As Integer = wp.zaItem_PosNo
Dim zollbetr As Decimal = 0D
Dim eust As Decimal = 0D
'Positionsabgaben aus Datenbank
If Not nurKopfabgaben Then
For Each duty In wp.Duties
Dim betrag As Decimal = If(duty.zaDuty_AmountEUR, 0D)
Dim art As String = If(duty.zaDuty_DutyType, "").Trim().ToUpperInvariant()
Select Case art.Trim.ToUpperInvariant()
'Zoll inkl. Zusatz-, Antidumping- und Ausgleichszoll
Case "A0000", "A00", "A2000", "A20", "A3000", "A30", "A35", "A4000", "A40"
zollbetr += betrag
'Einfuhrumsatzsteuer
Case "B0000", "B00", "5EV"
eust += betrag
'Sicherheiten, Summen und sonstige Abgaben nicht berücksichtigen
Case "2EU", "2IG", "2KO", "2PE", "2VF", "2VS", "5EU", "5ZO", "9EA", "6BE"
'Keine Addition
Case Else
'Debug.WriteLine("Unbekannte Abgabenart: " & art & " / Betrag: " & betrag.ToString())
zollbetr += betrag 'Default: Alle unbekannten Abgabenarten werden als Zoll behandelt
End Select
Next
ElseIf positionen.Count = 1 Then
'Nur bei einer Position sind Kopfabgaben eindeutig zuordenbar
zollbetr = gesamtZollKopf
eust = gesamtEustKopf
End If
Debug.WriteLine(prefix & "----------------------------------------")
Debug.WriteLine(prefix & "Position: " & posNr)
Debug.WriteLine(prefix & "Excel-Zeile: " & zeile)
Debug.WriteLine(prefix & "Zoll: " & zollbetr.ToString("0.00"))
Debug.WriteLine(prefix & "EUSt: " & eust.ToString("0.00"))
'AZ - Registration Number ATC/ATD
ws.Cell(zeile, "AZ").Value = If(zoll.za_DeclarationNo, "")
'BA - Date of Acceptance
If zoll.za_AcceptanceDate.HasValue Then
ws.Cell(zeile, "BA").Value = zoll.za_AcceptanceDate.Value.ToString("dd.MM.yyyy")
Else
ws.Cell(zeile, "BA").Value = ""
End If
'BB - Registration Number MRN
ws.Cell(zeile, "BB").Value = If(zoll.za_MRN, "")
'BC - Office of Entry
ws.Cell(zeile, "BC").Value = If(zoll.za_EntryCustomsOffice, "")
'BD - Mode of Transport at the Border
ws.Cell(zeile, "BD").Value = If(ZOLL.za_TransportModeBorder, If(ZOLL.za_TransportModeInland, ""))
'BE - Identity of means of transport at the border
ws.Cell(zeile, "BE").Value = If(zoll.za_MeansOfTransport_Vehicle, "")
'BF - Nationality of means of transport at the border
ws.Cell(zeile, "BF").Value = If(zoll.za_MeansOfTransport_Nationality, "")
'BG - Inland Mode of Transport
ws.Cell(zeile, "BG").Value = If(ZOLL.za_TransportModeInland, If(ZOLL.za_TransportModeBorder, ""))
'BH - Identity of inland means of transport
ws.Cell(zeile, "BH").Value = If(zoll.za_MeansOfTransport_Vehicle, "")
'BI - Nationality of inland means of transport
ws.Cell(zeile, "BI").Value = If(zoll.za_MeansOfTransport_Nationality, "")
'BJ - Assessment of payable duty
ws.Cell(zeile, "BJ").Value = zollbetr
ws.Cell(zeile, "BJ").Style.NumberFormat.Format = "0.00"
'BK - Assessment of payable Import VAT
ws.Cell(zeile, "BK").Value = eust
ws.Cell(zeile, "BK").Style.NumberFormat.Format = "0.00"
Debug.WriteLine(prefix & "AZ=" & ws.Cell(zeile, "AZ").GetString())
Debug.WriteLine(prefix & "BA=" & ws.Cell(zeile, "BA").GetString())
Debug.WriteLine(prefix & "BB=" & ws.Cell(zeile, "BB").GetString())
Debug.WriteLine(prefix & "BC=" & ws.Cell(zeile, "BC").GetString())
Debug.WriteLine(prefix & "BD=" & ws.Cell(zeile, "BD").GetString())
Debug.WriteLine(prefix & "BE=" & ws.Cell(zeile, "BE").GetString())
Debug.WriteLine(prefix & "BF=" & ws.Cell(zeile, "BF").GetString())
Debug.WriteLine(prefix & "BG=" & ws.Cell(zeile, "BG").GetString())
Debug.WriteLine(prefix & "BH=" & ws.Cell(zeile, "BH").GetString())
Debug.WriteLine(prefix & "BI=" & ws.Cell(zeile, "BI").GetString())
Debug.WriteLine(prefix & "BJ=" & zollbetr.ToString("0.00"))
Debug.WriteLine(prefix & "BK=" & eust.ToString("0.00"))
Next
wb.Save()
Debug.WriteLine(prefix & "Original gespeichert: " & pfad)
dateienGespeichert += 1
End Using
Next
Debug.WriteLine(prefix & "BrokerManagementFiles gefunden: " & dateienGefunden)
Debug.WriteLine(prefix & "BrokerManagementFiles gespeichert: " & dateienGespeichert)
If dateienGefunden = 0 Then Debug.WriteLine(prefix & "WARNUNG: Kein BrokerManagementFile gefunden")
Catch ex As Exception
Debug.WriteLine(prefix & "FEHLER: " & ex.ToString())
Throw
Finally
Debug.WriteLine(prefix & "========== ENDE BrokerManagementFile ==========")
End Try
End Sub
' =====================================================================
' NCTS 004 -> VERAG TRANSIT
' =====================================================================
Public Function ImportDakosyNCTS(bezugsNr As String, Optional overwrite As Boolean = True) As Boolean
If String.IsNullOrWhiteSpace(bezugsNr) Then Return False
Dim ncts = cDakosyNCTSOut004.LOADByBezugsNr(bezugsNr, True)
If ncts Is Nothing OrElse ncts.ncts_Id <= 0 Then Return False
Return ImportDakosyNCTS(ncts, overwrite)
End Function
Public Function ImportDakosyNCTS(ncts As cDakosyNCTSOut004, Optional overwrite As Boolean = True) As Boolean
Try
If ncts Is Nothing Then Return False
Dim mrn = ToStringSafe(ncts.ncts_MRN)
Dim anr = ToStringSafe(ncts.ncts_ANR)
Dim ref = If(Not String.IsNullOrWhiteSpace(mrn), mrn, anr)
If String.IsNullOrWhiteSpace(ref) Then Return False
If Not overwrite AndAlso ExistsNCTSInVERAG(mrn, anr) Then Return False
Dim ZA = cVERAG_CustomsDeclarations.loadByMRN(ref, False)
If ZA Is Nothing Then ZA = New cVERAG_CustomsDeclarations
If ZA.za_Id > 0 AndAlso ZA.za_REGIME <> "TRANSIT" Then Throw New InvalidOperationException("MRN gehört zu anderem Verfahren: " & ZA.za_REGIME)
ZA.za_System = "DAKOSY"
ZA.za_CustomsSystem = "ATLAS"
ZA.za_CustomsSystemCountry = "DE"
ZA.za_REGIME = "TRANSIT"
ZA.za_MRN = ref
ZA.za_LRN = ToStringSafe(ncts.ncts_ObjectName)
ZA.za_DeclarationNo = anr
ZA.za_IsExternalSystem = False
ZA.za_IsFinalDeclaration = Not String.IsNullOrWhiteSpace(mrn)
ZA.za_Firma = ToStringSafe(ncts.ncts_firma)
ZA.za_Niederlassung = ToStringSafe(ncts.ncts_niederlassung)
ZA.za_Sachbearbeiter = ToStringSafe(ncts.ncts_Bearbeiter)
ZA.za_CountryDispatch = ToStringSafe(ncts.ncts_CountryOfDispatch)
ZA.za_CountryDestination = ToStringSafe(ncts.ncts_CountryOfDestination)
ZA.za_TransitType = ToStringSafe(ncts.ncts_TransitDeclarationType)
If String.IsNullOrWhiteSpace(ZA.za_TransitType) Then ZA.za_TransitType = ToStringSafe(ncts.ncts_Declarationtype)
ZA.za_TransitStatus = ToStringSafe(ncts.ncts_Status)
ZA.za_TransitDepartureOffice = ToStringSafe(ncts.ncts_CustomsOfficeOfDeparture)
ZA.za_TransitDestinationOffice = ToStringSafe(ncts.ncts_CustomsOfficeOfDestinationDeclared)
ZA.za_TransitLimitDate = ToNullableDate(ncts.ncts_LimitDate)
ZA.za_TransitArrivalDate = ToNullableDate(ncts.ncts_Ankunft)
ZA.za_TransitCompletionDate = ToNullableDate(ncts.ncts_Erledigung)
ZA.za_TransitReducedDataset = ToNullableBool(ncts.ncts_ReductedDatasetIndicator)
ZA.za_TransitSecurityCode = ToStringSafe(ncts.ncts_Security)
ZA.za_TransitLocationType = ToStringSafe(ncts.ncts_LocationOfGoods_TypeofLocation)
ZA.za_TransitLocationQualifier = ToStringSafe(ncts.ncts_LocationOfGoods_QualifierIdenfitication)
ZA.za_TransitLocationIdentifier = ToStringSafe(ncts.ncts_LocationOfGoods_AdditionalIdentifier)
ZA.za_TransitContainerIndicator = ToNullableBool(ncts.ncts_ContainerIndicator)
ZA.za_TransitBorderVehicle = ToStringSafe(ncts.ncts_ActiveBorderTransportMeans_1_IdentificationNumber)
ZA.za_TransitBorderVehicleType = ToStringSafe(ncts.ncts_ActiveBorderTransportMeans_1_TypeOfIdentification)
ZA.za_TransitBorderVehicleNationality = ToStringSafe(ncts.ncts_ActiveBorderTransportMeans_1_Nationality)
ZA.za_TransportModeInland = ToStringSafe(ncts.ncts_InlandModeOfTransport)
ZA.za_TransportModeBorder = ToStringSafe(ncts.ncts_ModeOfTransportAtTheBorder)
ZA.za_MeansOfTransport_Vehicle = ToStringSafe(ncts.ncts_DepartureTransportMeans_1_IdentificationNumber)
ZA.za_MeansOfTransport_Type = ToStringSafe(ncts.ncts_DepartureTransportMeans_1_TypeOfIdentification)
ZA.za_MeansOfTransport_Nationality = ToStringSafe(ncts.ncts_DepartureTransportMeans_1_Nationality)
ZA.za_TotGrossMass = ToNullableDecimal(ncts.ncts_GrossMass)
ZA.za_UCR = ToStringSafe(ncts.ncts_ReferenceNumberUCR)
ZA.za_DeclarationDate = ToNullableDate(ncts.ncts_Eroeffnung)
VERAG_PROG_ALLGEMEIN.cProgramFunctions.tryGetFirmaNiederlassung(ZA.za_Firma, ZA.za_Niederlassung, "", ZA.za_LRN)
VERAG_PROG_ALLGEMEIN.cProgramFunctions.tryGetAvisoId_SndId_ByLRN(ZA.za_LRN, ZA.za_AvisoId, ZA.za_SendungsId)
' loadByMRN(..., False) lädt keine Kinddaten; bei Neuimport komplett neu aufbauen.
ZA.Parties.Clear()
ZA.Items.Clear()
ZA.Documents.Clear()
ZA.Duties.Clear()
ZA.HouseConsignments.Clear()
ZA.TransitGuarantees.Clear()
ZA.TransitOffices.Clear()
AddNCTSParty(ZA, "CONSIGNOR", ncts.ncts_Consignor_IdentificationNumber, ncts.ncts_Consignor_Name, ncts.ncts_Consignor_StreetNumber, ncts.ncts_Consignor_Postcode, ncts.ncts_Consignor_City, ncts.ncts_Consignor_Country, ncts.ncts_Consignor_SubsidiaryNumber)
AddNCTSParty(ZA, "CONSIGNEE", ncts.ncts_Consignee_IdentificationNumber, ncts.ncts_Consignee_Name, ncts.ncts_Consignee_StreetNumber, ncts.ncts_Consignee_Postcode, ncts.ncts_Consignee_City, ncts.ncts_Consignee_Country, ncts.ncts_Consignee_SubsidiaryNumber)
AddNCTSParty(ZA, "HOLDER", ncts.ncts_HolderOfTheTransitProcedure_IdentificationNumber, ncts.ncts_HolderOfTheTransitProcedure_Name, ncts.ncts_HolderOfTheTransitProcedure_StreetNumber, ncts.ncts_HolderOfTheTransitProcedure_Postcode, ncts.ncts_HolderOfTheTransitProcedure_City, ncts.ncts_HolderOfTheTransitProcedure_Country)
AddNCTSParty(ZA, "REPRESENTATIVE", ncts.ncts_Representative_IdentificationNumber, Nothing, Nothing, Nothing, Nothing, Nothing)
AddNCTSParty(ZA, "CARRIER", ncts.ncts_Carrier_IdentificationNumber, Nothing, Nothing, Nothing, Nothing, Nothing, ncts.ncts_Carrier_SubsidiaryNumber)
For Each grt In ncts.ncts_GUARANTEE
Dim betragFW As Decimal? = ToNullableDecimal(grt.nctsGRT_AmountToBeCovered)
Dim waehrungFW As String = ToStringSafe(grt.nctsGRT_Currency)
Dim betragEUR As Decimal? = Nothing
Dim kurs As Decimal? = Nothing
If betragFW.HasValue Then
If String.Equals(waehrungFW, "EUR", StringComparison.OrdinalIgnoreCase) Then
betragEUR = betragFW
kurs = 1D
ElseIf Not String.IsNullOrWhiteSpace(waehrungFW) Then
Dim umgerechnet As Decimal = VERAG_PROG_ALLGEMEIN.cEZB_Waehrungskurse.EXCHANGE_CURTOEUR(betragFW.Value, waehrungFW, ncts.ncts_Trans_DatumZeit)
If umgerechnet > 0 Then
betragEUR = umgerechnet
If betragFW.Value <> 0 Then kurs = umgerechnet / betragFW.Value
End If
End If
End If
ZA.TransitGuarantees.Add(New cVERAG_CustomsDeclarations_TransitGuarantee With {
.zaGRT_Type = ToStringSafe(grt.nctsGRT_Type),
.zaGRT_GRN = ToStringSafe(grt.nctsGRT_GRN),
.zaGRT_Reference = ToStringSafe(grt.nctsGRT_OtherGuaranteeReference),
.zaGRT_Amount = betragEUR,
.zaGRT_Currency = "EUR",
.zaGRT_AmountForeign = betragFW,
.zaGRT_CurrencyForeign = waehrungFW,
.zaGRT_ExchangeRateToEUR = kurs
})
Next
For i As Integer = 1 To 9
Dim office = NCTSProp(ncts, "ncts_CustomsOfficeOfTransitDeclared_" & i & "_RefNumber")
If Not String.IsNullOrWhiteSpace(office) Then
ZA.TransitOffices.Add(New cVERAG_CustomsDeclarations_TransitOffice With {
.zaTO_Sequence = i, .zaTO_Office = office,
.zaTO_ExpectedArrival = ToNullableDate(NCTSProp(ncts, "ncts_CustomsOfficeOfTransitDeclared_" & i & "_ArravialDateTime"))
})
End If
Next
Dim hcNumber As Integer = 0
Dim itemNumber As Integer = 0
For Each hc In ncts.ncts_HOUSE_CONSIGNMENT
hcNumber += 1
ZA.HouseConsignments.Add(New cVERAG_CustomsDeclarations_HouseConsignment With {
.zaHC_Number = hcNumber,
.zaHC_Reference = ToStringSafe(hc.nctsHC_HouseConsignMentReference),
.zaHC_UCR = ToStringSafe(hc.nctsHC_ReferenceNumberUCR),
.zaHC_CountryDispatch = ToStringSafe(hc.nctsHC_CountryOfDispatch),
.zaHC_CountryDestination = ToStringSafe(hc.nctsHC_CountryOfDestination),
.zaHC_GrossMass = ToNullableDecimal(hc.nctsHC_GrossMass)
})
For Each ci In hc.nctsWP_CONSIGNMENT_ITEM
itemNumber += 1
Dim pos = ToInt(ci.nctsHCCI_DeclarationGoodsItemNumber)
If pos <= 0 Then pos = ToInt(ci.nctsHCCI_GoodsItemNumber)
If pos <= 0 Then pos = itemNumber
Dim it As New cVERAG_CustomsDeclarations_Item With {
.zaItem_PosNo = pos,
.zaItem_HouseConsignmentNumber = hcNumber,
.zaItem_ArticleCode = ToStringSafe(ci.nctsHCCI_ArticleCode),
.zaItem_HSCode = ToStringSafe(ci.nctsHCCI_CommodityCode),
.zaItem_Description = ToStringSafe(ci.nctsHCCI_DescriptionOfGoods),
.zaItem_GrossMass = ToNullableDecimal(ci.nctsHCCI_GrossMass),
.zaItem_NetMass = ToNullableDecimal(ci.nctsHCCI_NetMass),
.zaItem_InvoiceValueForeign = ToNullableDecimal(ci.nctsHCCI_GoodsValue),
.zaItem_InvoiceCurrency = ToStringSafe(ci.nctsHCCI_CurrencyOfGoodsValue)
}
For Each pk In ci.nctsHCCI_PACKAGING
Dim pkg As New cVERAG_CustomsDeclarations_ItemPackage With {
.zaPkg_Type = ToStringSafe(pk.nctsHCCIPK_TypeOfPackages),
.zaPkg_Number = ToNullableInteger(pk.nctsHCCIPK_NumberOfPackages),
.zaPkg_Marks = ToStringSafe(pk.nctsHCCIPK_ShippingMarks)
}
it.Packages.Add(pkg)
Next
If it.Packages.Count > 0 Then
it.zaItem_PackageType = it.Packages(0).zaPkg_Type
it.zaItem_PackageColli = If(it.Packages(0).zaPkg_Number.HasValue, it.Packages(0).zaPkg_Number.Value.ToString(), Nothing)
it.zaItem_PackageMark = it.Packages(0).zaPkg_Marks
End If
AddNCTSDocs(it.Documents, ci, "nctsHCCI_")
ZA.Items.Add(it)
Next
Next
AddNCTSDocs(ZA.Documents, ncts, "ncts_")
' SAVE_TRANSIT ist aktuell separat; bestehende NCTS-Datensätze nur in Test-DB überschreiben.
If Not ZA.SAVE() Then Return False
ZA.SAVE_TRANSIT()
Return True
Catch ex As Exception
cErrorHandler.ERR(ex.Message, ex.StackTrace, Reflection.MethodInfo.GetCurrentMethod.Name)
Return False
End Try
End Function
Private Function ExistsNCTSInVERAG(mrn As String, anr As String) As Boolean
Dim sqlstr = "SELECT TOP 1 1 FROM tblVERAG_CustomsDeclarations WHERE za_System='DAKOSY' AND za_REGIME='TRANSIT' AND (za_MRN=@mrn OR za_MRN=@anr OR za_DeclarationNo=@anr)"
Dim args As New List(Of SQLVariable) From {New SQLVariable("mrn", mrn), New SQLVariable("anr", anr)}
Dim dt = New SQL().loadDgvBySql_Param(sqlstr, "VERAG", , args)
Return dt IsNot Nothing AndAlso dt.Rows.Count > 0
End Function
Private Sub AddNCTSParty(za As cVERAG_CustomsDeclarations, role As String, eori As Object, name As Object, street As Object, zip As Object, city As Object, country As Object, Optional subsidiary As Object = Nothing)
If String.IsNullOrWhiteSpace(ToStringSafe(eori)) AndAlso String.IsNullOrWhiteSpace(ToStringSafe(name)) Then Exit Sub
za.Parties.Add(New cVERAG_CustomsDeclarations_Parties With {
.zaParty_Role = role, .zaParty_EORI = ToStringSafe(eori), .zaParty_SubsidiaryNumber = ToStringSafe(subsidiary),
.zaParty_Name = ToStringSafe(name), .zaParty_Street = ToStringSafe(street),
.zaParty_PostalCode = ToStringSafe(zip), .zaParty_City = ToStringSafe(city), .zaParty_Country = ToStringSafe(country)
})
End Sub
Private Function NCTSProp(obj As Object, name As String) As Object
Dim p = obj.GetType().GetProperty(name)
Return If(p Is Nothing, Nothing, p.GetValue(obj, Nothing))
End Function
Private Sub AddNCTSDocs(docs As List(Of cVERAG_CustomsDeclarations_Document), obj As Object, prefix As String)
For Each kind In {"SupportingDocument", "PreviousDocument", "TransportDocument"}
For i As Integer = 1 To 9
Dim baseName = prefix & kind & "_" & i & "_"
Dim typ = ToStringSafe(NCTSProp(obj, baseName & "Type"))
Dim number = ToStringSafe(NCTSProp(obj, baseName & "ReferenceNumber"))
If String.IsNullOrWhiteSpace(typ) AndAlso String.IsNullOrWhiteSpace(number) Then Continue For
docs.Add(New cVERAG_CustomsDeclarations_Document With {
.zaDoc_Section = kind, .zaDoc_Code = typ, .zaDoc_Reference = number
})
Next
Next
End Sub
Private Function ToNullableInteger(v As Object) As Integer?
If v Is Nothing OrElse v Is DBNull.Value Then Return Nothing
Dim i As Integer
If Integer.TryParse(ToStringSafe(v), i) Then Return i
Return Nothing
End Function
' =====================================================================
' DUPLIKATSPRÜFUNG
' =====================================================================
Private Function ExistsInVERAG(eza As cDakosyEZA) As Boolean
Dim sql As String =
"SELECT TOP 1 1 FROM tblVERAG_CustomsDeclarations " &
"WHERE za_System='DAKOSY' " &
"AND (za_MRN=@mrn OR za_MRN=@anr)"
Dim p As New List(Of SQLVariable) From {
New SQLVariable("mrn", eza.eza_MRN),
New SQLVariable("anr", eza.eza_ANR)
}
Dim dt = New SQL().loadDgvBySql_Param(sql, "VERAG", , p)
Return dt IsNot Nothing AndAlso dt.Rows.Count > 0
End Function
' =========================================================================
' Small helpers (falls du sie schon hast, kannst du diese entfernen)
' =========================================================================
Private Function ToStringSafe(v As Object) As String
If v Is Nothing Then Return Nothing
Dim s As String = TryCast(v, String)
If s IsNot Nothing Then Return s
Return Convert.ToString(v, Globalization.CultureInfo.InvariantCulture)
End Function
Private Function ToInt(v As Object) As Integer
If v Is Nothing Then Return 0
Dim s = Convert.ToString(v, Globalization.CultureInfo.InvariantCulture)
Dim i As Integer
If Integer.TryParse(s, Globalization.NumberStyles.Any, Globalization.CultureInfo.InvariantCulture, i) Then Return i
Return 0
End Function
Private Function ToNullableDecimal(v As Object) As Decimal?
If v Is Nothing Then Return Nothing
Dim s = Convert.ToString(v, Globalization.CultureInfo.InvariantCulture)
Dim d As Decimal
If Decimal.TryParse(s, Globalization.NumberStyles.Any, Globalization.CultureInfo.InvariantCulture, d) Then Return d
Return Nothing
End Function
Private Function ToNullableDate(v As Object) As Date?
If v Is Nothing Then Return Nothing
If TypeOf v Is Date Then Return CType(v, Date)
Dim s = Convert.ToString(v, Globalization.CultureInfo.InvariantCulture)
Dim dt As Date
If Date.TryParse(s, Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dt) Then Return dt
Return Nothing
End Function
Private Function ToNullableBool(v As Object) As Boolean?
If v Is Nothing Then Return Nothing
If TypeOf v Is Boolean Then Return CType(v, Boolean)
Dim s = Convert.ToString(v, Globalization.CultureInfo.InvariantCulture).Trim().ToLowerInvariant()
If s = "J" OrElse s = "1" OrElse s = "true" OrElse s = "y" OrElse s = "yes" Then Return True
If s = "N" OrElse s = "0" OrElse s = "false" OrElse s = "n" OrElse s = "no" Then Return False
Return Nothing
End Function
End Class