"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
@@ -20,6 +20,10 @@
|
||||
import { formatCurrency } from '@/lib/utils'
|
||||
// Pure module (no next/server): safe for the client bundles this file lives in.
|
||||
import { formatDimensionValidationIssues } from '@/lib/bookkeeping/dimension-errors'
|
||||
import {
|
||||
describeMissingInvoicePaymentAccount,
|
||||
isInvoicePaymentAccountCurrency,
|
||||
} from '@/lib/invoices/payment-accounts'
|
||||
import { getErrorEntry, hasErrorEntry } from './structured-errors'
|
||||
|
||||
type ErrorContext =
|
||||
@@ -352,6 +356,20 @@ export function getErrorMessage(
|
||||
details?: unknown
|
||||
}
|
||||
|
||||
// Say what is missing for THIS invoice's currency: on a SEK invoice the
|
||||
// registry's currency-neutral text read as a foreign-currency account
|
||||
// when the gap was the company's bankgiro (#2126). Before the English
|
||||
// registry shortcut on purpose: both locales get the specific text.
|
||||
if (structured.code === 'INVOICE_SEND_PAYMENT_ACCOUNT_MISSING') {
|
||||
// Own local name on purpose: the sek-labelled-amount guard keys
|
||||
// currency reads by owner path, and `details` is also the owner of
|
||||
// the SEK-only journal totals formatted further down.
|
||||
const paymentDetails = structured.details as { currency?: unknown } | undefined
|
||||
if (isInvoicePaymentAccountCurrency(paymentDetails?.currency)) {
|
||||
return pick(describeMissingInvoicePaymentAccount(paymentDetails.currency), locale)
|
||||
}
|
||||
}
|
||||
|
||||
// For English UI, return the registry's English message for any known
|
||||
// code instead of falling through to the Swedish branches below (which
|
||||
// ignored locale: English users were shown Swedish prose). The Swedish
|
||||
|
||||
Reference in New Issue
Block a user