* fix: article number ordering, free-text rows, invoice back-nav, onboarding resilience (#1053)
Four fixes from Discord feedback in issue #1053:
- Articles now order by article number with numeric-aware comparison
('2' before '10', unnumbered last, name tiebreak) in the invoice
editor's article picker and as the register's default sort, via a
shared lib/articles/sort.ts. Name order put article "1" last.
- Invoice rows with no amounts (quantity 0, unit price 0) render as
pure text rows on the PDF, the invoice detail page, and the review
step via shared isTextLikeLine(), instead of printing
"0 / 0,00 SEK / 0,00 SEK". Display-only; booking untouched.
- The invoice editor navigates with router.replace after saving, so
the detail page's back arrow returns to the list instead of
reopening a fresh editor from history.
- A transient query failure no longer reads as "no companies" /
"onboarding not done": getActiveCompanyId throws
CompanyContextError('resolution_failed') instead of returning null,
the Edge middleware fails open on a degraded resolution (no
onboarding redirect, no cookie clearing, no locale overwrite), and
the dashboard page only redirects to /onboarding on a positively
read incomplete/missing settings row. This is the likely cause of
the completed onboarding wizard reappearing.
Fixes#1053
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs: CLAUDE.md tenancy line matches actual resolution order (prefs-first, cookie not read)
The middleware stopped reading the gnubok-company-id cookie when
user_preferences became authoritative (RLS parity); the stale doc line
still described cookie-first order and misled review tooling.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat: implement inbox document picker and linking functionality
* feat: implement self-billing invoice functionality
- Added support for registering self-billed invoices received from customers.
- Updated the invoice schema to include fields for self-billing metadata such as `is_self_billed`, `external_invoice_number`, `self_billing_agreement_ref`, and `received_date`.
- Created API route for handling self-billed invoice submissions, including validation and error handling.
- Implemented database migrations to add necessary columns and constraints for self-billing invoices.
- Developed tests to ensure correct behavior of self-billing invoice creation and validation rules.
- Updated Swedish localization files to include new terms related to self-billing.
* feat: enforce SIE import requirement for non-Fortnox providers in migration process
* feat: streamline invoice processing and enhance error logging across APIs
* feat: make invoice_number nullable and assign on send
- Updated the invoices table to allow invoice_number to be nullable.
- Modified the logic to assign invoice numbers only when the invoice status transitions to 'sent'.
- Refactored related code to handle nullable invoice numbers, including UI components and API routes.
- Added tests to ensure correct behavior when handling invoices with null invoice numbers.
- Introduced a utility function to display invoice numbers, defaulting to '(Utkast)' for drafts.
* fix: update fiscal period handling to return names of open periods in error messages
* fix: enhance period creation logic to account for company-wide bookkeeping lock-through
* fix: remove unnecessary customer_type field from customer insertion query
* fix: scope invoice number count query to specific companies to avoid test interference
* feat: Implement atomic invoice number generation and ensure compliance with invoice numbering rules
- Introduced `ensureInvoiceNumber` function to assign invoice numbers atomically, handling concurrency and ensuring compliance with document types.
- Updated invoice-related components to utilize the new `invoiceNumberDisplay` utility for consistent invoice number formatting.
- Added checks to ensure that invoices in non-draft statuses have valid invoice numbers, preventing violations of legal requirements.
- Created tests for the new invoice number generation logic, ensuring correct behavior under various scenarios, including concurrent requests.
- Added a draft banner to PDF templates for invoices without assigned numbers, clarifying their status to users.
- Updated database migrations to support the new atomic invoice number generation logic and enforce constraints on invoice statuses.