$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.