From e69be7f3d5ef77aea2a11d712c1604a0b6b3c750 Mon Sep 17 00:00:00 2001 From: Guido Date: Fri, 21 Aug 2026 07:01:04 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20negative=20Kontost=C3=A4nde=20werden=20n?= =?UTF-8?q?icht=20mehr=20als=20positiv=20angezeigt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Money-Komponente gab den Betrag immer durch Math.abs() aus; das Vorzeichen kam nur über das optionale sign-Prop. Kontostände (Konten-Seite und Dashboard- Karte) übergeben keines – ein überzogenes Konto oder eine Kreditkartenschuld sah dadurch positiv aus, während die Gesamtsumme korrekt negativ rechnete. Genau dieser Widerspruch: alle Konten scheinbar im Plus, Gesamt im Minus. Ohne sign steht der Wert für sich selbst und wird jetzt mit echtem Vorzeichen (und rot) ausgegeben; mit sign bleibt es wie bisher, weil dort die Richtung aus der Buchungsart kommt. Co-Authored-By: Claude Opus 4.8 --- web/src/components/Money.jsx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/web/src/components/Money.jsx b/web/src/components/Money.jsx index 5138311..14cdd50 100644 --- a/web/src/components/Money.jsx +++ b/web/src/components/Money.jsx @@ -1,7 +1,14 @@ import { formatMoney } from "../format"; // Zeigt einen Betrag in Kontowährung und – falls abweichend – zusätzlich den in -// die Hauptwährung umgerechneten Wert. `sign` färbt +/− (grün/rot). +// die Hauptwährung umgerechneten Wert. +// +// `sign` ist für Listen gedacht, in denen die Richtung aus der Buchungsart kommt +// (Ausgabe/Einnahme): dort wird der Betrag ohne Vorzeichen geführt und hier mit +// +/− und Farbe versehen. OHNE `sign` steht der Wert für sich selbst – etwa ein +// Kontostand – und wird mit seinem echten Vorzeichen ausgegeben. Früher lief er +// auch dann durch Math.abs(), wodurch ein überzogenes Konto oder eine +// Kreditkartenschuld fälschlich positiv aussah. export default function Money({ cents, currency = "EUR", @@ -10,7 +17,8 @@ export default function Money({ sign = null, // "pos" | "neg" | null showConverted = true, }) { - const cls = sign ? `amount ${sign}` : "amount"; + const negativ = !sign && Number(cents) < 0; + const cls = sign ? `amount ${sign}` : negativ ? "amount neg" : "amount"; const prefix = sign === "pos" ? "+" : sign === "neg" ? "−" : ""; const showBase = showConverted && baseCents != null && currency !== baseCurrency; @@ -18,10 +26,12 @@ export default function Money({ {prefix} - {formatMoney(Math.abs(cents), currency)} + {formatMoney(sign ? Math.abs(cents) : cents, currency)} {showBase && ( - ≈ {formatMoney(Math.abs(baseCents), baseCurrency)} + + ≈ {formatMoney(sign ? Math.abs(baseCents) : baseCents, baseCurrency)} + )} );