mirror of
https://github.com/escalante29/WealthySmart.git
synced 2026-07-17 12:28:48 +02:00
Show net total of listed transactions above the table
Compras minus devoluciones, one figure per currency, excluding Tasa Cero anchors (their cuotas are what count). Tooltip explains the math. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -194,6 +194,22 @@ export default function TransactionList({
|
|||||||
: transactions;
|
: transactions;
|
||||||
const empty = visibleTransactions.length === 0 && !loading;
|
const empty = visibleTransactions.length === 0 && !loading;
|
||||||
|
|
||||||
|
// Net spend of the listed transactions per currency: COMPRA − DEVOLUCION,
|
||||||
|
// excluding Tasa Cero anchors (their cuotas are what count in the budget).
|
||||||
|
const totalsByCurrency = useMemo(() => {
|
||||||
|
const totals = new Map<string, number>();
|
||||||
|
for (const tx of visibleTransactions) {
|
||||||
|
if (tx.is_installment_anchor) continue;
|
||||||
|
if (tx.transaction_type !== 'COMPRA' && tx.transaction_type !== 'DEVOLUCION') continue;
|
||||||
|
const sign = tx.transaction_type === 'DEVOLUCION' ? -1 : 1;
|
||||||
|
totals.set(tx.currency, (totals.get(tx.currency) ?? 0) + sign * tx.amount);
|
||||||
|
}
|
||||||
|
// CRC first, then the rest alphabetically
|
||||||
|
return [...totals.entries()].sort(([a], [b]) =>
|
||||||
|
a === 'CRC' ? -1 : b === 'CRC' ? 1 : a.localeCompare(b),
|
||||||
|
);
|
||||||
|
}, [visibleTransactions]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/* Search + Add */}
|
{/* Search + Add */}
|
||||||
@@ -213,6 +229,25 @@ export default function TransactionList({
|
|||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Total of the listed transactions */}
|
||||||
|
{totalsByCurrency.length > 0 && (
|
||||||
|
<div
|
||||||
|
className="flex items-center justify-end gap-1.5 text-sm text-muted-foreground"
|
||||||
|
title="Compras menos devoluciones de las transacciones listadas. Excluye compras convertidas a Tasa Cero (cuentan sus cuotas)."
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
{visibleTransactions.length} transaccion{visibleTransactions.length === 1 ? '' : 'es'} · Total:
|
||||||
|
</span>
|
||||||
|
{totalsByCurrency.map(([currency, net], i) => (
|
||||||
|
<span key={currency} data-sensitive className="font-mono font-semibold text-foreground">
|
||||||
|
{i > 0 && <span className="text-muted-foreground font-normal mr-1.5">+</span>}
|
||||||
|
{net < 0 ? '+' : ''}
|
||||||
|
{formatAmount(net, currency)}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Bulk action bar */}
|
{/* Bulk action bar */}
|
||||||
{selected.size > 0 && (
|
{selected.size > 0 && (
|
||||||
<div className="hidden md:flex items-center gap-2 rounded-lg border bg-muted/40 px-3 py-2">
|
<div className="hidden md:flex items-center gap-2 rounded-lg border bg-muted/40 px-3 py-2">
|
||||||
|
|||||||
Reference in New Issue
Block a user