Fix/supp ag fb (#1023)

* 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
This commit is contained in:
Mattsson
2026-07-15 15:53:15 +02:00
committed by GitHub
parent a558c75678
commit 072aedeaf9
116 changed files with 5708 additions and 669 deletions
+91 -8
View File
@@ -828,15 +828,16 @@
"edit_dialog_title": "Redigera kund",
"viewer_disabled_tooltip": "Du har endast läsbehörighet i detta företag",
"section_contact": "Kontaktuppgifter",
"section_business": "Företagsuppgifter",
"section_business": "Kunduppgifter",
"section_summary": "Översikt",
"section_notes": "Anteckningar",
"section_invoices": "Fakturor",
"no_contact_info": "Inga kontaktuppgifter",
"no_business_info": "Inga företagsuppgifter",
"no_business_info": "Inga ytterligare kunduppgifter",
"no_invoices": "Inga fakturor kopplade till denna kund",
"label_customer_number": "Kundnummer:",
"label_org_number": "Org.nr:",
"label_personal_number": "Persnr:",
"label_vat": "VAT:",
"label_payment_terms": "Betalningsvillkor:",
"payment_terms_value": "{days} dagar",
@@ -1531,7 +1532,12 @@
"default_days_label": "Betalningsvillkor (dagar)",
"default_notes_label": "Standardtext på fakturor",
"default_notes_placeholder": "T.ex. betalningsvillkor, leveransinfo...",
"default_notes_help": "Föreslås automatiskt vid ny faktura."
"default_notes_help": "Föreslås automatiskt vid ny faktura.",
"reminder_days_heading": "Automatiska påminnelser",
"reminder_days_help": "Ange hur många dagar efter förfallodatum varje påminnelse skickas. Dagarna måste vara i stigande ordning.",
"reminder_days_level_1": "Första påminnelsen (dagar)",
"reminder_days_level_2": "Andra påminnelsen (dagar)",
"reminder_days_level_3": "Slutlig påminnelse (dagar)"
},
"settings_pdf_print": {
"coming_soon": "Kommer snart",
@@ -2498,9 +2504,15 @@
"title_invoice": "Ny faktura",
"title_proforma": "Ny proformafaktura",
"title_delivery_note": "Ny följesedel",
"title_copy": "Kopiera faktura",
"subtitle_invoice": "Skapa en ny faktura",
"subtitle_proforma": "Skapa en proformafaktura (ingen bokföring)",
"subtitle_delivery_note": "Skapa en följesedel (utan priser)",
"subtitle_copy": "Skapa en ny faktura med återanvänt innehåll",
"copy_notice": "Innehållet har kopierats från {number}. Ett nytt utkast skapas med nytt datum och nytt fakturanummer. Kontrollera kund, referenser och ROT/RUT-uppgifter innan du fortsätter.",
"copy_load_failed_title": "Kunde inte kopiera fakturan",
"copy_load_failed_description": "Fakturan finns inte eller kan inte användas som mall.",
"close": "Stäng",
"bank_missing_warning": "Betalningsuppgifter saknas: du behöver lägga till dem innan du skapar en faktura.",
"bank_add_now": "Lägg till nu",
"customer_card_title": "Kund",
@@ -2710,9 +2722,13 @@
"sent_at_suffix": " • Skickad {date}",
"convert_to_invoice": "Konvertera till faktura",
"send_via_email": "Skicka via e-post",
"send_via_email_and_book": "Skicka via e-post och bokför",
"mark_sent_manually": "Skickad manuellt",
"mark_sent_and_book": "Markera som skickad och bokför",
"complete_credit_bookkeeping": "Slutför bokföring",
"mark_as_sent": "Markera som skickad",
"mark_as_paid": "Markera som betald",
"copy_invoice": "Kopiera faktura",
"download_pdf": "Ladda ner PDF",
"viewer_disabled_tooltip": "Du har endast läsbehörighet i detta företag",
"customer_card_title": "Kund",
@@ -2754,7 +2770,7 @@
"payment_status_view_voucher_unlinked": "Saknar verifikat",
"payment_status_empty": "Inga registrerade betalningar ännu.",
"reminders_card_title": "Påminnelser",
"reminders_description": "Automatiska påminnelser skickas vid 15, 30 och 45 dagars förfallen betalning",
"reminders_description": "Automatiska påminnelser skickas när fakturan varit förfallen i {day1}, {day2} och {day3} dagar",
"reminders_empty": "Inga påminnelser har skickats ännu.",
"reminder_level_label": "Nivå {level}",
"reminder_level_1": "Vänlig påminnelse",
@@ -2765,6 +2781,8 @@
"reminder_objection": "Kunden har invändningar",
"credited_card_title": "Krediterad",
"see_credit_note": "Se kreditfaktura {number}",
"credit_draft_card_title": "Kreditfaktura väntar på att skickas",
"open_credit_draft": "Öppna utkast {number}",
"credit_note_card_title": "Kreditfaktura",
"credit_note_description": "Denna kreditfaktura krediterar",
"see_original_invoice": "Se faktura {number}",
@@ -2774,6 +2792,7 @@
"actions_card_title": "Åtgärder",
"cancel_action": "Makulera",
"delete_draft": "Makulera utkast",
"remove_credit_draft": "Ta bort kreditutkast",
"create_credit_note": "Skapa kreditfaktura",
"no_customer_email_warning": "Kunden saknar e-postadress. Lägg till e-post för att kunna skicka fakturan digitalt.",
"send_manual_hint_with_email": "Använd om du redan skickat fakturan på annat sätt (post, annat system)",
@@ -2801,6 +2820,9 @@
"remove_dialog_title": "Ta bort utkast?",
"remove_dialog_desc": "Utkastet och dess rader tas bort permanent. Eftersom inget fakturanummer tilldelats påverkas inte nummerserien. Detta kan inte ångras.",
"remove_dialog_confirm": "Ta bort",
"remove_credit_dialog_title": "Ta bort kreditutkast?",
"remove_credit_dialog_desc": "Kreditfakturan har inte utfärdats eller bokförts. Utkastet och dess rader tas bort permanent och kan skapas på nytt.",
"remove_credit_dialog_confirm": "Ta bort utkast",
"removed_toast_title": "Utkast borttaget",
"removed_toast_description": "Utkastet har tagits bort.",
"status_update_toast_title": "Uppdaterad",
@@ -2830,8 +2852,8 @@
"back": "Tillbaka",
"title": "Skapa kreditfaktura",
"subtitle": "Krediterar faktura {number}",
"warning_title": "Oåterkallelig åtgärd",
"warning_description": "En kreditfaktura makulerar den ursprungliga fakturan helt. Alla belopp blir negativa, en bokföringsverifikation skapas, och den ursprungliga fakturan markeras som krediterad. Denna åtgärd kan inte ångras.",
"warning_title": "Kreditfakturan skapas som utkast",
"warning_description": "Alla belopp blir negativa. Originalfakturan markeras som krediterad först när kreditfakturan skickas eller markeras som skickad. Bokföringen hanteras då enligt företagets valda bokföringsmetod.",
"original_card_title": "Ursprunglig faktura",
"invoice_number_label": "Fakturanummer:",
"date_label": "Datum:",
@@ -2867,7 +2889,7 @@
"already_credited_title": "Redan krediterad",
"already_credited_description": "Denna faktura har redan krediterats",
"created_toast_title": "Kreditfaktura skapad",
"created_toast_description": "Kreditfaktura {number} har skapats",
"created_toast_description": "Kreditfaktura {number} har skapats som utkast.",
"create_failed_title": "Kunde inte skapa kreditfaktura",
"create_failed_fallback": "Kunde inte skapa kreditfaktura",
"try_again": "Försök igen."
@@ -2956,26 +2978,54 @@
"invoice_send_dialog": {
"title_email": "Skicka faktura",
"title_manual": "Markera som skickad",
"title_credit_email": "Skicka kreditfaktura",
"title_credit_manual": "Markera kreditfaktura som skickad",
"title_credit_repair": "Slutför kreditfakturans bokföring",
"title_suffix": ": {number}",
"description_sek_suffix": " ({amount} SEK)",
"description_to_email": " till {email}",
"load_failed_title": "Kunde inte ladda inställningar",
"no_active_company": "Inget aktivt företag",
"company_settings_failed": "Kunde inte ladda företagsinställningar",
"fiscal_period_failed": "Kunde inte ladda räkenskapsperioden",
"original_invoice_failed": "Kunde inte ladda originalfakturan",
"journal_preview_intro": "Följande bokföringsverifikation skapas automatiskt:",
"voucher_description": "Försäljning faktura{numberSpace}{customerSuffix}",
"credit_voucher_description": "Kreditfaktura{numberSpace}{customerSuffix}",
"explain_cash": "Kontantmetoden: bokföring sker vid betalning, inte vid fakturering.",
"explain_credit_cash": "Kontantmetoden: originalfakturan är obetald, så ingen verifikation skapas när kreditfakturan utfärdas.",
"explain_email": "Fakturan skickas till {email}.",
"explain_manual": "Fakturan markeras som skickad.",
"cancel": "Avbryt",
"later": "Gör senare",
"send_invoice": "Skicka faktura",
"send_invoice_and_book": "Skicka och bokför",
"mark_as_sent": "Markera som skickad",
"mark_as_sent_and_book": "Markera som skickad och bokför",
"send_credit_note": "Skicka kreditfaktura",
"send_credit_note_and_book": "Skicka och bokför kreditfaktura",
"mark_credit_note_sent": "Markera som skickad",
"mark_credit_note_sent_and_book": "Markera som skickad och bokför",
"complete_credit_bookkeeping": "Slutför bokföring",
"send_failed_title": "Kunde inte skicka faktura",
"credit_send_failed_title": "Kunde inte utfärda kreditfakturan",
"send_failed_fallback": "Kunde inte skicka fakturan",
"send_success_title": "Faktura skickad",
"send_book_success_title": "Skickad och bokförd",
"credit_send_success_title": "Kreditfaktura skickad",
"credit_send_book_success_title": "Kreditfaktura skickad och bokförd",
"credit_send_success": "Kreditfakturan har skickats till {email} och utfärdats.",
"send_success_default": "Fakturan har skickats till {email}",
"partial_success": "{message}. Ett efterföljande steg misslyckades. Kontrollera fakturan och bokföringen.",
"mark_success_title": "Faktura markerad som skickad",
"mark_book_success_title": "Skickad och bokförd",
"credit_mark_success_title": "Kreditfaktura utfärdad",
"credit_mark_book_success_title": "Kreditfaktura skickad och bokförd",
"credit_repair_success_title": "Bokföringen är slutförd",
"credit_mark_success_voucher_created": "Kreditfakturan är markerad som skickad och verifikationen har skapats.",
"credit_mark_success_no_voucher": "Kreditfakturan är markerad som skickad. Kontantmetoden kräver ingen verifikation för en obetald originalfaktura.",
"mark_success_voucher_created": "Bokföringsverifikationen har skapats.",
"mark_partial_success": "Fakturan markerades som skickad, men ett efterföljande steg misslyckades. Kontrollera fakturan och bokföringen.",
"try_again": "Försök igen."
},
"invoice_payment_dialog": {
@@ -3060,6 +3110,14 @@
"due_date_label": "Förfallodatum",
"payment_reference_label": "OCR / Betalningsreferens",
"payment_reference_placeholder": "OCR-nummer",
"document_label": "Fakturaunderlag",
"document_help": "Bifoga leverantörens PDF eller en bild. Underlaget sparas med fakturan och kopplas automatiskt till verifikationen.",
"document_upload_in_progress_title": "Underlaget laddas fortfarande upp",
"document_upload_in_progress_description": "Vänta tills uppladdningen är klar innan du registrerar fakturan.",
"document_upload_failed_title": "Underlaget kunde inte laddas upp",
"document_upload_failed_description": "Ta bort filen och försök ladda upp den igen.",
"document_link_warning_title": "Fakturan registrerades, men underlaget saknas på verifikationen",
"document_link_warning_description": "Öppna verifikationen och bifoga underlaget där.",
"add_row": "Lägg till rad",
"currency_label": "Valuta",
"exchange_rate_label": "Växelkurs",
@@ -3267,6 +3325,9 @@
"registration_voucher": "Registreringsverifikation",
"no_registration_voucher": "Ingen registreringsverifikation (kontantmetoden)",
"payment_voucher": "Betalningsverifikation",
"document_title": "Fakturaunderlag",
"document_attached": "Leverantörens faktura är bifogad och arkiverad.",
"view_document": "Visa underlag",
"notes_title": "Anteckningar",
"pay_dialog_title": "Markera som betald",
"tab_new_payment": "Ny betalning",
@@ -3474,11 +3535,27 @@
"corrupt_replace_cta": "Ladda upp ny version",
"integrity_unknown": "Filens integritet kunde inte verifieras: försök igen senare om förhandsgranskningen inte visas."
},
"document_upload": {
"session_expired": "Din session har gått ut. Ladda om sidan och logga in igen.",
"server_status": "Servern svarade {status}.",
"failed_status": "Uppladdningen misslyckades ({status})",
"network_error": "Uppladdningen misslyckades: nätverksfel",
"unsupported_type": "Filtypen stöds inte",
"too_large": "Filen är för stor (max 10 MB)",
"compact_prompt": "Dra och släpp eller klicka",
"prompt": "Dra och släpp filer här",
"format_hint": "PDF eller bild (max 10 MB)",
"uploaded": "Uppladdad",
"error": "Fel",
"remove_file": "Ta bort fil",
"uploading": "Laddar upp..."
},
"journal_attachments": {
"loading": "Laddar underlag...",
"title": "Underlag",
"add": "Lägg till underlag",
"empty": "Inga underlag bifogade.",
"via_supplier_invoice": "Via leverantörsfaktura",
"download": "Ladda ner",
"remove": "Ta bort",
"replace": "Ersätt med ny version",
@@ -3924,7 +4001,7 @@
"ext_enable_banking_long_description": "Koppla ditt bankkonto direkt och synka transaktioner automatiskt via säker PSD2-bankintegration. Stöder de flesta svenska banker.",
"ext_email_name": "E-post (Resend)",
"ext_email_description": "Skicka fakturor och påminnelser via e-post",
"ext_email_long_description": "Aktiverar e-postfunktioner: skicka fakturor till kunder, automatiska betalningspåminnelser (15/30/45 dagar), och e-postmeddelanden. Kräver ett Resend-konto med verifierad domän.",
"ext_email_long_description": "Aktiverar e-postfunktioner: skicka fakturor till kunder, automatiska betalningspåminnelser enligt valt schema, och e-postmeddelanden. Kräver ett Resend-konto med verifierad domän.",
"ext_arcim_migration_name": "Systemmigration",
"ext_arcim_migration_description": "Migrera bokföring från Fortnox, Visma, Bokio, Björn Lundén eller Briox",
"ext_arcim_migration_long_description": "Flytta all bokföringsdata från ditt gamla system till accounted. Importerar kontoplan, verifikationer, kunder, leverantörer och öppna fakturor automatiskt via säker API-integration direkt med leverantören.",
@@ -4217,6 +4294,7 @@
"back": "Tillbaka till artiklar",
"edit": "Redigera",
"deactivate": "Inaktivera",
"delete": "Ta bort",
"edit_dialog_title": "Redigera artikel",
"viewer_disabled_tooltip": "Du har endast läsbehörighet i detta företag",
"type_vara": "Vara",
@@ -4247,6 +4325,11 @@
"deactivate_confirm_label": "Inaktivera",
"deactivated_title": "Artikel inaktiverad",
"deactivate_failed_title": "Kunde inte inaktivera artikel",
"delete_confirm_title": "Ta bort {name}",
"delete_confirm_description": "Artikeln och dess artikelnummer tas bort permanent. Det går bara om artikeln aldrig har använts på en faktura.",
"delete_confirm_label": "Ta bort",
"deleted_title": "Artikel borttagen",
"delete_failed_title": "Kunde inte ta bort artikel",
"activate_and_save": "Aktivera och spara"
},
"form_article": {