You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,3 +1,7 @@
1
+
### 3.15.2: 2026-07-11
2
+
3
+
* Fix the budget claiming more money to allocate than the accounts actually hold once a transaction was excluded: exclusion pulled the cost out of both the category and Ready to Assign, so money that had really left the account was absorbed nowhere. `budget_excluded` now only hides a transaction from spending reports (cash flow, trends, heatmap, burn rate, today's spent, month expenses); the category it is filed under still absorbs the cost and Ready to Assign stays untouched, so the accounts and the budget reconcile again
4
+
1
5
### 3.15.1: 2026-07-11
2
6
3
7
* Keep the daily budget on real cash balances for excluded transactions instead of adding the excluded amount back: excluding a transaction still drops it from spending, category and cash-flow reporting and holds Ready to Assign steady, but no longer inflates the spendable pool (which double-counted money that moved in from an excluded account)
"SELECT COALESCE(SUM(amount), 0) AS v FROM transactions WHERE amount > 0 AND (category = 'Inflow: Ready to Assign' OR category LIKE 'Inflow%') AND date >= ? AND date <= ? AND "+NOT_BUDGET_EXCLUDED
57
+
"SELECT COALESCE(SUM(amount), 0) AS v FROM transactions WHERE amount > 0 AND (category = 'Inflow: Ready to Assign' OR category LIKE 'Inflow%') AND date >= ? AND date <= ?"
58
58
)
59
59
.get(start,end)as{v: number}).v||0;
60
60
}
@@ -235,15 +235,8 @@ export function monthBudgetNumbers(
235
235
// in any category. Reconciling against balances surfaces that money as assignable. Past and future
236
236
// months keep the carry-forward, since account balances are only meaningful for "now".
// Budgetable on-budget balance = real balance minus the net of budget-excluded transactions on
239
-
// on-budget accounts. An excluded outflow dropped the real balance but was pulled out of category
240
-
// activity, so without this its cost would silently fall onto Ready to Assign (breaking the golden
241
-
// equation). Netting it back keeps RTA and every category available consistent.
242
238
constonBudget=(db.prepare("SELECT COALESCE(SUM(balance), 0) AS v FROM ynab_accounts WHERE on_budget = 1 AND closed = 0").get()as{v: number}).v||0;
243
-
constexcludedNet=(db.prepare(
244
-
"SELECT COALESCE(SUM(t.amount), 0) AS v FROM transactions t JOIN ynab_accounts a ON a.id = t.account_id WHERE a.on_budget = 1 AND a.closed = 0 AND COALESCE(t.budget_excluded, 0) = 1"
0 commit comments