March 2, 2026
Bug Fixes
- code review fixes for email feature
- fix API key encryption timing and add email handler tests
- update MarkBillAsPaidCommandHandlerTests for new IMediator dependency
- fix dialog auto-close and add None option to account dropdown
- address code review issues - null check, transaction safety, cache invalidation, display
- improve dialog with proper window chrome and category autocomplete
- set explicit 700px height on bill payment dialog
- clear change tracker after duplicate search to prevent SQLite lock
- remove future date restriction from transactions
- clear change tracker before bill payment to prevent SQLite lock
- reset page on search and add amount-match highlighting in picker
- remove explicit SQLite transaction to eliminate deadlock
- address code review issues for Either-to-NotSet rename
- widen deductible % input in dialog and simplify grid inline editor
- add missing IInvoiceActivityRepository implementation and move error to top
- show email errors in dialog and add sent/paid dates to detail view
- remove SendGrid, fix leaky SMTP abstraction, simplify email architecture
- use "Generated by OpenLedger" in PDF invoice footer
- remove unused DeductiblePercent field from category system
- add RevertToDraft tests, hide line item buttons when read-only, fix stale panel
- update 12 stale tests to match current production code
- exclude non-business account types from Schedule C and Tax Summary
- complete unlock reconciled transactions feature
- remove UsageType filter from Schedule C account eligibility
- show Reconciled status in all edit dialogs when unlocked
- check DefaultNameMappings for subcategory parts in Schedule C mapping
- add diagnostic logging to transaction validators for "not found" errors
- make IsReconciledStatusVisible observable for binding
- include BusinessType in reconciled structural change detection
- eliminate false positives from subscription detection
- auto-prepend https:// to account URLs for Fetch Statement
- show finalized/emailed dates in detail panel and simplify email body
- connect SnapTrade adapter to user-entered credentials from settings.db
- rewrite SnapTrade API auth to use query params per API spec
- fix SnapTrade signature computation to match official SDK
- use relaxed JSON encoding for SnapTrade signature
- fix SnapTrade account model and add response logging
- fix SnapTrade account model — brokerage_authorization is a string UUID
- prevent UNIQUE constraint violation in batch pattern learning
- include mapping dialog in ShouldCache check
- remove IAsyncDisposable from AmazonAutoSyncService
- keep filter bar and grid visible when filter returns no results
- add diagnostic logging and UI thread dispatch for mapping dialog
New Features
- add SendGrid email settings (API key, from, CC, BCC)
- add Email settings view in Settings sidebar
- add IInvoiceEmailService interface
- implement SendGridInvoiceEmailService
- add EmailInvoiceCommand with branded HTML email
- add Email button and send dialog to InvoiceDetailView
- add AccountUrl to AccountSummaryDto and mapping
- add CategoryId and Payee to MarkBillAsPaidRequest
- create transaction when recording bill payment with account
- rewrite MarkBillPaidDialogViewModel with account and category selection
- rewrite MarkBillPaidDialog as windowed dialog with account/category
- switch BillRemindersViewModel to windowed dialog for mark paid
- add duplicate transaction detection when recording bill payments
- add TransactionPickerDialog for linking existing transactions
- add Link Existing Transaction option to Record Payment dialog
- add DeductiblePercent property and domain tests
- add DeductiblePercent to DTOs and handlers
- wire DeductiblePercent through ViewModels
- rename Tax Deductible to Schedule C Deductible, add percentage input
- apply DeductiblePercent in Tax Summary report math
- support partial bill payments with remaining balance tracking
- widen percentage input, add filter panel, and tree icons
- use category emoji icons in tree view instead of monochrome FluentIcons
- add count column and inline percentage to subcategory grid
- add Income/Expense/Transfer type editing to detail panel and grid badge
- rename Either to Not Set, add warning icons, business indicators, and group-by-type toggle
- add SMTP email support as alternative to SendGrid
- add Email Invoice button to detail view for finalized invoices
- add Email button to list sidebar, read-only editor for finalized invoices, and Revert to Draft
- add HasAnyActiveAsync to ITransferPatternRepository
- add BackfillTransferPatternsCommand to seed patterns from history
- trigger transfer pattern backfill on file open
- add transfer pattern lookup to coordinator for auto-detection
- add Auto Sync design, plan, and POC tests
- add IAmazonAutoSyncService interface
- implement AmazonAutoSyncService with Playwright automation
- add AutoSync command to AmazonSyncViewModel
- add Auto Sync button to Amazon view
- wire up SnapTrade account mapping dialog and auto-sync
Other Changes
- add invoice emailing design document
- add invoice emailing implementation plan
- add SendGrid NuGet package for invoice emailing
- add bill payment dialog redesign design document
- add bill payment dialog implementation plan
- remove mark-paid overlay panel from BillRemindersView
- add dialog standards reference and slim down CLAUDE.md
- add design for Link Existing Transaction to Invoice Payment
- add implementation plan for Link Existing Transaction feature
- add DeductiblePercent column configuration and migrations
- remove duplicate IsVisible attribute on Person icon
- regenerate SampleData.oledger with enriched business transactions
- add transfer pattern auto-detection design and implementation plan
- update progress with transfer pattern auto-detection
- add Playwright package reference to Desktop project
- register IAmazonAutoSyncService in DI container
Performance
- optimize pattern lookup with dictionary grouping and pre-loading