What's Changed
🧾 Refund-aware budgets
MoneyMatter now treats refunds the way you'd expect them inside a budget. Income, expense totals, and the statistics on a budget's detail page no longer double-count refunded amounts – a returned purchase cancels itself out instead of inflating both sides of the ledger.
🐛 Bug Fixes
- Widened all cents columns to 64-bit integers so balances above ~$21M and low-unit currencies like IDR and VND no longer overflow and break amount display.
- Fixed a crash when deleting an investment transaction whose currency had been disconnected from regular accounts – the currency is now re-linked on the fly and disconnecting a currency that still backs holdings is blocked up front.
- Backfilled and enforced the base-currency stamp on portfolio-transfer transactions, restoring multi-currency reporting and aggregations that were silently broken for those rows.
🛠️ Other Improvements
- Migrated user-data entity IDs (28 tables) from integers to UUID v7. No user-visible change today; this is the groundwork for safer multi-device sync and reduces the chance of ID collisions as the dataset grows.
- Exchange-rate records now track which provider supplied the rate, giving us better visibility when a fallback provider kicks in.
📝 Code Changes
- fix(budgets): Exclude refunds from budget's income, expense, and statistics by @letehaha in #268
- feat: track provider source on exchange rates by @letehaha in #267
- fix: populate refCurrencyCode for portfolio-transfer transactions by @letehaha in #266
- fix: orphan-currency on investment tx delete by @letehaha in #265
- fix: widen cents columns to BIGINT to prevent integer overflow by @letehaha in #264
- feat(db): migrate user-data entity IDs from integer to UUID v7 by @letehaha in #263
Full Changelog: v0.15.1...v0.15.2