# tOS - Enterprise Web Operating System

![Next.js](https://img.shields.io/badge/Next.js-14.2-black?logo=next.js)
![NestJS](https://img.shields.io/badge/NestJS-10.3-red?logo=nestjs)
![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16-blue?logo=postgresql)
![Keycloak](https://img.shields.io/badge/Keycloak-24-blue?logo=keycloak)
![TypeScript](https://img.shields.io/badge/TypeScript-5.6-blue?logo=typescript)
![License](https://img.shields.io/badge/License-Proprietary-gray)

Ein webbasiertes Enterprise-Dashboard, das verschiedene Unternehmenssysteme integriert und einen zentralen LEAN-Management-Bereich bietet.

---

## Inhaltsverzeichnis

- [Überblick](#überblick)
- [Tech-Stack](#tech-stack)
- [Projektstruktur](#projektstruktur)
- [Voraussetzungen](#voraussetzungen)
- [Installation & Setup](#installation--setup)
- [Scripts](#scripts)
- [Architektur](#architektur)
- [Module](#module)
- [API-Dokumentation](#api-dokumentation)
- [Datenbank](#datenbank)
- [Keycloak](#keycloak)
- [Umgebungsvariablen](#umgebungsvariablen)
- [Lizenz](#lizenz)

---

## Überblick

tOS ist ein modulares Enterprise Operating System mit folgenden Kernbereichen:

- **Dashboard** - Anpassbares Widget-Dashboard mit Drag & Drop
- **HR** - Mitarbeiterverwaltung, Zeiterfassung, Abwesenheiten, Organigramm
- **LEAN** - 3S-Planung, Morning Meeting (SQCDM), Skill Matrix
- **Integrations** - Anbindung an 7 externe Systeme
- **Admin** - Benutzer-, Abteilungs- und Systemverwaltung

---

## Tech-Stack

| Bereich | Technologien |
|---------|-------------|
| **Frontend** | Next.js 14, React 18, TanStack Query, Zustand, Tailwind CSS, shadcn/ui, Framer Motion |
| **Backend** | NestJS 10, Prisma 5, Passport JWT, Swagger |
| **Datenbank** | PostgreSQL 16, Redis 7 |
| **Auth** | Keycloak 24, NextAuth 4 |
| **Infrastruktur** | Docker Compose, pnpm 9, Turborepo |
| **Sprachen** | TypeScript 5.6, i18n via next-intl (DE/EN) |

---

## Projektstruktur

```
tOS/
├── apps/
│   ├── web/                    # Next.js 14 Frontend (Port 3000)
│   │   ├── src/
│   │   │   ├── app/[locale]/   # App Router mit i18n
│   │   │   │   ├── (auth)/     # Geschützte Routen
│   │   │   │   └── login/      # Öffentliche Login-Seite
│   │   │   ├── components/     # React-Komponenten (ui, layout, dashboard, hr, lean)
│   │   │   ├── hooks/          # Custom Hooks (hr, lean, integrations)
│   │   │   ├── lib/            # Utilities, API-Client, Auth-Config
│   │   │   ├── stores/         # Zustand State Management
│   │   │   └── types/          # TypeScript-Typen
│   │   └── messages/           # i18n Übersetzungen (de.json, en.json)
│   │
│   └── api/                    # NestJS 10 Backend (Port 3001)
│       ├── src/
│       │   ├── auth/           # JWT Guards, Rollen, Permissions
│       │   ├── modules/
│       │   │   ├── hr/         # Mitarbeiter, Abwesenheiten, Zeiterfassung
│       │   │   ├── lean/       # Skill Matrix, Morning Meeting, 3S-Planung
│       │   │   ├── integrations/ # 7 API-Connectoren + Sync
│       │   │   ├── dashboard/  # Widget-Daten & Statistiken
│       │   │   ├── departments/# Abteilungsverwaltung
│       │   │   ├── user-preferences/ # Benutzereinstellungen
│       │   │   └── audit/      # Audit-Logging
│       │   └── common/         # Filter, Interceptors, Pipes
│       └── prisma/             # Schema, Migrations, Seed
│
├── packages/
│   └── shared/                 # Gemeinsame Typen & Utilities
│
├── docs/
│   └── integrations/           # API-Dokumentationen (z.B. PlentyONE Swagger)
│
├── docker/
│   ├── docker-compose.yml      # PostgreSQL, Redis, Keycloak
│   ├── keycloak/               # Realm-Export & Config
│   └── .env.example
│
└── turbo.json                  # Turborepo Build-Pipeline
```

---

## Voraussetzungen

| Software | Version |
|----------|---------|
| **Node.js** | >= 20.0.0 |
| **pnpm** | >= 9.0.0 |
| **Docker** | >= 24.0 |
| **Docker Compose** | >= 2.20 |

---

## Installation & Setup

### 1. Repository klonen

```bash
git clone https://github.com/Tradeo-GmbH/tOS.git
cd tOS
```

### 2. Dependencies installieren

```bash
pnpm install
```

### 3. Environment-Variablen einrichten

```bash
# Docker
cp docker/.env.example docker/.env

# Backend
cp apps/api/.env.example apps/api/.env

# Frontend
cp apps/web/.env.example apps/web/.env
```

Die `.env.example`-Dateien enthalten alle benötigten Variablen mit Entwicklungs-Standardwerten.

### 4. Docker-Services starten

```bash
pnpm docker:up
```

Startet PostgreSQL (5432), Redis (6379) und Keycloak (8080).

### 5. Anwendungs-Datenbank erstellen

Keycloak verwendet die Datenbank `tos_db`. Die Anwendung benötigt eine separate Datenbank `tos_app`:

```bash
docker exec -it tos-postgres psql -U tos_user -d tos_db -c "CREATE DATABASE tos_app;"
```

### 6. Datenbank-Schema anwenden

```bash
pnpm db:push
```

### 7. Datenbank mit Stammdaten befüllen

```bash
pnpm db:seed
```

Erstellt Rollen (admin, hr-manager, team-lead, employee), Abteilungen und einen Entwickler-Admin-Benutzer.

### 8. Shared Package bauen

```bash
pnpm --filter @tos/shared build
```

Das Shared Package muss vor dem ersten Start gebaut werden, da API und Web die kompilierten Typen benötigen.

### 9. Entwicklungsserver starten

```bash
pnpm dev
```

| Service | URL |
|---------|-----|
| **Frontend** | http://localhost:3000 |
| **Backend API** | http://localhost:3001/api |
| **Swagger Docs** | http://localhost:3001/api/docs |
| **Keycloak Admin** | http://localhost:8080 (admin/admin) |

---

## Scripts

### Entwicklung

| Script | Beschreibung |
|--------|-------------|
| `pnpm dev` | Alle Apps im Dev-Modus starten |
| `pnpm dev:web` | Nur Frontend starten |
| `pnpm dev:api` | Nur Backend starten |
| `pnpm build` | Alle Apps bauen |
| `pnpm typecheck` | TypeScript-Prüfung |
| `pnpm lint` | Code-Linting |
| `pnpm format` | Code-Formatierung |

### Datenbank

| Script | Beschreibung |
|--------|-------------|
| `pnpm db:generate` | Prisma Client generieren |
| `pnpm db:push` | Schema in die Datenbank pushen |
| `pnpm db:migrate` | Migrationen ausführen |
| `pnpm db:seed` | Stammdaten einspielen |
| `pnpm db:studio` | Prisma Studio öffnen |

### Docker

| Script | Beschreibung |
|--------|-------------|
| `pnpm docker:up` | Container starten |
| `pnpm docker:down` | Container stoppen |
| `pnpm docker:ps` | Container-Status anzeigen |
| `pnpm docker:logs` | Container-Logs anzeigen |
| `pnpm docker:reset` | Container + Volumes zurücksetzen |

---

## Architektur

### Authentifizierung

```
Browser → Next.js (NextAuth) → Keycloak (OAuth2/OIDC)
                                      │
                                      ▼
Browser → Next.js → NestJS API (JWT Guard) → Keycloak (Token-Validierung)
```

- **Frontend:** NextAuth mit Keycloak-Provider, automatische Weiterleitung zum Keycloak-Login
- **Backend:** Passport-JWT mit globalem Guard (`@Public()` zum Deaktivieren)
- **Guard-Kette:** JWT → Rollen → Permissions

### Rollen-System

| Rolle | Beschreibung |
|-------|-------------|
| `admin` | Vollzugriff auf alle Bereiche |
| `hr-manager` | HR-Verwaltung + LEAN-Zugriff |
| `manager` | Abteilungsübergreifende Sicht |
| `department_head` | Abteilungsleitung |
| `team-lead` | Teamleitung mit direkten Reports |
| `employee` | Standard-Mitarbeiterzugriff |

### Permissions

Feingranulare Berechtigungen pro Modul (z.B. `EMPLOYEES_VIEW`, `ABSENCES_APPROVE`, `INTEGRATIONS_MANAGE`). Jede Rolle hat ein vorkonfiguriertes Permission-Set, das über die Datenbank angepasst werden kann.

### Frontend-Architektur

- **App Router** mit `[locale]` Segment für i18n
- **Server/Client Split:** `page.tsx` (Server) → `*-content.tsx` (Client)
- **State Management:** Zustand (UI-State), TanStack Query (Server-State)
- **Component Library:** shadcn/ui auf Radix UI Basis

---

## Module

### Dashboard

Anpassbares Widget-Grid mit Drag & Drop (dnd-kit). Verfügbare Widgets:

| Widget | Beschreibung |
|--------|-------------|
| Welcome | Begrüßung mit Benutzerinfo |
| Clock | Digitale Uhr |
| Stats | KPI-Statistiken |
| Quick Actions | Schnellzugriff auf häufige Aktionen |
| Calendar | Kalenderübersicht |
| Activity | Aktivitätsfeed |
| Orders | PlentyONE Bestellungen |
| Chat | Zulip Nachrichten |
| Tasks | Todoist Aufgaben |
| Tickets | FreeScout Tickets |
| Files | Nextcloud Dateien |
| Documents | ecoDMS Dokumente |
| GembaDocs | Audit-Dokumente |

### HR-Modul

- **Mitarbeiterverwaltung** - CRUD, Detailansicht, Neuanlage
- **Zeiterfassung** - Stempeluhr, Übersichten pro Mitarbeiter
- **Abwesenheiten** - Anträge, Genehmigungen, Kalenderansicht
- **Organigramm** - Visuelle Unternehmensstruktur

### LEAN-Modul

- **3S-Planung** - Seiri (Sortieren), Seiton (Systematisieren), Seiso (Säubern)
- **Morning Meeting** - SQCDM-Board (Safety, Quality, Cost, Delivery, Morale)
- **Skill Matrix** - Kompetenzerfassung und -bewertung pro Abteilung

### Integrations-Modul

7 externe Systeme mit einheitlicher Connector-Architektur:

| System | Typ | Funktionen |
|--------|-----|-----------|
| **PlentyONE** | ERP | Bestellungen, Artikel, Kontakte |
| **Zulip** | Chat | Nachrichten, Streams, Präsenz |
| **Todoist** | Tasks | Aufgaben, Projekte |
| **FreeScout** | Helpdesk | Tickets, Konversationen |
| **Nextcloud** | Cloud | Dateien, Ordner, Freigaben |
| **ecoDMS** | DMS | Dokumente, Klassifizierung |
| **GembaDocs** | Audit | Audits, Findings, Compliance |

### Admin-Bereich

- **Benutzerverwaltung** - Rollen zuweisen, Benutzer verwalten
- **Abteilungen** - Abteilungsstruktur pflegen
- **Integrations-Admin** - Credentials und Sync-Jobs verwalten

---

## API-Dokumentation

Die interaktive API-Dokumentation ist via Swagger UI verfügbar:

```
http://localhost:3001/api/docs
```

Authentifizierung erfolgt über Bearer JWT-Token. Die API ist in folgende Bereiche unterteilt:

- `auth` - Authentifizierung
- `users` - Benutzerverwaltung
- `departments` - Abteilungen
- `hr/*` - HR-Endpunkte (Mitarbeiter, Abwesenheiten, Zeiterfassung)
- `lean/*` - LEAN-Endpunkte (3S, Morning Meeting, Skill Matrix)
- `integrations/*` - Integrations-Endpunkte (pro Connector)
- `dashboard` - Dashboard-Daten

---

## Datenbank

### Zwei-Datenbanken-Setup

| Datenbank | Verwendung |
|-----------|-----------|
| `tos_db` | Keycloak (wird automatisch erstellt) |
| `tos_app` | Anwendungsdaten (muss manuell erstellt werden) |

Beide laufen auf derselben PostgreSQL-Instanz.

### Schema-Übersicht

| Bereich | Modelle |
|---------|---------|
| **Core** | User, Department, Role, UserRole |
| **HR** | Employee, TimeEntry, Absence, EmployeeReview, OnboardingTask |
| **LEAN** | S3Plan, S3Category, S3Status, MorningMeeting, MorningMeetingTopic, MorningMeetingAction, Skill, SkillMatrixEntry |
| **Integrations** | IntegrationCredential, IntegrationSyncHistory |
| **System** | UserPreference, AuditLog |

### Prisma Studio

```bash
pnpm db:studio
```

Öffnet eine Web-UI zur direkten Datenbank-Inspektion unter http://localhost:5555.

---

## Keycloak

### Realm-Konfiguration

Der Realm `tOS` wird beim Start automatisch aus `docker/keycloak/realm-export.json` importiert.

### Clients

| Client | Typ | Verwendung |
|--------|-----|-----------|
| `tos-nextauth` | Confidential | NextAuth (Frontend-Authentifizierung) |
| `tos-backend` | Confidential | NestJS (Service-Account, Token-Validierung) |

> **Hinweis:** Der Client `tos-nextauth` muss einmalig manuell in der Keycloak Admin-Konsole angelegt werden. Der Realm-Export enthält nur `tos-frontend` und `tos-backend`. Siehe `apps/web/.env` für die benötigten Client-Einstellungen.

### Rollen & Gruppen

**Realm-Rollen:** admin, hr-manager, manager, department_head, team-lead, employee

**Gruppen:** Administrators, Management, sowie Abteilungen (Sales, Accounting, Warehouse, Logistics, Engineering, IT, Executive, HR, Procurement)

### Admin-Konsole

```
http://localhost:8080
Benutzer: admin
Passwort: admin
```

---

## Umgebungsvariablen

### Docker (`docker/.env`)

| Variable | Beschreibung | Standard |
|----------|-------------|----------|
| `POSTGRES_USER` | Datenbankbenutzer | `tos_user` |
| `POSTGRES_PASSWORD` | Datenbankpasswort | `tos_secret_password` |
| `POSTGRES_DB` | Keycloak-Datenbank | `tos_db` |
| `KEYCLOAK_ADMIN` | Keycloak-Admin | `admin` |
| `KEYCLOAK_ADMIN_PASSWORD` | Keycloak-Admin-Passwort | `admin` |

### Backend (`apps/api/.env`)

| Variable | Beschreibung |
|----------|-------------|
| `DATABASE_URL` | PostgreSQL Connection String (tos_app) |
| `PORT` | API-Port (3001) |
| `JWT_SECRET` | JWT-Signaturschlüssel |
| `KEYCLOAK_URL` | Keycloak-URL |
| `KEYCLOAK_REALM` | Realm-Name (tOS) |
| `KEYCLOAK_CLIENT_ID` | Backend-Client-ID |
| `KEYCLOAK_CLIENT_SECRET` | Backend-Client-Secret |
| `REDIS_HOST` / `REDIS_PORT` | Redis-Verbindung |
| `ENCRYPTION_KEY` | AES-256-Schlüssel (32 Bytes) |
| `SWAGGER_ENABLED` | Swagger UI aktivieren |
| `ENABLE_SYNC_JOBS` | Integrations-Sync aktivieren |

### Frontend (`apps/web/.env`)

| Variable | Beschreibung |
|----------|-------------|
| `NEXT_PUBLIC_API_URL` | Backend-API-URL |
| `NEXT_PUBLIC_APP_URL` | Frontend-URL |
| `NEXTAUTH_URL` | NextAuth-Callback-URL |
| `NEXTAUTH_SECRET` | NextAuth-Signaturschlüssel |
| `KEYCLOAK_CLIENT_ID` | Frontend-Client-ID |
| `KEYCLOAK_CLIENT_SECRET` | Frontend-Client-Secret |
| `KEYCLOAK_ISSUER` | Keycloak Issuer-URL |

Vollständige Beispiele befinden sich in den jeweiligen `.env.example`-Dateien.

---

## Lizenz

Proprietary - Tradeo GmbH. Alle Rechte vorbehalten.
# teos
