Office & Business

E-Rechnung per Skript erstellen – so simpel?

Es konnte gar nicht anders kommen: Ich musste mein eigenes E-Rechnungs-Tool basteln - hilft auch beim Verständnis!

Die E-Rechnung/XRechnung ist in aller Munde, aber keine Sorge: Noch müsst Ihr sie nur empfangen können, für das Versenden habt Ihr noch zwei Jahre Zeit. Und dann wird es vermutlich auch Euer Standard-Rechnungs-Tool beherrschen. Derzeit gibt es allerlei (Übergangs-)Software, aber für meinen Bedarf war nichts dabei: Einfach, Open Source, standardkonform. Also selbst Hand angelegt und etwas gebastelt. Ihr bekommt hier den wohl einfachsten Weg zu einer neuen Rechnung und ein wenig Verständnis für das Format.

Warum basteln?

Ganz kurz vorweg: Zuerst habe ich mir die LibreOffice-Lösung angeguckt - auf den ersten Blick zu kompliziert. Dann gibt es da noch Fakturama, ebenfalls Open Source, aber ich brauche kein komplettes Rechnungswesen. Und im Open-Source-Bereich wird es dann schon dünn.

Dann habe ich einer Empfehlung von Kollegen eine Chance geben wollen. Ein proprietäres Tool aus Deutschland für 20 Euro, das allerdings einige Probleme hatte: Teils merkwürdige Usability, zu wenig Hintergrundinfos, Daten werden teils nicht gespeichert und vor allem spuckt es Dokumente aus, die nicht auf Konformität zum Standard geprüft werden und es entsprechend oft auch nicht sind. Prüfen könnt Ihr das bei etlichen Online-Validatoren, etwa hier beim Service-Portal Baden-Württemberg (dahinter steckt die Software von der KoSIT selbst, hier das GitHub-Repo).

Egal, schließlich sind meine Anforderungen gering und das E-Rechnungs-Format ist eigentlich ziemlich trivial, eine simple XML-Datei. Okay, die kann ich auch selbst bearbeiten, ohne Tool.

E-Rechnungs-Creator

Wie einfach so eine E-Rechnung von innen ist, seht Ihr hier - ein Auszug mit den Infos zum Rechnungsersteller:

<ram:SellerTradeParty>
   <ram:Name>Mirco Lang</ram:Name>
   <ram:DefinedTradeContact>
     <ram:PersonName>Mirco Lang</ram:PersonName>
     <ram:TelephoneUniversalCommunication>
       <ram:CompleteNumber>0171 11 11 11111111</ram:CompleteNumber>
     </ram:TelephoneUniversalCommunication>
     <ram:EmailURIUniversalCommunication>
       <ram:URIID>lang@gizlog.de</ram:URIID>
     </ram:EmailURIUniversalCommunication>
</ram:SellerTradeParty>

Ihr seht, das sind einfach schlichte Infos (Name, Telefon, Mail) in XML-Tags. Wie komme ich daran? Die KoSIT, die für den Standard verantwortlich ist, stellt eine Beispieldatei zur Verfügung - erfreulicherweise auf GitHub.

Eine neue Rechnung für einen Kunden heißt dann ja einfach nur, dass Posten und Summen neu eingetragen werden. Und in meinem Fall ist es sogar noch einfacher: Es gibt immer nur einen Posten, lediglich Umsatzsteuer, Netto- und Bruttosummen, Datum und fortlaufende Rechnungsnummer müssen angepasst werden.

Hier mal ein Auszug mit einigen Summen:

<ram:ApplicableTradeTax>
    <ram:CalculatedAmount>414.2</ram:CalculatedAmount>
    <ram:TypeCode>VAT</ram:TypeCode>
    <ram:BasisAmount>2180</ram:BasisAmount>
    <ram:CategoryCode>S</ram:CategoryCode>
    <ram:RateApplicablePercent>19</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>

Wenn ich diese Summen dann später für echte Rechnungen ersetzen will, müssen sie erstmal durch Variablen ersetzt werden:

<ram:ApplicableTradeTax>
    <ram:CalculatedAmount>customer_ust</ram:CalculatedAmount>
    <ram:TypeCode>VAT</ram:TypeCode>
    <ram:BasisAmount>customer_cost_items</ram:BasisAmount>
    <ram:CategoryCode>S</ram:CategoryCode>
    <ram:RateApplicablePercent>7</ram:RateApplicablePercent>
