Private
Public Access
1
0
Commit Graph

65 Commits

Author SHA1 Message Date
Catherine Renelle 24839a3a21 Add 7-day sync overlap buffer and improve empty investments state
SimpleFIN sync now looks back 7 days from last sync to catch
retroactively posted transactions. Investments page shows account
balance instead of $0 summary cards when no holdings exist.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 23:16:28 -05:00
Catherine Renelle e9ad7c0248 Group accounts by Assets and Liabilities with section totals
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:52:53 -05:00
Catherine Renelle 5537945276 Organize nav menu into grouped sections with dividers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:50:39 -05:00
Catherine Renelle 81d7337ce8 Make account cards equal height with bottom-aligned actions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:47:32 -05:00
Catherine Renelle ab335dac55 Add warm neutral background to light theme
Set light theme background to warm cream (#F5F3EF) with white cards,
softer text (#2C2C2C), and a surface variant (#EDE9E3) to eliminate
the flat all-white appearance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:16:07 -05:00
Catherine Renelle e83cb582a7 Fix pie chart highlight by directly dimming non-hovered slices
Replace toggleDataPointSelection with direct SVG opacity manipulation
for reliable visual feedback when hovering legend or table rows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 21:50:43 -05:00
Catherine Renelle 7a333a1705 Replace built-in chart legend with custom legend for reliable hover sync
ApexCharts legendMouseOver event is unreliable for donut charts. Use custom
HTML legend items with direct mouseenter/mouseleave handlers that sync
highlighting between legend, chart slices, and the category table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 21:30:22 -05:00
Catherine Renelle 1df5283188 Fix legend hover not highlighting table row
legendMouseOver receives (chartContext, config), not three parameters.
The extra parameter was shifting config to undefined.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 21:23:30 -05:00
Catherine Renelle fcffdce6d8 Fix payee action buttons layout and chart tooltip hover highlight
Place edit and delete buttons side by side in payees table using flex.
Debounce chart highlight clear to persist during tooltip hover transitions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 21:10:17 -05:00
Catherine Renelle 94049c08a8 Highlight table row when hovering spending chart legend items
Add legendMouseOver/legendMouseOut events to sync legend hover
with the category table highlighting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 19:57:54 -05:00
Catherine Renelle f3211b7ee7 Add global multi-account filter to all reports with chart hover interaction
Move account selector to date range bar and apply filtering to all four
report types. Add bidirectional hover highlighting between spending donut
chart and category table. Fix donut data label readability with white text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 18:15:46 -05:00
Catherine Renelle 63a58b10c0 Default reports to This Month, add Last Month preset, fix chart theme colors
Change default date range from Last 3 Months to This Month. Add Last Month
option. Apply theme-aware colors to chart axis labels, legends, and data
labels so they're readable in both light and dark modes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 17:26:36 -05:00
Catherine Renelle dc4fd692ba Limit dashboard spending to top 10 categories and fix nav double-highlight
Show top 10 categories in spending breakdown with label indicating the limit.
Fix account-scoped transactions highlighting both Accounts and Transactions
nav items by excluding sub-route match when account-transactions is active.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 15:59:27 -05:00
Catherine Renelle e2b69b41f4 Show current month's payment in amortization schedule
Filter from start of current month instead of today so the current
month's entry is always visible even mid-month.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:35:53 -05:00
Catherine Renelle 0392fc4690 Use daily per-diem for payoff calculation and rename dashboard bills section
Payoff quotes always use daily per-diem interest (rate/365 × days) regardless
of loan type. Rename "Upcoming Bills" to "Upcoming Transactions" on dashboard.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:32:01 -05:00
Catherine Renelle f148b35ab2 Add payoff amount, fix dialog overlay and nav highlight for sub-routes
- Show estimated payoff amount (balance + accrued interest) in loan summary
- Display loan balances as absolute values in red
- Fix dialog overlay blocking UI after edit by closing in finally with nextTick
- Highlight parent nav item when viewing sub-routes (e.g. /loans/:id)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:12:50 -05:00
Catherine Renelle d28faa6838 Hide past payments in amortization schedule by default
Add toggle button to show/hide past payments. Future payments are shown
by default since past entries are rarely useful for day-to-day viewing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 22:00:15 -05:00
Catherine Renelle 1b06894383 Use daily interest accrual for lines of credit and auto loans, fix hasLoanDetail on account list
Lines of credit and auto loans use daily accrual (rate/365 × days) matching
actual bank calculations. Mortgages and personal loans keep monthly compounding.
Include LoanDetail in GetAllAsync so the loan cards correctly show status.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 20:47:14 -05:00
Catherine Renelle 47010e5f55 Use standard monthly compounding for all loan types
Daily accrual made HELOC estimates worse due to front-loaded 31-day
months. Revert to rate/12 for all types - it's the standard amortization
method and works well for mortgages and personal loans. For HELOCs and
auto loans, differences from bank statements are typically due to
variable rates, extra payments, or daily billing conventions that a
fixed amortization schedule cannot capture.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 20:10:18 -05:00
Catherine Renelle dd2cdbf815 Use daily interest accrual for HELOC and auto loan amortization
Mortgages and personal loans use monthly compounding (rate/12), but
HELOCs and auto loans accrue interest daily (rate/365 * actual days).
Select the calculation method based on account type and update the
disclaimer to reflect which method is being used.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 18:41:32 -05:00
Catherine Renelle 98104c0c0e Add estimation disclaimer to loan amortization view
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 17:36:46 -05:00
Catherine Renelle 428e18bb41 Fix date display timezone shift and revert to standard monthly interest
formatDate was parsing UTC timestamps in local time, shifting dates
back a day in western timezones. Strip the time portion before parsing
so dates display correctly.

Revert interest calculation from daily accrual back to standard monthly
compounding (rate/12) with per-payment rounding. This matches how
mortgage servicers calculate interest and produces correct amortization
schedules.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 17:26:55 -05:00
Catherine Renelle 6ddecd7a99 Use first payment date and maturity date instead of origination date and term
Replace the term months field with a maturity date picker - users know
when their loan ends, not the month count. Compute termMonths from the
two dates. Rename "Origination Date" to "First Payment Date" and adjust
the amortization schedule so payment #1 falls on the entered date.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 17:06:21 -05:00
Catherine Renelle 2ae12770cf Fix date timezone shift in loan detail maturity date computation
Parse date string components directly and use Date.UTC() to avoid
local timezone interpretation that shifts dates by a day in western
timezones when using new Date() with date-only strings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 16:33:46 -05:00
Catherine Renelle 3bb9c688ed Auto-populate loan details from Plaid liabilities and pre-fill setup form
Fetch loan data (mortgage/student) from Plaid's Liabilities API during sync
and auto-create LoanDetail records. For accounts without liabilities data,
pre-populate the setup form with balance, interest rate, and smart term
defaults. Also fixes maturity date computation in the frontend form.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 16:23:49 -05:00
Catherine Renelle c91d6125a4 Preserve transaction status when editing instead of resetting to Uncleared
Adds a Status select to the add/edit transaction dialog that defaults to
the current value when editing, so cleared transactions stay cleared.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 21:22:49 -05:00
Catherine Renelle 8f4d4eaabb Exclude current category from parent options when editing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 18:46:32 -05:00
Catherine Renelle 0b4fa68236 Add edit, delete, and deactivate actions to categories view
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 18:20:42 -05:00
Catherine Renelle 688dd333dc Add adjustable context size, custom chatbot name, and cat icon for AI chat
Settings > AI tab now includes context size slider (2048–131072) with VRAM
estimate and a chatbot name field. ChatService reads both dynamically instead
of hardcoding num_ctx=16384 and "Purrse AI". Chat panel FAB and empty state
use mdi-cat icon to match the rest of the app.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:38:07 -05:00
Catherine Renelle 0ad8e472f7 Auto-reload transactions after AI makes changes
When the AI updates a category (or any tool result), the transactions
page now automatically reloads. ChatPanel triggers a refresh counter
in the usePageContext composable when the response includes a tool
result, and TransactionsView watches that counter to reload data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:07:09 -05:00
Catherine Renelle 333b21224d Run AI classification in background with SignalR notifications
Move the classify-uncategorized endpoint from synchronous to async.
The controller now queues a ClassificationJob to an unbounded channel
and returns 202 Accepted. A new BackgroundService processes jobs and
pushes results (or errors) to the user via SignalR. The frontend
listens for the AiClassificationComplete event and surfaces it in the
notification system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 23:53:14 -05:00
Catherine Renelle c2a4272585 Add floating AI chat panel with page context awareness
Replace the standalone /chat page with a bottom-right floating widget
available on every page. The panel sends page context with each message
so the AI knows what the user is viewing. On the Transactions page,
the full visible transaction list (with filters) is serialized into
the context so the AI can answer questions about on-screen entries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 23:51:52 -05:00
Catherine Renelle 9b81a8e37e Fix auth refresh retry loop on expired tokens
The 401 interceptor was re-triggering itself when the refresh call
also returned 401, causing repeated requests before eventually
logging out. Add guards to skip refresh for the refresh endpoint
itself and prevent any request from retrying more than once.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 20:02:07 -05:00
Catherine Renelle 6552a97036 Add budget, loan, payee, and scheduled transaction tools to AI chat
Integrate 6 new tool chains into the chat service: get_budget,
get_budget_summary, get_loan_details, calculate_loan_payoff,
list_payees, and get_scheduled_transactions. Also raises the
search_transactions page_size cap from 25 to 50 and the upcoming
bills display from 5 to 10.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 08:28:31 -05:00
Catherine Renelle 26fb3dc1e1 Add category management tools to AI chat (list, create, delete)
Three new tools: list_categories shows all categories with type and
parent, create_category adds a new one with optional parent nesting,
delete_category removes non-system categories by name. Frontend renders
category tables, success alerts for creation, and warning alerts for
deletion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 23:51:18 -05:00
Catherine Renelle 02c1f49db5 Fix crypto.randomUUID not available in all environments
Replace with a simple counter-based temp ID generator for optimistic
UI messages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 23:37:24 -05:00
Catherine Renelle 846edad2a4 Add AI chat with Ollama tool calling for financial queries
Conversational AI chat that uses Ollama's native tool-calling API to query
transactions, spending reports, account balances, dashboard summaries, and
update transaction categories through natural language. Includes persistent
conversation history, a full-page chat UI with sidebar, and rich inline
rendering of tool results (tables, alerts, cards).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 23:34:16 -05:00
Catherine Renelle 1ceeca0fb6 Add profile management (display name, email, password change, account deletion)
Full-stack profile section: DisplayName column on User model, profile CRUD
endpoints on AuthController, and complete Settings > Profile tab UI with
profile editing, password change, account info, and account deletion.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 22:44:52 -05:00
Catherine Renelle 8cc40272c7 Fix server-side pagination returning same data on every page
v-data-table-server re-emits update:options when items/totalCount
change, creating a loop that resets to page 1. Guard against
redundant fetches by skipping when page and pageSize haven't
changed. Remove duplicate loadTransactions from onMounted since
the table's initial update:options event handles the first load.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:12:41 -05:00
Catherine Renelle caf109013e Switch transactions to server-side pagination
Replace v-data-table with v-data-table-server so page changes
fetch from the API instead of being limited to the first 50
results. Filters reset to page 1; page/size changes trigger a
new API call with the correct page and pageSize parameters.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 19:50:35 -05:00
Catherine Renelle 9a49adf89a Fix navigation drawer: rail expand, icon centering, and tooltips
- Make the entire header clickable to toggle rail mode so users
  can expand the drawer after collapsing it
- Center the cat icon in rail mode via scoped CSS
- Add tooltips on all nav items and logout when in rail mode

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 19:44:39 -05:00
Catherine Renelle 5811588698 Add Re-sync button for SimpleFIN connections
Resets LastSyncAt on all linked accounts so the next sync
re-fetches the full 90-day transaction window. Duplicate
detection prevents re-importing existing transactions.

- POST /api/bank-sync/connections/{id}/reset-sync endpoint
- Re-sync button shown only on SimpleFIN connection cards

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 19:29:15 -05:00
Catherine Renelle 8ca2dbd763 Fix transaction action buttons layout and Dashboard UTC error
Wrap edit/delete buttons in a flex container so they render
side by side instead of stacking. Fix Dashboard DateTime to use
UTC kind, which Npgsql requires for timestamp comparisons.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:58:28 -05:00
Catherine Renelle a2b12d9abd Split SimpleFIN connections by institution
Group discovered SimpleFIN accounts by institution and create a
separate SyncConnection per institution so each bank appears as
its own card in the UI.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 23:26:49 -05:00
Catherine Renelle 53f49ba9d8 Run bank sync in background to avoid gateway timeouts
sync-now and sync-all now return 202 Accepted immediately and
dispatch work to a background task. The frontend uses the existing
SignalR BankSyncComplete notification to stop the spinner and
display results.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 21:31:59 -05:00
Catherine Renelle 1db0101b5a Fix SimpleFIN integration for beta-bridge.simplefin.org
HttpClient does not extract Basic Auth credentials from URLs with
embedded user:pass@host format. Parse the access URL, build the
Authorization header explicitly, and strip credentials from the
request URI. Also send Content-Length: 0 on token exchange POST
and update setup instructions to point to beta-bridge.simplefin.org.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 20:57:02 -05:00
Catherine Renelle d49ad4aca7 Use editable default values with {placeholders} for AI prompts
Instead of showing defaults as greyed-out placeholder text, populate
textareas with the actual default prompt text so users can directly
edit it. Add {categories}, {examples}, and {transactions} placeholders
so users control where dynamic data is inserted in the prompts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 20:26:07 -05:00
Catherine Renelle e742b0fbe7 Make AI categorization prompts user-configurable
Add SystemPrompt and UserPromptTemplate fields to AI categorization
settings so users can customize the prompts sent to Ollama without
code changes. Null/empty values fall back to built-in defaults.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 19:30:26 -05:00
Catherine Renelle 1c7abb7ffc Add AI categorization with Ollama: settings, auto-classify on sync/import, and manual classify from Transactions
Adds local LLM-based transaction categorization using Ollama:
- Settings UI to configure Ollama URL, model, confidence threshold
- Auto-categorization during bank sync and file import
- Manual "Classify Uncategorized" button on Transactions screen that respects active filters
- Payee default category learning loop for classified transactions

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 18:41:12 -05:00
Catherine Renelle 9d6a006045 Make Plaid credentials per-user, configurable via Settings UI
Plaid ClientId/Secret are now stored per-user in the database
(encrypted) instead of in appsettings.json. Users enter their own
Plaid developer credentials in the Settings > Bank Connections tab.

- New BankSyncSettings model (1:1 with User) for encrypted credentials
- PlaidSyncProvider is now stateless, receives credentials per-call
- Settings UI shows a credentials card with save form
- Connect via Plaid button disabled until credentials are configured
- Removed Plaid section from appsettings.json

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-08 16:50:48 -05:00