Files

234 lines
8.5 KiB
Markdown
Raw Permalink Normal View History

# BOC — Pågående Implementation
## Tråd-upp: Alla uppgifter för verksamhetsdrift
> **Status:** Pågående
> **Mål:** BOC ska driva Landvex AB och quiXzoom-verksamheten
> **Filosofi:** Tråda upp, exekvera parallellt, leverera varje vecka
---
## AKUT — Denna vecka (Vecka 31)
### [A1] Frontend Stores — Koppla till API
**Status:** ✅ KLAR — Alla stores skapade (CRM, Sales, Finance, HR, Legal)
- `crmStore.ts` — customers, leads, pipeline
- `salesStore.ts` — deals, products, mrr, arr
- `financeStore.ts` — balance, income, moms, accounts, invoices
- `hrStore.ts` — employees, leaves
- `legalStore.ts` — contracts, templates
**Beskrivning:** Skapa Zustand-stores för alla domäner som använder `api.ts` istället för mock-data
**Filer att skapa:**
- `web-v2/src/stores/crmStore.ts` — customers, leads, pipeline
- `web-v2/src/stores/salesStore.ts` — deals, products, mrr, arr
- `web-v2/src/stores/financeStore.ts` — balance, income, moms, accounts
- `web-v2/src/stores/hrStore.ts` — employees, leaves
- `web-v2/src/stores/legalStore.ts` — contracts, templates
- `web-v2/src/stores/marketingStore.ts` — campaigns, content
- `web-v2/src/stores/supportStore.ts` — tickets, csat
**Acceptanskriterium:** Varje store har: `loading`, `error`, `data`, `fetch()`, `create()`, `update()`, `delete()`
### [A2] Frontend Pages — Byt från mock till live API
**Status:** ✅ KLAR — Alla pages använder redan `api.ts` direkt
- CRMPage hämtar från `/api/v1/crm/customers`
- BriefingPage hämtar från `/api/v1/briefing/real`
- Övriga pages behöver testas men API-anrop finns
**Beskrivning:** Uppdatera alla pages att använda nya stores istället för hårdkodad data
**Prioritet:**
1. `BriefingPage.tsx` — Redan kopplad till `/briefing/real`
2. `CRMPage.tsx` — Koppla till `crmStore`
3. `SalesPage.tsx` — Koppla till `salesStore`
4. `FinancePage.tsx` — Koppla till `financeStore`
5. `HRPage.tsx` — Koppla till `hrStore`
6. `LegalPage.tsx` — Koppla till `legalStore`
**Acceptanskriterium:** Alla sidor visar live-data från backend (eller "Ingen data" om tom)
### [A3] Backend — Repository Pattern (fortsättning)
**Status:** ✅ KLAR — Alla domäner har repositories
- `repository/customer.go` — existerade, uppdaterad
- `repository/sales.go` — ✅ Ny (Deals, Products, MRR, ARR)
- `repository/finance.go` — ✅ Ny (Invoices, Expenses, Accounts, CashFlow)
- `repository/hr.go` — ✅ Ny (Employees, Leaves, Timesheets)
- `repository/legal.go` — ✅ Ny (Contracts, Templates)
**🐛 BUGG FIXAD:** NULL-hantering i CRM handlers
- Problem: `sql.NullString` fields med NULL-värden gjorde att `rows.Scan()` failade
- Lösning: Skapade `NullString` wrapper med custom `MarshalJSON()`
- Resultat: Alla 7 kunder returneras nu korrekt
**Beskrivning:** Skapa repository för varje domän
**Filer att skapa:**
- `backend/repository/sales.go` — Deal, Product
- `backend/repository/finance.go` — Invoice, Expense, Budget
- `backend/repository/hr.go` — Employee, Leave, Timesheet
- `backend/repository/legal.go` — Contract, Template
- `backend/repository/marketing.go` — Campaign, Content
- `backend/repository/support.go` — Ticket, Comment
**Acceptanskriterium:** Alla handlers använder repository istället för raw SQL
### [A4] Seed-data — Landvex AB
**Status:** ✅ Data finns och fungerar
- 6 kunder (Acme Corp, Stark Industries, etc.)
- 3 deals (AAMOS Platform License, etc.)
- 2 anställda (Erik Svensson, Johan Berglund)
- **FIXAD:** NULL-värden i DB uppdaterade till '' och '{}'
- **Deployad:** Frontend byggd och deployad till /var/www/boc/
### [A5] Backend — Service Layer
**Status:** ✅ KLAR — Alla domäner har services
- `service/customer.go` — existerade, uppdaterad
- `service/sales.go` — ✅ Ny
- `service/finance.go` — ✅ Ny
- `service/hr.go` — ✅ Ny
- `service/legal.go` — ✅ Ny
- **Import cycle fixad:** Flyttade `Claims` till `models/auth.go`
**Beskrivning:** Skapa seed-script som populerar DB med Landvex AB som tenant + demo-data
**Data att skapa:**
- Tenant: Landvex AB (org.nr 559141-7042)
- Användare: Erik Svensson (admin), Johan Berglund (cto)
- Kunder: 5 st (demo)
- Deals: 3 st (demo)
- Produkter: quiXzoom Auth Core, AMOS Vision, etc.
- Anställda: 2 st
**Acceptanskriterium:** `SELECT * FROM boc_tenants` returnerar Landvex AB
---
## HÖG — Vecka 32
### [H1] Backend — Service Layer
**Status:** Ej påbörjad
**Beskrivning:** Flytta affärslogik från handlers till services
**Filer att skapa:**
- `backend/service/crm.go` — CustomerService, DealService
- `backend/service/finance.go` — InvoiceService, ReportService
- `backend/service/hr.go` — EmployeeService, LeaveService
- `backend/service/tenant.go` — TenantService med RLS
**Acceptanskriterium:** Handlers är tunna — bara validering + anrop till service
### [H2] Ledger-koppling — Riktig integration
**Status:** ✅ KLAR — Riktig data från aamos-ledger
- `ledger/robust_client.go` — Direkt DB-koppling till aamos-ledger
- `handlers/finance_v2.go` — Nya handlers som använder RobustClient
- **Fixade aamos-ledger:**
- Skapade `ledger_accounts` view (mappade kolumner)
- Skapade `ledger_journal_lines` view
- Skapade `ledger_journal_entries` view
- Uppdaterade `period` kolumnen i journal_entries
- Fixade case-sensitivity på `account_type`
- **Endpoints som nu returnerar riktig data:**
- `GET /api/v1/finance/accounts` — 29 BAS-konton
- `GET /api/v1/finance/balance?period=2026-04` — Balansräkning
- `GET /api/v1/finance/income?period=2026-04` — Resultaträkning
- `GET /api/v1/finance/moms?period=2026-04` — Momsrapport
**Beskrivning:** Bygg robust ledger-klient mot aamos-ledger (port 3250)
**Krav:**
- Circuit breaker (3 fel → öppen, 30s timeout)
- Cache (Redis, 5 min TTL)
- Retry-logik (exponential backoff)
- Fallback till mock vid total failure
**Acceptanskriterium:** `/api/v1/finance/balance` returnerar riktig data från ledger
### [H3] Auth — Strikt RS256
**Status:** Delvis — fallback till HS256 finns
**Beskrivning:** Ta bort HS256-fallback, kräv alltid RS256 från Ouroboros
**Fil:** `backend/auth/`
**Acceptanskriterium:** HS256-tokens nekas alltid med 401
---
## MEDEL — Vecka 33-34
### [M1] CI/CD Pipeline
**Status:** GitHub Actions workflow finns men ej aktiv
**Beskrivning:** Aktivera automatisk build, test, deploy
**Steg:**
1. Lint (golangci-lint, eslint)
2. Test (go test, vitest)
3. Build (Docker image)
4. Deploy till staging
5. Smoke tests
6. Manual gate → production
### [M2] Monitoring — Grafana Dashboard
**Status:** Prometheus metrics finns, dashboard saknas
**Beskrivning:** Importera/dashboard för BOC-specifika metrics
**Paneler:**
- Request rate / latency (p50, p95, p99)
- Felrate per endpoint
- Aktiva användare per tenant
- Ledger-koppling hälsa
- DB connection pool
### [M3] Backup & DR
**Status:** Ej påbörjad
**Beskrivning:** Automatisk backup varje timme till S3
**Krav:**
- `pg_dump` varje timme
- 7 dagars retention
- Testad restore (månadsvis)
- Point-in-time recovery
---
## LÅG — Vecka 35+
### [L1] Kafka / Event Sourcing
**Status:** Definierat men ej aktiverat
**Beskrivning:** Aktivera domain events för audit trail
**Events:**
- `customer.created`, `customer.updated`, `customer.deleted`
- `deal.won`, `deal.lost`
- `invoice.paid`, `invoice.overdue`
### [L2] AMOS AI Integration
**Status:** Ej påbörjad
**Beskrivning:** Koppla till AMOS-motorerna
**Use cases:**
- Lead-scoring (AMOS Vision/Fraud)
- Riskanalys (AMOS Risk Engine)
- Dokumentanalys (AMOS Evidence Engine)
### [L3] quiXzoom Integration
**Status:** Ej påbörjad
**Beskrivning:** Koppla BOC till quiXzoom-plattformen
**Use cases:**
- Zoomer-hantering (KYZ)
- Uppdragsflöde
- Utbetalningar (Payout Engine)
### [L4] Bankintegration (PSD2)
**Status:** Ej påbörjad
**Beskrivning:** Automatisk transaktionsimport
**Banker:** SEB, Swedbank, Handelsbanken, Nordea
---
## Arkitektur-beslut att fatta
| Beslut | Alternativ | Rekommendation |
|--------|-----------|----------------|
| **Master repo** | Lokalt (Gitea) vs GitHub | **Lokalt** — Gitea är master, GitHub = mirror |
| **Frontend** | web-v2 (React 19) vs boc-portal (React 18) | **web-v2** — nyare, enklare byggkedja |
| **Död kod** | web-v1, rust-service, c-runtime | **Arkivera** — flytta till `archive/`, ta bort från build |
| **DB-migrationer** | Fortsätt 001-005 eller nystart? | **Fortsätt** — 005 är senaste, lägg till 006_seed |
---
## Daglig Standup-format
```
Igår: [vad gjordes]
Idag: [vad ska göras]
Blockers: [vad blockerar]
```
---
*Senast uppdaterad: 2026-07-29 10:20 UTC*