Add Kleinunternehmerregelung (§19 UStG) support
Validate e-invoices / mustang (push) Successful in 43s

InvoiceOrder/CorrectionInvoiceOrder gain an optional order-level
kleinunternehmer flag, snapshotted per order (same pattern as vatExempt)
so a later toggle of the tenant's setting never rewrites an
already-issued invoice. Takes precedence over vatExempt.

- Visual PDF: "enthält X% MwSt." becomes the §19 UStG notice.
- E-invoice XML: new UNTDID 5305 category "E" with a free-text exemption
  reason (no VATEX code — §19 UStG has none, BR-E-10 allows text alone).
- New Mustang CI fixture + buildEInvoiceData unit test for the "E" path.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Marco
2026-07-24 12:51:13 +00:00
parent c28ceb7bd3
commit 51ae8a9c0a
7 changed files with 202 additions and 38 deletions
+13 -1
View File
@@ -156,6 +156,16 @@ export type InvoiceOrder = {
// figures) — this flag only controls the exemption note shown here,
// it doesn't itself change any arithmetic in this file.
vatExempt?: boolean;
// Kleinunternehmerregelung (§19 UStG) — snapshotted per order at checkout
// time (frontend's api/checkout/route.ts, from the seller's own
// company-settings.kleinunternehmer), never read live off the seller at
// render time: an invoice already issued must keep showing the tax
// treatment that actually applied at the moment of sale, even if the
// tenant later toggles this setting on/off. Takes precedence over
// vatExempt below when both would otherwise apply — a Kleinunternehmer
// never charges VAT in the first place, so there is nothing left to
// "exempt" via the separate intra-community rule.
kleinunternehmer?: boolean;
deliveryMethod: "address" | "packstation";
street?: string | null;
packstationNumber?: string | null;
@@ -394,7 +404,9 @@ export function InvoiceDocument({ order, seller }: { order: InvoiceOrder; seller
made it read as if Netto were what contained the tax,
which is backwards (Netto is the figure with tax
already taken out). */}
{order.vatExempt ? (
{order.kleinunternehmer ? (
<Text style={styles.vatNoteLabel}>Gemäß § 19 UStG wird keine Umsatzsteuer berechnet.</Text>
) : order.vatExempt ? (
<Text style={styles.vatNoteLabel}>Steuerfreie innergemeinschaftliche Lieferung (§4 Nr. 1b UStG)</Text>
) : (
rateGroups.map((g) => (