fix(invoices): drop UTKAST banner from sent/archived PDFs (#495)

The "UTKAST – inte en giltig faktura" banner in pdf-template.tsx fires
whenever `invoice.status === 'draft'`. All four send-equivalent code
paths render the PDF while the in-memory invoice still reads 'draft',
so the customer's email attachment and the archived underlag are both
stamped as not-a-valid-faktura.

- /api/invoices/[id]/send: status flip happens after email delivery
  (kept that way so a provider failure leaves the row in draft); render
  with `{ ...invoice, status: 'sent' }` instead of mutating order.
- /api/invoices/[id]/mark-sent: DB flip happens before render but the
  in-memory copy is never re-fetched.
- /api/v1/companies/.../invoices/[id]/send: same shape as the internal
  send route; extend the existing `renderableInvoice` override.
- lib/pending-operations/commit.ts (MCP send path): same shape.

The banner condition itself is unchanged — the genuine draft preview
(`/api/invoices/[id]/pdf`) still surfaces the watermark correctly.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-05-15 10:43:14 +02:00
committed by GitHub
co-authored by Claude Opus 4.7
parent b0890c7c79
commit 1163fd3bee
7 changed files with 98 additions and 4 deletions
+4 -1
View File
@@ -589,9 +589,12 @@ async function commitSendInvoice(
if (orig) originalInvoiceNumber = orig.invoice_number
}
// Override `status` to 'sent' on the in-memory copy. The DB flip happens
// after email delivery (line ~625); rendering with the stale 'draft' status
// would stamp the customer's PDF with "UTKAST – inte en giltig faktura".
const pdfBuffer = await renderToBuffer(
InvoicePDF({
invoice: invoice as Invoice,
invoice: { ...(invoice as Invoice), status: 'sent' as const },
customer,
items,
company: company as CompanySettings,