234 lines
8.5 KiB
Markdown
234 lines
8.5 KiB
Markdown
|
|
# 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*
|