# LandveX Enterprise Platform — Faktureringsmodul ## Översikt Faktureringsmodulen hanterar kommunala fakturor och avtal, integrerar med befintliga ekonomisystem och erbjuder rapportering/export i SIE4 och PDF. UI:n är designad för icke-tekniska användare (handläggare, ekonomer, avtalsansvariga). --- ## 1. Datamodell ### 1.1 Huvudentiteter ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Customer │ │ Contract │ │ Invoice │ │ (Kund) │1..* │ (Avtal) │1..* │ (Faktura) │ ├─────────────────┤◄────┤ ├────►├─────────────────┤ │ id (PK) │ ├─────────────────┤ │ id (PK) │ │ org_number │ │ id (PK) │ │ contract_id (FK)│ │ name │ │ customer_id (FK)│ │ invoice_number │ │ address │ │ contract_type │ │ period_start │ │ postal_code │ │ start_date │ │ period_end │ │ city │ │ end_date │ │ amount_ex_vat │ │ contact_person │ │ amount │ │ vat_amount │ │ email │ │ vat_rate │ │ total_amount │ │ phone │ │ billing_period │ │ due_date │ │ municipality_id │ │ status │ │ status │ │ created_at │ │ created_at │ │ sent_date │ │ updated_at │ │ updated_at │ │ paid_date │ └─────────────────┘ └─────────────────┘ │ created_at │ │ updated_at │ └─────────────────┘ │ │ 1..* ▼ ┌─────────────────┐ │ ContractService │ │(Avtalstjänst) │ ├─────────────────┤ │ id (PK) │ │ contract_id (FK)│ │ service_name │ │ description │ │ unit_price │ │ quantity │ │ unit │ │ created_at │ └─────────────────┘ ``` ### 1.2 Detaljerade tabeller #### customers (Kunder) | Kolumn | Typ | Beskrivning | |--------|-----|-------------| | id | UUID PK | Unikt ID | | org_number | VARCHAR(12) | Organisationsnummer (t.ex. 212000-1234) | | name | VARCHAR(255) | Kommunens/offentliga aktörens namn | | address | VARCHAR(255) | Postadress | | postal_code | VARCHAR(10) | Postnummer | | city | VARCHAR(100) | Ort | | contact_person | VARCHAR(255) | Kontaktperson | | email | VARCHAR(255) | E-post | | phone | VARCHAR(50) | Telefon | | municipality_id | VARCHAR(4) | Kommunkod (t.ex. 1480 för Göteborg) | | created_at | TIMESTAMP | Skapad | | updated_at | TIMESTAMP | Uppdaterad | #### contracts (Avtal) | Kolumn | Typ | Beskrivning | |--------|-----|-------------| | id | UUID PK | Unikt ID | | customer_id | UUID FK | Referens till kund | | contract_number | VARCHAR(50) | Avtalsnummer (t.ex. "LVX-2024-001") | | contract_type | ENUM | 'service', 'license', 'project', 'subscription' | | start_date | DATE | Startdatum | | end_date | DATE | Slutdatum | | amount | DECIMAL(15,2) | Avtalsbelopp exkl. moms | | vat_rate | DECIMAL(4,2) | Momssats (t.ex. 25.00) | | billing_period | ENUM | 'monthly', 'quarterly', 'semi_annual', 'annual', 'one_time' | | next_billing_date | DATE | Nästa faktureringsdatum | | status | ENUM | 'draft', 'active', 'paused', 'terminated', 'expired' | | notes | TEXT | Interna anteckningar | | created_at | TIMESTAMP | Skapad | | updated_at | TIMESTAMP | Uppdaterad | #### contract_services (Avtalstjänster) | Kolumn | Typ | Beskrivning | |--------|-----|-------------| | id | UUID PK | Unikt ID | | contract_id | UUID FK | Referens till avtal | | service_name | VARCHAR(255) | Tjänstens namn | | description | TEXT | Beskrivning | | unit_price | DECIMAL(15,2) | Pris per enhet | | quantity | DECIMAL(10,2) | Antal enheter | | unit | VARCHAR(50) | Enhet (t.ex. 'st', 'tim', 'mån') | | created_at | TIMESTAMP | Skapad | #### invoices (Fakturor) | Kolumn | Typ | Beskrivning | |--------|-----|-------------| | id | UUID PK | Unikt ID | | contract_id | UUID FK | Referens till avtal | | invoice_number | VARCHAR(50) | Fakturanummer (t.ex. "FV-2024-00042") | | period_start | DATE | Periodens start | | period_end | DATE | Periodens slut | | amount_ex_vat | DECIMAL(15,2) | Belopp exkl. moms | | vat_amount | DECIMAL(15,2) | Momsbelopp | | total_amount | DECIMAL(15,2) | Totalt inkl. moms | | due_date | DATE | Förfallodatum | | status | ENUM | 'draft', 'sent', 'paid', 'overdue', 'cancelled', 'credited' | | sent_date | TIMESTAMP | Skickad datum | | paid_date | DATE | Betald datum | | reference | VARCHAR(255) | OCR/Referensnummer | | created_at | TIMESTAMP | Skapad | | updated_at | TIMESTAMP | Uppdaterad | #### invoice_rows (Fakturarader) | Kolumn | Typ | Beskrivning | |--------|-----|-------------| | id | UUID PK | Unikt ID | | invoice_id | UUID FK | Referens till faktura | | description | VARCHAR(500) | Radbeskrivning | | quantity | DECIMAL(10,2) | Antal | | unit | VARCHAR(50) | Enhet | | unit_price | DECIMAL(15,2) | Pris per enhet | | total_price | DECIMAL(15,2) | Radsumma | | created_at | TIMESTAMP | Skapad | #### integrations (Integrationer) | Kolumn | Typ | Beskrivning | |--------|-----|-------------| | id | UUID PK | Unikt ID | | name | VARCHAR(255) | Integrationens namn | | system_type | ENUM | 'fortnox', 'visma', 'hogia', 'custom' | | config | JSONB | Konfiguration (API-nycklar, URL:er, etc.) | | is_active | BOOLEAN | Aktiv/inaktiv | | last_sync | TIMESTAMP | Senaste synkronisering | | created_at | TIMESTAMP | Skapad | #### audit_log (Revisionslogg) | Kolumn | Typ | Beskrivning | |--------|-----|-------------| | id | UUID PK | Unikt ID | | entity_type | VARCHAR(50) | 'invoice', 'contract', 'customer' | | entity_id | UUID | Referens till entitet | | action | VARCHAR(50) | 'created', 'updated', 'deleted', 'sent', 'paid' | | user_id | UUID | Vilken användare | | old_values | JSONB | Tidigare värden | | new_values | JSONB | Nya värden | | created_at | TIMESTAMP | När händelsen inträffade | --- ## 2. API-endpoints ### 2.1 Base URL ``` /api/v1/billing ``` ### 2.2 Kunder (Customers) ``` GET /customers # Lista alla kunder (paginerad) GET /customers/:id # Hämta specifik kund POST /customers # Skapa ny kund PUT /customers/:id # Uppdatera kund DELETE /customers/:id # Ta bort kund (soft delete) GET /customers/:id/contracts # Hämta kundens avtal ``` **Query-parametrar för GET /customers:** - `search` — fritextsökning på namn/org.nr - `municipality_id` — filtrera på kommunkod - `page`, `limit` — paginering - `sort` — sortering (t.ex. `name:asc`) ### 2.3 Avtal (Contracts) ``` GET /contracts # Lista avtal GET /contracts/:id # Hämta specifikt avtal POST /contracts # Skapa nytt avtal PUT /contracts/:id # Uppdatera avtal DELETE /contracts/:id # Ta bort avtal PUT /contracts/:id/status # Ändra status (activate/pause/terminate) GET /contracts/:id/invoices # Hämta avtalets fakturor POST /contracts/:id/renew # Förnya avtal ``` **Query-parametrar för GET /contracts:** - `search` — fritextsökning - `status` — filtrera på status - `customer_id` — filtrera på kund - `expiring_within` — dagar till upphörande (t.ex. 30, 90) - `page`, `limit`, `sort` ### 2.4 Fakturor (Invoices) ``` GET /invoices # Lista fakturor GET /invoices/:id # Hämta specifik faktura POST /invoices # Skapa manuell faktura POST /invoices/generate # Generera fakturor från avtal PUT /invoices/:id # Uppdatera utkast PUT /invoices/:id/send # Skicka faktura PUT /invoices/:id/pay # Markera som betald PUT /invoices/:id/cancel # Makulera faktura PUT /invoices/:id/credit # Skapa kreditfaktura GET /invoices/:id/pdf # Generera PDF GET /invoices/:id/sie4 # Exportera som SIE4 ``` **Query-parametrar för GET /invoices:** - `search` — fritextsökning - `status` — filtrera på status - `customer_id` — filtrera på kund - `contract_id` — filtrera på avtal - `period_from`, `period_to` — datumintervall - `overdue` — true/false, visa endast förfallna - `page`, `limit`, `sort` ### 2.5 Rapportering & Export ``` GET /reports/summary # Sammanfattning (intäkter, förfallna, etc.) GET /reports/revenue # Intäktsrapport per period GET /reports/aging # Förfallorapport (aging report) GET /reports/export/sie4 # SIE4-export för period GET /reports/export/pdf # PDF-rapport POST /reports/custom # Anpassad rapport ``` **Query-parametrar för rapporter:** - `period_from`, `period_to` — obligatoriska datum - `customer_id` — valfri filtrering - `group_by` — 'month', 'quarter', 'year', 'customer' ### 2.6 Integrationer ``` GET /integrations # Lista integrationer GET /integrations/:id # Hämta integration POST /integrations # Skapa integration PUT /integrations/:id # Uppdatera integration DELETE /integrations/:id # Ta bort integration POST /integrations/:id/sync # Manuell synkronisering GET /integrations/:id/logs # Synkroniseringsloggar ``` ### 2.7 Autogenerering (Cron/Scheduler) ``` POST /jobs/generate-invoices # Trigga fakturagenerering GET /jobs/status # Status på bakgrundsjobb ``` --- ## 3. UI-skiss (Textbeskrivning) ### 3.1 Designprinciper - **Enkelhet**: Minimera antalet klick för vanliga uppgifter - **Tydlighet**: Tydliga statusindikatorer (färger, ikoner) - **Kontext**: All relevant info synlig utan att navigera bort - **Tillgänglighet**: WCAG 2.1 AA, stöd för skärmläsare ### 3.2 Huvudnavigering (Sidebar) ``` ┌────────────────────────────────────────┐ │ 🏠 LandveX Fakturering │ ├────────────────────────────────────────┤ │ 📋 Översikt ← Dashboard │ │ 👥 Kunder │ │ 📄 Avtal │ │ 💰 Fakturor │ │ 📊 Rapporter │ │ 🔌 Integrationer │ ├────────────────────────────────────────┤ │ ⚙️ Inställningar │ │ ❓ Hjälp │ └────────────────────────────────────────┘ ``` ### 3.3 Dashboard (Översikt) ``` ┌─────────────────────────────────────────────────────────────┐ │ God morgon, [Användare]! [Sök] [🔔] [👤 Profil] │ ├─────────────────────────────────────────────────────────────┤ │ SNABBLÄNKAR: │ │ [+ Ny faktura] [+ Nytt avtal] [📥 Importera] [⚙️] │ ├─────────────────────────────────────────────────────────────┤ │ KORT (4 st i rad): │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌────────┐│ │ │ 💰 Omsättn. │ │ 📄 Fakturor │ │ ⏰ Förfallna│ │ ✅ Bet. ││ │ │ 1 245 000 │ │ 42 denna │ │ 7 st │ │ 35 st ││ │ │ kr (mån) │ │ månad │ │ 89 500 kr │ │ ││ │ │ +12% vs förra│ │ │ │ 🔴 Varning! │ │ ││ │ └─────────────┘ └─────────────┘ └─────────────┘ └────────┘│ ├─────────────────────────────────────────────────────────────┤ │ TVÅ KOLUMNER: │ │ ┌─────────────────────────┐ ┌─────────────────────────┐ │ │ │ 📅 Kommande fakturering │ │ 🔔 Påminnelser │ │ │ │ ─────────────────────── │ │ ─────────────────────── │ │ │ │ • Avtal #123 - 15 jan │ │ • 7 fakturor förfallna │ │ │ │ • Avtal #456 - 22 jan │ │ • 2 avtal upphör snart │ │ │ │ • Avtal #789 - 1 feb │ │ • 1 synkronisering fel │ │ │ │ │ │ │ │ │ │ [Visa alla] │ │ [Hantera] │ │ │ └─────────────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ### 3.4 Kundlista ``` ┌─────────────────────────────────────────────────────────────┐ │ 👥 Kunder [+ Ny kund] │ ├─────────────────────────────────────────────────────────────┤ │ [Sök kund...] [Filtrera ▼] [Kommun ▼] [Export ▼] │ ├─────────────────────────────────────────────────────────────┤ │ Namn │ Org.nr │ Kommun │ Avtal │ Status │ │ ───────────────┼─────────────┼───────────┼───────┼────────│ │ Göteborgs Stad │ 212000-1234 │ Göteborg │ 3 │ 🟢 Akt │ │ Malmö Stad │ 212000-5678 │ Malmö │ 1 │ 🟢 Akt │ │ Uppsala Kommun │ 212000-9012 │ Uppsala │ 2 │ 🟡 Paus│ ├─────────────────────────────────────────────────────────────┤ │ Visar 1-3 av 3 kunder [<] [1] [>] │ └─────────────────────────────────────────────────────────────┘ ``` **Klick på rad → Kunddetaljvy med flikar:** - **Översikt**: Kontaktinfo, snabbfakta, noteringar - **Avtal**: Lista med avtal, status, belopp - **Fakturor**: Historik över alla fakturor - **Aktivitet**: Revisionslogg ### 3.5 Avtalslista ``` ┌─────────────────────────────────────────────────────────────┐ │ 📄 Avtal [+ Nytt avtal] │ ├─────────────────────────────────────────────────────────────┤ │ [Sök...] [Status ▼] [Typ ▼] [Förfaller ▼] [Export ▼] │ ├─────────────────────────────────────────────────────────────┤ │ Avtalsnr │ Kund │ Typ │ Period │ Belopp │ │ ─────────┼─────────────┼───────────┼─────────────┼────────│ │ LVX-001 │ Göteborg │ Tjänst │ 2024-01 → │ 50 000 │ │ LVX-002 │ Malmö │ Licens │ 2024-06 → │ 120 000│ │ LVX-003 │ Uppsala │ Projekt │ 2024-03 → │ 75 000 │ ├─────────────────────────────────────────────────────────────┤ │ [Bulk: 🔄 Förnya] [⏸ Pausa] [❌ Avsluta] │ └─────────────────────────────────────────────────────────────┘ ``` **Statusfärger:** - 🟢 Grön = Aktivt - 🟡 Gul = Pausat - 🔴 Röd = Upphört / Upphör snart (< 30 dagar) - ⚪ Grå = Utkast ### 3.6 Fakturor ``` ┌─────────────────────────────────────────────────────────────┐ │ 💰 Fakturor [+ Ny faktura] │ ├─────────────────────────────────────────────────────────────┤ │ [Sök...] [Status ▼] [Period ▼] [Kund ▼] [Generera ▼] │ ├─────────────────────────────────────────────────────────────┤ │ Fakturanr │ Kund │ Period │ Belopp │ Status │ │ ──────────┼─────────────┼─────────────┼─────────┼────────│ │ FV-00042 │ Göteborg │ 2024-12 │ 62 500 │ 🟢 Bet │ │ FV-00043 │ Malmö │ 2024-Q4 │ 30 000 │ 🟡 Skk │ │ FV-00044 │ Uppsala │ 2024-12 │ 18 750 │ 🔴 Övr │ ├─────────────────────────────────────────────────────────────┤ │ [Bulk: 📧 Skicka] [💾 SIE4] [📄 PDF] [❌ Makulera] │ └─────────────────────────────────────────────────────────────┘ ``` **Statusfärger:** - ⚪ Vit/Grå = Utkast - 🟡 Gul = Skickad - 🟢 Grön = Betald - 🔴 Röd = Förfallen / Överfallen - 🟣 Lila = Krediterad - ⬛ Grå = Makulerad **Fakturadetaljvy:** - Fakturahuvud (nummer, datum, kund, referens) - Fakturarader (tabell med beskrivning, antal, pris, summa) - Tidslinje: Skapad → Skickad → Betald / Förfallen - Åtgärder: [Skicka] [Skriv ut/PDF] [Kreditera] [Makulera] - Kommentarer/historik ### 3.7 Rapporter ``` ┌─────────────────────────────────────────────────────────────┐ │ 📊 Rapporter │ ├─────────────────────────────────────────────────────────────┤ │ Välj rapport: │ │ [📈 Intäktsrapport] [⏰ Förfallorapport] [📋 Transaktioner]│ ├─────────────────────────────────────────────────────────────┤ │ Period: [2024-01-01] till [2024-12-31] │ │ Gruppera per: [Månad ▼] Kund: [Alla ▼] │ │ │ │ [📊 Generera] [💾 SIE4] [📄 PDF] [📊 Excel] │ ├─────────────────────────────────────────────────────────────┤ │ RESULTAT (tabell + enkel graf): │ │ Period │ Antal │ Belopp exkl. moms │ Moms │ Totalt │ │ ──────────┼───────┼───────────────────┼──────┼────────────│ │ Jan 2024 │ 5 │ 125 000 kr │25 000│ 150 000 kr │ │ Feb 2024 │ 4 │ 100 000 kr │20 000│ 120 000 kr │ │ ... │ ... │ ... │ ... │ ... │ ├─────────────────────────────────────────────────────────────┤ │ [📈 Visa graf] [📧 Skicka rapport] │ └─────────────────────────────────────────────────────────────┘ ``` ### 3.8 Generera fakturor (Wizard) ``` ┌─────────────────────────────────────────────────────────────┐ │ 🔄 Generera fakturor — Steg 1 av 3 │ ├─────────────────────────────────────────────────────────────┤ │ 1. Välj avtal 2. Granska 3. Bekräfta │ │ [████████] [────────] [────────] │ ├─────────────────────────────────────────────────────────────┤ │ Välj vilka avtal som ska faktureras: │ │ │ │ [✅] LVX-001 — Göteborg — Tjänst — 50 000 kr │ │ [✅] LVX-002 — Malmö — Licens — 30 000 kr │ │ [ ] LVX-003 — Uppsala — Pausat (hoppas över) │ │ │ │ [✅ Välj alla] [❌ Avmarkera alla] │ ├─────────────────────────────────────────────────────────────┤ │ [Avbryt] [Nästa: Granska →] │ └─────────────────────────────────────────────────────────────┘ ``` ### 3.9 Integrationer ``` ┌─────────────────────────────────────────────────────────────┐ │ 🔌 Integrationer [+ Ny integration]│ ├─────────────────────────────────────────────────────────────┤ │ System │ Status │ Senaste synk │ Åtgärder │ │ ───────────┼─────────┼───────────────┼─────────────────────│ │ Fortnox │ 🟢 OK │ 2024-01-15 │ [🔄 Synka] [⚙️] │ │ Visma │ 🟡 Varn │ 2024-01-10 │ [🔄 Synka] [⚙️] │ │ Hogia │ 🔴 Fel │ 2024-01-05 │ [🔄 Synka] [⚙️] [📋]│ ├─────────────────────────────────────────────────────────────┤ │ SYNKRONISERINGSINSTÄLLNINGAR: │ │ [ ] Synkronisera automatiskt varje natt (02:00) │ │ [ ] Skicka fakturor direkt till ekonomisystemet │ │ [ ] Importera betalningar automatiskt │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 4. Integrationer med ekonomisystem ### 4.1 Fortnox - **API**: REST API v3 (OAuth2) - **Funktioner**: - Skicka fakturor till Fortnox (skapar kundfaktura) - Hämta betalningsstatus - Synkronisera kundregister - **Konfiguration**: Client ID, Client Secret, Authorization Code ### 4.2 Visma - **API**: Visma.net ERP API / Visma eAccounting API - **Funktioner**: - Export av fakturor och verifikationer - Import av betalningar - **Konfiguration**: API-nyckel, Tenant ID ### 4.3 Hogia - **API**: Hogia Web API / filbaserad export - **Funktioner**: - SIE4-export (standardformat) - CSV-export för import - **Konfiguration**: API-nyckel eller filsökväg ### 4.4 Generisk SIE4-export - Standardformat för svensk bokföring - Kan importeras i de flesta ekonomisystem - Stöd för SIE4 typ 1 (saldobalans) och typ 4 (transaktioner) --- ## 5. Teknisk arkitektur (Översikt) ``` ┌─────────────────────────────────────────────────────────────┐ │ WEBBLÄSARE (React/Vue) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Dashboard │ │ Faktura- │ │ Rapporter & Export │ │ │ │ │ │ hantering │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ REST API (JSON) ┌─────────────────────────────────────────────────────────────┐ │ API-LAGER (Node.js/Python) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Kunder │ │ Avtal │ │ Fakturor │ │ │ │ /customers │ │ /contracts │ │ /invoices │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Rapporter │ │ Integration│ │ Autogenerering │ │ │ │ /reports │ │ /integrations│ │ (Cron-jobb) │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ DATASKIKT (PostgreSQL) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ customers │ │ contracts │ │ invoices │ │ │ │ contract_ │ │ services │ │ invoice_rows │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ integrations│ │ audit_log │ │ (indexerade sök) │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ EXTERNA INTEGRATIONER │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Fortnox │ │ Visma │ │ Hogia / SIE4 │ │ │ │ (REST API) │ │ (REST API) │ │ (Fil/API) │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 6. Säkerhet & Rättigheter ### Roller | Roll | Rättigheter | |------|-------------| | **Admin** | Alla rättigheter, hantera integrationer | | **Ekonom** | Skapa/skicka fakturor, rapporter, export | | **Avtalsansvarig** | Hantera avtal och kunder, se fakturor | | **Läsare** | Se allt, kan inte skapa/ändra | ### Säkerhetsåtgärder - Alla ändringar loggas i `audit_log` - Känslig data krypteras i vila (AES-256) - API-nycklar och tokens lagras krypterat - Rollbaserad åtkomstkontroll (RBAC) på alla endpoints --- ## 7. Implementeringsfaser | Fas | Innehåll | Tidsestimat | |-----|----------|-------------| | **1** | Datamodell, API-grund, kundhantering | 2 veckor | | **2** | Avtalshantering, fakturagenerering | 2 veckor | | **3** | UI (Dashboard, listor, detaljvyer) | 2 veckor | | **4** | PDF-export, SIE4-export | 1 vecka | | **5** | Integrationer (Fortnox, Visma, Hogia) | 2 veckor | | **6** | Rapporter, avancerade funktioner | 2 veckor | | **7** | Testning, dokumentation, lansering | 2 veckor | **Totalt: ~13 veckor** --- *Dokumentversion: 1.0* *Skapad: 2026-07-02* *För: LandveX Enterprise Platform*