Move Netto below the MwSt annotation, not above it
Validate e-invoices / mustang (push) Successful in 20s

Order was Gesamt → Netto → "enthält X% MwSt." — reads as if the
annotation describes Netto, which is backwards: Netto already has the
tax removed, Gesamt is what contains it. Reordered to Gesamt →
"enthält X% MwSt." → Netto so the annotation stays unambiguously
attached to the row it actually describes. Verified by re-rendering
and visually inspecting both the original invoice and a Storno.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Marco
2026-07-23 21:26:51 +00:00
parent 70c39f8b3a
commit 3922ea12e1
2 changed files with 35 additions and 23 deletions
+13 -9
View File
@@ -337,15 +337,10 @@ function CorrectionInvoiceDocument({ kind, order, seller }: { kind: CorrectionIn
<Text style={styles.grandTotalLabel}>Gesamt</Text>
<Text style={styles.grandTotalValue}>-{formatPrice(grandTotal)}</Text>
</View>
{/* Netto — same reasoning as invoicePdf.tsx's own row: a
single well-defined figure (Gesamt minus every rate's own
tax, summed) regardless of how many rates are present.
Shown on every correction invoice (Storno and Gutschrift
alike), not just non-exempt ones. */}
<View style={styles.nettoRow}>
<Text style={styles.summaryLabel}>Netto</Text>
<Text style={styles.summaryValue}>-{formatPrice(rateGroups.reduce((sum, g) => sum + g.net, 0))}</Text>
</View>
{/* Kept directly under Gesamt (not after Netto) — same
ordering fix as invoicePdf.tsx: "enthält X% MwSt."
describes Gesamt, not Netto (which has the tax already
taken out), so it must not read as attached to Netto. */}
<View style={styles.vatNotes}>
{order.vatExempt ? (
<Text style={styles.vatNoteLabel}>Steuerfreie innergemeinschaftliche Lieferung (§4 Nr. 1b UStG)</Text>
@@ -358,6 +353,15 @@ function CorrectionInvoiceDocument({ kind, order, seller }: { kind: CorrectionIn
))
)}
</View>
{/* Netto — same reasoning as invoicePdf.tsx's own row: a
single well-defined figure (Gesamt minus every rate's own
tax, summed) regardless of how many rates are present.
Shown on every correction invoice (Storno and Gutschrift
alike), not just non-exempt ones. */}
<View style={styles.nettoRow}>
<Text style={styles.summaryLabel}>Netto</Text>
<Text style={styles.summaryValue}>-{formatPrice(rateGroups.reduce((sum, g) => sum + g.net, 0))}</Text>
</View>
</View>
</View>
</View>
+22 -14
View File
@@ -383,25 +383,17 @@ export function InvoiceDocument({ order, seller }: { order: InvoiceOrder; seller
<Text style={styles.grandTotalLabel}>Gesamt</Text>
<Text style={styles.grandTotalValue}>{formatPrice(order.total)}</Text>
</View>
{/* Netto (Gesamt minus every rate's own tax, summed — a
single well-defined figure regardless of how many
distinct rates the order actually has) — businesses read
this off the invoice directly for their own input-tax
deduction instead of having to compute Gesamt minus MwSt
by hand. Shown on every invoice, not just B2B/non-exempt
ones — on a vatExempt order Netto and Gesamt happen to be
the same figure (0% tax), but the row stays for layout
consistency across every invoice this shop issues. */}
<View style={styles.nettoRow}>
<Text style={styles.summaryLabel}>Netto</Text>
<Text style={styles.summaryValue}>{formatPrice(rateGroups.reduce((sum, g) => sum + g.net, 0))}</Text>
</View>
<View style={styles.vatNotes}>
{/* Exempt orders already have every item at 0% (see this
file's own InvoiceOrder.vatExempt comment) — "enthält
0% MwSt.: 0,00 €" would be a meaningless thing to print,
so this replaces the whole per-rate breakdown with the
actual legal basis instead. */}
actual legal basis instead. Kept directly under Gesamt
(not after Netto) — "enthält X% MwSt." describes what's
contained in Gesamt; sandwiching Netto between the two
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 ? (
<Text style={styles.vatNoteLabel}>Steuerfreie innergemeinschaftliche Lieferung (§4 Nr. 1b UStG)</Text>
) : (
@@ -413,6 +405,22 @@ export function InvoiceDocument({ order, seller }: { order: InvoiceOrder; seller
))
)}
</View>
{/* Netto (Gesamt minus every rate's own tax, summed — a
single well-defined figure regardless of how many
distinct rates the order actually has) — businesses read
this off the invoice directly for their own input-tax
deduction instead of having to compute Gesamt minus MwSt
by hand. Shown on every invoice, not just B2B/non-exempt
ones — on a vatExempt order Netto and Gesamt happen to be
the same figure (0% tax), but the row stays for layout
consistency across every invoice this shop issues. Placed
last (after the MwSt annotation, not before it) — see
that annotation's own comment above for why the order
matters here. */}
<View style={styles.nettoRow}>
<Text style={styles.summaryLabel}>Netto</Text>
<Text style={styles.summaryValue}>{formatPrice(rateGroups.reduce((sum, g) => sum + g.net, 0))}</Text>
</View>
</View>
{paid && (
<View style={styles.paidBadgeRow}>