Docs: fahrschuldesk Projektplan angelegt

This commit is contained in:
Hermes Agent
2026-05-18 22:49:36 +02:00
parent 22206d361a
commit 6ca0df4538

329
docs/fahrschuldesk/PLAN.md Normal file
View File

@@ -0,0 +1,329 @@
# fahrschuldesk — Projektplan
## 1. Überblick
**fahrschuldesk** ist eine SaaS-Plattform zur Verwaltung von Fahrschulen. Plattformbetreiber (Admin-Team) können Fahrschulen als Mandanten anlegen und verwalten. Jede Fahrschule erhält eine modulare Oberfläche mit Kundenverwaltung, Kalender, Messenger und optionaler Lernsoftware.
**Status:** Planungsphase (Initialsetup)
---
## 2. Architektur
### 2.1 Domains
| Domain | Zweck | Pfad |
|---|---|---|
| `fahrschuldesk.de` | WebUI (Frontend) | `www/fahrschuldesk.de/public/` |
| `api.fahrschuldesk.de` | REST API (Backend) | `www/api.fahrschuldesk.de/public/` |
### 2.2 Tech-Stack
- **Frontend:** Vue 3 + Vite (SPA)
- **Backend:** PHP (Laravel oder Slim Framework)
- **Datenbank:** PostgreSQL (fahrschuldesk DB, Host: 10.255.30.11:5433)
- **Auth:** JWT-basiert
- **Deploy:** Git → Server via rsync
---
## 3. Hierarchie & Datenmodell
```
Plattform-Admins (intern)
└── Fahrschule (Mandant)
└── Filialen
└── Benutzer
```
### 3.1 Tabellen
#### Plattform-Admins (interne Verwaltung)
```
platform_admins
- id
- email (unique)
- password_hash
- name
- role (super_admin | support | sales)
- created_at
- updated_at
- last_login_at
```
#### Fahrschulen (Mandanten)
```
tenants
- id
- name
- slug (unique, für Subdomain?)
- email (Rechnungs-Kontakt)
- phone
- address
- status (active | suspended | trial)
- trial_ends_at
- created_at
- updated_at
```
#### Filialen
```
branches
- id
- tenant_id (FK)
- name
- address
- phone
- email
- opening_hours (JSON)
- created_at
- updated_at
```
#### Benutzer
```
users
- id
- tenant_id (FK)
- branch_id (FK, nullable)
- email (unique pro Tenant)
- password_hash
- first_name
- last_name
- user_type (office | instructor | lecturer | student | admin)
- status (active | inactive)
- created_at
- updated_at
- last_login_at
```
#### Module (pro Fahrschule zuweisbar)
```
modules
- id
- key (office | calendar | messenger | learning_blank | learning_premium)
- name
- description
- monthly_price
- is_active (Plattform-global)
tenant_modules
- id
- tenant_id (FK)
- module_id (FK)
- status (enabled | disabled)
- enabled_at
- expires_at (nullable)
```
#### Lerninhalte (Premium-Modul)
```
learning_contents
- id
- tenant_id (FK, nullable — null = Plattform-global)
- category
- title
- description
- content_type (video | document | quiz | exercise)
- content_url
- thumbnail_url
- is_premium (nur mit Premium-Modul)
- created_at
- updated_at
```
#### Fahrschüler-Fortschritt
```
student_progress
- id
- user_id (FK, student)
- content_id (FK)
- status (not_started | in_progress | completed)
- completed_at
- notes (Lehrer-Kommentare)
- created_at
- updated_at
```
---
## 4. API-Struktur
### 4.1 Auth
```
POST /api/auth/login (Admin/Login)
POST /api/auth/logout
GET /api/auth/me
```
### 4.2 Plattform-Admin (nur Admins)
```
GET /api/admin/tenants
POST /api/admin/tenants
GET /api/admin/tenants/:id
PUT /api/admin/tenants/:id
DELETE /api/admin/tenants/:id
GET /api/admin/tenants/:id/modules
POST /api/admin/tenants/:id/modules
DELETE /api/admin/tenants/:id/modules/:moduleId
GET /api/admin/platform-modules
GET /api/admin/platform-modules/:id
```
### 4.3 Tenant-Admin (Fahrschule)
```
GET /api/branches
POST /api/branches
PUT /api/branches/:id
DELETE /api/branches/:id
GET /api/users
POST /api/users
GET /api/users/:id
PUT /api/users/:id
DELETE /api/users/:id
GET /api/my-modules
```
### 4.4 Users (allgemein pro Tenant)
```
GET /api/calendar/events
POST /api/calendar/events
PUT /api/calendar/events/:id
DELETE /api/calendar/events/:id
GET /api/messages
POST /api/messages
GET /api/messages/conversations
```
### 4.5 Lernsoftware
```
GET /api/learning/contents
GET /api/learning/contents/:id
GET /api/learning/my-progress
POST /api/learning/my-progress
PUT /api/learning/my-progress/:contentId
```
---
## 5. Rollen & Rechte
### Plattform-Admins (intern)
| Rolle | Rechte |
|---|---|
| super_admin | Alles: Tenants, Admins, Module, Settings |
| support | Tenants einsehen/verwalten, keine Admins |
| sales | Tenants anlegen, keine Settings |
### Fahrschul-Benutzer
| Typ | Beschreibung |
|---|---|
| admin | Voller Zugriff auf eigene Fahrschule |
| office | Büromitarbeiter: Kunden, Kalender, Berichte |
| instructor | Fahrlehrer: Kalender, eigene Fahrschüler |
| lecturer | Dozent: Kalender, eigene Unterrichtseinheiten |
| student | Fahrschüler: Lernsoftware, eigener Fortschritt |
---
## 6. Modul-System
### 6.1 Verfügbare Module
| Key | Name | Beschreibung |
|---|---|---|
| `office` | Office | Kundenverwaltung, Fahrzeugverwaltung, Berichte |
| `calendar` | Kalender | Terminplanung, Unterrichtszeiten |
| `messenger` | Messenger | Interne Kommunikation |
| `learning_blank` | Lernsoftware (Blanko) | Eigene Inhalte erstellen, keine Premium-Inhalte |
| `learning_premium` | Lernsoftware (Premium) | Inkl. vorgefertigter Lerninhalte |
### 6.2 Modul-Zuordnung
- Jede Fahrschule kann Module einzeln aktivieren/deaktivieren
- Preise werden pro Modul hinterlegt (für Abrechnung)
- Das Modul `learning_blank` und `learning_premium` schließen sich gegenseitig aus
---
## 7. Frontend-Struktur (fahrschuldesk.de)
```
src/
├── views/
│ ├── auth/
│ │ ├── Login.vue
│ │ └── Logout.vue
│ ├── admin/ (Plattform-Admin-Bereich)
│ │ ├── Dashboard.vue
│ │ ├── Tenants.vue
│ │ ├── TenantEdit.vue
│ │ └── Modules.vue
│ ├── tenant/ (Fahrschule-Bereich)
│ │ ├── Dashboard.vue
│ │ ├── Users.vue
│ │ ├── Branches.vue
│ │ ├── Office.vue
│ │ ├── Calendar.vue
│ │ ├── Messenger.vue
│ │ └── Learning.vue
│ └── student/ (Fahrschüler-Bereich)
│ ├── Dashboard.vue
│ └── Learning.vue
├── components/
├── stores/ (Pinia)
├── router/
└── api/ (API-Client)
```
---
## 8. Deployment-Workflow
```
Lokal (~/drivetimeplaner/www/fahrschuldesk.de/)
└── git commit + push
Git (https://git.shadow-land.de/madgerm/drivetimeplaner)
↓ git push (oder rsync via CI/CD)
Server (/srv/web/fahrschuldesk/domains/fahrschuldesk.de/public/)
```
### Sync-Befehle
```bash
# Server → Lokal (Daten holen)
rsync -az --exclude='storage/sessions/' --exclude='storage/database/' \
-e "ssh -p 2225" fahrschuldesk@fahrschuldesk.de:/srv/web/fahrschuldesk/domains/ www/
# Lokal → Server (deployen)
rsync -az --exclude='storage/sessions/' --exclude='storage/database/' \
-e "ssh -p 2225" www/fahrschuldesk.de/public/ \
fahrschuldesk@fahrschuldesk.de:/srv/web/fahrschuldesk/domains/fahrschuldesk.de/public/
```
---
## 9. Offene Fragen / Next Steps
- [ ] Tech-Stack final abstimmen (Laravel vs. Slim vs. anderes?)
- [ ] Auth-Flow: Login-Seite designen
- [ ] Erste Migration: Plattform-Admins + Tenants + Users
- [ ] Mockups/UI-Design für Dashboard
- [ ] Premium-Lerninhalte: woher kommen? Eigene Erstellung oder Drittanbieter?
---
## 10. Phase 1 — Erste Schritte
### Ziel: Grundgerüst stehen
1. **DB-Schema:** Migrationen schreiben für alle Tabellen
2. **API-Skelett:** Auth + Tenant-CRUD + Module-CRUD
3. **Frontend-Skelett:** Vue 3 + Vite + Router + Pinia
4. **Login-Seite:** Plattform-Admin Login
5. **Admin-Dashboard:** Tenants auflisten, anlegen, Module zuweisen