feat: add month breakdown and session backups
Continuous Integration / lint-and-test (push) Successful in 17s
Continuous Integration / docker-build-and-push (push) Successful in 35s

Allow recurring costs and confirmations to remain unassigned when created from a purchase without a post. Add browser backup retention and restore controls, with coverage and documentation updates.
This commit is contained in:
Lucas Winther committed 2026-10-01 04:01:49 +02:00
1 parent 019517e6e9
commit 7cccd7a41a
32 files changed
+640 -41

No files matched your search

+8
View File
@@ -20,6 +20,10 @@ record.
ordered migration functions applied on load, because IndexedDB holds the
user's only copy of their financial data. Now at version 11.
→ [`specs/2026-09-01-budget-app-design.md`](specs/2026-09-01-budget-app-design.md)
- **Session backups live in browser storage.** Each app start saves a checkpoint
before editing is available; 7 daily, 8 weekly and 12 monthly checkpoints
are retained. Chosen for automatic operation, with manual JSON export still
needed for browser-storage loss. → [`ARCHITECTURE.md`](ARCHITECTURE.md)
- **A destructive write downloads a backup first.** Import and reset both export
before replacing, and abort if the export fails. → commit `ac3d18a`
- **Reset restores first-run state, not an empty dataset.** The seed posts, the
@@ -85,6 +89,10 @@ record.
## Recurring costs
- **A recurring cost may have no post.** It still appears as due, while no
envelope projection moves; confirming it records an unassigned purchase.
This lets the purchase dialog turn an unassigned charge into a bill without
inventing a destination. → [`ARCHITECTURE.md`](ARCHITECTURE.md)
- **Two-stage confirmation, over projection-only or generation-only.** A
recurring cost projects expected occurrences that stay expected until the
owner confirms one into an ordinary `Purchase`. Projection-only would charge