feat: create validated ZUGFeRD invoices in one console command

This commit is contained in:
admin committed 2026-10-16 09:29:08 +02:00
1 parent e0c15fc7f2
commit a643cf5227
30 files changed
+1509 -207

No files matched your search

+118 -24
View File
@@ -1,31 +1,125 @@
# jr-einvoice-toolchain (Folder-first Factur-X / ZUGFeRD EN16931)
# einvoice – Rechnung mit einem Konsolenaufruf
## New in v0.8
Kundenname, Leistung, Menge und Nettopreis eingeben: `einvoice --create` erledigt
Rechnungsnummer, Berechnung, PDF/A-Erstellung, Einbettung des EN16931-XML und
technische Validierung. Das fertige ZUGFeRD/Factur-X-PDF kannst du direkt an eine
E-Mail anhängen. Alles läuft lokal.
`generate` kann jetzt Artefakt-Pfade für Automatisierung ausgeben:
## Direkt loslegen
- `--print-artifacts` → druckt Artefakt-Pfade zusätzlich nach dem OK-Panel
- `--print-artifacts-only` → druckt **nur** Pfade (je Zeile), ohne Rich-Output
- `--json` → druckt ein JSON-Objekt (ideal für CI)
## Beispiele
### CI/Script: JSON
```bash
jr-einvoice generate invoices/Rechnung_2026-0007_unicredit --json > artifacts.json
cat artifacts.json
```
### Script: Liste
```bash
jr-einvoice generate invoices/Rechnung_2026-0007_unicredit --print-artifacts-only
```
## Init quickstart
Auf diesem Rechner sind Python-Umgebung, Absenderdaten und Mustang eingerichtet.
```bash
INV_DIR=$(jr-einvoice init invoices --auto-folder -c unicredit -p "Beratung" --print-path-only)
jr-einvoice generate "$INV_DIR" --json
cd /home/johannes/localdev/einvoice
source .venv/bin/activate
einvoice --create \
--Customer "Meine Kundenfirma GmbH" \
--Entry "Geleistete Stunden Oktober 2026" \
--Volume 120 \
--Price "85,00 €"
```
Mehr: `Documentation.md`
Bei einem **neuen Kunden** fragt die Konsole einmalig Straße/Hausnummer, Postleitzahl
und Ort ab. Bei späteren Rechnungen genügt der gleiche Kundenname. Groß- und
Kleinschreibung sind beim Kundennamen gleichgültig. `einvoice --customers` listet
die gespeicherten Kunden samt Schlüssel auf. Es ist kein Standardkunde vorgewählt.
IDV ist ausschließlich ein historisches Beispiel aus früheren Rechnungen.
Der Preis ist **netto je Einheit**. Standard: Stunden (`HUR`), 19 % USt, heute als
Rechnungsdatum und 30 Tage Zahlungsziel. Im Beispiel entstehen 10.200,00 EUR netto,
1.938,00 EUR USt und **12.138,00 EUR brutto**. „Oktober 2026“ in der Beschreibung
wird als Leistungsmonat erkannt. Für Teilmonate/andere Leistungen `--Month` oder
`--ServiceDate` ausdrücklich setzen und die tatsächlichen Leistungsdaten verwenden.
```text
Rechnungsdaten vollständig: JR-2026-0001 · Meine Kundenfirma GmbH
PDF/A und strukturierte Rechnungsdaten werden erzeugt …
Rechnung validiert: PDF/A und EN16931-XML technisch gültig.
Rechnung erzeugt · Netto: 10.200,00 EUR · USt: 1.938,00 EUR · Brutto: 12.138,00 EUR
Leistung: 2026-10-01 bis 2026-10-31
PDF zum Anhängen an deine E-Mail:
…/Rechnung_JR-2026-0001_…/Rechnung_JR-2026-0001.pdf
Prüfbericht: …/out/validation/validate_report.xml
Vor Versand Leistungsdaten, Betrag und Empfänger prüfen.
```
**Die ausgegebene `Rechnung_<Nummer>.pdf` ist die vollständige E-Rechnung**, inklusive
XML. Direkt anhängen; nicht über einen PDF-Drucker neu drucken, weil dabei das XML
verloren gehen kann. Die Ausgabe bestätigt die erfolgreiche technische Prüfung.
Sie garantiert nicht pauschal die sachliche oder steuerliche Richtigkeit deiner
Eingaben. Details: [Rechtsstand und Grenzen](docs/e-rechnung-2027.md).
## Optionen für Alltag und Skripte
```bash
# Neue Kundenanschrift ohne Rückfragen übergeben:
einvoice --create --Customer "Neue Firma GmbH" \
--Street "Kundenstraße 12" --PostalCode 10115 --City Berlin \
--Email rechnung@empfaenger.example \
--Entry "IT-Beratung" --Volume "7,5" --Price "120,00 EUR" \
--ServiceDate 2026-10-15 --non-interactive
# Bekannter Kunde, expliziter Monat und Bestellbezug:
einvoice --create --Customer "Meine Kundenfirma GmbH" \
--Entry "Softwareentwicklung" --Volume 120 --Price "85,00 €" \
--Month 2026-10 --OrderReference "PO-12345" --DueDays 14
# Beispiel für eine Stückposition:
einvoice --create --Customer "Meine Kundenfirma GmbH" \
--Entry "Dokumentationspaket" --Volume 1 --Unit C62 --Price "500,00 €"
```
Weitere Optionen: `--Number`, `--Date`, `--Tax`, `--BuyerReference`, `--Country`,
`--VatId`, `--root`, `--json`. Alle Fachoptionen haben auch kleingeschriebene
Varianten (`--customer`, `--entry`, …); `einvoice --help` zeigt sie an.
`--json` liefert Artefaktpfade und den technischen Prüfstatus ohne Fragen.
Die Nummer lautet automatisch `JR-JJJJ-NNNN` und wird im Rechnungsstamm unter
Dateisperre vergeben. `--Number` setzt eine ausdrücklich gewählte freie Nummer.
Vorhandene PDF-Rechnungen außerhalb dieses Stamms werden nicht automatisch
eingelesen. Das Präfix JR trennt die neue Serie von früheren `JJJJ-MM`-Nummern.
Bei einem technischen Fehler bleibt der reservierte Entwurf samt Log zur Diagnose
erhalten; zum Wiederholen `jr-einvoice generate <Rechnungsordner>` verwenden.
## Daten und Einrichtung
- Absender: **johannes@jr-it-services.de**, lokale Vorlage `private/presets/seller.default.yaml`.
- Kunden: `private/presets/customers/`; neue Kunden werden dort mit geschützter Dateiberechtigung gespeichert.
- Rechnungen: `private/invoices/`, jeweils in einem eigenen geschützten Ordner.
- Eigenes Logo optional: `private/presets/logo.svg`, sonst mitgeliefertes JR-Logo.
- Persönliche Daten, Rechnungen und Ausgabeordner werden nicht mit Git veröffentlicht.
Andere Datenablage: `JR_EINVOICE_HOME=/absoluter/pfad`; nur die Vorlagen umleiten:
`JR_EINVOICE_PRESETS=/absoluter/pfad`. Nach Wheel-Installation ist der Standard
`~/.local/share/jr-einvoice/`. Bei einem frischen Checkout zuerst die vollständigen
eigenen Absender-/Zahlungsdaten lokal konfigurieren; `create` verwendet keine
versionierten Musteradressen als echte Geschäftsdaten.
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -e '.[pdf]'
jr-einvoice setup-mustang --version 2.26.0
```
Java und die WeasyPrint-Systembibliotheken müssen installiert sein; für Arch siehe
`scripts/arch_install.sh`. Die bisherigen `jr-einvoice`-Befehle bleiben verfügbar:
YAML-Entwürfe, mehrere Positionen, Neuerzeugung, Eingangskontrolle und optionaler
EML-Mailentwurf mit Absender aus den eigenen Stammdaten.
```bash
jr-einvoice email /pfad/zum/rechnungsordner --to rechnung@empfaenger.example
jr-einvoice validate /pfad/eingangsrechnung.xml --report private/eingang-pruefung.xml
python -m unittest discover -s tests -v
JR_EINVOICE_INTEGRATION=1 python -m unittest discover -s tests -v
```
Unterstützt werden normale positive EUR-Rechnungen mit positiver Umsatzsteuer.
Steuerbefreiungen/Kleinunternehmer, Reverse Charge, Gutschriften/Storno und
XRechnung-Ausgabe sind noch nicht implementiert. Archivierung, DATEV-/Peppol-
Anbindung und Versandnachweis bleiben im betrieblichen Ablauf. Nach dem Versand
PDF, strukturierte Daten, Prüfbericht und Versandnachweis gesichert aufbewahren.
[Ausführliche Dokumentation](Documentation.md) ·
[Rechtsstand und Abgleich mit der INTEGRA-Mail](docs/e-rechnung-2027.md)