fix(bookkeeping): editable verifikationstext on andringsverifikation (#1035)

The correction header was always built server-side as
"Rattelse: <original description>". When the original entry was labelled
after the wrong account, the correction kept echoing that stale label even
after the user switched to the correct account (follow-up to the
line-description fix in #1029).

- CorrectJournalEntrySchema gains an optional trimmed description
- correctEntry() accepts options.description; blank or absent falls back
  to the canonical "Rattelse: <original>" auto text
- both correct routes (dashboard + v1, which share the schema) thread the
  description through
- CorrectionEntryDialog surfaces an editable verifikationstext field,
  pre-filled with the auto text; an untouched or cleared prefill is NOT
  sent, so the server-side fallback stays the source of truth (same
  only-overwrite-auto-filled principle as #1029)

Forward-only: already-posted corrections are immutable per BFL.

Fixes #1031

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-07-16 18:14:02 +02:00
committed by GitHub
co-authored by Claude Fable 5
parent 90e4f668c9
commit 6bd85f94b6
10 changed files with 236 additions and 8 deletions
@@ -6,9 +6,11 @@
* posted with the new lines. All three remain in the verifikationsserie,
* linked via reverses_id, reversed_by_id, and correction_of_id.
*
* Body: `{ lines: [...] }`: the new balanced lines. The corrected entry
* inherits entry_date, fiscal_period_id, description, and voucher_series
* from the original.
* Body: `{ lines: [...], description? }`: the new balanced lines. The
* corrected entry inherits entry_date, fiscal_period_id, and voucher_series
* from the original. Its description defaults to "Rättelse: <original>";
* pass `description` to override it (e.g. when the original label named the
* wrong account).
*
* Idempotent (mandatory Idempotency-Key). Dry-runnable.
*/
@@ -108,7 +110,7 @@ export const POST = withApiV1<{ params: Promise<{ companyId: string; id: string
details: { issues: parsed.error.issues.map((i) => ({ field: i.path.join('.'), message: i.message })) },
})
}
const { lines } = parsed.data
const { lines, description } = parsed.data
const balance = validateBalance(lines)
if (!balance.valid) {
@@ -178,6 +180,7 @@ export const POST = withApiV1<{ params: Promise<{ companyId: string; id: string
ctx.userId,
entryId,
lines,
{ description },
)
return ok(
{