Bulk import preview (checkBulkImportDuplicates) now matches fuzzy duplicates on the user's civil calendar day (User.settings.timezone, default UTC) instead of UTC-only day slicing. Fixes false negatives/positives for operators in non-UTC zones when comparing import rows to existing ledger entries.
zonedDayBoundsFromEpoch into src/lib/utils/zonedDayBounds.ts (IANA tz via Intl, binary search for day bounds, UTC fallback on invalid tz).checkBulkImportDuplicates loads settings.timezone once per probe batch and uses zoned day bounds for fuzzy duplicate queries (same day + amount + accounts, excluding exact bankImportRef match).bankImportRef variants).Transaction dates in the UI are chosen as local calendar days, but fuzzy duplicate detection sliced days in UTC. A transaction near midnight in Asia/Jakarta could miss or spuriously match ledger rows on adjacent UTC days.
externalId / bankImportRef for idempotent reruns; fuzzy duplicate is preview-only in the modal.src/lib/utils/zonedDayBounds.ts (new)src/lib/actions/transaction.ts — checkBulkImportDuplicatesdocs/features/01-transactions.md — bulk import duplicate behavior