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