[PR #5554] [MERGED] Add Crossover Report #5994

Closed
opened 2026-02-28 21:22:13 -06:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/actualbudget/actual/pull/5554
Author: @sjones512
Created: 8/14/2025
Status: Merged
Merged: 11/7/2025
Merged by: @youngcw

Base: masterHead: feat/add-crossover-report


📝 Commits (10+)

  • 5d850c2 Add Crossover Report
  • 14a79fb Fix lint and typecheck
  • 6dc62ad Use useFormat hook for formatting, make spreadsheet always return cents
  • d3cd1f1 Change defaults to all categories and accounts. Return 0 when no categories selected
  • bb2652c Change error handling to use addNotification
  • de9c712 Detect if crossover has already happened before projecting
  • 5e5b66e [autofix.ci] apply automated fixes
  • d8131c4 lint:fix. Only get first crossoverIdx
  • 444ccd2 Annualize historical return via compounding, not multiplication
  • 53b120a Optional guard in median helper for future-proofing

📊 Changes

13 files changed (+2175 additions, -0 deletions)

View changed files

packages/desktop-client/src/components/reports/AccountSelector.tsx (+421 -0)
📝 packages/desktop-client/src/components/reports/Overview.tsx (+20 -0)
📝 packages/desktop-client/src/components/reports/ReportRouter.tsx (+11 -0)
packages/desktop-client/src/components/reports/graphs/CrossoverGraph.tsx (+195 -0)
packages/desktop-client/src/components/reports/reports/Crossover.tsx (+848 -0)
packages/desktop-client/src/components/reports/reports/CrossoverCard.tsx (+240 -0)
packages/desktop-client/src/components/reports/spreadsheets/crossover-spreadsheet.ts (+410 -0)
📝 packages/desktop-client/src/components/settings/Experimental.tsx (+7 -0)
📝 packages/desktop-client/src/hooks/useFeatureFlag.ts (+1 -0)
📝 packages/loot-core/src/server/dashboard/app.ts (+1 -0)
📝 packages/loot-core/src/types/models/dashboard.ts (+14 -0)
📝 packages/loot-core/src/types/prefs.ts (+1 -0)
upcoming-release-notes/5554.md (+6 -0)

📄 Description

This pull request adds a Crossover Point report for projecting when income from investments may be sufficient to cover expenses.

Selected categories are used as expenses and then forecast into the future.
Selected account balances are treated as investments and similarly forecast into the future using a configurable annual rate of return.
A configurable "Safe Withdrawal Rate" is used to determine how much income the investment accounts provide monthly.
The report projects out until the Projected Income exceeds the Projected Expenses or 50 years, whichever comes first.

image image

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/actualbudget/actual/pull/5554 **Author:** [@sjones512](https://github.com/sjones512) **Created:** 8/14/2025 **Status:** ✅ Merged **Merged:** 11/7/2025 **Merged by:** [@youngcw](https://github.com/youngcw) **Base:** `master` ← **Head:** `feat/add-crossover-report` --- ### 📝 Commits (10+) - [`5d850c2`](https://github.com/actualbudget/actual/commit/5d850c2908b8b12f532df69ac14825c03a7faa94) Add Crossover Report - [`14a79fb`](https://github.com/actualbudget/actual/commit/14a79fb55c56bdc38661e2cbb09eb90c05b8ef87) Fix lint and typecheck - [`6dc62ad`](https://github.com/actualbudget/actual/commit/6dc62ad4432c2b73451b17f06f78b249d5a17eaf) Use useFormat hook for formatting, make spreadsheet always return cents - [`d3cd1f1`](https://github.com/actualbudget/actual/commit/d3cd1f1f6ad32aa852f6383c4a4da12851ad960d) Change defaults to all categories and accounts. Return 0 when no categories selected - [`bb2652c`](https://github.com/actualbudget/actual/commit/bb2652cf3e91e1490eeb7d1212ac6aa840116661) Change error handling to use addNotification - [`de9c712`](https://github.com/actualbudget/actual/commit/de9c7122b9105f97b7b84a716d9c9cb6c6ebf2af) Detect if crossover has already happened before projecting - [`5e5b66e`](https://github.com/actualbudget/actual/commit/5e5b66ee3fe76a0bfd156d6b9bdc6ebf96d9e6d4) [autofix.ci] apply automated fixes - [`d8131c4`](https://github.com/actualbudget/actual/commit/d8131c4eb455d3172f865e8ab52402df04e498ce) lint:fix. Only get first crossoverIdx - [`444ccd2`](https://github.com/actualbudget/actual/commit/444ccd2ef113e7fe08547f4304043882bdeda9a2) Annualize historical return via compounding, not multiplication - [`53b120a`](https://github.com/actualbudget/actual/commit/53b120a322428cd62d80b8988c144df19c2ddc7d) Optional guard in median helper for future-proofing ### 📊 Changes **13 files changed** (+2175 additions, -0 deletions) <details> <summary>View changed files</summary> ➕ `packages/desktop-client/src/components/reports/AccountSelector.tsx` (+421 -0) 📝 `packages/desktop-client/src/components/reports/Overview.tsx` (+20 -0) 📝 `packages/desktop-client/src/components/reports/ReportRouter.tsx` (+11 -0) ➕ `packages/desktop-client/src/components/reports/graphs/CrossoverGraph.tsx` (+195 -0) ➕ `packages/desktop-client/src/components/reports/reports/Crossover.tsx` (+848 -0) ➕ `packages/desktop-client/src/components/reports/reports/CrossoverCard.tsx` (+240 -0) ➕ `packages/desktop-client/src/components/reports/spreadsheets/crossover-spreadsheet.ts` (+410 -0) 📝 `packages/desktop-client/src/components/settings/Experimental.tsx` (+7 -0) 📝 `packages/desktop-client/src/hooks/useFeatureFlag.ts` (+1 -0) 📝 `packages/loot-core/src/server/dashboard/app.ts` (+1 -0) 📝 `packages/loot-core/src/types/models/dashboard.ts` (+14 -0) 📝 `packages/loot-core/src/types/prefs.ts` (+1 -0) ➕ `upcoming-release-notes/5554.md` (+6 -0) </details> ### 📄 Description <!-- Thank you for submitting a pull request! Make sure to follow the instructions to write release notes for your PR — it should only take a minute or two: https://github.com/actualbudget/docs#writing-good-release-notes. Try running yarn generate:release-notes *before* pushing your PR for an interactive experience. --> This pull request adds a Crossover Point report for projecting when income from investments may be sufficient to cover expenses. Selected categories are used as expenses and then forecast into the future. Selected account balances are treated as investments and similarly forecast into the future using a configurable annual rate of return. A configurable "Safe Withdrawal Rate" is used to determine how much income the investment accounts provide monthly. The report projects out until the Projected Income exceeds the Projected Expenses or 50 years, whichever comes first. <img width="1921" height="1005" alt="image" src="https://github.com/user-attachments/assets/86a63f41-0537-4abf-b998-7c6ffcae9e38" /> <img width="1668" height="501" alt="image" src="https://github.com/user-attachments/assets/100b8b13-ab46-431b-8466-e9e4a9a401b9" /> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-02-28 21:22:13 -06:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#5994