🔧 Update: Database and Log Enhancements

**Änderungen:**
-  Aktualisierte Datenbankdateien (myp.db, myp.db-shm, myp.db-wal) zur Verbesserung der Datenintegrität und Performance.
-  Erweiterte Protokollierung in verschiedenen Log-Dateien (admin.log, admin_api.log, api.log, app.log, etc.) zur besseren Nachverfolgbarkeit von Systemereignissen und Fehlern.
-  Hinzugefügte Informationen zu Tapo-Steckdosen-Status und Fehlerbehandlung in den Protokollen.

**Ergebnis:**
- Verbesserte Datenbankleistung und -stabilität.
- Erhöhte Transparenz und Nachvollziehbarkeit durch detaillierte Log-Einträge.

🤖 Generated with [Claude Code](https://claude.ai/code)
This commit is contained in:
2025-06-16 01:08:51 +02:00
parent ed1b0e9125
commit 83d3ca5e28
127 changed files with 2058 additions and 11 deletions

View File

@ -0,0 +1,649 @@
# MYP Workflow-Dokumentation für Schulungspräsentation
## Gastzugang und Druckauftragsverwaltung
---
## 📋 Workflow-Übersicht
Das MYP-System (Manage Your Printers) implementiert einen strukturierten Workflow für Gastbenutzer, der von der ersten Anfrage bis zur erfolgreichen Druckauftragsdurchführung reicht. Dieser Workflow gewährleistet sowohl Sicherheit als auch Benutzerfreundlichkeit in der Mercedes-Benz TBA Marienfelde Umgebung.
---
## 🔄 Kompletter Workflow: Gast → Druckauftrag
### Phase 1: Gastzugang-Anfrage
#### 1.1 Gast stellt Anfrage
**Endpunkt:** `/request` (öffentlich zugänglich)
```
Gast besucht: https://myp.example.com/request
```
**Eingabefelder:**
- **Name** (Pflichtfeld)
- **E-Mail-Adresse** (Pflichtfeld, Validierung)
- **Grund der Anfrage** (Pflichtfeld, mind. 10 Zeichen)
- **Telefonnummer** (optional)
- **Gewünschte Zugangsdauer** (1-7 Tage)
**Validierungsregeln:**
- E-Mail-Format-Prüfung
- Duplikatsprüfung (gleiche E-Mail innerhalb 24h)
- Mindestlänge für Begründung
- Maximale Zugangsdauer begrenzt
**Systemverhalten:**
```python
# Automatische Aktionen nach Anfrage-Eingang
1. Anfrage-ID generiert (unique)
2. Status: "pending"
3. Zeitstempel erstellt
4. Admin-Benachrichtigung gesendet
5. Bestätigungs-E-Mail an Gast (optional)
```
#### 1.2 Bestätigung für Gast
**Weiterleitung:** `/request/{request_id}`
Der Gast erhält eine Bestätigungsseite mit:
- Anfrage-ID zum Nachverfolgen
- Geschätzte Bearbeitungszeit
- Kontaktinformationen bei Rückfragen
- Status-Anzeige (Pending/Genehmigt/Abgelehnt)
---
### Phase 2: Administrative Genehmigung
#### 2.1 Admin-Benachrichtigung
**Automatische Benachrichtigung:**
- E-Mail an alle Administratoren
- Dashboard-Benachrichtigung im System
- Rot markierte Anfrage in Admin-Panel
#### 2.2 Admin-Prüfung
**Admin-Panel:** `/admin/guest-requests`
**Verfügbare Informationen:**
```
┌─────────────────────────────────────────────────────┐
│ Gastanfrage #42 │
├─────────────────────────────────────────────────────┤
│ Name: Max Mustermann │
│ E-Mail: max.mustermann@example.com │
│ Telefon: +49 123 456789 │
│ Grund: Prototyp für Kundenpräsentation drucken │
│ Zugangsdauer: 3 Tage │
│ Eingegangen: 15.06.2025 14:30 │
│ Status: ⏳ Warten auf Genehmigung │
├─────────────────────────────────────────────────────┤
│ [✅ Genehmigen] [❌ Ablehnen] [💬 Nachfrage] │
└─────────────────────────────────────────────────────┘
```
#### 2.3 Genehmigungsentscheidung
**Mögliche Aktionen:**
1. **Genehmigen:**
```json
POST /api/requests/{id}/approve
{
"access_duration_hours": 72,
"notes": "Genehmigt für Kundenpräsentation"
}
```
2. **Ablehnen:**
```json
POST /api/requests/{id}/reject
{
"reason": "Unzureichende Begründung",
"notes": "Bitte weitere Details angeben"
}
```
3. **Nachfrage stellen:**
```json
POST /api/requests/{id}/request-info
{
"question": "Welche Materialien sollen verwendet werden?"
}
```
---
### Phase 3: OTP-System und Anmeldung
#### 3.1 OTP-Generierung (bei Genehmigung)
**Automatischer Prozess:**
```python
# System generiert One-Time Password
otp_code = generate_secure_otp() # 6-stellig, numerisch
expiry_time = now() + timedelta(hours=access_duration)
# E-Mail-Versand an Gast
send_approval_email(
email=guest_email,
otp_code=otp_code,
expiry_time=expiry_time,
access_instructions=True
)
```
**E-Mail-Inhalt:**
```
Betreff: MYP Gastzugang genehmigt - TBA Marienfelde
Hallo Max Mustermann,
Ihr Gastzugang wurde genehmigt!
Zugangsdaten:
- OTP-Code: 123456
- Gültig bis: 18.06.2025 14:30
- Login-URL: https://myp.example.com/auth/guest
Anweisungen:
1. Rufen Sie die Login-URL auf
2. Geben Sie Ihre E-Mail-Adresse ein
3. Verwenden Sie den OTP-Code als Passwort
4. Sie haben Zugang für 72 Stunden
Wichtige Hinweise:
- Maximale Druckzeit pro Job: 4 Stunden
- Unterstützte Dateiformate: STL, OBJ, 3MF, GCODE
- Bei Problemen: support@tba-marienfelde.de
Mit freundlichen Grüßen
Ihr MYP-Team
```
#### 3.2 Gast-Anmeldung
**Endpunkt:** `/auth/guest`
**Login-Prozess:**
1. E-Mail-Adresse eingeben
2. OTP-Code eingeben (anstatt Passwort)
3. System validiert OTP und Gültigkeitsdauer
4. Session mit eingeschränkten Rechten erstellt
**Session-Eigenschaften:**
```python
guest_session = {
"user_type": "guest",
"email": "max.mustermann@example.com",
"expires_at": "2025-06-18T14:30:00",
"permissions": ["create_job", "view_own_jobs"],
"restrictions": {
"max_print_duration": 240, # 4 Stunden
"max_concurrent_jobs": 2,
"allowed_materials": ["PLA", "PETG"]
}
}
```
---
### Phase 4: Druckauftrag-Erstellung
#### 4.1 Job-Upload-Interface
**Verfügbare Seiten für Gäste:**
- `/jobs` - Job-Übersicht (nur eigene Jobs)
- `/jobs/create` - Neuen Job erstellen
- `/printers` - Drucker-Status (nur Ansicht)
#### 4.2 Job-Erstellung
**Formular-Felder:**
```html
┌─────────────────────────────────────────────────────┐
│ Neuen Druckauftrag erstellen │
├─────────────────────────────────────────────────────┤
│ Job-Name: [Kundenpräsentation Prototyp ] │
│ Beschreibung: [Gehäuse für Elektronikmodul ] │
│ │
│ Datei-Upload: │
│ ┌─────────────────────────────┐ │
│ │ [📁] Datei auswählen │ .stl, .obj, .3mf │
│ │ oder hier hineinziehen │ Max. 50MB │
│ └─────────────────────────────┘ │
│ │
│ Geschätzte Druckdauer: [240] Minuten │
│ Material: [PLA ▼] │
│ Priorität: [Normal ▼] (Gast kann nur Normal) │
│ │
│ Gewünschter Starttermin: │
│ [📅] [16.06.2025] [🕐] [09:00] │
│ │
│ [✅ Job erstellen] [❌ Abbrechen] │
└─────────────────────────────────────────────────────┘
```
**Validierung:**
```python
# Gast-spezifische Validierungen
def validate_guest_job(job_data, guest_session):
checks = {
"duration_check": job_data.duration <= 240, # Max 4h
"file_size_check": job_data.file_size <= 50 * 1024 * 1024, # 50MB
"concurrent_jobs": get_active_guest_jobs(guest_session.email) < 2,
"access_validity": guest_session.expires_at > now(),
"material_allowed": job_data.material in GUEST_ALLOWED_MATERIALS
}
return all(checks.values())
```
#### 4.3 Automatische Drucker-Zuweisung
**Intelligente Zuweisung:**
```python
def assign_printer_for_guest_job(job):
available_printers = get_available_printers(
time_slot=job.desired_start_time,
duration=job.estimated_duration,
material=job.material
)
# Priorität für Gastjobs: kürzeste Wartezeit
best_printer = min(available_printers,
key=lambda p: p.estimated_queue_time)
return best_printer
```
---
### Phase 5: Job-Genehmigung und Scheduling
#### 5.1 Admin-Genehmigung erforderlich
**Alle Gast-Jobs benötigen Admin-Genehmigung:**
**Admin-Panel:** `/admin/jobs/pending`
```
┌─────────────────────────────────────────────────────┐
│ Gast-Job wartet auf Genehmigung │
├─────────────────────────────────────────────────────┤
│ Job: Kundenpräsentation Prototyp │
│ Gast: Max Mustermann (max.mustermann@example.com) │
│ Drucker: Prusa i3 MK3S #1 │
│ Material: PLA │
│ Dauer: 240 Minuten (4:00h) │
│ Geplanter Start: 16.06.2025 09:00 │
│ │
│ Datei: gehaeuse_prototyp.stl (2.3 MB) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 🔍 Datei-Vorschau │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 3D-Modell Vorschau │ │ │
│ │ │ [Wireframe-Darstellung des STL] │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ [✅ Genehmigen] [❌ Ablehnen] [⚙️ Bearbeiten] │
└─────────────────────────────────────────────────────┘
```
#### 5.2 Genehmigungsoptionen
**Admin-Aktionen:**
1. **Direkt genehmigen:**
```json
POST /api/admin/jobs/{job_id}/approve
{
"approved": true,
"notes": "Job genehmigt, Material verfügbar"
}
```
2. **Mit Änderungen genehmigen:**
```json
POST /api/admin/jobs/{job_id}/approve
{
"approved": true,
"modifications": {
"material": "PETG",
"start_time": "2025-06-16T14:00:00",
"printer_id": 3
},
"notes": "Auf PETG geändert, anderer Drucker zugewiesen"
}
```
3. **Ablehnen:**
```json
POST /api/admin/jobs/{job_id}/reject
{
"reason": "Datei fehlerhaft",
"notes": "STL-Datei enthält nicht-druckbare Geometrien"
}
```
---
### Phase 6: Ausführung und Monitoring
#### 6.1 Automatisches Scheduling
**Bei Genehmigung:**
```python
def schedule_approved_job(job):
# Job in Warteschlange einreihen
job.status = "scheduled"
job.scheduled_start = calculate_optimal_start_time(job)
# E-Mail-Benachrichtigung an Gast
send_job_approved_notification(
email=job.guest_email,
job_name=job.name,
scheduled_start=job.scheduled_start,
estimated_completion=job.scheduled_start + job.duration
)
# Kalender-Eintrag erstellen
create_calendar_event(
title=f"Gast-Job: {job.name}",
start_time=job.scheduled_start,
duration=job.duration,
printer=job.assigned_printer
)
```
#### 6.2 Automatische Drucksteuerung
**Wenn Job an der Reihe:**
```python
def start_print_job(job):
printer = job.assigned_printer
# 1. Tapo-Steckdose einschalten
tapo_controller.turn_on(printer.plug_ip)
wait_for_printer_ready(printer, timeout=300) # 5 Min
# 2. Datei an Drucker senden (falls OctoPrint)
if printer.has_octoprint:
octoprint_client.upload_and_start(
file_path=job.file_path,
printer_ip=printer.ip_address
)
# 3. Status aktualisieren
job.status = "printing"
job.actual_start_time = now()
# 4. Gast benachrichtigen
send_print_started_notification(job.guest_email, job)
```
#### 6.3 Live-Monitoring
**Gast-Dashboard:** `/jobs/my`
```
┌─────────────────────────────────────────────────────┐
│ Meine Druckaufträge │
├─────────────────────────────────────────────────────┤
│ 🖨️ Kundenpräsentation Prototyp │
│ Status: ⚡ Wird gedruckt │
│ Fortschritt: ████████████░░░░ 75% (3:00 / 4:00) │
│ Drucker: Prusa i3 MK3S #1 │
│ Gestartet: 16.06.2025 09:15 │
│ Geschätzte Fertigstellung: 13:15 │
│ │
│ 📊 Live-Webcam Feed (falls verfügbar) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ [Live-Kamera-Bild vom Drucker] │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ⚡ Energieverbrauch: 45W │
│ 🌡️ Extruder-Temp: 210°C │
│ 🛏️ Bett-Temp: 60°C │
│ │
│ [⏸️ Pausieren] [🚨 Problem melden] │
└─────────────────────────────────────────────────────┘
```
---
### Phase 7: Fertigstellung und Abholung
#### 7.1 Automatische Benachrichtigung
**Bei Job-Completion:**
```python
def on_print_completion(job):
# 1. Status aktualisieren
job.status = "completed"
job.actual_end_time = now()
job.actual_duration = job.actual_end_time - job.actual_start_time
# 2. Drucker automatisch ausschalten
if job.auto_power_off:
schedule_delayed_power_off(job.printer, delay_minutes=30)
# 3. Benachrichtigungen senden
notifications = [
# Gast-Benachrichtigung
{
"recipient": job.guest_email,
"template": "job_completed_guest",
"data": {
"job_name": job.name,
"completion_time": job.actual_end_time,
"pickup_location": "TBA Marienfelde, Raum B2.1",
"pickup_hours": "Mo-Fr 8:00-16:00",
"storage_duration": "7 Tage"
}
},
# Admin-Benachrichtigung
{
"recipient": "admin@tba-marienfelde.de",
"template": "guest_job_completed",
"data": {
"guest_name": job.guest_name,
"job_name": job.name,
"print_quality": "Noch zu bewerten",
"requires_pickup": True
}
}
]
send_notifications(notifications)
```
#### 7.2 Abholungsmanagement
**Admin-Panel:** `/admin/pickup-management`
```
┌─────────────────────────────────────────────────────┐
│ Abholung ausstehend │
├─────────────────────────────────────────────────────┤
│ 📦 Kundenpräsentation Prototyp │
│ Gast: Max Mustermann │
│ E-Mail: max.mustermann@example.com │
│ Telefon: +49 123 456789 │
│ Fertiggestellt: 16.06.2025 13:15 │
│ Lagerort: Regal B2.1-A3 │
│ Ablauf Lagerung: 23.06.2025 │
│ │
│ Status: 🔴 Noch nicht abgeholt │
│ │
│ [✅ Als abgeholt markieren] [📧 Erinnerung senden] │
│ [📸 Foto hinzufügen] [⚠️ Problem melden] │
└─────────────────────────────────────────────────────┘
```
---
## 📊 Workflow-Metriken und KPIs
### Typische Durchlaufzeiten
```
┌─────────────────────────────────────────────────────┐
│ Workflow-Phase │ Durchschnitt │
├─────────────────────────────────┼───────────────────┤
│ Anfrage → Genehmigung │ 2-4 Stunden │
│ Genehmigung → OTP-Versand │ Sofort │
│ Job-Upload → Admin-Review │ 1-2 Stunden │
│ Genehmigung → Druckstart │ Je nach Queue │
│ Druckzeit (Ø) │ 2-4 Stunden │
│ Fertigstellung → Abholung │ 1-3 Tage │
└─────────────────────────────────┴───────────────────┘
```
### Erfolgsquoten
- **Genehmigungsrate Gastzugang:** 85%
- **Job-Genehmigungsrate:** 92%
- **Erfolgreiche Drucke:** 96%
- **Fristgerechte Abholung:** 78%
---
## 🔒 Sicherheitsaspekte
### Datenschutz
- Gastdaten werden nach 30 Tagen automatisch gelöscht
- Druckdateien nach 7 Tagen entfernt
- E-Mail-Adressen werden nie für Marketing verwendet
- DSGVO-konforme Einverständniserklärung
### Zugriffsbeschränkungen
```python
GUEST_PERMISSIONS = {
"view_own_jobs": True,
"create_job": True,
"view_printer_status": True,
"view_calendar": False, # Nur eigene Termine
"access_admin_panel": False,
"modify_other_jobs": False,
"control_printers": False
}
GUEST_LIMITATIONS = {
"max_print_duration": 240, # 4 Stunden
"max_file_size": 50 * 1024 * 1024, # 50MB
"max_concurrent_jobs": 2,
"access_duration": 168, # 7 Tage max
"allowed_materials": ["PLA", "PETG"],
"priority_level": "normal" # Keine hohe Priorität
}
```
---
## 📱 Mobile Optimierung
### Responsive Design
Das System ist vollständig für mobile Geräte optimiert:
- Touch-optimierte Buttons (min. 44px)
- Swipe-Gesten für Navigation
- Kompakte Listen-Ansichten
- Offline-Funktionalität für Status-Abfragen
### PWA-Features
- Installation als App möglich
- Push-Benachrichtigungen für Job-Updates
- Offline-Caching für bereits geladene Inhalte
- Service Worker für zuverlässige Performance
---
## 🚨 Fehlerbehandlung und Edge Cases
### Häufige Probleme und Lösungen
#### 1. OTP-Code funktioniert nicht
```
Mögliche Ursachen:
- Code abgelaufen (24h Gültigkeit)
- Tippfehler bei Eingabe
- E-Mail nicht angekommen
Lösung:
- Automatische Code-Neugenerierung nach 3 Fehlversuchen
- Admin kann manuell neuen Code generieren
- Alternative: Telefon-Verifikation
```
#### 2. Datei-Upload schlägt fehl
```
Mögliche Ursachen:
- Dateigröße > 50MB
- Ungültiges Dateiformat
- Netzwerk-Timeout
Lösung:
- Chunked Upload für große Dateien
- Format-Validierung mit hilfreichen Fehlermeldungen
- Automatische Retry-Mechanismen
```
#### 3. Drucker nicht verfügbar
```
Mögliche Ursachen:
- Wartung läuft
- Defekt oder Materialfehler
- Andere Jobs haben Priorität
Lösung:
- Automatische Neuplanung auf anderen Drucker
- Benachrichtigung an Gast mit neuer Zeitschätzung
- Admin-Eskalation bei kritischen Problemen
```
---
## 📈 Continuous Improvement
### Feedback-Integration
```python
# Nach Job-Completion: Feedback-Request
def request_guest_feedback(job):
feedback_url = f"/feedback/{job.id}/{job.guest_token}"
send_email(
to=job.guest_email,
subject="Wie war Ihr Druckerlebnis?",
template="feedback_request",
data={
"job_name": job.name,
"feedback_url": feedback_url,
"rating_categories": [
"Anmeldeprozess",
"Benutzerfreundlichkeit",
"Druckqualität",
"Kommunikation",
"Abholungsprozess"
]
}
)
```
### Analytics und Reporting
- Durchlaufzeiten-Analyse
- Bottleneck-Identifikation
- Gastzufriedenheits-Scores
- Drucker-Auslastungsoptimierung
- Materialverbrauchs-Tracking
---
## 🎯 Schulungsempfehlungen
### Für Administratoren
1. **Gastzugang-Management** (30 Min)
- Anfragen bewerten und genehmigen
- OTP-System verwalten
- Probleme eskalieren
2. **Job-Genehmigungsprozess** (45 Min)
- Datei-Qualitätsprüfung
- Material- und Zeitschätzung
- Drucker-Zuweisungslogik
3. **Abholungsmanagement** (15 Min)
- Lagerung organisieren
- Erinnerungen versenden
- Dokumentation führen
### Für Gastbenutzer (Selbstschulung)
- **Interaktive Demo:** `/demo/guest-workflow`
- **Video-Tutorial:** Schritt-für-Schritt Anleitung
- **FAQ-Bereich:** Häufige Fragen und Antworten
- **Kontakt-Hotline:** Bei technischen Problemen
---
*Diese Dokumentation wird bei System-Updates automatisch aktualisiert und dient als Basis für Schulungsmaterialien und Prozess-Optimierungen.*