* feat(import): add customer and supplier parsing functionality
- Implemented customer file parsing in `lib/import/customers/parser.ts` with support for Excel and CSV formats.
- Created types for detected customer columns and parsed customer rows in `lib/import/customers/types.ts`.
- Added tests for customer classification logic in `lib/import/shared/__tests__/classify.test.ts`.
- Developed classification functions for customers and suppliers in `lib/import/shared/classify.ts`.
- Introduced shared column utility functions in `lib/import/shared/column-utils.ts`.
- Implemented supplier file parsing in `lib/import/suppliers/parser.ts` with validation for various fields.
- Created types for detected supplier columns and parsed supplier rows in `lib/import/suppliers/types.ts`.
- Added tests for supplier column detection and parsing in `lib/import/suppliers/__tests__/column-detector.test.ts` and `lib/import/suppliers/__tests__/parser.test.ts`.
* fix(labels): update 'Svenskt företag' to 'Svenskt företag eller organisation' for clarity
* feat(import): refactor encoding handling for Swedish files and add tests for character preservation
* feat(recapt): implement clearRecaptIdentity function and integrate into logout flow
* feat(bookkeeping): implement copy functionality and next voucher sequence retrieval
* feat(import): enhance customer and supplier import functionality with normalization and event handling
Three confirmed issues from user feedback:
1. Reverse charge preview now uses per-item VAT rates and correct accounts
(2645/2647, 2614/2624/2634) instead of hardcoded 25%/2614
2. Bank sync uses 90-day lookback on first sync (when last_synced_at is null)
instead of hardcoded 7 days for all syncs
3. Bank file import improvements:
- Shared date normalizer supporting DD.MM.YYYY, DD/MM/YYYY, YYYYMMDD
- Silent row skips now reported with reason in issues[]
- Decimal separator mismatch detection in generic CSV
- Swedish error message with format diagnostics on detection failure
- Date format selector in column mapping UI
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: BankID graceful fallback, bank import fixes, and account deletion
- BankID: surface service_unavailable state in login/register with password
fallback messaging; structured error codes in tic extension; poll failure
counter in BankIdAuth avoids infinite retry when TIC API is down.
- Transactions: allow deleting unbooked bank-synced and imported transactions
(only posted entries remain protected); detect reconnect duplicates by also
checking unbooked bank-synced rows in content-based dedup.
- Enable Banking: key external_id by account iban/uid instead of connection id
so reconnects don't create duplicates.
- Bank import: detect SEB privatbanken CSV variant (Bokföringsdatum /
Valutadatum headers) via regex.
- Banking settings: replace full-screen sync loader with toast notifications.
- delete_user_account: raise statement_timeout, pre-clear NO ACTION FK
references, and disable audit/immutability triggers during CASCADE.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: address Greptile review — ingest dedup scoping and migration EXCEPTION handler
- ingest: split buildExistingTransactionMap into two maps. Booked rows
(any source) remain consumed by any incoming raw transaction, but
unbooked enable_banking slots are only consumed when the incoming raw
transaction is also enable_banking. This preserves reconnect dedup
while preventing false positives where a pending bank-synced row
silently blocks a legitimately separate CSV row with the same
date/amount.
- delete_user_account: add EXCEPTION WHEN OTHERS handler that re-enables
every legally required enforcement trigger before re-raising. Postgres
transactional DDL already rolls back on abort, but the explicit guard
makes the intent unambiguous and covers sub-transaction edge cases so
enforcement triggers are never left disabled.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- SIE parser: Windows-1252 and CP437 encoding detection and decoding
- Bank file parser: add Nordea Business (Företag) CSV format
- Bank file parser: improve format detection for SEB, Länsförsäkringar, generic CSV
- INK2 engine: calculate årets resultat (7222) from income statement for open fiscal years
- Dashboard: parallel Supabase queries, simplified dashboard page
- Fix Swedish characters (å, ä, ö) in BAS data descriptions, validation messages, AI consent disclosures
- Import wizard UI improvements across all steps
- Migration: add 'bas_range' match type to sie_account_mappings constraint
- Extensive new tests for SIE parser encoding and bank file parser
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Add auto-detecting CSV parsers for Länsförsäkringar, ICA Banken, Skandia,
and Lunar. Refine SEB detection to avoid false matches. Update bank file
upload UI with new bank options and export instructions. Include booking
templates, improved AI categorization, and transaction review enhancements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace PSD2 bank integration as the default with file-based bank
import (CSV/XML), which better suits Swedish sole traders and small
companies. Enable Banking is now an opt-in extension.
- Phase 1: Extract generic transaction ingestion service (ingest.ts)
with dedup, auto-categorization, and OCR-based invoice matching
- Phase 2: Bank file parser library supporting Nordea, SEB, Swedbank,
Handelsbanken CSV formats and ISO 20022 camt.053 XML
- Phase 3: Database migration adding import_source, reference columns
and bank_file_imports tracking table
- Phase 4: Import wizard UI (5-step flow) and API routes for parse/execute
- Phase 5: Move Enable Banking to extensions/enable-banking/ with
commented-out loader entry for opt-in activation
- Phase 6: 104 new tests (ingestion + all parser formats), fixing
Nordea detection overlap and camt.053 XML tag collision bugs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>