Releases: thekum-lab/budget-cards-releases
Budget Cards v1.7.8
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 usingPRAGMA table_info()instead of error-swallowing fallback. Previously, calling this function twice in one session would fail silently.update_payment— settingis_cleared = truenow automatically generates ledger transactions (transactionsrows) as documented. Previously, transactions were only generated via the explicitgenerate_transactions_for_paymentcommand.move_transaction— drag-and-drop date changes now account for public holidays whenbusinessDaysOnlyis 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.hexfrom 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'scountry_codefield.
Code Quality
- Duplicated
fetch_splits_for_paymentconsolidated from 3 locations into a single canonical version inmodels/payment.rs. - Duplicated
argon2_hasherandvalidate_pinremoved fromcommands/security.rs— now delegates toutils/pin_hash. - Manual
BEGIN/COMMITreplaced withunchecked_transaction()in bothmigrations.rsandsplits.rsfor proper error-safe transaction handling. - Migration SQL injection vector removed — parameterised
INSERT INTO schema_infoinstead offormat!()string interpolation.
Performance
get_payment_listnow 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_idnow prefers fast sandbox-safesysctl kern.hostuuidbefore falling back toioreg.
Test Coverage (+17 tests, now 211 total)
- 5 rollover / carryover recalculation tests (surplus, deficit, disabled, multi-category, full carryover).
- 6 HTML escape tests (
html_escapehelper). - 4 savings goal PIN verification tests (no PIN, correct PIN, wrong PIN, unknown goal).
- New
verify_savings_goal_pin_conninner function (testable without Tauri state). - 1 schema idempotency test.
- 1
is_cleared→ transaction generation test. - Fixed pre-existing
schema_snapshot_matchestest (missingrollover_transfersentries).