* feat(mcp): ask the bank first: connect link deep-starts the named bank's consent The connect card used to open the generic picker page; the user then chose the bank there. The agent now asks 'vilken bank har företaget?' among the opening questions and passes it to gnubok_connect_bank, whose connect_url becomes /import?mode=psd2&bank=<name>. BankSelector resolves the name (exact, then unique prefix, then unique substring: ambiguous names fall back to the prefilled picker rather than guessing an institution) and auto-starts that bank's consent through the same onConnect handler, so the duplicate-pending and renew-instead guards stay fully interactive. The param is stripped via history.replaceState after the one-shot so an aborted bank flow plus back-navigation does not silently relaunch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(mcp): first-year suggestion keeps the AB vs enskild firma distinction Compliance-review finding on #1949: the suggestion text collapsed both forms onto a 31 December end. Only an enskild firma's first year MUST end 31 December; an AB may pick any end within BFL 3 kap 3 §'s 18-month cap, with 31 December as the common default. The lookup tool's still_to_ask line and the skill now say so explicitly, and first-year-defaults documents that fiscalYear-null is a strong-not-perfect filed-report signal that must only ever feed confirm-question suggestions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
/**
|
|
* matchBankByName: the deep-link resolver behind /import?mode=psd2&bank=<name>.
|
|
* Conservative on purpose: starting a consent at the wrong institution is
|
|
* worse than falling back to the prefilled picker.
|
|
*/
|
|
import { describe, expect, it } from 'vitest'
|
|
import { matchBankByName } from '../lib/bank-match'
|
|
|
|
const BANKS = [
|
|
{ name: 'Swedbank' },
|
|
{ name: 'SEB' },
|
|
{ name: 'Nordea' },
|
|
{ name: 'Handelsbanken' },
|
|
{ name: 'Danske Bank' },
|
|
{ name: 'Länsförsäkringar Bank' },
|
|
{ name: 'Länsförsäkringar Skåne' },
|
|
{ name: 'ICA Banken' },
|
|
]
|
|
|
|
describe('matchBankByName', () => {
|
|
it('matches exact names case-insensitively', () => {
|
|
expect(matchBankByName(BANKS, 'swedbank')?.name).toBe('Swedbank')
|
|
expect(matchBankByName(BANKS, 'SEB')?.name).toBe('SEB')
|
|
expect(matchBankByName(BANKS, ' handelsbanken ')?.name).toBe('Handelsbanken')
|
|
})
|
|
|
|
it('matches a unique prefix', () => {
|
|
expect(matchBankByName(BANKS, 'nord')?.name).toBe('Nordea')
|
|
expect(matchBankByName(BANKS, 'danske')?.name).toBe('Danske Bank')
|
|
})
|
|
|
|
it('matches a unique substring', () => {
|
|
expect(matchBankByName(BANKS, 'ica')?.name).toBe('ICA Banken')
|
|
})
|
|
|
|
it('returns null for an ambiguous name instead of guessing an institution', () => {
|
|
expect(matchBankByName(BANKS, 'länsförsäkringar')).toBeNull()
|
|
})
|
|
|
|
it('returns null for unknown or empty input', () => {
|
|
expect(matchBankByName(BANKS, 'Monopolbanken')).toBeNull()
|
|
expect(matchBankByName(BANKS, '')).toBeNull()
|
|
expect(matchBankByName(BANKS, ' ')).toBeNull()
|
|
})
|
|
})
|