</ram:ApplicableTradeTax>

Hier sind die Summen nun also durch customer_ust und customer_cost_items ersetzt, sprich Basiskosten und die zugehörige Umsatzsteuer.

Die Summen wollen berechnet und die Variablen ersetzt werden. Das erledigt dieses winzige Skript:

#!/bin/bash

customer_cost_items=$1
customer_total_netto=$1
customer_ust=$(bc <<< "scale=2;$customer_cost_items/100*7")
customer_total_brutto=$(bc <<< "scale=2;$customer_cost_items+$customer_ust")
customer_datetimestring=$(date +%Y%m%d)
timestamp=$(date +%s)

sed "
s/customer_cost_items/$customer_cost_items/g
s/customer_total_netto/$customer_total_netto/g
s/customer_total_brutto/$customer_total_brutto/g
s/customer_ust/$customer_ust/g
s/customer_total/$customer_total/g 
s/customer_timestamp/$timestamp/g
s/customer_datetimestring/$customer_datetimestring/g" $2 > rechnung_$timestamp.xml

#"C:\Program Files\Mozilla Thunderbird\thunderbird.exe" -compose "to='MrManager@example.com',subject='Rechnung Tuto',body='Le Rechnung bitteschön.'"

Über customer_cost_item=$1 wird die Netto-Summe eines einzelnen Postens gesetzt (das Skript wird "meinskript.sh 235 mein_template.xml" aufgerufen). In meinem Fall entspricht das Einzel-Netto dem Gesamt-Netto, daher die doppelte Verwendung von $1. Und $2 steht entsprechend für die verwendete Vorlage.

Dann werden aus der Nettosumme die Steuer und die Bruttosumme berechnet. Dabei hilft das Tools bc, weil die Bash selbst nicht mit Dezimalrechnung klar kommt.

Die beiden date-Kommandos erzeugen einen Timestamp (für die fortlaufende Rechnungsnummer) und ein Datum im Format YYYMMDD (also zum Beispiel 20250129).

Der sed-Part ersetzt dann schlicht die Platzfreihalter in der Kundenvorlage mit den korrekten, berechneten Beträgen, dem aktuellen Datum und einer fortlaufenden Rechnungsnummer.

Gespeichert wird die Rechnung dann als rechnung_$timestamp also beispielsweise rechnung_1738607375 (wobei 1738607375 die Unix-Zeit ist, sprich Sekunden seit dem 1. Januar 1970).

Die letzte Zeile dient schlicht der Bequemlichkeit und öffnet ein Email-schreiben-Fenster, wo ich nur noch die Rechnung selbst anhängen muss.

In der Praxis erstelle ich eine echte Rechnung dann so:

xrechnung_creator.sh 250.99 template_customer.xml

Wie viel einfacher kann das Erstellen einer Rechnung sein? Und natürlich standardkonform:

skript und bestätigung der konformität.
Konforme XRechnung per Mini-Skript

"Echtes" Tool

Für mich persönlich genügt diese Lösung, weil ich derzeit nur für einen Kunden eine E-Rechnung erstelle, die keine unterschiedlichen Posten hat, keine unterschiedlichen Steuersätze oder sonst etwas in der Art.

Allerdings wäre es nun ein Kinderspiel, noch ein paar weitere Werte zu berechnen und ersetzen zu lassen! Alles was Ihr für eine eigene Variante braucht, sind eine korrekte, validierte Rechnung, ein paar bc-Berechnungen, zwei date-Datumsangaben und ein paar sed-Zeilen zum Ersetzen.

Und wenn Ihr nicht selbst basteln wollt: Hoffentlich habt Ihr zumindest gesehen, wie simpel so eine E-Rechnung im Grunde ist! Ein Schelm wer denkt, dass es eigentlich darum ginge ;)

E-Rechnungen für Dummies
25,00 €
(Stand: 18.02.2025 01:01 - Details)
Verkäufer: Amazon.de
Zum Angebot bei Amazon ↗ *
(* = Affiliate-Link / Bildquelle: Amazon-Partnerprogramm)
×
Produktpreise und -verfügbarkeit sind zum angegebenen Datum / Uhrzeit korrekt und können sich ändern. Alle Preis- und Verfügbarkeitsinformationen auf https://www.amazon.de/ zum Zeitpunkt des Kaufs gelten für den Kauf dieses Produkts.

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Schaltfläche "Zurück zum Anfang"