Commit Graph

25 Commits

Author SHA1 Message Date
AJ
c44929afe1 Add pagination to transaction preview for large imports
When uploading files with more than 100 transactions, the preview now displays transactions in pages of 100 rows at a time. This prevents browser freezing when rendering thousands of form inputs and dramatically improves page load performance.

- Show first 100 transactions by default with pagination controls
- All transactions remain in DOM but hidden for instant page switching
- Update counters and form submission to work across all pages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 22:17:46 -04:00
AJ
3d6b47d537 Optimize transaction preview duplicate checking for large imports
Improve performance when uploading thousands of transactions by loading all existing transactions into memory once for duplicate detection, rather than running individual database queries for each transaction. This reduces database calls from O(n) to O(1) for n transactions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 22:17:37 -04:00
AJ
40135ab6d6 Update UI for account-card relationship and transfers
- Updated EditTransaction to handle account selection and card filtering
- Added Transfers link to navigation menu
- Updated Transactions page to properly display account labels
- Refined Upload preview UI for account/card selection

These changes support the new account-centric model where every
transaction belongs to an account and optionally uses a card.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 20:54:20 -04:00
AJ
7f74cd8c29 Add transfer support between accounts
- Added TransferToAccountId to Transaction model for linking transfers
- Created CreateTransfer page for recording account-to-account transfers
- Migration adds the new foreign key relationship
- Transfers are created as paired transactions (debit and credit)

This enables tracking of money movement between bank accounts while
maintaining proper accounting with matching transaction pairs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 20:54:09 -04:00
AJ
83ef8480c1 Add migration to make AccountId required on transactions
Changed Transaction.AccountId from optional to required, reflecting that
every transaction must belong to an account (the source of the CSV file).
Cards remain optional as they represent the payment method used.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 20:53:58 -04:00
AJ
338374f831 Enhance card management with account linking and nicknames
- Added account linking functionality to cards with dropdown selector
- Added optional nickname field for easier card identification
- Updated Cards list page to show linked accounts with badges
- Reorganized card display to show issuer and last4 together
- Include account relationship when loading cards

This allows cards to be properly associated with their bank accounts,
which is essential for the transaction import and categorization flow.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 20:53:46 -04:00
AJ
eb3e9c5407 Simplify payment column display in transactions table
Condensed the verbose payment method labels to show only the essential
information:
- Card transactions: Show just the card name (e.g., "AJ's Debit Card")
- Direct account transactions: Show just the account name
- Transfers: Show "Transfer → [Destination]"

Removed duplicate display of account information since cards are
already linked to accounts. This makes the Payment/Account column
much less crowded and easier to read.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 20:50:34 -04:00
AJ
aee006763d Improve card auto-mapping by prioritizing memo over filename
Changed the card resolution logic to check transaction memos first
before falling back to the CSV filename. This enables per-transaction
card detection when account CSVs contain card identifiers in memos
(e.g., "usbank.com.2765").

Also prioritize card matches over account matches in TryResolveByLast4
to ensure cards are correctly identified even when they share the same
last4 digits as their linked account.

This fixes the issue where card dropdowns showed "none / direct debit"
even when card information was present in transaction memos.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 20:50:15 -04:00
AJ
926285d64e Seed default category mappings on application startup
Added automatic seeding of default category mappings to ensure the
transaction categorizer has patterns to match against. This fixes the
issue where all transactions appeared as uncategorized during preview
because the CategoryMappings table was empty.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 20:49:53 -04:00
AJ
0acc8d51bc Merge branch 'master' of https://git.thecozycat.net/aj/MoneyMap 2025-10-09 23:04:04 -04:00
AJ
ea8d1b442a Link Cards to Accounts with proper relationship
Model Changes:
- Add Card.AccountId (nullable FK to Account)
- Add Card.Nickname field for friendly names
- Add Card.DisplayLabel computed property
- Add Account.Cards navigation property
- Add Account.DisplayLabel computed property

DbContext Updates:
- Configure Card → Account relationship (optional, restrict delete)
- Add index on Card.AccountId
- Set Card.Owner as required

Migration:
- Add LinkCardsToAccounts migration
- Adds AccountId and Nickname columns to Cards table
- Creates FK constraint from Cards to Accounts

