feat: create validated ZUGFeRD invoices in one console command
This commit is contained in:
1 parent
e0c15fc7f2
commit
a643cf5227
30 files changed
+1509
-207
No files matched your search
@@ -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)
|
||||
Reference in new issue
Block a user