# 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