Files
accounted/supabase/migrations/20260716150000_company_settings_defer_invoice_booking.sql
Jakob Wennberg 1443235cec feat(invoices): registrera utan att bokföra + explicit Bokför-steg (#1040)
* feat(invoices): registrera utan att bokföra + explicit Bokför-steg

Companies where one person registers supplier invoices / sends customer
invoices while ekonomi does the actual bookkeeping had no way to split
the two: under faktureringsmetoden every registration/send booked the
journal entry inline.

- New company setting defer_invoice_booking (default off, accrual only):
  registering a supplier invoice or sending/marking-sent a customer
  invoice creates NO journal entry.
- New explicit booking routes POST /api/supplier-invoices/[id]/book and
  POST /api/invoices/[id]/book: create the registration/revenue entry
  afterwards, CAS-guarded against concurrent booking (a lost race
  cancels the just-posted voucher with a gap explanation), including
  periodisering schedules.
- Detail pages show "Ej bokförd ännu" + a Bokför button for unbooked
  accrual invoices; the settings toggle lives under Bokföringsmetod.
- mark-paid needs no changes: both payment flows already route on the
  journal-entry link, so an invoice still unbooked when paid gets the
  full cash-style entry.
- The mark-sent fail-closed rollback now keys on the same gate so
  deferred sends are not rolled back as booking failures.

Fixes #967

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(invoices): harden deferred booking after review

CodeRabbit round on #1040:
- CAS link guards also require a still-bookable status (and uncredited,
  customer side) so a concurrent mark-paid/credit cannot end up with a
  double-posting registration/revenue entry.
- Settings reads fail closed instead of defaulting to accrual rules.
- Detail pages surface the ACCRUAL_SCHEDULE_FAILED warning instead of
  showing plain success, and the customer page no longer stringifies
  structured errors into "[object Object]".
- The settings form normalizes defer_invoice_booking to false under
  kontantmetoden so a stale flag cannot re-activate on method switch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:15:20 +02:00

21 lines
1.1 KiB
SQL

-- Issue #967 "Registrera men bokför inte": let companies split registering
-- invoices from booking them. Many companies have one person who creates the
-- customer invoice / registers the supplier invoice while ekonomi books it
-- with the correct kontering afterwards.
--
-- When defer_invoice_booking is true AND the company uses faktureringsmetoden
-- (accrual), registering a supplier invoice or sending a customer invoice no
-- longer creates the journal entry inline; a separate explicit "Bokför"
-- action (POST /api/supplier-invoices/[id]/book, /api/invoices/[id]/book)
-- posts it later. Kontantmetoden companies already defer booking to payment,
-- so the flag is a no-op for them. Default false keeps every existing
-- company on the book-immediately behavior.
ALTER TABLE public.company_settings
ADD COLUMN IF NOT EXISTS defer_invoice_booking boolean NOT NULL DEFAULT false;
COMMENT ON COLUMN public.company_settings.defer_invoice_booking IS
'When true (faktureringsmetoden only): registering supplier invoices / sending customer invoices does not book them; booking is a separate explicit step (#967).';
NOTIFY pgrst, 'reload schema';