Fix CSV import failing silently due to unbalanced splits
Details
The CSV parser creates single-split transactions, but LedgerService.ValidateTransaction
enforces double-entry (sum of splits must equal zero). Every SaveTransactionAsync call
threw an InvalidOperationException that was caught and swallowed.
Fix: ImportCsvToRegisterAsync now adds a balancing counter-split targeting an
"Uncategorized Expenses" account (same pattern as AddTransactionAsync). Also reorders
the file picker filters so CSV appears first since the button is labeled "Import CSV".
Add import date range filter for bank statement imports
Details
New ImportDateFilterControl provides preset date range options (Last 30
Days, Last 90 Days, This Year, All, Custom) when importing bank
statements in both the Account Register and Reconciliation paths.
IngestionService now accepts an optional fromDate parameter to filter
parsed transactions by date. The modal stacks correctly over the
reconciliation view by saving and restoring previous modal state.
Bumps version to 3.15.0.
Sort Income vs Expenses report in descending date order
Details
Changed the loop iteration in GetIncomeVsExpensesAsync to build results from most recent month first (i=0 is current month) instead of oldest first, so the current month appears at the top of the report.
Add bottom spacers to Finance scroll content to prevent clipping
Details
Added 60px spacer elements (Border Height or bottom Margin) inside
all scrollable content areas in Finance plugin views. This extends
the scroll extent so the last items can be fully scrolled into view,
preventing them from being permanently clipped at the bottom edge.
Affected views: ReportsView (4 report StackPanels), BudgetDashboardView,
AccountRegisterView, ReconciliationView, AccountSummaryView,
AccountManagementView.
Add independent pill segments and biweekly/semi-monthly goal types
Details
Replace the overlay-divider approach for weekly goal progress bars with
truly independent pill segments. Each segment now has its own track and
fill bar, eliminating visual artifacts where fill would bleed through
divider gaps. The new GoalSegmentViewModel drives per-pill rendering
with independent fill widths, corner radii, and funding state colors.
Add two new GoalTargetType enum values: BiweeklySpending (anchored to a
user-selected date, repeating every 14 days, producing 2-3 segments per
month) and SemiMonthlySpending (two user-picked days of month, always 2
segments). GoalService gains CountBiweeklyOccurrences and a generalized
CalculateSegmentProgress method that handles rollover for all segmented
goal types.
Category management now shows an anchor date picker for biweekly goals
and two day-of-month ComboBoxes (1-30 + Last of Month) for semi-monthly
goals. The Category record gains GoalAnchorDate, GoalSemiMonthlyDay1,
and GoalSemiMonthlyDay2 fields. Seed data includes demo biweekly and
semi-monthly categories. Indexable content labels updated for new types.
Version bump 3.13.0 -> 3.14.0 (csproj + PluginMetadata).
Get notified about new releases