* fix(articles): article delete failed for everyone on a phantom column
Support report (odinaero.se): three unused articles could not be
deleted. Root cause: the DELETE route's usage preflight filtered
invoice_items by company_id, a column that table does not have, so
PostgREST answered 42703 and the route mapped it to
ARTICLE_DELETE_FAILED on every delete since 8a9a930f. The queued
supabase mock swallows chained filters, which is why tests stayed
green; a source-pin regression test now guards the query shape.
Tenancy is unaffected: the preceding articles lookup already scopes
the id to the company, and invoice_items rows are only reachable via
that article's UUID.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs: decision log for the currency-honesty batch and the phantom-column lesson
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
- invoice/article posting-account overrides accept active class 1-3 accounts;
class 1-2 (balance-sheet) accounts are rejected on VAT-bearing lines so the
ruta 05 tax base always books to a 3xxx account
- shared posting-account regex across server schemas, pending-operation
re-validation, and client forms
- share-capital settings (aktiekapital/antal_aktier) feed the annual-report
note; kvotvarde derived per ABL 1 kap 6 $; all-or-nothing pair constraint
- signed per-rate VAT breakdown on credit-note PDFs; U+2212 to ASCII hyphen
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix: prevent credit notes from entering payment flow
* fix: persist and display customer personal numbers
* feat: configure automatic invoice reminder days
* fix: issue credit notes through send flow
* chore: add repository agent guidance
* feat(mcp): route tools across user companies
* fix(articles): delete unused register entries
* feat(invoices): improve issued invoice actions
* feat(supplier-invoices): retain uploaded source documents
* docs: record implementation decisions
* feat: enhance customer personal number handling and validation
- Updated CustomerForm to allow personal numbers in the format of "********-1234" for individual customers.
- Added validation to ensure personal numbers are only accepted for individual customers in CreateCustomerSchema.
- Implemented masking and encryption for personal numbers to enhance data protection.
- Introduced new utility functions for masking and encrypting personal numbers.
- Added database migration to enforce unique constraints on credit note relationships and prevent duplicate entries.
- Enhanced error handling and logging for credit note issuance and invoice processing.
- Updated tests to cover new credit note creation guards and personal number handling.
* test: enhance list companies test with supabase query mocks
Em dashes (—) and en dashes (–) had spread across comments, docs, tests,
and a few UI strings, reading as AI-generated boilerplate rather than
house style. Replaced each with punctuation matching its context: colon
for explanatory clauses, comma for asides, plain hyphen for numeric/legal
ranges (e.g. "21-23§"), "to"/"till" for date ranges, parentheses for
paired-dash asides. messages/en.json and messages/sv.json were fixed by
hand together to keep sv/en in sync.
Left untouched where the dash is the functional subject rather than
decorative punctuation: date-range-parser.ts's separator regex,
charset-repair.ts's CP1252 byte-mapping table (and its test), the SIE
encoding mojibake docs, generic-csv.ts's minus-sign normalizer, the
agent system-prompt files that already instruct against em dashes, and
a golden iXBRL test fixture compared byte-for-byte.
Also fixes two bugs surfaced along the way: an off-by-one in
ApiKeysPanel's scope-label split (a leftover from an earlier partial
pass), and a charset-repair test that had lost the literal en-dash it
exists to verify.
Regenerated the agent atom seed migration (skills:generate) since 27
SKILL.md files changed. Added a CLAUDE.md rule against em/en dashes,
with an explicit carve-out for the functional-dash cases above.
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* fix(invoices): apply configured voucher series to payments + preview next voucher
The booking engine resolves the series from
default_voucher_series_per_source_type, but the global "Standardserie"
dropdown wrote a separate field the engine ignored, and cash-method invoice
payments (invoice_cash_payment) weren't exposed in settings — so configured
series were silently dropped to "A".
- Expose cash/private payment source types in the per-source-type form
- Write the global default through to the map on save, keeping overrides
- Resolve voucher-sequences/next by source_type (+date) to match the engine
- Show the upcoming voucher (V2) in the payment dialog title
- Share resolveInvoicePaymentSourceType so preview and booking can't drift
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(salary): keep AGI panel in sync with Skatteverket signing state
The AGI panel mixed run-scoped generation state (agi_generated_at,
agi_declarations) with period-scoped submission state (extension_data
agi_submission_{period}), so the two could drift and present
contradictory UI. Reconcile them:
- Auto-detect a Mina Sidor BankID signature: while awaiting_signing,
poll /agi/kvittenser on mount and on tab refocus so the panel flips
to "signed" (hiding the signing actions) without a manual
"Hamta kvittens" click.
- Warn instead of offering to sign when the locked granskningsunderlag
predates the run's latest AGI generation (draftIsStale) — avoids
filing superseded figures.
- Self-heal a stale "AGI-XML saknas" error once the run's AGI is
(re)generated out-of-band (MCP/API/other tab).
- Refetch the salary run on tab focus so agi_generated_at reflects
out-of-band generation without a hard reload.
- /agi/lasUpp now clears the cached agi_submission_{period} record, so
unlocking drops the panel back to the pre-submission state instead of
stranding it on a released "redo att signeras" draft.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat: Implement VAT registration handling and invoice item line types
- Added VAT registration check in commitCreateInvoice to set VAT rate to 0% for non-VAT registered companies.
- Updated invoice creation logic to reflect 'exempt' VAT treatment and adjusted related fields accordingly.
- Introduced support for free-text and blank spacer rows in invoice items by adding a new line_type field.
- Enhanced invoice and credit note handling to accommodate new line types.
- Added new localized messages for text rows in English and Swedish.
- Created tests for salary run approval logic, ensuring bank details are validated correctly.
- Implemented effective net payout calculation for salary runs, considering tax overrides.
- Added SQL migrations to support new invoice item line types and accounting method awareness for linking invoices to vouchers.
* feat(articles): artikelregister with revenue account + VAT rate per article
Article register (non-inventory) with per-article VAT rate and optional
BAS class-3 revenue-account override. Includes API routes, UI pages,
MCP tools, pending-operation staging, and the activate-or-create
account flow (ACCOUNTS_NOT_IN_CHART -> ActivateAccountsDialog,
unknown numbers -> AddAccountDialog) reusing the journal entry UX.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(bookkeeping): no-doc-required batch + bulk-missing endpoints
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(payments): supplier payment lines + cash-method invoice matching
Shared payment-line proposal for supplier invoices, improved
match-invoice/match-supplier-invoice flows (kontantmetoden-aware),
and voucher-link support without requiring a 151x clearing entry.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(bookkeeping): new journal entry dialog, SIE import tweaks, misc
New journal entry dialog component, journal list/page updates,
invoice editor updates, SIE import adjustments, transaction ingest
and api-key tweaks, pr-agent workflow update.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(invoices): implement tax reduction features and localization updates
* feat(tests): add VAT registration gate to pending operations commit tests
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>