Implements #914 (kundnummer on customers, printed on the invoice PDF).
- Migration: nullable text column customers.customer_number, no unique
constraint in v1 so existing rows and imports keep working.
- API: CreateCustomerSchema/UpdateCustomerSchema accept an optional
customer_number (trimmed, max 32 chars, nullable-then-optional so the
OpenAPI registry sees it as not required); create/update routes
persist it and normalize empty string to null so it can be cleared.
- v1 public API: customers create/detail/update round-trip the field
(insert and update field lists, response projections, response
schemas), and the invoices :send route fetches customer_number in its
explicit customer join so the emailed PDF matches the downloaded one
(the pdf route already selects customers(*)).
- UI: optional Kundnummer field in CustomerForm (next-intl keys in both
sv and en), wired into the edit dialog's initialData; read-only
Kundnummer row on the customer detail page's business-details card.
- Invoice PDF: renders "Kundnr:" / "Customer no.:" in the customer box
when set; the PDF reads the live customers join, so no snapshot
column is needed.
- Tests: route tests cover 400 validation, trimming, clearing with
null/empty, and omit-leaves-untouched on POST and PATCH; v1 tests
cover the create/update round-trip (insert/update payload + response
projection) and the :send customer-join projection.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>