feat(expenses): utlägg as an answer to "Vem betalade?" in Underlag, not a page (#2317)

An out-of-pocket purchase differs from any other receipt only in the
credit account, so the Underlag pane now asks one question for an
unmatched underlag (Företaget / Jag, privat / En anställd / Ingen ännu)
and books a privately paid receipt in place through POST
/api/expense-claims, replacing the "Andra sätt att bokföra" dropdown and
the deep link into the two-step wizard. The verifikat editor stays
reachable below as the escape hatch (BFL 5 kap 6-7 §).

The person owed surfaces in Att göra under a new Betala band, one row per
person (lib/worklist expense_payout, counted in the total and exposed to
agents through the attention resource). The Utlägg nav row is gated on
existing claims, the same hybrid gate as Körjournal, since the entry
point for a new utlägg is now the Underlag pane.


Claude-Session: https://claude.ai/code/session_01P8YsvPqjfGxGZUkGeBVUWQ

Co-authored-by: Jakob Wennberg <311770904+jakobwennberg-oss@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-09-05 15:57:14 +02:00
committed by GitHub
co-authored by Jakob Wennberg Claude Fable 5.1
parent bff44e5757
commit cbe5580886
17 changed files with 866 additions and 86 deletions
+35
View File
@@ -3302,6 +3302,37 @@
"mixed_currency_note": "Documents in different currencies cannot be summed into a single amount. Each document is still booked separately, against its matched bank transaction and the amount the bank actually settled in SEK."
},
"inbox_workspace": {
"payer_question": "Who paid?",
"payer_company": "The company",
"payer_help_company": "Card or bank account. Matched against the transaction when it appears.",
"payer_owner": "Me, privately",
"payer_help_owner": "The company owes you the amount. Paid out from the company account later.",
"payer_employee": "An employee",
"payer_help_employee": "The company owes the person the amount (2820). Paid out later.",
"payer_unpaid": "No one yet",
"payer_help_unpaid": "Unpaid invoice. Booked as a supplier liability with a due date.",
"payer_help_unpaid_cash": "Unpaid invoice. Registered as a supplier invoice and booked when the payment shows on the account.",
"payer_book_expense": "Book the expense",
"payer_open_editor": "Open in the voucher editor",
"expense_dialog_title": "Book the expense",
"expense_dialog_help_owner": "Cost and VAT are booked now. The company owes you the amount on account {account} until it is paid out.",
"expense_dialog_help_employee": "Cost and VAT are booked now. The company owes the employee the amount on account 2820 until it is paid out.",
"expense_owner_name": "Your name",
"expense_employee": "Employee",
"expense_pick_employee": "Choose a person",
"expense_no_employees": "No employees registered",
"expense_description": "Description",
"expense_date": "Date",
"expense_amount": "Amount ({currency})",
"expense_vat": "VAT",
"expense_account": "Expense account",
"expense_outcome_att_gora": "Lands in To do: Pay out expenses to {name}.",
"expense_fx_note": "Booked in SEK at the Riksbank rate for the date.",
"expense_cancel": "Cancel",
"expense_confirm": "Book",
"expense_booked_title": "Expense booked",
"expense_booked_description": "The debt to {name} is now in To do.",
"expense_failed_title": "Could not book the expense",
"hunt_stop": "Stop",
"hunt_reading": "Reading {mailboxes}",
"hunt_progress": "pass {pass} · {found} fetched",
@@ -6640,6 +6671,10 @@
"dismiss": "Hide"
},
"dashboard": {
"band_betala": "Pay",
"row_expense_payout": "Pay out expenses to {name}",
"row_expense_payout_detail_one": "1 receipt · {date}",
"row_expense_payout_detail_other": "{count} receipts · oldest {date}",
"skv_promo_title": "Connect Skatteverket",
"skv_promo_description": "See your tax account and file VAT and employer declarations directly from here. Connect with BankID in a couple of minutes.",
"skv_promo_cta": "Connect",