This properly models the real-world relationship where payment cards
are linked to bank accounts (e.g., a Visa card draws from a checking
account, or a credit card is paid from a savings account).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 22:56:11 -04:00
AJ
a44b3d41ac Major refactor: Split Cards and Accounts into separate tables
Schema Changes:
- Add Account model (Institution, AccountType enum, Last4, Owner, Nickname)
- Add Transfer model for tracking money movement between accounts
- Update Transaction to support both CardId and AccountId (nullable FKs)
- Rename Transaction.CardLast4 → Last4 (works for both cards and accounts)
- Add PaymentMethodLabel computed property to Transaction
- Create EF Core migration: SplitCardsAndAccounts

Data Model Improvements:
- Accounts: Checking, Savings, Other types
- Transfers: Source/Destination accounts, optional link to original transaction
- Transactions can now link to either a Card OR an Account
- Transfer categories excluded from spending reports via TransactionFilters

UI Pages:
- Add Accounts.cshtml - List all bank accounts with transaction counts
- Add EditAccount.cshtml - Create/edit bank accounts
- Add Accounts link to navigation
- Update all references from CardLast4 to Last4

Service Layer Updates:
- Update CardResolutionResult to use nullable CardId and renamed Last4
- Update TransactionKey record to include AccountId
- Update IsDuplicate check to include both CardId and AccountId
- Update all PaymentMethodLabel usage across pages

This architecture allows proper separation of credit cards from bank
accounts and enables tracking of transfers between accounts without
double-counting in spending reports.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 20:52:54 -04:00
AJ
227e9dd006 Fix double-counting issue and refactor category mapping forms.
Transaction Filtering:
- Add TransactionFilters helper class to exclude transfer categories from spending reports
- Exclude "Credit Card Payment" and "Banking" categories from dashboard top spending
- Add ExcludeTransfers() extension method for reusable filtering
- Update dashboard header to indicate transfers are excluded

Category Mappings Refactor:
- Split form models into separate AddMappingModel and UpdateMappingModel
- Remove [BindProperty] attributes and use parameter binding instead
- Eliminate cross-validation issues between add/edit forms
- Simplify validation logic by removing manual ModelState cleanup

This fixes the issue where credit card payments were counted as spending
even though they're just transfers between accounts, causing inflated
spending totals on the dashboard.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 18:42:40 -04:00
AJ
ff14aed65f Add card management pages and enhance category mappings UI.
Features added:
- Cards page with list/create/edit/delete functionality
- EditCard page for modifying card details
- Enhanced CategoryMappings UI with inline add/edit/delete modals
- Category dropdown autocomplete in mapping forms
- Priority badges and visual indicators for high-priority mappings
- Click-to-edit functionality on patterns

Improvements:
- TransactionCategorizer: Add TARGET.COM to online shopping patterns
- TransactionCategorizer: Set Credit Card Payment to priority 200 to catch before Banking
- TransactionCategorizer: Add database migration comments
- Layout: Add Cards link to navigation
- Layout: Fix Bootstrap JS path
- ValidationScriptsPartial: Use Url.Content for script paths

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 16:49:18 -04:00
AJ
7ac0dd9dbc Add comprehensive architecture documentation and remove unused Privacy pages.
Created AGENTS.md with detailed documentation covering:
- Project overview and technology stack
- Architecture patterns and service layer design
- Complete domain model documentation
- Service implementations (TransactionImporter, CardResolver, TransactionCategorizer, DashboardService, ReceiptManager, OpenAIReceiptParser)
- Database schema and EF Core configuration
- Key workflows and design patterns
- Security considerations and performance optimizations
- Testing strategies and deployment guidance

Removed unused Privacy.cshtml and Privacy.cshtml.cs pages.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 16:21:26 -04:00
AJ
aeac767881 Added pages for cards 2025-10-05 01:45:03 -04:00
AJ
a5046df38c Sanitize file name on upload 2025-10-04 18:19:08 -04:00
AJ
462973cf2f Make notes optional, again 2025-10-04 18:18:40 -04:00
AJ
159e47ee69 Fixed display of file size 2025-10-04 18:18:20 -04:00
AJ
99788a3d2d Moved receipt line items 2025-10-04 18:17:50 -04:00
AJ
65de073c01 Notes is optional when editing transaction 2025-10-04 12:24:36 -04:00
user1
c546235677 Improved parsing utility bills 2025-10-04 11:58:24 -04:00
user1
f01b44e9ac Pagination on Transactions 2025-10-04 03:32:25 -04:00
AJ
d04db5af12 ignore publish folder 2025-10-04 02:19:54 -04:00
AJ
d579029492 Initial commit 2025-10-04 02:13:50 -04:00