feat: integrate Grafana dashboards into BOC DashboardPage
- Add Infrastructure Health section with CPU/Memory/Disk panels - Add Service Status section with PM2/Docker panels - Create GrafanaPanel component for iframe embedding - Build passes successfully
This commit is contained in:
@@ -0,0 +1,464 @@
|
||||
# Employee Lifecycle Platform — Teknisk Specifikation
|
||||
|
||||
## Version: 1.0
|
||||
## Datum: 2026-07-29
|
||||
## Status: Designfas
|
||||
|
||||
---
|
||||
|
||||
## 1. Övergripande Systemarkitektur
|
||||
|
||||
### 1.1 Arkitekturprinciper
|
||||
- **API First**: All funktionalitet exponeras via REST API
|
||||
- **Event Driven**: Kafka för händelseflöden
|
||||
- **Modulär**: Varje domän är en isolerad modul
|
||||
- **Domain Driven Design**: Tydliga bounded contexts
|
||||
- **Plugin-baserat**: Integrationer via plugin-arkitektur
|
||||
- **Immutable History**: Ingen data raderas, endast append
|
||||
- **RBAC**: Rollbaserad åtkomstkontroll på alla nivåer
|
||||
|
||||
### 1.2 Teknisk Stack
|
||||
- **Backend**: Go (befintlig BOC-backend)
|
||||
- **Database**: PostgreSQL (befintlig)
|
||||
- **Cache**: Redis (befintlig)
|
||||
- **Event Bus**: Kafka (förberedd)
|
||||
- **Search**: PostgreSQL full-text + Elasticsearch (framtida)
|
||||
- **Files**: S3-kompatibel lagring
|
||||
- **Queue**: Redis/RabbitMQ för bakgrundsjobb
|
||||
|
||||
### 1.3 Modulstruktur
|
||||
```
|
||||
employee/
|
||||
├── profile/ # Profilhantering
|
||||
├── onboarding/ # Onboarding wizard
|
||||
├── documents/ # Dokumentmotor
|
||||
├── timeline/ # Tidslinje
|
||||
├── competence/ # Kompetensregister
|
||||
├── training/ # Utbildningssystem
|
||||
├── certification/ # Certifieringsmotor
|
||||
├── tasks/ # Uppgiftsbibliotek
|
||||
├── performance/ # Prestationsmotor
|
||||
├── attendance/ # Närvaro
|
||||
├── briefing/ # Daily briefing (finns)
|
||||
└── integrations/ # Plugin-system
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Datamodell
|
||||
|
||||
### 2.1 Core Entities
|
||||
|
||||
#### Employee (Medarbetare)
|
||||
```sql
|
||||
CREATE TABLE employees (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
|
||||
-- Personuppgifter
|
||||
first_name VARCHAR(100) NOT NULL,
|
||||
last_name VARCHAR(100) NOT NULL,
|
||||
email VARCHAR(255) UNIQUE NOT NULL,
|
||||
phone VARCHAR(20),
|
||||
personal_number VARCHAR(20), -- Svenskt personnummer
|
||||
birth_date DATE,
|
||||
|
||||
-- Profil
|
||||
avatar_url VARCHAR(500),
|
||||
bio TEXT,
|
||||
|
||||
-- Anställning
|
||||
employment_type VARCHAR(20), -- full_time, part_time, consultant, intern
|
||||
employment_status VARCHAR(20), -- active, probation, notice, terminated
|
||||
start_date DATE,
|
||||
end_date DATE,
|
||||
probation_end_date DATE,
|
||||
notice_period_days INTEGER DEFAULT 30,
|
||||
|
||||
-- Organisation
|
||||
department_id UUID REFERENCES departments(id),
|
||||
team_id UUID REFERENCES teams(id),
|
||||
manager_id UUID REFERENCES employees(id),
|
||||
role_id UUID REFERENCES roles(id),
|
||||
|
||||
-- Ekonomi
|
||||
salary DECIMAL(12,2),
|
||||
salary_currency VARCHAR(3) DEFAULT 'SEK',
|
||||
bank_account VARCHAR(50),
|
||||
bank_clearing VARCHAR(10),
|
||||
|
||||
-- Kontakt
|
||||
address TEXT,
|
||||
postal_code VARCHAR(10),
|
||||
city VARCHAR(100),
|
||||
country VARCHAR(2) DEFAULT 'SE',
|
||||
|
||||
-- Metadata
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW(),
|
||||
created_by UUID REFERENCES employees(id),
|
||||
version INTEGER DEFAULT 1
|
||||
);
|
||||
```
|
||||
|
||||
#### EmployeeTimeline (Tidslinje)
|
||||
```sql
|
||||
CREATE TABLE employee_timeline_events (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
employee_id UUID NOT NULL REFERENCES employees(id),
|
||||
event_type VARCHAR(50) NOT NULL, -- hired, promoted, review, leave, etc.
|
||||
event_date DATE NOT NULL,
|
||||
title VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
metadata JSONB, -- flexibla data per event-typ
|
||||
created_by UUID REFERENCES employees(id),
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
```
|
||||
|
||||
#### Competence (Kompetens)
|
||||
```sql
|
||||
CREATE TABLE competences (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
name VARCHAR(100) NOT NULL,
|
||||
category VARCHAR(50), -- technical, soft_skill, language, etc.
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE employee_competences (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
employee_id UUID REFERENCES employees(id),
|
||||
competence_id UUID REFERENCES competences(id),
|
||||
level INTEGER CHECK (level BETWEEN 1 AND 5), -- 1=beginner, 5=expert
|
||||
acquired_date DATE,
|
||||
validated_by UUID REFERENCES employees(id),
|
||||
notes TEXT,
|
||||
UNIQUE(employee_id, competence_id)
|
||||
);
|
||||
```
|
||||
|
||||
#### Document (Dokument)
|
||||
```sql
|
||||
CREATE TABLE employee_documents (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
employee_id UUID REFERENCES employees(id),
|
||||
document_type VARCHAR(50) NOT NULL, -- contract, nda, policy, etc.
|
||||
title VARCHAR(255) NOT NULL,
|
||||
template_id UUID REFERENCES document_templates(id),
|
||||
|
||||
-- Innehåll
|
||||
content JSONB, -- strukturerat innehåll
|
||||
file_url VARCHAR(500),
|
||||
file_type VARCHAR(50),
|
||||
|
||||
-- Signering
|
||||
signature_status VARCHAR(20) DEFAULT 'draft', -- draft, sent, signed, expired
|
||||
signed_by_employee_at TIMESTAMP,
|
||||
signed_by_company_at TIMESTAMP,
|
||||
signature_method VARCHAR(20), -- digital, manual
|
||||
|
||||
-- Versionering
|
||||
version INTEGER DEFAULT 1,
|
||||
parent_id UUID REFERENCES employee_documents(id), -- för versioner
|
||||
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
```
|
||||
|
||||
#### Training (Utbildning)
|
||||
```sql
|
||||
CREATE TABLE trainings (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
title VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
category VARCHAR(50), -- onboarding, compliance, skill, etc.
|
||||
format VARCHAR(20), -- video, text, quiz, workshop
|
||||
content JSONB, -- modulär struktur
|
||||
duration_minutes INTEGER,
|
||||
mandatory BOOLEAN DEFAULT false,
|
||||
valid_for_days INTEGER, -- hur länge certifiering gäller
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE employee_trainings (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
employee_id UUID REFERENCES employees(id),
|
||||
training_id UUID REFERENCES trainings(id),
|
||||
status VARCHAR(20) DEFAULT 'assigned', -- assigned, in_progress, completed, expired
|
||||
progress_percent INTEGER DEFAULT 0,
|
||||
started_at TIMESTAMP,
|
||||
completed_at TIMESTAMP,
|
||||
expires_at TIMESTAMP,
|
||||
score INTEGER, -- för quiz/test
|
||||
certificate_url VARCHAR(500),
|
||||
UNIQUE(employee_id, training_id)
|
||||
);
|
||||
```
|
||||
|
||||
#### Task (Uppgift)
|
||||
```sql
|
||||
CREATE TABLE task_templates (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
||||
title VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
category VARCHAR(50),
|
||||
priority VARCHAR(20) DEFAULT 'medium',
|
||||
estimated_duration_minutes INTEGER,
|
||||
checklist JSONB, -- array av steg
|
||||
required_role_ids UUID[], -- vilka roller som får uppgiften
|
||||
required_competence_ids UUID[],
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE employee_tasks (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
employee_id UUID REFERENCES employees(id),
|
||||
template_id UUID REFERENCES task_templates(id),
|
||||
title VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
status VARCHAR(20) DEFAULT 'pending', -- pending, in_progress, completed, cancelled
|
||||
priority VARCHAR(20) DEFAULT 'medium',
|
||||
due_date DATE,
|
||||
completed_at TIMESTAMP,
|
||||
completed_by UUID REFERENCES employees(id),
|
||||
checklist_progress JSONB,
|
||||
assigned_by UUID REFERENCES employees(id),
|
||||
assigned_at TIMESTAMP DEFAULT NOW(),
|
||||
source VARCHAR(50), -- onboarding, role, manual, automation
|
||||
source_id UUID -- referens till t.ex. onboarding_id
|
||||
);
|
||||
```
|
||||
|
||||
#### Performance (Prestation)
|
||||
```sql
|
||||
CREATE TABLE performance_reviews (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
employee_id UUID REFERENCES employees(id),
|
||||
reviewer_id UUID REFERENCES employees(id),
|
||||
review_period_start DATE,
|
||||
review_period_end DATE,
|
||||
review_type VARCHAR(20), -- annual, quarterly, probation, ad_hoc
|
||||
|
||||
-- Bedömningar
|
||||
ratings JSONB, -- {competence_id: score, ...}
|
||||
goals JSONB, -- {goal: description, status: achieved/partial/missed}
|
||||
strengths TEXT[],
|
||||
improvements TEXT[],
|
||||
|
||||
-- Feedback
|
||||
employee_comments TEXT,
|
||||
reviewer_comments TEXT,
|
||||
|
||||
status VARCHAR(20) DEFAULT 'draft', -- draft, submitted, acknowledged
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE performance_kpis (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
employee_id UUID REFERENCES employees(id),
|
||||
kpi_name VARCHAR(100) NOT NULL,
|
||||
kpi_value DECIMAL(10,2),
|
||||
target_value DECIMAL(10,2),
|
||||
period VARCHAR(20), -- weekly, monthly, quarterly
|
||||
period_start DATE,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. API Design
|
||||
|
||||
### 3.1 REST Endpoints
|
||||
|
||||
#### Employee Profile
|
||||
```
|
||||
GET /api/v1/employees # Lista medarbetare
|
||||
POST /api/v1/employees # Skapa medarbetare
|
||||
GET /api/v1/employees/{id} # Hämta profil
|
||||
PUT /api/v1/employees/{id} # Uppdatera profil
|
||||
GET /api/v1/employees/{id}/timeline # Tidslinje
|
||||
GET /api/v1/employees/{id}/competences # Kompetenser
|
||||
GET /api/v1/employees/{id}/documents # Dokument
|
||||
GET /api/v1/employees/{id}/trainings # Utbildningar
|
||||
GET /api/v1/employees/{id}/tasks # Uppgifter
|
||||
GET /api/v1/employees/{id}/performance # Prestation
|
||||
```
|
||||
|
||||
#### Onboarding
|
||||
```
|
||||
POST /api/v1/onboarding # Starta onboarding
|
||||
GET /api/v1/onboarding/{id} # Hämta status
|
||||
PUT /api/v1/onboarding/{id}/step/{step} # Uppdatera steg
|
||||
POST /api/v1/onboarding/{id}/complete # Slutför
|
||||
```
|
||||
|
||||
#### Documents
|
||||
```
|
||||
GET /api/v1/documents/templates # Lista mallar
|
||||
POST /api/v1/documents # Skapa dokument
|
||||
GET /api/v1/documents/{id} # Hämta dokument
|
||||
POST /api/v1/documents/{id}/sign # Signera
|
||||
GET /api/v1/documents/{id}/versions # Versioner
|
||||
```
|
||||
|
||||
#### Training
|
||||
```
|
||||
GET /api/v1/trainings # Lista utbildningar
|
||||
POST /api/v1/trainings # Skapa utbildning
|
||||
POST /api/v1/trainings/{id}/assign # Tilldela
|
||||
POST /api/v1/trainings/{id}/complete # Markera klar
|
||||
```
|
||||
|
||||
#### Tasks
|
||||
```
|
||||
GET /api/v1/tasks # Lista uppgifter
|
||||
POST /api/v1/tasks # Skapa uppgift
|
||||
PUT /api/v1/tasks/{id} # Uppdatera
|
||||
POST /api/v1/tasks/{id}/complete # Slutför
|
||||
```
|
||||
|
||||
### 3.2 Event Bus (Kafka Topics)
|
||||
|
||||
```
|
||||
employee.created
|
||||
employee.updated
|
||||
employee.onboarding.started
|
||||
employee.onboarding.completed
|
||||
employee.document.signed
|
||||
employee.training.completed
|
||||
employee.certification.expired
|
||||
employee.task.assigned
|
||||
employee.task.completed
|
||||
employee.performance.review.submitted
|
||||
employee.attendance.changed
|
||||
employee.role.changed
|
||||
employee.manager.changed
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Implementationsplan
|
||||
|
||||
### Fas 1: Core (Vecka 1-2)
|
||||
- [ ] Databasschema
|
||||
- [ ] Employee CRUD API
|
||||
- [ ] Profilsida (frontend)
|
||||
- [ ] Tidslinje
|
||||
|
||||
### Fas 2: Onboarding (Vecka 3-4)
|
||||
- [ ] Onboarding wizard
|
||||
- [ ] Dokumentgenerering
|
||||
- [ ] Digital signering (integration)
|
||||
- [ ] Task-automatisering
|
||||
|
||||
### Fas 3: Kompetens & Utbildning (Vecka 5-6)
|
||||
- [ ] Kompetensregister
|
||||
- [ ] Utbildningssystem
|
||||
- [ ] Certifieringsmotor
|
||||
- [ ] Quiz/test-system
|
||||
|
||||
### Fas 4: Prestation & Uppgifter (Vecka 7-8)
|
||||
- [ ] Prestationsmotor
|
||||
- [ ] Medarbetarsamtal
|
||||
- [ ] Uppgiftsbibliotek
|
||||
- [ ] To-do engine
|
||||
|
||||
### Fas 5: Integrationer (Vecka 9-10)
|
||||
- [ ] Microsoft 365
|
||||
- [ ] Google Workspace
|
||||
- [ ] Slack
|
||||
- [ ] SSO/Identitetsleverantörer
|
||||
|
||||
### Fas 6: Dashboard & Analys (Vecka 11-12)
|
||||
- [ ] Dashboards
|
||||
- [ ] Rapporter
|
||||
- [ ] KPI-visualisering
|
||||
- [ ] Exportfunktioner
|
||||
|
||||
---
|
||||
|
||||
## 5. Säkerhet
|
||||
|
||||
### 5.1 RBAC Modell
|
||||
```
|
||||
Role: admin
|
||||
- Alla rättigheter
|
||||
|
||||
Role: manager
|
||||
- Läsa/uppdatera egna teammedlemmar
|
||||
- Skapa uppgifter
|
||||
- Godkänna dokument
|
||||
- Se rapporter för team
|
||||
|
||||
Role: employee
|
||||
- Läsa/uppdatera egen profil
|
||||
- Se egna uppgifter
|
||||
- Signera egna dokument
|
||||
- Se egen tidslinje
|
||||
|
||||
Role: hr
|
||||
- Läsa alla medarbetare
|
||||
- Skapa/uppdatera anställningar
|
||||
- Hantera dokument
|
||||
- Se alla rapporter
|
||||
```
|
||||
|
||||
### 5.2 Audit Log
|
||||
Alla ändringar loggas:
|
||||
- Vilken användare
|
||||
- Vilken tid
|
||||
- Vilken resurs
|
||||
- Vilken åtgärd
|
||||
- Före/efter värden
|
||||
|
||||
---
|
||||
|
||||
## 6. Integrationer
|
||||
|
||||
### 6.1 Plugin-arkitektur
|
||||
```go
|
||||
type IntegrationPlugin interface {
|
||||
Name() string
|
||||
Version() string
|
||||
|
||||
// Provisionering
|
||||
ProvisionUser(user Employee) error
|
||||
DeprovisionUser(userID string) error
|
||||
|
||||
// Synkronisering
|
||||
SyncUsers() error
|
||||
SyncGroups() error
|
||||
|
||||
// Events
|
||||
HandleEvent(event Event) error
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 Förberedda integrationer
|
||||
- Microsoft 365 (Azure AD)
|
||||
- Google Workspace
|
||||
- Slack
|
||||
- GitHub
|
||||
- AWS IAM
|
||||
- Fortnox (bokföring)
|
||||
- Scrive (digital signering)
|
||||
|
||||
---
|
||||
|
||||
## 7. Nästa Steg
|
||||
|
||||
1. **Godkänn specifikation**
|
||||
2. **Skapa migrations** för databasschema
|
||||
3. **Implementera core API** (Employee CRUD)
|
||||
4. **Bygga profilsida** i frontend
|
||||
5. **Implementera onboarding wizard**
|
||||
|
||||
---
|
||||
|
||||
*Denna specifikation är levande och uppdateras kontinuerligt.*
|
||||
Reference in New Issue
Block a user