Commit Graph
11 Commits
Author SHA1 Message Date
Lars Nolden 673cbf917b Synchronize connected accounts twice a day
One named syncInterval replaces the two 24-hour literals in the scheduler: a
successful run now waits 12 hours, and an account becomes due again 12 hours
after its last successful sync. Two background fetches a day stay inside Enable
Banking's documented allowance of roughly four per account per day, which a
failing sync's hourly retries also draw from, so the bank rate limits that
prompted this are no more likely than before.
2026-09-11 18:57:52 +02:00
Lars Nolden b3e1c65a82 Report a rate-limited bank sync as a wait, and name real failures
Two of three banks were only pacing us, yet the dashboard demanded attention,
printed four nested wrappers and a nanosecond UTC deadline, and the scheduler
retried hourly into a refusal whose end time the bank had already given.

A rate limit now carries its retry time as data: Status.SyncRetryAt is set when
every failure is self-clearing, the connection reports rate_limited with that
deadline, the dashboard says synchronization resumes by itself and renders the
time in the browser's zone, and the scheduler sleeps until the deadline instead
of spending hourly session checks. Sync now still tries immediately.

The third bank's "transaction retrieval failed" hid its cause. Provider
failures Finance Duck determines itself are typed as banking.ProviderError,
so an unreachable provider, a timeout or an unusable response, such as a booked
transaction without a booking date, is reported instead of the opaque fallback.
Provider response text still never reaches the message.
2026-09-11 18:41:35 +02:00
Lars Nolden dece0d5b79 Let imports opt out of AI classification
Classification preferences gains "Classify newly imported transactions with
AI", stored as classify_on_import in config.toml and on by default, so existing
configurations keep their behaviour. It covers CSV imports and bank
synchronization alike.

With it off, no import path contacts the provider: classification falls to the
new provider-free rules path, where an opted-in merchant rule still applies its
category and tags, an alias match still attaches its merchant, and everything
else arrives on the editable fallback without a provenance error that would
suggest the provider had failed. Analyse remains available on demand.
2026-09-11 18:10:05 +02:00
Lars Nolden dc767799bc Import ING and Kontist statements behind a reviewed column mapping
CSV import is now mapping-driven: N26, ING (metadata preamble, Windows-1252,
German decimals) and Kontist exports are recognized locally, and any other
layout can have its columns proposed by the configured model from a sample in
which letters are replaced by x and digits by 0. Proposals are untrusted: every
column must name a supplied header, money must come from one signed column or
one debit/credit pair, and formats must be from a closed list.

Uploading no longer imports. /api/import is replaced by prepare/confirm/cancel:
prepare parses, deduplicates and previews the exact facts, and only confirming
at the reviewed revision writes them. ING and AI-mapped facts carry no
transaction reference, because repeating SEPA mandate references must never
become a transaction identity.
2026-09-11 17:49:03 +02:00
Lars Nolden 4324660888 Pace provider traffic and identify genuine foreground bank requests 2026-09-10 17:47:44 +02:00
Lars Nolden ba3ea6ae5a Respect provider rate limits and preserve bank connections on throttling 2026-09-10 17:25:09 +02:00
Lars Nolden 2259db3e85 Add per-account historical bank imports without resetting sync cursors 2026-09-10 17:02:17 +02:00
Lars Nolden f4c7d54575 Configure initial bank history in the connection UI 2026-09-10 16:37:34 +02:00
Lars Nolden bec6d0b444 Distinguish debit and credit postings sharing an upstream reference 2026-09-10 15:48:42 +02:00
Lars Nolden 964b9dfc15 Add native NixOS deployment and UI-managed provider credentials 2026-09-10 14:25:37 +02:00
Lars Nolden 9843fe0c50 init 2026-09-10 12:30:42 +02:00