$ba; if ($cmp !== 0) { return $cmp; } return strcmp((string) ($a['name'] ?? ''), (string) ($b['name'] ?? '')); }); $nameById = []; foreach ($people as $p) { if (!empty($p['id'])) { $nameById[(string) $p['id']] = (string) ($p['name'] ?? ''); } } $expenses = normalizeExpensesList(readJsonFile('expenses.json')); usort($expenses, static function ($a, $b) { $da = (string) ($a['date'] ?? ''); $db = (string) ($b['date'] ?? ''); if ($db !== $da) { return strcmp($db, $da); } return strcmp((string) ($b['created_at'] ?? ''), (string) ($a['created_at'] ?? '')); }); $recentExpenses = array_slice($expenses, 0, 50); $today = gmdate('Y-m-d'); $currentMonth = gmdate('Y-m'); $bankRows = readJsonFile('bank_transactions.json'); if (!is_array($bankRows)) { $bankRows = []; } usort($bankRows, static function ($a, $b) { return strcmp((string) ($b['created_at'] ?? ''), (string) ($a['created_at'] ?? '')); }); $recentBank = array_slice($bankRows, 0, 80); $donatedByPersonThisMonth = []; foreach ($bankRows as $row) { if (!is_array($row)) { continue; } if ((string) ($row['type'] ?? '') !== 'charity_outflow') { continue; } $dateYmd = bankingYmd((string) ($row['created_at'] ?? '')); if (strpos($dateYmd, $currentMonth . '-') !== 0) { continue; } $pid = (string) ($row['person_id'] ?? ''); if ($pid === '') { continue; } $donatedByPersonThisMonth[$pid] = ($donatedByPersonThisMonth[$pid] ?? 0) + (float) ($row['amount'] ?? 0); } ?>

Leaderboard and expenses use the family currency from Family settings.

Leaderboard

Add people in Family settings to see balances.

$p): ?> 0 ? (int) max(0, min(100, round(($donatedThisMonth / $goal) * 100))) : 0; $isSelf = $activePerson && ($activePerson['id'] ?? '') === $pid; ?>
# Name Checking Savings Charity pending Donated total Donation goal progress Balance
You 0): ?>
/
No goal set
Move your funds
Monthly donation goal
HoH checking credit/debit
HoH charity outflow
Record expense

Deducts from one person’s balance (e.g. spent allowance). Requires enough balance.

0): ?>

Switch to a verified Head of household to record expenses.

No bank transactions recorded yet.

No expenses recorded yet.

Date Person Type Category Note Amount Date Title To Amount
−
Monthly statements

Download your monthly statement as JSON or CSV.