Move Netto below the MwSt annotation, not above it
Validate e-invoices / mustang (push) Successful in 20s
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:
@@ -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
@@ -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}>
|
||||
|
||||
Reference in New Issue
Block a user