e5623d2f84
- 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
465 lines
12 KiB
Markdown
465 lines
12 KiB
Markdown
# 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.*
|