The core entities behind Wealthview's three domains, as specified in PROJECT.md (§ Data Model). Everything is tenant-scoped: tenant_id appears on every aggregate root, and multi-tenancy is row-level within one PostgreSQL database.
tenants — the isolation unit (a household)users — belong to a tenant; role is one of admin, member, viewerinvite_codes — registration is invite-driven: unique codes with creator, consumer, and expiryaccounts — type ∈ brokerage, ira, 401k, roth, bank; carries institutionholdings — symbol, quantity, cost basis, is_manual_override, as_of_date; holdings are computed from transactions with manual override as the escape hatchtransactions — type ∈ buy, sell, dividend, deposit, withdrawalprices — per-symbol daily close cache, source ∈ manual, finnhubStock splits are auto-detected: a daily Finnhub sync (StockSplitSyncService) plus a one-time backfill keep transactions, holdings, and historical prices split-adjusted; manual entry/un-apply lives under /api/v1/admin/stock-splits (see docs/operations/stock-splits.md).
properties — purchase price/date, current value, mortgage balanceproperty_income — category ∈ rent, otherproperty_expenses — category ∈ mortgage, tax, insurance, maintenance, capex, hoa, mgmt_feeprojection_scenarios — named what-if runs: retirement date, end age, inflation rate, free-form params_jsonprojection_accounts — per-scenario account assumptions: initial balance, annual contribution, expected return; optionally linked to a real accountimport_jobs — source ∈ csv, ofx, manual, with status and error capture; the import pipeline lives in the wealthview-import module