Skip to content

Releases: thekum-lab/budget-cards-releases

Budget Cards v1.7.8

17 Jun 08:47

Choose a tag to compare

Monthly category budget limits now support surplus and deficit rollover — batch operations, full undo, standalone UI, savings goal deposits, i18n across 48 languages.

v1.7.8

Rollover — Monthly Budget Carry-Over

Monthly category budget limits now support surplus and deficit rollover.

How it works: Each category budget limit now has a rollover_enabled toggle. When enabled, the system tracks the difference between your monthly limit and actual spending. Any surplus (underspend) or deficit (overspend) is automatically calculated and made available for transfer at the start of each new month.

Surplus (you spent less than the limit):

  • The unspent amount (surplus) can be carried forward in three ways:
    • Same category — adds to next month's limit (default)
    • Other category — transfer the surplus to a different category's budget
    • Savings goal — deposit the surplus directly into any savings goal
  • Supports partial transfers: you can carry over only a portion of the surplus
  • Smart defaults with automatic recalculation at month start

Deficit (you overspent the limit):

  • When spending exceeds the category limit, the deficit is tracked
  • Next month's category limit is reduced by the overspent amount
  • Clear visual indicators show which categories are in surplus vs. deficit

Batch operations:

  • Select multiple categories at once and apply all carryovers in a single step
  • Preview the total amount before confirming
  • Full undo: reset any or all carryovers with one click
  • Every transfer is recorded in the rollover history log and can be reviewed or reversed at any time

Standalone rollover window:

  • Dedicated UI window accessible from the sidebar and settings
  • Overview of all categories with their surplus/deficit status
  • Categorized views: surplus categories, deficit categories, and categories without limits
  • Destination picker with category browser and savings goal selector

i18n: Complete translations for all 73 rollover-related UI strings across all 48 languages (powered by DeepL + OpenAI).

Critical Bug Fixes

  • ensure_category_limits_schema — idempotent ALTER TABLE using PRAGMA table_info() instead of error-swallowing fallback. Previously, calling this function twice in one session would fail silently.
  • update_payment — setting is_cleared = true now automatically generates ledger transactions (transactions rows) as documented. Previously, transactions were only generated via the explicit generate_transactions_for_payment command.
  • move_transaction — drag-and-drop date changes now account for public holidays when businessDaysOnly is enabled. Previously passed an empty holiday set.
  • Restore fallback — copy+delete replaced with atomic copy-to-temp then rename, eliminating the crash window between copy and delete.

Security

  • Removed license_private_key.hex from the repository and local git history.
  • Private key added to .gitignore.

Localisation

  • EUR currency fallback locale changed from German (de) to English (en). EUR is used by 20+ countries; the country-specific mapping (EUR_COUNTRY_LOCALE) already covers 17 Eurozone countries via the account's country_code field.

Code Quality

  • Duplicated fetch_splits_for_payment consolidated from 3 locations into a single canonical version in models/payment.rs.
  • Duplicated argon2_hasher and validate_pin removed from commands/security.rs — now delegates to utils/pin_hash.
  • Manual BEGIN/COMMIT replaced with unchecked_transaction() in both migrations.rs and splits.rs for proper error-safe transaction handling.
  • Migration SQL injection vector removed — parameterised INSERT INTO schema_info instead of format!() string interpolation.

Performance

  • get_payment_list now bulk-loads split parts in a single query instead of N+1 per payment.
  • WAL checkpoint added before snapshot() backup to ensure on-disk consistency.
  • macOS machine_id now prefers fast sandbox-safe sysctl kern.hostuuid before falling back to ioreg.

Test Coverage (+17 tests, now 211 total)

  • 5 rollover / carryover recalculation tests (surplus, deficit, disabled, multi-category, full carryover).
  • 6 HTML escape tests (html_escape helper).
  • 4 savings goal PIN verification tests (no PIN, correct PIN, wrong PIN, unknown goal).
  • New verify_savings_goal_pin_conn inner function (testable without Tauri state).
  • 1 schema idempotency test.
  • 1 is_cleared → transaction generation test.
  • Fixed pre-existing schema_snapshot_matches test (missing rollover_transfers entries).