From d5a89899d357fcf213f244710ba5926d31a982c2 Mon Sep 17 00:00:00 2001 From: "d.breimaier" Date: Fri, 10 Jan 2025 15:23:56 +0100 Subject: [PATCH] Zugferd --- SDL/Fakturierung/cFakturierung.vb | 288 +++++++++-------- SDL/My Project/AssemblyInfo.vb | 4 +- SDL/mdm/frmMDMDatenverarbetiung.vb | 304 ++++++------------ .../DATENSERVER/cDATENSERVER.vb | 10 +- 4 files changed, 257 insertions(+), 349 deletions(-) diff --git a/SDL/Fakturierung/cFakturierung.vb b/SDL/Fakturierung/cFakturierung.vb index ce563e62..1cb2d600 100644 --- a/SDL/Fakturierung/cFakturierung.vb +++ b/SDL/Fakturierung/cFakturierung.vb @@ -1897,99 +1897,101 @@ Public Class cFakturierung Dim BelegartenKz = If(Gesamt_RG_Betrag < 0, "AG", "AR") + If ROW("RechnungsNr") Is DBNull.Value Then Return "" + Dim RechnungsNr = If(ROW("RechnungsNr") IsNot DBNull.Value, addYeartoRgNr(FIRMA.Firma_ID, ROW("Buchungsjahr")) & ROW("RechnungsNr"), "Vorschau") - Dim RechnungsDatum = If(ROW("RechnungsDatum") IsNot DBNull.Value, ROW("RechnungsDatum"), "Vorschau") - Dim zahlungszieldatum As Date = CDate(RechnungsDatum).AddDays(ZZTage) - Dim desc As InvoiceDescriptor = InvoiceDescriptor.CreateInvoice(RechnungsNr, RechnungsDatum, IIf(FIRMA.Firma_ID = 26, CurrencyCodes.GBP, CurrencyCodes.EUR)) + Dim RechnungsDatum = If(ROW("RechnungsDatum") IsNot DBNull.Value, ROW("RechnungsDatum"), "Vorschau") + Dim zahlungszieldatum As Date = CDate(RechnungsDatum).AddDays(ZZTage) + Dim desc As InvoiceDescriptor = InvoiceDescriptor.CreateInvoice(RechnungsNr, RechnungsDatum, IIf(FIRMA.Firma_ID = 26, CurrencyCodes.GBP, CurrencyCodes.EUR)) - Select Case BelegartenKz - Case "AR" - desc.Name = "SPEDITIONSRECHNUNG" - desc.Type = InvoiceType.ForwardersInvoice - Case "AG" - desc.Name = "GUTSCHRIFT" - desc.Type = InvoiceType.CreditNote - End Select + Select Case BelegartenKz + Case "AR" + desc.Name = "SPEDITIONSRECHNUNG" + desc.Type = InvoiceType.ForwardersInvoice + Case "AG" + desc.Name = "GUTSCHRIFT" + desc.Type = InvoiceType.CreditNote + End Select - Dim Rechnugnsname2 As String = "" - If ROW("RechnungsName 2") IsNot DBNull.Value AndAlso ROW("RechnungsName 2") <> "" Then - Rechnugnsname2 = ROW("RechnungsName 2") - End If - - Dim RechnungsName_AdressZusatz As String = "" - If ROW("RechnungsName_AdressZusatz") IsNot DBNull.Value AndAlso ROW("RechnungsName_AdressZusatz") <> "" Then - RechnungsName_AdressZusatz = ROW("RechnungsName_AdressZusatz") - End If - - Dim RechnungsStraße As String = "" - If ROW("RechnungsStraße") IsNot DBNull.Value AndAlso ROW("RechnungsStraße") <> "" Then - RechnungsStraße = ROW("RechnungsStraße") - End If - - Dim RechnungsOrt As String = "" - If ROW("RechnungsOrt") IsNot DBNull.Value AndAlso ROW("RechnungsOrt") <> "" Then - RechnungsOrt = ROW("RechnungsOrt") - End If - - Dim RechnungsLandKz As String = "" - If ROW("RechnungsLandKz") IsNot DBNull.Value AndAlso ROW("RechnungsLandKz") <> "" Then - RechnungsLandKz = ROW("RechnungsLandKz") 'cProgramFunctions.getLandBez_fromISO1Land(ROW("RechnungsLandKz"), "", ROW("RechnungSprache")).ToString.ToUpper - End If - - - Dim RE_UID As String = If(ROW("RechnungsUstIdKz") IsNot DBNull.Value, ROW("RechnungsUstIdKz"), "") & If(ROW("RechnungsUstIdNr") IsNot DBNull.Value, ROW("RechnungsUstIdNr"), "") - - - 'If RECHNUNG.Besonderheiten IsNot Nothing Then - ' desc.AddNote(RECHNUNG.Besonderheiten.ToString, SubjectCodes.AAI) - 'End If - - If rpt.txtVermerk.Text IsNot Nothing AndAlso rpt.txtVermerk.Text <> "" Then desc.AddNote(rpt.txtVermerk.Text.ToString, SubjectCodes.AAI) - - desc.AddNote("Es bestehen Rabatt- und Bonusvereinbarungen.", SubjectCodes.AAK) - - desc.SetBuyer(ROW("RechnungsName 1") & " " & Rechnugnsname2, RechnungsOrt, RechnungsOrt, RechnungsStraße, GetCountryCodeFromLandKZ(RechnungsLandKz, vatBuyer), IIf(Not IsDBNull(ROW("RechnungsKundenNr")), ROW("RechnungsKundenNr"), "")) - desc.SetSeller(FIRMA.Firma_Bez, FIRMA.Firma_Ort, FIRMA.Firma_Ort, FIRMA.Firma_Straße, GetCountryCodeFromLandKZ(FIRMA.Firma_LandKz, vatSeller)) - - If FIRMA.Firma_Steuernummer IsNot Nothing Then desc.AddSellerTaxRegistration(FIRMA.Firma_Steuernummer, TaxRegistrationSchemeID.FC) - desc.AddSellerTaxRegistration(FIRMA.Firma_UID.ToString.Replace("UID: ", ""), TaxRegistrationSchemeID.VA) - - ' Optionally, to support Peppol----------------------------- - - - If RE_UID <> "" Then - desc.AddBuyerTaxRegistration(RE_UID, TaxRegistrationSchemeID.VA) - If vatBuyer Then - desc.SetBuyerElectronicAddress(RE_UID, vatBuyer) - desc.SetSellerElectronicAddress(FIRMA.Firma_UID.ToString.Replace("UID: ", ""), vatSeller) + Dim Rechnugnsname2 As String = "" + If ROW("RechnungsName 2") IsNot DBNull.Value AndAlso ROW("RechnungsName 2") <> "" Then + Rechnugnsname2 = ROW("RechnungsName 2") End If - End If + Dim RechnungsName_AdressZusatz As String = "" + If ROW("RechnungsName_AdressZusatz") IsNot DBNull.Value AndAlso ROW("RechnungsName_AdressZusatz") <> "" Then + RechnungsName_AdressZusatz = ROW("RechnungsName_AdressZusatz") + End If + + Dim RechnungsStraße As String = "" + If ROW("RechnungsStraße") IsNot DBNull.Value AndAlso ROW("RechnungsStraße") <> "" Then + RechnungsStraße = ROW("RechnungsStraße") + End If + + Dim RechnungsOrt As String = "" + If ROW("RechnungsOrt") IsNot DBNull.Value AndAlso ROW("RechnungsOrt") <> "" Then + RechnungsOrt = ROW("RechnungsOrt") + End If + + Dim RechnungsLandKz As String = "" + If ROW("RechnungsLandKz") IsNot DBNull.Value AndAlso ROW("RechnungsLandKz") <> "" Then + RechnungsLandKz = ROW("RechnungsLandKz") 'cProgramFunctions.getLandBez_fromISO1Land(ROW("RechnungsLandKz"), "", ROW("RechnungSprache")).ToString.ToUpper + End If - Dim steuerProzent As Double = SQL.DLookup(" isnull([Steuersatz %],0)", "[Steuertabelle] ", "[Steuerschlüssel]='" & ROW("Steuerschlüssel") & "'", "FMZOLL", 0) - Dim steuerProzenFaktor As Double = 0 - If steuerProzent > 0 AndAlso steuerProzent < 1 Then - steuerProzenFaktor = steuerProzent * 100 - End If - - Dim einzelpreis As Double = 0 - Dim sumNetto As Double = 0 + Dim RE_UID As String = If(ROW("RechnungsUstIdKz") IsNot DBNull.Value, ROW("RechnungsUstIdKz"), "") & If(ROW("RechnungsUstIdNr") IsNot DBNull.Value, ROW("RechnungsUstIdNr"), "") - For Each pos As DataRow In SR_DT.Rows + 'If RECHNUNG.Besonderheiten IsNot Nothing Then + ' desc.AddNote(RECHNUNG.Besonderheiten.ToString, SubjectCodes.AAI) + 'End If - Dim SteuerpflichtigerBetrag As Double = 0 - Dim SteuerfreierBetrag As Double = 0 - Dim anzahl As Double = 0 - Dim bez As String = "" + If rpt.txtVermerk.Text IsNot Nothing AndAlso rpt.txtVermerk.Text <> "" Then desc.AddNote(rpt.txtVermerk.Text.ToString, SubjectCodes.AAI) - Dim einzepreis = 0 + desc.AddNote("Es bestehen Rabatt- und Bonusvereinbarungen.", SubjectCodes.AAK) - einzelpreis = IIf(pos.Item("SteuerpflichtigerBetrag") > 0, pos.Item("SteuerpflichtigerBetrag") / checkNull(pos.Item("Anzahl")), pos.Item("SteuerfreierBetrag") / checkNull(pos.Item("Anzahl"))) + desc.SetBuyer(ROW("RechnungsName 1") & " " & Rechnugnsname2, RechnungsOrt, RechnungsOrt, RechnungsStraße, GetCountryCodeFromLandKZ(RechnungsLandKz, vatBuyer), IIf(Not IsDBNull(ROW("RechnungsKundenNr")), ROW("RechnungsKundenNr"), "")) + desc.SetSeller(FIRMA.Firma_Bez, FIRMA.Firma_Ort, FIRMA.Firma_Ort, FIRMA.Firma_Straße, GetCountryCodeFromLandKZ(FIRMA.Firma_LandKz, vatSeller)) - Dim tradeLineItemNew As TradeLineItem = desc.AddTradeLineItem( + If FIRMA.Firma_Steuernummer IsNot Nothing Then desc.AddSellerTaxRegistration(FIRMA.Firma_Steuernummer, TaxRegistrationSchemeID.FC) + desc.AddSellerTaxRegistration(FIRMA.Firma_UID.ToString.Replace("UID: ", ""), TaxRegistrationSchemeID.VA) + + ' Optionally, to support Peppol----------------------------- + + + If RE_UID <> "" Then + desc.AddBuyerTaxRegistration(RE_UID, TaxRegistrationSchemeID.VA) + If vatBuyer Then + desc.SetBuyerElectronicAddress(RE_UID, vatBuyer) + desc.SetSellerElectronicAddress(FIRMA.Firma_UID.ToString.Replace("UID: ", ""), vatSeller) + End If + + End If + + + Dim steuerProzent As Double = SQL.DLookup(" isnull([Steuersatz %],0)", "[Steuertabelle] ", "[Steuerschlüssel]='" & ROW("Steuerschlüssel") & "'", "FMZOLL", 0) + Dim steuerProzenFaktor As Double = 0 + If steuerProzent > 0 AndAlso steuerProzent < 1 Then + steuerProzenFaktor = steuerProzent * 100 + End If + + Dim einzelpreis As Double = 0 + Dim sumNetto As Double = 0 + + + For Each pos As DataRow In SR_DT.Rows + + Dim SteuerpflichtigerBetrag As Double = 0 + Dim SteuerfreierBetrag As Double = 0 + Dim anzahl As Double = 0 + Dim bez As String = "" + + Dim einzepreis = 0 + + einzelpreis = IIf(pos.Item("SteuerpflichtigerBetrag") > 0, pos.Item("SteuerpflichtigerBetrag") / checkNull(pos.Item("Anzahl")), pos.Item("SteuerfreierBetrag") / checkNull(pos.Item("Anzahl"))) + + Dim tradeLineItemNew As TradeLineItem = desc.AddTradeLineItem( name:=checkNull(pos.Item("LeistungsBez")), billedQuantity:=Convert.ToDecimal(checkNull(pos.Item("Anzahl"))), unitCode:=QuantityCodes.C62, ' immer in Stück @@ -1999,68 +2001,68 @@ Public Class cFakturierung taxPercent:=IIf(pos.Item("SteuerpflichtigerBetrag") > 0, Convert.ToDecimal(steuerProzent * 100), 0), taxType:=IIf(pos.Item("SteuerpflichtigerBetrag") > 0, TaxTypes.VAT, TaxTypes.VAT) ) - Dim netUnitPrice = Convert.ToDecimal(einzelpreis) - Dim netPricePos = netUnitPrice * Convert.ToDecimal(checkNull(pos.Item("Anzahl"))) - sumNetto += netPricePos + Dim netUnitPrice = Convert.ToDecimal(einzelpreis) + Dim netPricePos = netUnitPrice * Convert.ToDecimal(checkNull(pos.Item("Anzahl"))) + sumNetto += netPricePos - 'For Each search As GrapeCity.ActiveReports.SectionReportModel.ARControl In rpt.Detail.Controls - ' If search.Name = "lblAnzahl" Then - ' anzahl = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text], 0) - ' End If + 'For Each search As GrapeCity.ActiveReports.SectionReportModel.ARControl In rpt.Detail.Controls + ' If search.Name = "lblAnzahl" Then + ' anzahl = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text], 0) + ' End If - ' If search.Name = "lblSteuerpflichtig" Then - ' SteuerpflichtigerBetrag = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text], 0) - ' End If + ' If search.Name = "lblSteuerpflichtig" Then + ' SteuerpflichtigerBetrag = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text], 0) + ' End If - ' If search.Name = "lblSteuerfrei" Then - ' SteuerfreierBetrag = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text], 0) - ' End If + ' If search.Name = "lblSteuerfrei" Then + ' SteuerfreierBetrag = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.Label).[Text], 0) + ' End If - ' If search.Name = "txtLeistung" Then - ' bez = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.TextBox).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.TextBox).[Text], 0) - ' End If + ' If search.Name = "txtLeistung" Then + ' bez = IIf(DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.TextBox).[Text] <> "", DirectCast(search, GrapeCity.ActiveReports.SectionReportModel.TextBox).[Text], 0) + ' End If - 'If bez <> "" Then + 'If bez <> "" Then - ' einzelpreis = IIf(SteuerpflichtigerBetrag > 0, SteuerpflichtigerBetrag / checkNull(anzahl), SteuerfreierBetrag / checkNull(anzahl)) + ' einzelpreis = IIf(SteuerpflichtigerBetrag > 0, SteuerpflichtigerBetrag / checkNull(anzahl), SteuerfreierBetrag / checkNull(anzahl)) - ' Dim tradeLineItemNew As TradeLineItem = desc.AddTradeLineItem( - ' name:=checkNull(bez), - ' billedQuantity:=Convert.ToDecimal(checkNull(anzahl)), - ' unitCode:=QuantityCodes.C62, ' immer in Stück - ' netUnitPrice:=Convert.ToDecimal(einzelpreis), - ' grossUnitPrice:=Convert.ToDecimal(einzelpreis), - ' categoryCode:=IIf(SteuerpflichtigerBetrag > 0, TaxCategoryCodes.S, TaxCategoryCodes.Z), - ' taxPercent:=IIf(SteuerpflichtigerBetrag > 0, Convert.ToDecimal(steuerProzent * 100), 0), - ' taxType:=IIf(SteuerpflichtigerBetrag > 0, TaxTypes.VAT, TaxTypes.VAT) - ' ) - ' Dim netUnitPrice = Convert.ToDecimal(einzelpreis) - ' Dim netPricePos = netUnitPrice * Convert.ToDecimal(checkNull(anzahl)) - ' sumNetto += netPricePos + ' Dim tradeLineItemNew As TradeLineItem = desc.AddTradeLineItem( + ' name:=checkNull(bez), + ' billedQuantity:=Convert.ToDecimal(checkNull(anzahl)), + ' unitCode:=QuantityCodes.C62, ' immer in Stück + ' netUnitPrice:=Convert.ToDecimal(einzelpreis), + ' grossUnitPrice:=Convert.ToDecimal(einzelpreis), + ' categoryCode:=IIf(SteuerpflichtigerBetrag > 0, TaxCategoryCodes.S, TaxCategoryCodes.Z), + ' taxPercent:=IIf(SteuerpflichtigerBetrag > 0, Convert.ToDecimal(steuerProzent * 100), 0), + ' taxType:=IIf(SteuerpflichtigerBetrag > 0, TaxTypes.VAT, TaxTypes.VAT) + ' ) + ' Dim netUnitPrice = Convert.ToDecimal(einzelpreis) + ' Dim netPricePos = netUnitPrice * Convert.ToDecimal(checkNull(anzahl)) + ' sumNetto += netPricePos - ' bez = "" + ' bez = "" - ' End If + ' End If - 'Next + 'Next - Next + Next - 'Summe aller Rechnungspositions-Nettobeträge der Rechnung - Dim lineTotalAmont = sumNetto - 'Der Gesamtbetrag der Umsatzsteuer für die Rechnung, - Dim taxTotalAmount = IIf(Gesamt_RG_BetragSteuerpflichtig <> 0, Math.Round(Convert.ToDecimal(Gesamt_RG_BetragSteuerpflichtig) / (100 + steuerProzenFaktor) * steuerProzenFaktor, 2), 0) - ' Die Gesamtsumme der Rechnung ohne Umsatzsteuer ' RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + 0 - 0 - Dim taxBasisAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig + 0 - 0 - taxTotalAmount) - 'Der Gesamtbetrag der Rechnung mit Umsatzsteuer - Dim grandTotalAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig) - 'Der ausstehende Betrag, um dessen Zahlung gebeten wird. Dieser Betrag ist der Rechnungsgesamtbetrag einschließlich Umsatzsteuer abzüglich des im Voraus gezahlten Betrages.Im Falle einer vollständig beglichenen Rechnung ist dieser Betrag gleich null. Der Betrag kann negativ sein; In diesem Fall schuldet der Verkäufer dem Käufer den Betrag - Dim duePayableAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig) + 'Summe aller Rechnungspositions-Nettobeträge der Rechnung + Dim lineTotalAmont = sumNetto + 'Der Gesamtbetrag der Umsatzsteuer für die Rechnung, + Dim taxTotalAmount = IIf(Gesamt_RG_BetragSteuerpflichtig <> 0, Math.Round(Convert.ToDecimal(Gesamt_RG_BetragSteuerpflichtig) / (100 + steuerProzenFaktor) * steuerProzenFaktor, 2), 0) + ' Die Gesamtsumme der Rechnung ohne Umsatzsteuer ' RECHNUNG.SteuerfreierGesamtbetrag + RECHNUNG.SteuerpflichtigerGesamtbetrag + 0 - 0 + Dim taxBasisAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig + 0 - 0 - taxTotalAmount) + 'Der Gesamtbetrag der Rechnung mit Umsatzsteuer + Dim grandTotalAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig) + 'Der ausstehende Betrag, um dessen Zahlung gebeten wird. Dieser Betrag ist der Rechnungsgesamtbetrag einschließlich Umsatzsteuer abzüglich des im Voraus gezahlten Betrages.Im Falle einer vollständig beglichenen Rechnung ist dieser Betrag gleich null. Der Betrag kann negativ sein; In diesem Fall schuldet der Verkäufer dem Käufer den Betrag + Dim duePayableAmount = Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei + Gesamt_RG_BetragSteuerpflichtig) - desc.SetTotals( + desc.SetTotals( lineTotalAmount:=Convert.ToDecimal(lineTotalAmont), chargeTotalAmount:=0, 'Summe aller in der Rechnung enthaltenen Zuschläge der Dokumentenebene allowanceTotalAmount:=0, 'Summe aller in der Rechnung enthaltenen Abschläge der Dokumenteneben @@ -2072,29 +2074,29 @@ Public Class cFakturierung roundingAmount:=0 'Der Betrag, der dem Rechnungsgesamtbetrag hinzuzufügen ist, um den zu zahlenden Betrag zu runden ) - desc.AddTradePaymentTerms(rpt.Label2.Text, zahlungszieldatum) + desc.AddTradePaymentTerms(rpt.Label2.Text, zahlungszieldatum) - Dim isReverseCharge = IIf(getReverseChargeSumme(FIRMA, ROW("RechnungsLandKz"), ROW("RechnungsNr"), ROW("RechnungsDatum"), "") > 0, True, False) + Dim isReverseCharge = IIf(getReverseChargeSumme(FIRMA, ROW("RechnungsLandKz"), ROW("RechnungsNr"), ROW("RechnungsDatum"), "") > 0, True, False) - If Gesamt_RG_BetragSteuerfrei > 0 Then - desc.AddApplicableTradeTax(Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei), 0, TaxTypes.VAT, TaxCategoryCodes.Z) + If Gesamt_RG_BetragSteuerfrei > 0 Then + desc.AddApplicableTradeTax(Convert.ToDecimal(Gesamt_RG_BetragSteuerfrei), 0, TaxTypes.VAT, TaxCategoryCodes.Z) + End If + + If Gesamt_RG_BetragSteuerpflichtig > 0 Then + desc.AddApplicableTradeTax(Convert.ToDecimal(taxBasisAmount - Gesamt_RG_BetragSteuerfrei), Convert.ToDecimal(steuerProzenFaktor), Convert.ToDecimal(taxTotalAmount), TaxTypes.VAT, IIf(isReverseCharge, TaxCategoryCodes.AE, TaxCategoryCodes.S)) + End If + + Dim tmpPathZugpferd = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("ZUGFeRD_Invoice_" & RechnungsNr, ".xml", True, False) + Dim stream As FileStream = New FileStream(tmpPathZugpferd, FileMode.Create, FileAccess.Write) + desc.Save(stream, ZUGFeRDVersion.Version20, Profile.Comfort) + + stream.Flush() + stream.Close() + Return tmpPathZugpferd + End If - If Gesamt_RG_BetragSteuerpflichtig > 0 Then - desc.AddApplicableTradeTax(Convert.ToDecimal(taxBasisAmount - Gesamt_RG_BetragSteuerfrei), Convert.ToDecimal(steuerProzenFaktor), Convert.ToDecimal(taxTotalAmount), TaxTypes.VAT, IIf(isReverseCharge, TaxCategoryCodes.AE, TaxCategoryCodes.S)) - End If - - Dim tmpPathZugpferd = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("ZUGFeRD_Invoice_" & RechnungsNr, ".xml", True, False) - Dim stream As FileStream = New FileStream(tmpPathZugpferd, FileMode.Create, FileAccess.Write) - desc.Save(stream, ZUGFeRDVersion.Version20, Profile.Comfort) - - stream.Flush() - stream.Close() - Return tmpPathZugpferd - - End If - diff --git a/SDL/My Project/AssemblyInfo.vb b/SDL/My Project/AssemblyInfo.vb index 2ed9f5cd..d3423d08 100644 --- a/SDL/My Project/AssemblyInfo.vb +++ b/SDL/My Project/AssemblyInfo.vb @@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices ' übernehmen, indem Sie "*" eingeben: ' - - + + diff --git a/SDL/mdm/frmMDMDatenverarbetiung.vb b/SDL/mdm/frmMDMDatenverarbetiung.vb index 016b38a3..87a8ef14 100644 --- a/SDL/mdm/frmMDMDatenverarbetiung.vb +++ b/SDL/mdm/frmMDMDatenverarbetiung.vb @@ -2,8 +2,10 @@ Imports System.IO Imports Challenge Imports com.sun.org.glassfish.external.probe.provider.annotations +Imports GrapeCity.ActiveReports.Export.Pdf.Section.Signing Imports itextsharp.text.pdf Imports MDM_Worker +Imports sun.swing Imports TAlex.WPF.Helpers Imports VERAG_PROG_ALLGEMEIN Imports VERAG_PROG_ALLGEMEIN.TESTJSON @@ -1272,18 +1274,20 @@ Public Class frmMDMDatenverarbetiung Dim SPEDBUCH As VERAG_PROG_ALLGEMEIN.cSpeditionsbuch = Nothing Dim verarbOK = IIf(test, False, True) + Dim RECHNUNG As cRechnungsausgang = Nothing + If Not gen_SPEDBUCH_ByKdNr(uta("Customer Nr"), SPEDBUCH, "UTA",,,, datPloseAnhang.Value) Then verarbOK = False - If Not gen_RECHNUNG_BySPEDBUCH(uta("Customer Nr"), SPEDBUCH, "UTA") Then verarbOK = False + If Not gen_RECHNUNG_BySPEDBUCH(uta("Customer Nr"), SPEDBUCH, "UTA",,,, RECHNUNG) Then verarbOK = False - genUTAAttachmentByKdNr(uta("Customer Nr"), uta("Customer ID"), dir, datPloseAnhang.Value) + Dim pathFile = genUTAAttachmentByKdNr(uta("Customer Nr"), uta("Customer ID"), dir, datPloseAnhang.Value) + + If Not AddAttachementToRE(pathFile, uta("Customer Nr"), RECHNUNG, "UTA") Then verarbOK = False If verarbOK Then 'UPDATE Fakturiert SQL.doSQL("UPDATE [tblUTAImportNew] set chargedDatetime=GETDATE() where chargedDatetime is null and [Rechnungsdatum] = '" & DateTimePicker2.Text & "' and Kundennummer = " & uta("Customer ID"), "FMZOLL") - End If - If True Then 'cnt Mod 10 = 0 Then txtPloseAnh_Einarbeitung.Text = cnt & " / " & dt_Main.Rows.Count Dim proz As Double = (cnt / dt_Main.Rows.Count) * 100 @@ -1306,20 +1310,16 @@ Public Class frmMDMDatenverarbetiung Next End If If Not Directory.Exists(dirAnhang) Then Directory.CreateDirectory(dirAnhang) - For Each f In Directory.GetFiles(dir) File.Copy(f, dirAnhang & (New FileInfo(f)).Name) Next - pbPloseAnh_Proz.Value = 100 txtPloseAnh_Einarbeitung.Text = dt_Main.Rows.Count & " / " & dt_Main.Rows.Count lblPloseAnh_Proz.Text = "100.00 %" - Return True End If Return False End Function - Function genRGAtt_MSE(mseParam As cMSEAPI) As Boolean Dim top = "" 'top = " TOP 20 " @@ -1409,11 +1409,24 @@ Public Class frmMDMDatenverarbetiung Dim SPEDBUCH As VERAG_PROG_ALLGEMEIN.cSpeditionsbuch = Nothing Dim verarbOK = IIf(test, False, True) + Dim RECHNUNG As cRechnungsausgang = Nothing If Not gen_SPEDBUCH_ByKdNr(MSE("Customer Nr"), SPEDBUCH, "MSE",,,, datPloseAnhang.Value) Then verarbOK = False - If Not gen_RECHNUNG_BySPEDBUCH(MSE("Customer Nr"), SPEDBUCH, "MSE") Then verarbOK = False + If Not gen_RECHNUNG_BySPEDBUCH(MSE("Customer Nr"), SPEDBUCH, "MSE",,,, RECHNUNG) Then verarbOK = False + + Dim pathfilePDF = genMSEAttachmentByKdNr(MSE("Customer Nr"), MSE("Customer ID"), dir, datPloseAnhang.Value) + If Not AddAttachementToRE(pathfilePDF, MSE("Customer Nr"), RECHNUNG, "MSE") Then verarbOK = False + + If Directory.Exists(dir) Then + For Each f In Directory.GetFiles(dir) + If f.Contains(MSE("Customer Nr") & "_Maut_MSE.csv") Then + Dim pathFileCSV As String = New FileInfo(f).FullName + If Not AddAttachementToRE(pathFileCSV, MSE("Customer Nr"), RECHNUNG, "MSE") Then verarbOK = False + End If + Next + + End If - genMSEAttachmentByKdNr(MSE("Customer Nr"), MSE("Customer ID"), dir, datPloseAnhang.Value) If verarbOK Then 'Update Fakturiert @@ -1491,7 +1504,7 @@ Public Class frmMDMDatenverarbetiung LEFT JOIN tblIDSInvoicesNew on tblIDSInvoicesNew.CustomerCode = tblIDSTransactionsNew.CustomerCode and tblIDSInvoicesNew.Invoicenumber = Paymentsummarynumber - WHERE cast(tblIDSTransactionsNew.YearMonthDay as Date) = '" & DateTimePicker2.Text & "' AND tblIDSTransactionsNew.[UStVAn_ID] is null and isnull(charged,0) = 0 " & sqlWhere & " + WHERE cast(tblIDSTransactionsNew.YearMonthDay as Date) = '" & DateTimePicker2.Text & "' AND tblIDSTransactionsNew.[UStVAn_ID] is null and isnull(charged,0) <> 0 " & sqlWhere & " order by tblIDSTransactionsNew.KdNrVERAG" Dim dt_Main As DataTable = SQL.loadDgvBySql_Param(SQLStr, "FMZOLL", 1200) @@ -1522,18 +1535,20 @@ Public Class frmMDMDatenverarbetiung Directory.CreateDirectory(dir) End If - - For Each IDS In dt_Main.Rows Dim SPEDBUCH As VERAG_PROG_ALLGEMEIN.cSpeditionsbuch = Nothing Dim verarbOK = IIf(test, False, True) + Dim RECHNUNG As cRechnungsausgang = Nothing If Not gen_SPEDBUCH_ByKdNr(IDS("KdNrVERAG"), SPEDBUCH, art,,,, datPloseAnhang.Value) Then verarbOK = False - If Not gen_RECHNUNG_BySPEDBUCH(IDS("KdNrVERAG"), SPEDBUCH, art) Then verarbOK = False + If Not gen_RECHNUNG_BySPEDBUCH(IDS("KdNrVERAG"), SPEDBUCH, art,,,, RECHNUNG) Then verarbOK = False If IDS("Rechnungsdruck") = 2 Then - If genIDSAttachmentByKdNr(IDS("KdNrVERAG"), IDS("CustomerCode"), dir, datPloseAnhang.Value, art) = "" Then verarbOK = False + + Dim pathfile = genIDSAttachmentByKdNr(IDS("KdNrVERAG"), IDS("CustomerCode"), dir, datPloseAnhang.Value, art) + If Not AddAttachementToRE(pathfile, IDS("KdNrVERAG"), RECHNUNG, "IDS") Then verarbOK = False + End If If IDS("InvoiceID") > 0 Then @@ -1552,13 +1567,16 @@ Public Class frmMDMDatenverarbetiung pdfReader.Close() Dim PdfTmp = fm.fillPDFVorhandenesLokalesPDF_Path(DS.GET_TOP1_PATH, listTowrite, , , , ,) + + If Not AddAttachementToRE(PdfTmp, IDS("KdNrVERAG"), RECHNUNG, "IDS") Then verarbOK = False + File.Copy(PdfTmp, dir & "\" & IDS("KdNrVERAG") & "_" & (DS.da_name), True) Else -File.Copy(DS.GET_TOP1_PATH, dir & "\" & IDS("KdNrVERAG") & "_" & (DS.da_name), True) + File.Copy(DS.GET_TOP1_PATH, dir & "\" & IDS("KdNrVERAG") & "_" & (DS.da_name), True) End If -End If + End If If verarbOK Then @@ -1718,8 +1736,29 @@ End If For Each R_ASFINAG In distinctDT_distKunden.Rows Dim SPEDBUCH As VERAG_PROG_ALLGEMEIN.cSpeditionsbuch = Nothing Dim verarbOK = IIf(test, False, True) + Dim RECHNUNG As cRechnungsausgang = Nothing If Not gen_SPEDBUCH_ByKdNr(R_ASFINAG("KundenNr"), SPEDBUCH, "ASFINAG",,,, abrechnungsdatum) Then verarbOK = False - If Not gen_RECHNUNG_BySPEDBUCH(R_ASFINAG("KundenNr"), SPEDBUCH, "ASFINAG") Then verarbOK = False + If Not gen_RECHNUNG_BySPEDBUCH(R_ASFINAG("KundenNr"), SPEDBUCH, "ASFINAG",,,, RECHNUNG) Then verarbOK = False + + If Directory.Exists(dir) Then + For Each f In Directory.GetFiles(dir) + If f.Contains(R_ASFINAG("KundenNr") & "_Maut_AT.csv") Then + Dim pathFileCSV As String = New FileInfo(f).FullName + If Not AddAttachementToRE(pathFileCSV, R_ASFINAG("KundenNr"), RECHNUNG, "ASFINAG") Then verarbOK = False + End If + Next + + End If + + If Directory.Exists(dir) Then + For Each f In Directory.GetFiles(dir) + If f.Contains(R_ASFINAG("KundenNr") & "_Maut_AT.pdf") Then + Dim pathFilePDF As String = New FileInfo(f).FullName + If Not AddAttachementToRE(pathFilePDF, R_ASFINAG("KundenNr"), RECHNUNG, "ASFINAG") Then verarbOK = False + End If + Next + + End If If verarbOK Then @@ -3327,7 +3366,7 @@ End If 'End Function - Function gen_RECHNUNG_BySPEDBUCH(KdNr As String, SPEDBUCH As VERAG_PROG_ALLGEMEIN.cSpeditionsbuch, Lieferant As String, Optional PLOSEKundenNr As String = "", Optional von As Date = Nothing, Optional bis As Date = Nothing) + Function gen_RECHNUNG_BySPEDBUCH(KdNr As String, SPEDBUCH As VERAG_PROG_ALLGEMEIN.cSpeditionsbuch, Lieferant As String, Optional PLOSEKundenNr As String = "", Optional von As Date = Nothing, Optional bis As Date = Nothing, Optional RE As cRechnungsausgang = Nothing) Try If KdNr = "" Then Return False @@ -3621,7 +3660,20 @@ End If Call usrCntlFaktAbrechnung.przPP(RG) ' Porto/Papiere errechnen Call usrCntlFaktAbrechnung.przBS415(RG) ' Bankspesen errechnen - Return IIf(test, True, RG.SAVE) + RE = RG + + If test Then + Return True + Else + + If RG.SAVE Then + RE = RG + Return True + Else + Return False + End If + + End If Catch ex As System.Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) @@ -4604,11 +4656,6 @@ RabattBerechnen: End Select - - - - - If trans.TransactionVolume <> 0 Then trans.RabattbetragProLiter = trans.Rabattbetrag / trans.TransactionVolume trans.RabattbetragProLiterOrig = trans.RabattbetragProLiter @@ -4631,182 +4678,6 @@ RabattBerechnen: initDgv_IDS() MsgBox(i & " Rechenwerte wurden gesetzt!") - ' Public Function fktDieselIDSImportiereCSV() - - - '1380 If Not IsNull(![KdNrVERAG]) Then - - ' ' Kunde ohne Rabatt - '1390 strSQL = "SELECT *" & _ - ' " FROM tbl_IDS_Kunden_ohne_Rabatt" & _ - ' " WHERE (((tbl_IDS_Kunden_ohne_Rabatt.CustomerCode)=" & ![KdNrVERAG] & "));" - '1400 Set rstIDSRechenwert = dbs.OpenRecordset(strSQL, dbOpenSnapshot) - '1410 If Not rstIDSRechenwert.EOF Then - '1420 GoTo Rabatt_errechnen - '1430 End If - '1440 rstIDSRechenwert.Close - - ' ' Rechenwert für Land/Station/Kunde/Produkt ermitteln - '1450 strSQL = "SELECT Rechenwert, Kz, KategorieNr" & _ - ' " FROM tbl_IDS_Rechenwerte" & _ - ' " WHERE (((OutletCountryCode)=" & ![Outlet Country Code] & ")" & _ - ' " AND ((OutletCode)=" & ![Outlet Code] & ")" & _ - ' " AND ((CustomerCode)=" & ![KdNrVERAG] & ")" & _ - ' " AND ((ProductTypeCode)=" & ![Product Type Code] & "))" & _ - ' " ORDER BY Zeitstempel DESC;" - '1460 Set rstIDSRechenwert = dbs.OpenRecordset(strSQL, dbOpenSnapshot) - '1470 If Not rstIDSRechenwert.EOF Then - '1480 GoTo Rechenwert_eintragen - '1490 End If - '1500 rstIDSRechenwert.Close - - ' ' Rechenwert für Land/Kunde/Produkt ermittteln - '1510 strSQL = "SELECT Rechenwert, Kz, KategorieNr" & _ - ' " FROM tbl_IDS_Rechenwerte" & _ - ' " WHERE (((OutletCountryCode)=" & ![Outlet Country Code] & ")" & _ - ' " AND ((OutletCode) Is Null)" & _ - ' " AND ((CustomerCode)=" & ![KdNrVERAG] & ")" & _ - ' " AND ((ProductTypeCode)=" & ![Product Type Code] & "))" & _ - ' " ORDER BY Zeitstempel DESC;" - '1520 Set rstIDSRechenwert = dbs.OpenRecordset(strSQL, dbOpenSnapshot) - '1530 If Not rstIDSRechenwert.EOF Then - '1540 GoTo Rechenwert_eintragen - '1550 End If - '1560 rstIDSRechenwert.Close - - '1570 End If - - ' ' Rechenwert für Land/Station/Produkt ermitteln - '1580 strSQL = "SELECT Rechenwert, Kz, KategorieNr" & _ - ' " FROM tbl_IDS_Rechenwerte" & _ - ' " WHERE (((OutletCountryCode)=" & ![Outlet Country Code] & ")" & _ - ' " AND ((OutletCode)=" & ![Outlet Code] & ")" & _ - ' " AND ((CustomerCode) Is Null)" & _ - ' " AND ((ProductTypeCode)=" & ![Product Type Code] & "))" & _ - ' " ORDER BY Zeitstempel DESC;" - '1590 Set rstIDSRechenwert = dbs.OpenRecordset(strSQL, dbOpenSnapshot) - '1600 If Not rstIDSRechenwert.EOF Then - '1610 GoTo Rechenwert_eintragen - '1620 End If - '1630 rstIDSRechenwert.Close - - ' ' Rechenwert für Land/Produkt ermitteln - '1640 strSQL = "SELECT Rechenwert, Kz, KategorieNr" & _ - ' " FROM tbl_IDS_Rechenwerte" & _ - ' " WHERE (((OutletCountryCode)=" & ![Outlet Country Code] & ")" & _ - ' " AND ((OutletCode) Is Null)" & _ - ' " AND ((CustomerCode) Is Null)" & _ - ' " AND ((ProductTypeCode)=" & ![Product Type Code] & "))" & _ - ' " ORDER BY Zeitstempel DESC;" - '1650 Set rstIDSRechenwert = dbs.OpenRecordset(strSQL, dbOpenSnapshot) - '1660 If Not rstIDSRechenwert.EOF Then - '1670 GoTo Rechenwert_eintragen - '1680 End If - '1690 rstIDSRechenwert.Close - - '1700 GoTo Rabatt_errechnen - - 'Rechenwert_eintragen: - '1710 !Rechenwert = rstIDSRechenwert!Rechenwert - '1720 !Kz = rstIDSRechenwert!Kz - '1730 If Not IsNull(rstIDSRechenwert!KategorieNr) Then - '1740 Set qry = dbs.QueryDefs("qry_IDS_KategorieNr_ProductTypeCode_Rechenwert") - '1750 qry.Parameters("[prmKategorieNr]") = rstIDSRechenwert!KategorieNr - '1760 qry.Parameters("[prmProductTypeCode]") = ![Product Type Code] - '1770 Set rst = qry.OpenRecordset(dbOpenSnapshot) - '1780 If Not rst.EOF Then - '1790 !Rechenwert = !Rechenwert + rst!Rechenwert - '1800 If !Rechenwert < 0 Then - '1810 !Rechenwert = 0 - '1820 End If - '1830 End If - '1840 rst.Close - '1850 qry.Close - '1860 End If - '1870 rstIDSRechenwert.Close - - - 'Rabatt_errechnen: - '1880 Select Case !Kz - ' Case "P" 'Rechenwert ist Preis pro Liter - '1890 !Rabattbetrag = ![Total Net Amount] - Int(!Rechenwert * ![Transaction Volume] * 100 + 0.5) / 100 - '1900 Case "R" 'Rechenwert ist Rabatt pro Liter - '1910 !Rabattbetrag = Int(!Rechenwert * ![Transaction Volume] * 100 + 0.5) / 100 - '1920 End Select - '1930 If ![Transaction Volume] <> 0 Then - '1940 !RabattbetragProLiter = !Rabattbetrag / ![Transaction Volume] - '1950 End If - - ' ' Zeitstempel und Sachbearbeiter in tblDiesel eintragen - '1960 !Zeitstempel = Now - '1970 !Sachbearbeiter = CurrentUser() - '1980 .Update - - ' ' Daten in das Archiv schreiben. - '1990 Set qryIDSDieselArchiv = dbs.QueryDefs("qryDieselArchivPKey") - '2000 qryIDSDieselArchiv.Parameters("[prmYearMonthDay]") = ![Year Month Day] - '2010 qryIDSDieselArchiv.Parameters("[prmPaymentSummaryNumber]") = ![Payment summary number] - '2020 qryIDSDieselArchiv.Parameters("[prmCustomerCode]") = ![Customer Code] - '2030 qryIDSDieselArchiv.Parameters("[prmOutletCountryCode]") = ![Outlet Country Code] - '2040 qryIDSDieselArchiv.Parameters("[prmOutletCode]") = ![Outlet Code] - '2050 qryIDSDieselArchiv.Parameters("[prmProductTypeCode]") = ![Product Type Code] - '2060 Set rstIDSDieselArchiv = qryIDSDieselArchiv.OpenRecordset(dbOpenDynaset) - '2070 If rstIDSDieselArchiv.EOF Then - '2080 rstIDSDieselArchiv.AddNew - '2090 lngDatensätzeAngefügt = lngDatensätzeAngefügt + 1 - '2100 Call SysCmd(acSysCmdSetStatus, "IDS-Diesel-Archiv Neuzugang: " & ![Year Month Day] & "-" & ![Payment summary number] & "-" & ![Customer Code] & "-" & ![Outlet Country Code] & "-" & ![Outlet Code] & "-" & ![Product Type Code]) - '2110 Else - '2120 rstIDSDieselArchiv.Edit - '2130 lngDatensätzeAktualisiert = lngDatensätzeAktualisiert + 1 - '2140 Call SysCmd(acSysCmdSetStatus, "IDS-Diesel-Archiv Änderung: " & ![Year Month Day] & "-" & ![Payment summary number] & "-" & ![Customer Code] & "-" & ![Outlet Country Code] & "-" & ![Outlet Code] & "-" & ![Product Type Code]) - '2150 End If - '2160 For Each fld In .Fields - '2170 rstIDSDieselArchiv(fld.Name) = fld.Value - '2180 Next - '2190 rstIDSDieselArchiv.Update - '2200 rstIDSDieselArchiv.Close - '2210 qryIDSDieselArchiv.Close - - '2220 DoEvents - '2230 .MoveNext - '2240 Loop - '2250 wrk.CommitTrans - '2260 On Error GoTo Fehler - '2270 .Close - '2280 End With - '2290 Call SysCmd(acSysCmdClearStatus) - '2300 DoCmd.Hourglass False - '2310 strPrompt = "Es wurden " & lngDatensätzeAngefügt & " Datensätze in das Archiv übernommen." - '2320 If lngDatensätzeAktualisiert > 0 Then - '2330 strPrompt = strPrompt & vbNewLine & lngDatensätzeAktualisiert & " Archivsätze wurden aktualisiert." - '2340 End If - '2350 strTitle = "Diesel-Datenarchiv" - '2360 MsgBox strPrompt, , strTitle - ' ' intAntwort = MsgBox("Das Einlesen ist beendet. Soll die Datei gelöscht werden?", vbYesNo + vbQuestion + vbDefaultButton2, Trim(dlg.SelectedItems(1))) - ' ' If intAntwort = vbYes Then Kill (Trim(dlg.SelectedItems(1))) - '2370 Else - '2380 MsgBox "Es wurde keine Datei ausgewählt.", vbInformation, "Daten einlesen." - '2390 End If - - 'Ende: - '2400 DoCmd.Hourglass False - '2410 Exit Function - - 'Rollback: - '2420 wrk.Rollback - - 'Fehler: - '2430 Call SysCmd(acSysCmdClearStatus) - '2440 DoCmd.Hourglass False - '2450 DoCmd.Beep - '2460 MsgBox "Error: " & Err.Number & ". " & Err.Description, , "fktDieselIDSImportiereCSV" - '2470 Resume Ende - - ' End Function - - - - End Function @@ -4958,4 +4829,35 @@ RabattBerechnen: End If End Sub + + Private Function AddAttachementToRE(pathFile As String, kdNr As Integer, RECHNUNG As cRechnungsausgang, Lieferant As String) As Boolean + + If Not IO.File.Exists(pathFile) Then Return False + + Dim fi As New System.IO.FileInfo(pathFile) + + Dim DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("MDM", "MDM_ABRECHNUNG", Lieferant, datPloseAnhang.Value.ToString("ddMMyyyy"), "", fi.Name,) + If Not DS.uploadDataToDATENSERVER(pathFile, fi.Name, fi.Extension,,,, True) Then + MsgBox("Fehler beim Speichern: Datenserver! KDNR:" & kdNr) + Return False + End If + If CInt(DS.da_id) <= 0 Then + MsgBox("Keine DocId!") + Return False + End If + Dim da_id = DS.da_id + Dim destPath = DS.GET_TOP1_PATH + + If RECHNUNG IsNot Nothing Then + RECHNUNG.ANHAENGE.Clear() + Dim ANH As New VERAG_PROG_ALLGEMEIN.cRechnungsausgangAnhaenge + ANH.dsId = CInt(DS.da_id) + ANH.Bezeichnung = DS.da_name + RECHNUNG.ANHAENGE.Add(ANH) + Return RECHNUNG.SAVE_ANHAENGE(RECHNUNG.RK_ID) + Else + Return False + End If + + End Function End Class diff --git a/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb b/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb index ec3a1903..d20d341c 100644 --- a/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb +++ b/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb @@ -2277,10 +2277,14 @@ Public Class DATENVERVER_OPTIONS Dim docPdf As Spire.Pdf.PdfDocument = New Spire.Pdf.PdfDocument() docPdf.LoadFromFile(File) - Dim attachment As PdfAttachment = New PdfAttachment(attPath) + If attPath <> "" Then + + Dim attachment As PdfAttachment = New PdfAttachment(attPath) + + docPdf.Attachments.Add(attachment) + docPdf.SaveToFile(File) + End If - docPdf.Attachments.Add(attachment) - docPdf.SaveToFile(File) Return File