Files
boc/LEDGER_ARCHITECTURE.md
T

176 lines
6.8 KiB
Markdown
Raw Normal View History

# LEDGER_ARCHITECTURE.md — Hållbar struktur för LandveX ekonomisystem
*Beslutad: 2026-06-17*
## Nuläge (vad som faktiskt finns och fungerar)
### ✅ Fungerar
- `aamos-ledger` kör på port 3250, 1 092 journalposter, audit trail, multi-tenant
- Reconciliation Engine (E1-004) — API finns, POST-routes registrerade
- Period Close Workflow (E1-005) — state machine open→review→approved→closed
- SIE4 Export (E1-006) — endpoint finns
- BAS 2024 kontoplan, 38 konton aktiva
- Fortnox-klonen UI på https://landvex.com/ouroboros/finance/
### ⚠️ Trasigt/ofullständigt
- trial-balance returnerar `balanced: null` (aggregering bruten)
- Reconciliation saknar GET /sessions (lista)
- Ingen period är stängd — alla 6 perioder `open`
- 1689 Observationskonto: 966k oklassificerat
- Auth mot Identity Service inte kopplad
- Diff D:5 803 792 vs C:5 928 838 = **125 046 kr obalans**
### 🔴 Affärskritiskt
- Q1-moms 202 787 kr OBETALD
- Leon-fordran 212 922 kr
- Konto 2990 Omföringskonto: 244 899 kr residual — betyder att omföringar inte är nollade
---
## Arkitekturen — tre lager
```
┌─────────────────────────────────────────────────────────────────┐
│ LAGER 3 — AUTOMATION & API │
│ Webhooks · n8n-flows · Skatteverket · Bank-API · Stripe │
├─────────────────────────────────────────────────────────────────┤
│ LAGER 2 — INTELLIGENCE & PUSH │
│ Checkpoint-motor · Nudge-engine · Task-lista · Dashboards │
├─────────────────────────────────────────────────────────────────┤
│ LAGER 1 — KÄRNAN (aamos-ledger) │
│ Journal · Kontoplan · Perioder · Reconciliation · SIE4 │
└─────────────────────────────────────────────────────────────────┘
```
**Principen:** Lager 1 måste vara komplett och stabil innan Lager 2 byggs. Lager 3 kopplas på när Lager 2 fungerar.
---
## Lager 1 — Fixa kärnan (denna sprint)
### L1-FIX-001: trial-balance aggregering
trial-balance returnerar `balanced: null`. Buggen: totalDebit/totalCredit beräknas inte server-side.
**Fix:** Summera i route-hanteraren.
### L1-FIX-002: Reconciliation GET /sessions
Saknar `GET /api/ledger/reconciliation/sessions` — listan syns aldrig.
**Fix:** Lägg till GET-route.
### L1-FIX-003: Stäng perioder 2026-01 t.o.m. 2026-05
Alla 6 perioder är `open`. En stängd period = oföränderlig historik.
**Workflow:** submit-review → approve → close
**Förutsättning:** trial-balance måste vara balanserad per period.
### L1-FIX-004: Rensa konto 2990 (Omföringskonto)
Residual 244 899 kr. Det ska alltid vara 0 — det är ett transitkonto.
**Fix:** Identifiera och bokför rättelseposter.
### L1-FIX-005: Förklara den -125 046 kr differensen
D:5 803 792 vs C:5 928 838. Kan vara FX-poster, ej bokförda kostnader, eller periodfel.
**Fix:** Spåra källan, bokför rättelse.
---
## Lager 2 — Intelligence & Push (nästa sprint)
### L2-001: Checkpoint-motor (det som pushar dig)
En `ledger_checkpoints`-tabell med regler som körs automatiskt:
```
Checkpoint | Trigger | Åtgärd
---------------------------|----------------------|---------------------------
Öppen period > 30 dagar | Nightly cron | Push: "2026-03 ej stängd"
Konto 1689 > 0 | On journal save | Push: "Oklassificerade poster"
Moms förfallen | Kalenderbaserad | Push: "Q1-moms OBETALD"
Fordran > 60 dagar | Nightly cron | Push: "Leon-fordran 92 dagar"
Debet ≠ Kredit i period | On journal save | Blockera post
2990 > 0 vid månadsslut | Period close trigger | Push: "Omföringskonto ej nollat"
```
### L2-002: Task-lista med status
Varje checkpoint genererar en task. Tasks har:
- `id`, `type`, `title`, `due_date`, `status` (open/snoozed/done), `amount`, `period`
- API: `GET /api/ledger/tasks` → lista med prioritet
- UI: Tasks-panel i Fortnox-klonen
### L2-003: Dashboard-siffror rätt
Koppla trial-balance till P&L och balansräkning korrekt:
- Intäkter: klass 3 (credit-saldo)
- Kostnader: klass 5-7 (debet-saldo)
- Resultat: intäkter kostnader
- Balansräkning: tillgångar vs skulder+eget kapital
---
## Lager 3 — Automationer & API (framtida)
### Prioritetsordning
1. **Momsdeklaration API** (Skatteverket eSkattedeklaration)
- Trigger: Period close av kvartalets sista period
- Flow: Beräkna moms → skapa XML → POST till Skatteverket
2. **AGI-fil automatisk** (Arbetsgivardeklaration)
- Trigger: Lönekörning bokförd
- Flow: Summera löneposter → generera AGI-fil → skicka till Skatteverket
3. **Bank-synk automatisk** (Nordea Open Banking / Revolut Webhooks)
- Trigger: Ny banktransaktion
- Flow: Importera → auto-kategorisera → skapa draft → notify
4. **SIE4 till revisor automatisk**
- Trigger: Periodeclose
- Flow: Generera SIE4 → e-posta till andreas.vretblom@kpmg.se
---
## Stängningsceremonin — hur man stänger böckerna
**Varje månad (när Lager 1+2 är klara):**
```
1. Checkpoint-lista = tom (alla poster kategoriserade)
2. Konto 1689 = 0
3. Konto 2990 = 0
4. D = C (trial-balance balanced: true)
5. Kör: POST /api/ledger/periods/2026-05/submit-review
6. Kör: POST /api/ledger/periods/2026-05/approve
7. Kör: POST /api/ledger/periods/2026-05/close
8. → Period låst. Kan ej ändras.
```
**Kvartalsvis tillägg:**
- Beräkna momsunderlag (konto 2611, 2645)
- Deklarera och betala moms
**Årsvis (FY 2025/2026, deadline 31 okt 2026):**
- Alla 12 perioder stängda
- Årsredovisning = P&L + Balansräkning från trial-balance
- SIE4-export till Andreas Vretblom / KPMG
---
## Sprint-plan
### Sprint 1 (nu — denna session)
- [ ] L1-FIX-001: trial-balance aggregering
- [ ] L1-FIX-002: Reconciliation GET /sessions
- [ ] L1-FIX-003: Stäng 2026-01 → 2026-03 (de klara perioderna)
- [ ] L1-FIX-004: Diagnostik på 2990 och -125k differensen
### Sprint 2
- [ ] L1-FIX-005: Rensa 1689 (auto-kategorisering av Revolut-poster)
- [ ] L2-001: Checkpoint-motor (5 basregler)
- [ ] L2-002: Tasks-API + Tasks-panel i UI
### Sprint 3
- [ ] L2-003: Dashboard P&L och balansräkning korrekt
- [ ] L3-001: Momsdeklaration-flow
- [ ] L3-004: SIE4 automatisk till revisor vid period-close
---
*Bernt äger arkitekturen. Erik godkänner.*