"Fakturan saknar ett betalningskonto för vald valuta" read as a foreign-currency account when the invoice was in SEK and the gap was simply the company's bankgiro; the remediation line also asked for an IBAN, which SEK does not need. A Visma-migrated user marking invoices as sent hit this and went looking for a valutakonto. - describeMissingInvoicePaymentAccount(currency) in lib/invoices/payment-accounts.ts: SEK names bankgiro, plusgiro, Swish or bank account; other currencies ask for an IBAN account in that currency (USD/GBP also offer routing number / sort code + BIC). Both point at Inställningar → Fakturering. - getErrorMessage branches on INVOICE_SEND_PAYMENT_ACCOUNT_MISSING + details.currency (every dashboard route already sends it), before the English registry shortcut so both locales get the specific text. - Registry entry rewritten currency-neutral for consumers without details (API, MCP): bankgiro/plusgiro/Swish/bankkonto for SEK, IBAN otherwise; remediation no longer says IBAN for everything. - Staged-operation commit path uses the helper directly. Tests: helper per currency, client mapping sv/en and the no-details fallback. Closes #2126 Claude-Session: https://claude.ai/code/session_01WFhSQWzu5SyXB6kG5ActZc Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Jakob Wennberg
Claude Fable 5.1
parent
4e1f739913
commit
ea45e9dc2f
@@ -563,3 +563,41 @@ describe('getProviderResourceForbiddenMessage', () => {
|
||||
expect(getProviderResourceForbiddenMessage(null)).not.toMatch(/återanslut för att fortsätta/i)
|
||||
})
|
||||
})
|
||||
|
||||
describe('getErrorMessage: INVOICE_SEND_PAYMENT_ACCOUNT_MISSING (#2126)', () => {
|
||||
const envelope = (currency?: unknown) => ({
|
||||
error: {
|
||||
code: 'INVOICE_SEND_PAYMENT_ACCOUNT_MISSING',
|
||||
message: getErrorEntry('INVOICE_SEND_PAYMENT_ACCOUNT_MISSING')!.message_sv,
|
||||
message_en: getErrorEntry('INVOICE_SEND_PAYMENT_ACCOUNT_MISSING')!.message_en,
|
||||
...(currency !== undefined ? { details: { currency } } : {}),
|
||||
},
|
||||
})
|
||||
|
||||
it('SEK invoice: names bankgiro/plusgiro/Swish, not a currency account', () => {
|
||||
const msg = getErrorMessage(envelope('SEK'), { statusCode: 400 })
|
||||
expect(msg).toContain('bankgiro')
|
||||
expect(msg).toContain('Inställningar → Fakturering')
|
||||
expect(msg).not.toMatch(/valuta/i)
|
||||
})
|
||||
|
||||
it('EUR invoice: asks for an IBAN account for EUR', () => {
|
||||
const msg = getErrorMessage(envelope('EUR'), { statusCode: 400 })
|
||||
expect(msg).toContain('EUR')
|
||||
expect(msg).toContain('IBAN')
|
||||
})
|
||||
|
||||
it('English locale gets the currency-specific English text, not the registry fallback', () => {
|
||||
const msg = getErrorMessage(envelope('SEK'), { statusCode: 400, locale: 'en' })
|
||||
expect(msg).toContain('bankgiro')
|
||||
expect(msg).toContain('Settings → Invoicing')
|
||||
expect(msg).not.toMatch(/currency/i)
|
||||
})
|
||||
|
||||
it('without a currency in details, falls back to the registry text', () => {
|
||||
const msg = getErrorMessage(envelope(), { statusCode: 400 })
|
||||
expect(msg).toBe(getErrorEntry('INVOICE_SEND_PAYMENT_ACCOUNT_MISSING')!.message_sv)
|
||||
const unknown = getErrorMessage(envelope('JPY'), { statusCode: 400 })
|
||||
expect(unknown).toBe(getErrorEntry('INVOICE_SEND_PAYMENT_ACCOUNT_MISSING')!.message_sv)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user