E-Rechnung
Ab dem 1. Januar 2025 gilt die grundsätzliche Verpflichtung zwischen inländischen Unternehmern zur Ausstellung (Versand) einer elektronischen Rechnung.
Viele VBA Entwickler fragen sich nun, was zu tun ist. Ja, entweder das Rad neu erfinden oder diesen Artikel lesen 🙂
Der öffentliche Dienst verlangt von seinen Lieferanten ja schon ziemlich lange E-Rechnungen. Am Anfang ZUGFeRD danach XRechnung.
Ab 2025 soll der Standard E-Rechnung auch für den B2B-Bereich verpflichtend werden. Die genaue Umsetzung ist derzeit aber noch Unklarheit. Ziemlich sicher lässt sich allerdings sagen, dass die E-Rechnung das Rechnungsformat der Zukunft werden wird.
Keiner von uns wird im B2B-Bereich um diese neuen Rechnungen herum kommen. Das bedeutet aber auch, dass wir keine Rechnung ablehnen können nur weil wir sie nicht lesen können.
Grund für all das ist das Wachstumschancengesetz. Also genauer gesagt das „Gesetz zur Stärkung von Wachstumschancen, Investitionen
und Innovation sowie Steuervereinfachung und Steuerfairness“ aus dem Bundesgesetzblatt vom 27.03.2024.
Hier wird im Artikel 23 „Weitere Änderung des Umsatzsteuergesetzes“ die E-Rechnung definiert und auch die Ausnahmen geregelt.
Ausnahmen?
Ja, es gibt Ausnahmen! z.B. Wenn Käufer oder Verkäufer kein Unternehmer ist oder einer von beiden nicht im Inland sitzt. Auch wenn der Bruttorechnungsbetrag 250,00€ nicht übersteigt oder es sich beim Artikel um einen Fahrschein handelt gibt es keine E-Rechnungspflicht. Auch nach §4 Nr. 8-29 UStG steuerbefreite Unternehmer haben keine E-Rechnungspflicht.
Es gibt allerdings keine Papierrechnungspflicht! Wenn z.B. der Schornsteinfeger an meine Firmenadresse eine E-Rechnung schreibt muss ich, als Unternehmer, diese annehmen.
Übergangsregelungen
Ja, kein Gesetz ohne Übergangsregelungen 🙂 Bis einschließlich 31.12.2026 dürfen Papierrechnungen verschickt werden. Auch PDF oder sonstige nicht E-Rechnungsformate dürfen mit Einwilligung des Empfängers versendet werden. Ab 01.01.2027 dürfen nur noch Unternehmen mit weniger als 800.000€ Vorjahresumsatz Papier- oder PDF-Rechnungen versenden. Ab 01.01.2028 gibt es keine Übergangsregelungen mehr. Da wir hier aber in Deutschland sind schreibe ich sicherheitshalber dazu, dass das eine Aussage mit Stand 01.11.2024 ist. Aus der Vergangenheit haben wir ja gelernt, dass sich da ganz schnell etwas ändern kann.
Was sind nun also E-Rechnungen?
Es gibt ZUGFeRD (neuerdings auch Factur-X genannt) als hybrides Format und die XRechnung in den Ausprägungen UBL (Universal Business Language) und CII (Cross Industry Invoice) als reine elektronische Rechnung. Reine PDF-Dateien sind zwar elektronische Dokumente und vielleicht auch Rechnungen, aber eben keine E-Rechnung im Sinne des Wachstumschancengesetzes.
ZUGFeRD
ist ein branchenübergreifendes Datenformat für den elektronischen Rechnungsdatenaustausch, das vom Forum elektronische Rechnung Deutschland (FeRD) – mit Unterstützung des Bundesministeriums für Wirtschaft und Energie – erarbeitet wurde. Das ZUGFeRD-Datenformat basiert auf der Richtlinie 2014/55/EU vom 16. April 2014 über die elektronische Rechnungsstellung bei öffentlichen Aufträgen und auf der am 28. Juni 2017 veröffentlichten Norm EN16931. Zudem werden die Cross-Industry-Invoice (CII) von UN/CEFACT und die ISO-Norm 19005-3:2012 (PDF/A-3) ab ZUGFeRD 2.0 berücksichtigt. (Quelle: https://www.ferd-net.de/standards/was-ist-zugferd/was-ist-zugferd.html)
Es handelt sich hier um ein PDF-A3 Dokument, welches eine eingebettete XRechnung im Format CII enthält. Na Super! Das kann also jeder Mensch lesen, kommt elektronisch und man kann es sofort ohne Scanner abspeichern. Dazu kommt noch, dass es ein anerkanntes E-Rechnungsformat ist.
Ja, damit könnte unsere Entscheidung schon fest stehen 🙂 Leider gibt es da einen kleinen Hacken. Wie bekomme ich das XML in das PDF? Dazu später mehr im Beitrag.
XRechnung
hierbei handelt es sich um eine strukturierte XML Datei. Sie hat allerdings keinen Platz für ein Firmenlogo, Design, individuelle Schriften oder gar fett gedruckte rote Hinweise auf die neue Kontoverbindung. Dafür können wir das XML allerdings recht einfach in fast jeder Programmiersprache erstellen.
Die XRechnung können wir im CII (Cross Industry Invoice) oder UBL (Universal Business Language) Schema erstellen. Es gibt hier keine Vorschrift welches Schema man verwenden muss. Wenn wir unser XML Dokument allerdings in ein ZUGFRed-Dokument verpacken wollen sollte es CII sein.
Wo ist nun der Unterschied?
Es ist die Struktur. Da im Namen von CII schon das Wort Invoice (Rechnung) auftaucht kann man wohl davon ausgehen, dass man damit nur Rechnungen schreiben kann. OK es gehen natürlich auch Gutschriften und Stornorechnungen. UBL hingegen ist für alle geschäftlichen Prozesse erstellt worden. Hier kann man also auch Lieferscheine, Arbeitszeitnachweise und Ähnliches erstellen.
Auch im Aufbau erscheint mir UBL sehr viel logischer als CII. UBL ist z.B. in vielen Blöcken organisiert aber dafür nicht so tief verschachtelt wie CII.
Hier muss sich also jeder selbst die Karten legen und sich letztendlich für beide Formate entscheiden 🙂
Für Beide – warum das denn? Ganz einfach: Du kannst Deinem Lieferanten nicht vorschreiben welches der beiden Formate er Dir schickt.
Schon vergessen? Wir müssen die Dinger auch noch lesen können und zwar alle 3. Zum erstellen meiner Rechnungen habe ich mich vor langer Zeit für ZUGFRed und dann für XRechnung UBL entschieden. Warum? Nun ja ich arbeite für Staatsunternehmen, kleinere Unternehmen und Privatpersonen. 2017 wollte die DB alle Rechnungen sofort im ZUGFReD Format. Damals noch ZUGFReD 1.0 mit CID Schema. Ungefähr im Jahr 2020 wurde es dann XRechnung. Da es damals nur Vorlagen im UBL-Format gab war auch hier die Entscheidung leicht. Heute müsste man die Entscheidung eigentlich bereuen, weil ZUGFReD ja nun auch auf CII umgestellt hat. Die ZUGFReD Rechnungen sende ich übrigens an alle Kunden die mich nicht gebeten haben XRechnungen zu stellen. Ach ja ich mache das Alles in VBA!
E-Rechnung in VBA
VBA ist ein tolles Werkzeug auch wenn es etwas Microsoft lastig ist. XML Dateien kann VBA allerdings von Hause aus nicht verarbeiten. Das Schöne ist, eine XML Datei ist ja nur eine einfache Textdatei. Die können wir mit VBA lesen und schreiben.
z.B. mit so einer Funktion:
Function ReadFile(strFilePath As String) As String
On Error GoTo ErrHandler
Dim myFSO As Object
Dim myFSOTs As Object
Dim DataLine As String, tmpCtr As Integer
Dim Data As String, xml As Boolean
Set myFSO = CreateObject("scripting.FileSystemObject")
Set myFSOTs = myFSO.OpenTextFile(strFilePath, 1)
Do Until myFSOTs.AtEndOfStream
DataLine = myFSOTs.readline
If InStr(1, DataLine, "<?xml") > 0 Then xml = True
If xml Then Data = Data & DataLine
Loop
ReadFile = Data
errExit:
Exit Function
ErrHandler:
MsgBox Err.Number & vbCrLf & Err.Description
Resume errExit
End Function
Ich habe hier schon den oberen Teil des Files abgeschnitten, der nicht zum XML gehört, weil ich die Funktion nutze um das XML aus einer ZUGFReD Rechnung zu extrahieren.
Das geht dann etwa so:
Dim strStream As String
strStream = Mid(strStream, InStr(1, strStream, "<?xml"))
If InStr(1, strStream, "</rsm:CrossIndustryDocument>") > 0 Then
strStream = Mid(strStream, 1, InStr(1, strStream, "</rsm:CrossIndustryDocument>") + 27)
Else
strStream = Mid(strStream, 1, InStr(1, strStream, "</rsm:CrossIndustryInvoice>") + 26)
End If
Die zwei unterschiedlichen Endtags verraten mir auch ob es ein CII oder CID Dokument ist. CID wird übrigens nur noch von veralteten Rechnungssystemen benutzt und ist gemäß Wachstumschancengesetzt kein gültiges E-Rechnungsformat mehr.
Nachdem wir nun die Dateien gelesen haben können wir die einzelnen Knotenpunkte suchen, in denen sich unsere Rechnungsinformationen befinden bzw. unsere Informationen in diese Knoten schreiben. Aber wo sind diese Knoten? Wie in den beiden Bildern oben zu sehen ist leider nicht an den selben Stellen. Wir müssen also unterscheiden welchen Typ von E-Rechnung wir vor uns haben oder welchen wir erstellen wollen. Schauen wir uns das mal am Beispiel von UBL an:
Das ist schon richtig heftig 🙂 Dieses Bild stammt aus der Spezifikation XRechnung die ihr unter https://xeinkauf.de/app/uploads/2024/07/302-XRechnung-2024-06-20.pdf findet. Dort könnt ihr auch genau sehen was wohin gehört und welches Format es haben sollte.
Auch für CII gibt es so ein Modell. Ich habe aber kein solches Komplettbild finden können.
Jetzt können wir uns eien Klasse schreiben, mit der wirXML Knoten lesen und schreiben können, oder einfach die Strings mit:
strXML = "<invoice>12345</invoice>"
zusammen bauen. Wir können natürlich auch die von Microsoft bereitgestellte MSXML2 Library nutzten. Dazu legen wir einen Verweis auf die Microsoft XML, v6.0 an. In einer neuen Klasse würde das dann etwa so aussehen:
Option Explicit
Private xmlDoc As Object ‚MSXML2.DOMDocument60
Private root As Object ‚Der Wurzelknoten der XRechnung
Private Sub Class_Initialize() Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0") Set root = xmlDoc.createElement("ubl:Invoice") 'Namespace-Definitionen hinzufügen root.setAttribute "xmlns:ubl", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" root.setAttribute "xmlns:cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" root.setAttribute "xmlns:cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" root.setAttribute "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance" root.setAttribute "xsi:schemaLocation", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 http://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Invoice-2.1.xsd" xmlDoc.appendChild root Dim invoiceElement As Object Set invoiceElement = xmlDoc.createElement("cbc:CustomizationID") invoiceElement.Text = "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0" root.appendChild invoiceElement Set invoiceElement = xmlDoc.createElement("cbc:ProfileID") invoiceElement.Text = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0" root.appendChild invoiceElement End Sub
Mit diesem Wurzelknoten haben wir das komplette Gerüst der UBL XRechnung erstellt. Jetzt müssen noch alle anderen Informationen an den root-Knoten gebunden werden. Dazu gehören Rechnungsnummer
Set invoiceElement = xmlDoc.createElement("cbc:ID")
invoiceElement.Text = InvoiceInfo.Number
root.appendChild invoiceElement
, das Rechnungsdatum
Set invoiceElement = xmlDoc.createElement("cbc:IssueDate")
invoiceElement.Text = InvoiceInfo.Date
root.appendChild invoiceElement
und vieles mehr (s. Bild oben hier die ersten zwei Elemente links unter Invoice).
Genau so wie das erstellen der XML-Datei funktioniert auch das Lesen der Datei. Wenn ihr eine XML Datei habet könnt ihr die Datei direkt mit
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.Load xmlFile
einlesen oder wenn ihr ein PDF habt eben mit der oben beschriebenen Funktion das XML extrahieren und mit diesem Befehl dem xmlDoc zur Verfügung stellen:
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.loadXML strStream
Danach z.B. mit
Set xmlNode = xmlDoc.selectSingleNode("//cbc:ID")
If Not xmlNode Is Nothing Then strRANR = xmlNode.Text
die Rechnungsnummer auslesen und ggf. in einer Tabelle speichern.
Wer bis hier hin gelesen hat kann sich nun sicherlich den Aufwand vorstellen eine komplette Klasse für mindestens ein E-Rechnungsformat zu schreiben und dazu noch zwei Routinen um CII und UBL lesen zu können. Vermutlich habt ihr es euch schon gedacht – ich habe mir diese Arbeit bereits gemacht. Es wäre also unfair euch nicht ein komplettes Werkzeug zum schreiben, lesen und verarbeiten an die Hand zu geben. Hier ist der Link (folgt in Kürze wer nicht warten kann mailt mir unter fried@eudatabase.de) zu einer Demo mit der Ihr Rechnungen erstellen und einlesen könnt. Für den offenen Quellcode würde ich um einen Betrag von 250€ zzgl, MwSt. (297,50€ brutto) bitten, für den ihr natürlich eine Factur-X Rechnung bekommt 🙂 BLACKWEEK ALARM: vom 22.11.2024 bis 02.12.2024 200€ Netto Rabatt! Sichert euch den Preis von 50€ zzgl MwSt (59,50€ brutto).
Factur-X oder ZUGFReD
Stimmt ja, da war noch was. Wie bekomme ich den nun eigentlich das XML in das PDF. Meinen schicken Rechnungsbericht habe ich ja schon erstellt und als PDF speichern geht ja z.B. über
DoCmd.OutputTo acOutputReport, "rep_Rechnung", acFormatPDF, "RA.pdf"
Wir wissen aber, dass das keine E-Rechnung ist und somit nur an Privatpersonen mit deren Einverständnis gesendet werden darf.
Für eine Factur-X Rechnung brauchen wir also nicht nur ein PDF sondern ein PDF mit Anhang. Das heißt dann PDF/A. Das A steht für Advanced also erweitert. Nun hat auch hier das Access Team vergessen uns wie in allen anderen Office-Programmen diesen Schalter zur Verfügung zu stellen und wir müssen unserem PDF-Export das über die Registry sagen. Das funktioniert z.B. so:
Sub PDFA_Setzen()
On Error Resume Next
Dim ws As Object
Set ws = CreateObject("WScript.Shell")
ws.RegWrite "HKCU\Software\MicroSoft\Office\" & Application.Version & "\Common\FixedFormat\LastISO19005-1", 1, "REG_DWORD"
If Err.Number <> 0 Then MsgBox "Fehler beim Setzen des Registry-Eintrags für die PDF/A-Kompatibilität!", vbInformation
Set ws = Nothing
End Sub
Danach produziert unser Befehl
DoCmd.OutputTo acOutputReport, "rep_Rechnung", acFormatPDF, "RA.pdf"
automatisch ein PDF/A1 Dokument.
Für das zusammenfügen unseres XML Elements mit dem PDF müssen wir das XML noch als speichern. z.B. mit dem Befehl
xmlDoc.Save "RA.xml"
Da wir in Access leider auch keine Möglichkeit haben die beiden Dateien nun zusammen zu fügen brauchen wir ein weiteres Werkzeug. Ich habe jahrelang das bis 100 pro Tag freie Kommandozeilentool von intarsys benutzt und wollte das eigentlich hier verlinken. Darf ich aber nicht, weil in den Lizenzbedingungen steht ihr müsst es von deren Seite runterladen. Da ist es aber nicht mehr aufzufinden. Es gibt aber ein Projekt namens Mustang. Die haben in Java eine Bibliothek geschrieben, die man per Kommandozeile aufrufen kann. Diese Bibliothek habe ich mit Launch4J in eine EXE Datei gekapselt. Damit könne wir ohne aufwendige Installation einfach per Shell Befehl die EXE aufrufen. Einfach das ZIP-File irgendwo hin extrahieren und z.B. so aufrufen:
Shell "mustang.exe --disable-file-logging --action combine -source ""RA.pdf"" -source-xml ""RA.xml"" -out ""RA_A3.pdf"""
Das Output-Element ist dann eine Factur-X oder ZUGFReD Rechnung die ihr sowohl an Privatpersonen als auch an Firmen senden könnt. Download Mustang.zip (264 MB)
So nun viel Spaß mit eurem neuen Wissen. Bei Fragen oder Anregungen könnt ihr mir gerne mailen unter fried@eudatbase.de