* 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>
25 lines
1.1 KiB
TypeScript
25 lines
1.1 KiB
TypeScript
/**
|
|
* #967 "Registrera men bokför inte": whether issuing an invoice (registering
|
|
* a supplier invoice, sending a customer invoice) books it inline.
|
|
*
|
|
* Inline booking happens only under faktureringsmetoden (accrual) with
|
|
* defer_invoice_booking off. Kontantmetoden companies never book at issue
|
|
* (they book at payment), and deferred companies book via the explicit
|
|
* "Bokför" routes (POST /api/supplier-invoices/[id]/book,
|
|
* POST /api/invoices/[id]/book) instead.
|
|
*
|
|
* The payment flows need no gate of their own: both mark-paid paths already
|
|
* route on whether a live journal-entry link exists, so an invoice that is
|
|
* still unbooked when paid gets the full cash-style entry at payment.
|
|
*/
|
|
export function booksInvoicesOnIssue(
|
|
settings:
|
|
| { accounting_method?: string | null; defer_invoice_booking?: boolean | null }
|
|
| null
|
|
| undefined
|
|
): boolean {
|
|
// No settings row: match the historical default (accrual, book at issue).
|
|
if (!settings) return true
|
|
return (settings.accounting_method || 'accrual') === 'accrual' && !settings.defer_invoice_booking
|
|
}
|