Gutschriften Phase 3b/2: ZUGFeRD/Factur-X (hybrides PDF/A-3)

- zugferd.service.ts: CII-XML (EN 16931, urn:cen.eu:en16931:2017,
  Dokumenttyp 381 Gutschrift). Steuerkategorie S bei USt, sonst E mit
  Befreiungsgrund. Verkaeufer=Firma (CompanyProfile), Kaeufer=Kunde.
- zugferdPdf.service.ts: bettet factur-x.xml als AF /Data ein, setzt
  sRGB-OutputIntent + XMP (PDF/A-3B pdfaid + Factur-X-Extension-Schema)
  via pdf-lib.
- creditNotePdf: eingebettete DejaVuSans-Fonts (Pflicht fuer PDF/A)
  statt Standard-Helvetica; nach PDF-Erzeugung ZUGFeRD-Embedding.
- assets/fonts (DejaVuSans + Bold) + assets/icc (sRGB) ins Repo;
  Dockerfile kopiert backend/assets ins Runtime-Image.

Lokal strukturell verifiziert: 1 Seite, /AF, /Metadata, /OutputIntents,
EmbeddedFiles, Font eingebettet, XML wohlgeformt (xmllint), TypeCode
381, GrandTotal korrekt.

WICHTIG: vor Prod gegen einen ZUGFeRD-/Factur-X-Validator pruefen
(Staging + echte Firmendaten). Feinheiten (Trailer-ID, XMP, XML-MIME)
ggf. nach erstem Validator-Lauf nachziehen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-07 12:56:12 +02:00
co-authored by Claude Opus 4.8
parent 043bc173b7
commit 5423c83009
9 changed files with 348 additions and 11 deletions
+17 -4
View File
@@ -144,10 +144,23 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
Kunden des Vertrags gehört. PDF zeigt bei Überweisung „Unsere
Bankverbindung" + „an Bankkonto: <Kunden-IBAN>". Section-Zeile zeigt das
Auszahlungskonto.
- **Offen:** Phase 3b Teil 2 (ZUGFeRD-XML EN 16931, Typ 381, in PDF/A-3
einbetten **muss gegen ZUGFeRD-Validator** geprüft werden). USt-
Einordnung (Vermittlung vs. Abschlussbonus) mit Steuerberater klären
Modell deckt beide über `vatRelevant` ab.
- **Phase 3b Teil 2 (erledigt):** ZUGFeRD/Factur-X. `zugferd.service.ts`
erzeugt CII-XML (EN 16931 `urn:cen.eu:en16931:2017`, Typ **381**;
Kategorie S bei USt, sonst E + Befreiungsgrund). `zugferdPdf.service.ts`
bettet als hybrides **PDF/A-3B** ein: `factur-x.xml` (AF /Data), sRGB-
OutputIntent (pdfkit-ICC ins Repo kopiert), XMP (pdfaid part=3/conf=B +
Factur-X-Extension-Schema). PDF nutzt **eingebettete DejaVuSans-Fonts**
(im Repo unter `backend/assets/fonts`, Pflicht für PDF/A). Dockerfile
kopiert `backend/assets` ins Runtime-Image. Lokal strukturell verifiziert
(1 Seite, /AF, /Metadata, /OutputIntents, EmbeddedFiles, Font eingebettet,
XML wohlgeformt, TypeCode 381, GrandTotal korrekt).
- **⚠️ VOR PROD:** hybrides PDF gegen einen **ZUGFeRD-/Factur-X-Validator**
prüfen (am besten auf Staging mit echten Firmendaten). Feinheiten
(Trailer-ID, XMP-Details, MIME `text/xml` vs `application/xml`) ggf.
nach dem ersten Validator-Lauf nachziehen.
- **Offen (fachlich):** USt-Einordnung (Vermittlung vs. Abschlussbonus) mit
Steuerberater klären Modell/XML decken beide über `vatRelevant` ab.
ZUGFeRD-Semantik (Seller=Firma, Buyer=Kunde, Typ 381) ggf. anpassen.
- [x] **📄➕ Vertrag kopieren (neuer eigenständiger Vertrag aus Vorlage)** (2026-08-03)
- „Kopieren"-Button in der Vertragsansicht (`contracts:create`) → öffnet das