Beispielcode fuer XRechnung mit Aloaha ZUGFeRD SDK

Ein Kunde hat uns folgenden Code als Beispiel zur Verfuegung gestellt:

    Private Function create_XML_Public_Authority(sLeitweg_ID As String) As Boolean
        Dim sSQL As String
        Dim sWrt As String
        Dim sArr() As String
        Dim iValue As Double
        '
        Dim RechnungsPostenID As Long
        Dim Produktnotiz As String
        Dim Produktname As String
        Dim Produktbeschreibung As String
        Dim ProduktID As String
        Dim Einheit As String
        Dim Anzahl As String
        Dim Bruttopreis As String
        Dim BruttopreisAnzahl As String
        Dim Bruttogesamtpreis As String
        Dim NettoEinzelPreis As Double
        Dim Rabatt As String
        Dim Nettopreis As String
        Dim NettopreisAnzahl As String
        Dim Nettogesamtpreis As String
        Dim MwSt_Satz As String
        Dim MwSt_KE As String
        '
        Dim CalculatedAmount As String
        Dim BasisAmount As String
        Dim TaxTypeCode As String
        Dim CategoryCode As String
        Dim ApplicablePercent As String
        Dim TaxPointDate As String
        Dim DueDateTypeCode As String
        Dim ExemptionReason As String
        '
        Dim LicenseKey As String = "1234567890"
        Dim zug As Aloaha_ZUGFeRD.iXML.ZUGFeRD = Nothing
        Dim ProfileType As Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile = Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort
        Dim TestIndicator As Boolean = False
        'Es ist immer eine gute Idee ein Backup vom "CultureInfo" zu machen
        Dim culture As System.Globalization.CultureInfo = System.Globalization.CultureInfo.GetCultureInfo("de-DE")
        Dim culturebackup As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture
        System.Threading.Thread.CurrentThread.CurrentCulture = culture
        Dim alo As Aloaha_ZUGFeRD.XML = New Aloaha_ZUGFeRD.XML(ProfileType, TestIndicator, LicenseKey)
        alo.ZUGfeRDStandard = Aloaha_ZUGFeRD.iXML.ZUGFeRDVersion.xInvoice
        'alo.PrintPDFDocument("c:\temp\pdfrechnung.pdf", LicenseKey, "Microsoft XPS Document Writer")
        alo.EightAfterKommaDigitsfor4 = False
        alo.isKOSIT = True
        '
        sActual_XML_Public_Authority = sSysTempVerz & "\XRECHNUNG_" & sInvoice_No & ".xml"
        Dim Rechnungsnummer As String = sInvoice_No
        Dim Rechnungsdatum As String = alo.TodayDate.Document_Date
        Dim Rechnungsnotiz As String = "Rechnung gemaess Bestellung"
        Dim Rechnungssprache As String = ""  'Sollte leer sein
        alo.CreateInvoice(Rechnungsnummer, Rechnungsnotiz, Rechnungsdatum, alo.TodayDate.Document_DateFormat, , Rechnungssprache, "EUR")
        alo.InvoiceCurrencyCode = "EUR"
        alo.Document_ID = Rechnungsnummer
        alo.Document_Type = Aloaha_ZUGFeRD.iXML.DocumentType.Invoice
        'BT-23 Statischer String
        alo.BusinessProcessSpecifiedDocumentContextParameter = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
        '
        'Definieren Sie einige allgemeine Eigenschaften der Rechnung
        alo.AddSpecifiedProcuringProject("ProjectID", "ProjectName")
        alo.AddBuyerAssignedID("Bestellnummer")
        alo.AddReceivableSpecifiedTradeAccountingAccount("Buchungsreferenz", "")
        '
        '
        '
        'falls es eine LeitwegID gibt bitte auch angeben
        'Sie ueberschreibt: alo.BuyerReference
        If sLeitweg_ID.Trim = "" Then
            sActual_XML_Public_Authority = ""
            Return false
        End If
        alo.LeitwegID = sLeitweg_ID
        '
        '=== Erstellen Sie den Kaeufer (Ohne Ort, der folgt im Ansprechpartnerblock) ===
        alo.BuyerName = 'Test GmbH"
        alo.BuyerPostCode = "20000"
        alo.BuyerID = "12345" 'Kundennr.
        alo.BuyerAddressLine1 = "Hauptstr. 1"
        alo.BuyerCountry = "DE" 'Iso-2-Code
        'BT-49
        'Auch die URIUniversalCommunication ist ein Muss
        alo.set_URIUniversalCommunication("info@zugferdpro.com", "EM", False)
        'Eine Kontaktperson ist ein Muss. Die meisten Validatoren erwarten es
        alo.BuyerPersonalName = "Franz Holzmann"
        alo.BuyerDepartment = ""
        alo.BuyerEmail = "fholzmann@gmail.com"
        alo.BuyerTelephone = "0170123456789"
        alo.BuyerCity = "Hamburg" 'ACHTUNG: City nur einmal nennen, gilt fuer Buyer und Ansprechpartner
        '
        '=== Erstellen Sie den Verkaeufer ===
        alo.WriteSeller("Test GmbH", "20000", "Hamburg", "Hauptstr. 1", "", "DE", "DE12345678",)
        alo.SellerLegalID = "HRB 12345"
        'EM=Email
        'BT-34
        alo.set_URIUniversalCommunication("info@test.de", "EM", True)
        'Und wieder ist die Kontaktperson ein Musss
        alo.WriteSellerContactPerson("Birgit Mueller", "Vertrieb", "bmueller@online.de", "+49 1234567890")
        '
        '
        '
        'Jede Rechnung moechte auch bezahlt werden. Deshalb benoetigen Sie mindestens eine Zahlungsmethode
        'Bankname, BLZ werden von den meisten Validatoren nicht mehr erwuenscht
        Dim KontoName As String = ""
        Dim BankName As String = "" 'Sollte leer bleiben
        'Zahlungsbedingungen sollten auch immer angegeben werden.
        'Hier kann auch Skonto untergebracht werden.
        'Details: h_ttps://www.zugferdpro.com/skonto-und-verzugszinsen-bt-20/
        Dim PaymentTermsDescription As String = ""
        Dim DueDate As String = ""
        Dim DirectDebitMandateID As String = ""
        Dim PeriodUnit As String = ""
        Dim Period As String = ""
        Dim DiscountPercent As String = ""
        Dim DiscountAmount As String = ""

        Dim Steuerbasis As Double  'Nettosumme 19%, wird pro Pos. aufaddiert
        Dim Umsatzsteuersatz As Double = "19"
        Dim Steuerbasis_reduced As Double 'Nettosumme 7%, wird pro Pos. aufaddiert
        Dim Umsatzsteuersatz_reduced As Double = "7"

        '
        KontoName = "Test GmbH" 'Kontoinhalber-Name
        alo.AddPaymentMeans(alo.PaymentMeansCode(Aloaha_ZUGFeRD.iXML.Payment_Means.SEPA_credit_transfer), "Sepa Credit Transfer", "DE1234567890", KontoName, "", "GENODEDXXXX", "", BankName, False)
        'Zahlungsbedingung aufgedroeselt: -wir lassen das erstmal und schreiben es nur in den Text-
        'PeriodUnit = "DAY"
        'Period = "30"
        'DiscountPercent = "3"
        'DiscountAmount = "10"
        PaymentTermsDescription = "30 Tage netto"
        DueDate = alo.TodayDate.Document_Date
        alo.AddTradePaymentTerms(PaymentTermsDescription, DueDate, alo.TodayDate.Document_DateFormat, DirectDebitMandateID, PeriodUnit, Period, DiscountPercent, DiscountAmount)

        'Kein Datum, sonst Fehler
        'alo.AddSellerAssignedID("Auftragsbestaetigung", "20130608", "102")                 'BT-14

        alo.PaymentReference = "Invoice No. " & sInvoice_No
        'Gibt es keine "Lieferavisreferenz", dann muss man etwas uebergeben
        alo.SetDespatchAdviceReferencedDocument("n/a")



        '================ P O S I T I O N E N ======================

        'Natuerlich enthaelt jede Rechnung auch die Rechnungsposten.
        'AddProduct_Comfort wird pro Posten einmal aufgerufen
        'Details auf: h_ttps://www.zugferdpro.com/der-rechnung-posten-mit-addproduct_comfort-hinzufugen/
        'Einheiten sind streng definiert. Sie koennen nicht einfach "Stueck" schreiben
        'h_ttps://www.zugferdpro.com/unitcodes-fuer-die-menge-in-zugferd-xrechnung-xinvoice/
        Steuerbasis = 0
        Steuerbasis_reduced = 0

        '-------------POS 0
        'Ohne Rabatt
        RechnungsPostenID = 0
        Produktnotiz = "nicht rabattierfaehig"
        ProduktID = "TB100A4"
        Produktname = "500 Blatt Papier"
        Produktbeschreibung = "Papier A4"
        Einheit = "C62"
        Anzahl = "10.00" 'Anzahl
        MwSt_Satz = "19.00"
        MwSt_KE = alo.VatCategoryCode(Aloaha_ZUGFeRD.iXML.VAT_Category.StandardRate)
        Bruttopreis = ""
        BruttopreisAnzahl = ""
        Bruttogesamtpreis = ""
        Rabatt = ""
        NettopreisAnzahl = "1.00"
        NettoEinzelPreis = 0
        Nettopreis = "5.00"  'EP
        Nettogesamtpreis = "50.00" 'GESPREIS = Anzahl * EP
        Steuerbasis += CDbl(Nettogesamtpreis)
        '
        RechnungsPostenID = alo.AddProduct_Comfort(CStr(RechnungsPostenID), Produktnotiz, ProduktID, Anzahl, Einheit, Produktname, Produktbeschreibung,
                                                   Bruttopreis, "EUR", "", Einheit, False, Rabatt, "", "", Nettopreis, "EUR", NettopreisAnzahl,
                                                   Einheit, "VAT", MwSt_KE, MwSt_Satz, "", Nettogesamtpreis, "EUR", "", "")
        '
        '
        '
        '-------------POS 1
        'RABATT
        Produktnotiz = "Rabatt gegeben"
        RechnungsPostenID = 1
        ProduktID = "AS0815"
        Produktname = "Scheibe"
        Produktbeschreibung = "Anlaufscheibe"
        Einheit = "C62"
        Anzahl = "10.00"
        MwSt_Satz = "19.00"
        MwSt_KE = alo.VatCategoryCode(Aloaha_ZUGFeRD.iXML.VAT_Category.StandardRate)
        Bruttopreis = "25.25" 'EP * Anzahl
        BruttopreisAnzahl = "10.00"
        Bruttogesamtpreis = ""
        Rabatt = "3.79" 'in Euro
        NettopreisAnzahl = "10.00"
        NettoEinzelPreis = (CDbl(Bruttopreis) - CDbl(Rabatt)) / CDbl(BruttopreisAnzahl) 'EP - Rabatt
        Nettopreis = CStr(Math.Round(NettoEinzelPreis * CDbl(NettopreisAnzahl), 2)) '(EP - Rabatt) * Anzahl 
        Nettogesamtpreis = CStr(Math.Round(NettoEinzelPreis * CDbl(Anzahl), 2))
        Steuerbasis += CDbl(Nettogesamtpreis)

        RechnungsPostenID = alo.AddProduct_Comfort(CStr(RechnungsPostenID), Produktnotiz, ProduktID, Anzahl, Einheit, Produktname, Produktbeschreibung,
                                                   Bruttopreis, "EUR", "", Einheit, False, Rabatt, "EUR", "", Nettopreis, "EUR", NettopreisAnzahl,
                                                   Einheit, "VAT", MwSt_KE, MwSt_Satz, "", Nettogesamtpreis, "EUR", "", "")

        '
        '-------------POS 2
        'Ohne Rabatt
        RechnungsPostenID = 2
        Produktnotiz = "nicht rabattierfaehig"
        ProduktID = "TBXXXA4"
        Produktname = "1 Blatt Papier"
        Produktbeschreibung = "Papier A5"
        Einheit = "C62"
        Anzahl = "10.00" 'Anzahl
        MwSt_Satz = "7.00"
        MwSt_KE = alo.VatCategoryCode(Aloaha_ZUGFeRD.iXML.VAT_Category.StandardRate)
        Bruttopreis = ""
        BruttopreisAnzahl = ""
        Bruttogesamtpreis = ""
        Rabatt = ""
        NettopreisAnzahl = "1.00"
        NettoEinzelPreis = 0
        Nettopreis = "5.00"  'EP
        Nettogesamtpreis = "50.00" 'GESPREIS = Anzahl * EP
        Steuerbasis_reduced = Steuerbasis_reduced + CDbl(Nettogesamtpreis)
        '
        RechnungsPostenID = alo.AddProduct_Comfort(CStr(RechnungsPostenID), Produktnotiz, ProduktID, Anzahl, Einheit, Produktname, Produktbeschreibung,
                                                   Bruttopreis, "EUR", "", Einheit, False, Rabatt, "", "", Nettopreis, "EUR", NettopreisAnzahl,
                                                   Einheit, "VAT", MwSt_KE, MwSt_Satz, "", Nettogesamtpreis, "EUR", "", "")



        '========= 19% ===========
        '
        'Nun muessen wir noch die Steuern addieren und angeben
        CalculatedAmount = Math.Round((Steuerbasis * (Umsatzsteuersatz)) / 100, 2)
        BasisAmount = CStr(Math.Round(Steuerbasis, 2))
        TaxTypeCode = "VAT"
        CategoryCode = alo.VatCategoryCode(Aloaha_ZUGFeRD.iXML.VAT_Category.StandardRate)
        ApplicablePercent = CStr(Umsatzsteuersatz)
        TaxPointDate = DueDate
        DueDateTypeCode = ""
        ExemptionReason = ""

        alo.AddTradeTax(CalculatedAmount, "EUR", BasisAmount, "EUR", TaxTypeCode, CategoryCode, ApplicablePercent, ExemptionReason, TaxPointDate,
                        "102", DueDateTypeCode)

        '========= 7% ===========
        '
        'Nun muessen wir noch die Steuern addieren und angeben
        CalculatedAmount = Math.Round((Steuerbasis_reduced * (Umsatzsteuersatz_reduced)) / 100, 2)
        BasisAmount = CStr(Math.Round(Steuerbasis_reduced, 2))
        TaxTypeCode = "VAT"
        CategoryCode = alo.VatCategoryCode(Aloaha_ZUGFeRD.iXML.VAT_Category.StandardRate)
        ApplicablePercent = CStr(Umsatzsteuersatz_reduced)
        TaxPointDate = "" 'Das Datum nur einmal ausweisen
        DueDateTypeCode = ""
        ExemptionReason = ""

        alo.AddTradeTax(CalculatedAmount, "EUR", BasisAmount, "EUR", TaxTypeCode, CategoryCode, ApplicablePercent, ExemptionReason, TaxPointDate,
                        "102", DueDateTypeCode)
        '
        '
        '
        '
        'Nun fehlen nur noch die Summen h_ttps://www.zugferdpro.com/writetotals/

        'Summe aller Posten           NETTO GESAMT
        Dim LineTotalAmount As String = CStr(Math.Round(Steuerbasis + Steuerbasis_reduced, 2))

        'Summe incl. MwSt             BRUTTO GESAMT
        iValue = Math.Round(Steuerbasis + ((Steuerbasis * (Umsatzsteuersatz)) / 100), 2)
        iValue += Math.Round(Steuerbasis_reduced + ((Steuerbasis_reduced * (Umsatzsteuersatz_reduced)) / 100), 2)
        Dim GrandTotalAmount As String = CStr(iValue)

        'Zahlbar                      BRUTTO GESAMT
        iValue = Math.Round(Steuerbasis + ((Steuerbasis * (Umsatzsteuersatz)) / 100), 2)
        iValue += Math.Round(Steuerbasis_reduced + ((Steuerbasis_reduced * (Umsatzsteuersatz_reduced)) / 100), 2)
        Dim DuePayableAmount As String = CStr(iValue)

        'Versteuerbare Summe          NETTO GESAMT
        Dim TaxBasisTotalAmount As String = CStr(Math.Round(Steuerbasis + Steuerbasis_reduced, 2))

        'MwSt Gesamt                  MWST GESAMT
        iValue = Math.Round(Steuerbasis * (Umsatzsteuersatz) / 100, 2)
        iValue += Math.Round(Steuerbasis_reduced * (Umsatzsteuersatz_reduced) / 100, 2)
        Dim TaxTotalAmount As String = CStr(iValue)

        'Anzahlungen beruecksichtigen
        Dim Anzahlung As String = "0.00"
        'Abschlaege
        Dim AllowanceTotalAmount As String = "0.00"
        'Zuschlaege
        Dim ChargeTotalAmount As String = "0.00"
        Dim Rundungsfehler As String = "0.00"
        '
        alo.WriteTotals(LineTotalAmount, GrandTotalAmount, DuePayableAmount, TaxBasisTotalAmount, TaxTotalAmount, AllowanceTotalAmount,
                        Anzahlung, Rundungsfehler, ChargeTotalAmount)

        'Sie koennen sich auch die Struktur im Debugger anschauen
        'Auch koennen Sie Werte direkt aendern

        zug = alo.ZUGFeRD_Structure
        'Wenn Felder editiert wurden muss man natuerlich zurueckschreiben
        'alo.ZUGFeRD_Structure = zug

        'Wir erstellen nun das XML
        alo.UseASIIOnSave = False
        alo.SaveWithoutUTF8Header = True  'Mit oder ohne BOM speichern
        If System.IO.File.Exists(sActual_XML_Public_Authority) = True Then System.IO.File.Delete(sActual_XML_Public_Authority)
        alo.SaveXML(sActual_XML_Public_Authority)

        'Es wurde nichts erstellt? Dann schauen Sie mal in Lasterror nach
        If alo.Last_Error <> "" Then MsgBox(alo.Last_Error)

        'Sie koennen auch direkt den PDF Teil erstellen. Winword muss dazu allerdings installiert sind
        'Natuerlich koennen Sie auch Ihre eigene PDF Datei benutzen. 

        Dim docpdf As String = "c:\temp\Rechnung.pdf"
        Dim docx As String = "c:\temp\template.docx"
        If System.IO.File.Exists(docpdf) = True Then System.IO.File.Delete(docpdf)

        alo.CreateDocFromXML(sActual_XML_Public_Authority, docpdf, docx, LicenseKey, True, "", True)

        'Wenn Sie eine Hybride Rechnung erstellen moechten
        'Dann muessen Sie den XML Teil in Ihre PDF Rechnung einbetten.

        'in docpdf koennen Sie natuerlich auch Ihre exitierende PDF Rechnung eintragen

        Dim zugferdrechnung As String = "c:\temp\zugferdrechnung.pdf"
        If System.IO.File.Exists(zugferdrechnung) = True Then System.IO.File.Delete(zugferdrechnung)

        'Eigentlich ueberfluessig da docpdf schon das XML enthaelt.
        Call alo.MergeXMLIntoPDF(sActual_XML_Public_Authority, docpdf, zugferdrechnung, True, "", LicenseKey)

        alo = Nothing

        'CultureInfo zurueckschreiben
        System.Threading.Thread.CurrentThread.CurrentCulture = culturebackup
end Function