# 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 (Vor-Ort-Prozess)
**Endpunkt:** `/request` (nur im lokalen Netzwerk zugänglich)

```
Gast besucht vor Ort: http://192.168.1.100:5000/request
(Terminal/Kiosk in TBA Marienfelde)
```

**Eingabefelder:**
- **Name** (Pflichtfeld)
- **Grund der Anfrage** (Pflichtfeld, mind. 10 Zeichen)
- **Abteilung/Firma** (Pflichtfeld)
- **Gewünschte Zugangsdauer** (1-7 Tage)
- **Ansprechpartner (Mercedes-Benz)** (optional)

**Validierungsregeln:**
- Duplikatsprüfung (gleicher Name 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. Dashboard-Benachrichtigung für Admin
5. Ausdruck mit Anfrage-ID für Gast
```

#### 1.2 Bestätigung für Gast
**Weiterleitung:** `/request/{request_id}`

Der Gast erhält eine Bestätigungsseite mit:
- **Anfrage-ID zum Nachverfolgen** (wird ausgedruckt)
- **QR-Code** für spätere Status-Abfrage
- Geschätzte Bearbeitungszeit (1-4 Stunden)
- Kontaktinformation: **Vor Ort bei Mercedes-Benz Ansprechpartner**
- Status-Anzeige (Pending/Genehmigt/Abgelehnt)

**Gast erhält:**
```
┌─────────────────────────────────────────────────────┐
│ MYP Gastzugang-Anfrage                              │
│ TBA Marienfelde                                     │
├─────────────────────────────────────────────────────┤
│ Anfrage-ID: GAS-2025-001234                        │
│ Name: Max Mustermann                                │
│ Eingegangen: 16.06.2025 09:00                      │
│                                                     │
│ Status: ⏳ Wartet auf Genehmigung                   │
│                                                     │
│ [QR-Code]  ← Scannen für Status-Update             │
│                                                     │
│ Bearbeitungszeit: 1-4 Stunden                      │
│ Bei Fragen: Mercedes-Benz Ansprechpartner          │
└─────────────────────────────────────────────────────┘
```

---

### Phase 2: Administrative Genehmigung

#### 2.1 Admin-Benachrichtigung
**Lokale Benachrichtigung:**
- Dashboard-Benachrichtigung im System (rote Badge)
- Browser-Popup (wenn Admin angemeldet)
- Audio-Signal bei neuer Anfrage (optional)

#### 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 (Offline)

#### 3.1 OTP-Generierung (bei Genehmigung)
**Lokaler Prozess:**
```python
# System generiert One-Time Password
otp_code = generate_secure_otp()  # 6-stellig, numerisch
expiry_time = now() + timedelta(hours=access_duration)

# Automatischer Ausdruck für Admin
print_guest_credentials(
    guest_name=guest_name,
    otp_code=otp_code,
    expiry_time=expiry_time,
    access_instructions=True
)
```

**Ausgedruckte Zugangsdaten:**
```
┌─────────────────────────────────────────────────────┐
│ MYP GASTZUGANG GENEHMIGT                            │
│ TBA Marienfelde                                     │
├─────────────────────────────────────────────────────┤
│ Name: Max Mustermann                                │
│ Anfrage-ID: GAS-2025-001234                        │
│ Genehmigt: 16.06.2025 10:30                        │
│                                                     │
│ 🔑 ZUGANGSDATEN:                                    │
│    OTP-Code: 123456                                │
│    Gültig bis: 18.06.2025 14:30                   │
│                                                     │
│ 🌐 ANMELDUNG:                                       │
│    Terminal vor Ort oder                           │
│    http://192.168.1.100:5000/auth/guest           │
│                                                     │
│ 📋 ANWEISUNGEN:                                     │
│ 1. Name eingeben: Max Mustermann                   │
│ 2. OTP-Code eingeben: 123456                      │
│ 3. Druckdateien hochladen                         │
│ 4. Auf Admin-Freigabe warten                      │
│                                                     │
│ ⚠️ WICHTIGE HINWEISE:                              │
│ • Max. Druckzeit pro Job: 4 Stunden               │
│ • Dateiformate: STL, OBJ, 3MF, GCODE             │
│ • Bei Problemen: Mercedes-Benz Ansprechpartner    │
│                                                     │
│ [QR-Code für Login-Seite]                         │
└─────────────────────────────────────────────────────┘

👨‍💼 ADMIN: Bitte an Gast aushändigen
```

#### 3.2 Gast-Anmeldung
**Endpunkt:** `/auth/guest`

**Login-Prozess:**
1. **Name eingeben** (wie auf Ausdruck)
2. **OTP-Code eingeben** (vom ausgedruckten Zettel)
3. System validiert OTP und Gültigkeitsdauer
4. Session mit eingeschränkten Rechten erstellt

**Session-Eigenschaften:**
```python
guest_session = {
    "user_type": "guest",
    "guest_name": "Max Mustermann",
    "request_id": "GAS-2025-001234",
    "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"
   }
   ```

**Gast-Benachrichtigung bei Genehmigung:**
- **Dashboard-Update:** Status ändert sich automatisch
- **Ausdruck für Admin:** Job-Details mit geplanter Startzeit
- **Gast kann Status prüfen:** Über QR-Code oder Anfrage-ID

---

### 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)
    
    # Lokale Benachrichtigung für Gast (Dashboard)
    update_guest_dashboard_status(
        guest_name=job.guest_name,
        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
    )
    
    # Ausdruck für Gast (Admin händigt aus)
    print_job_schedule_info(job)
```

#### 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-Dashboard aktualisieren
    update_guest_dashboard_status(job.guest_name, "printing")
    
    # 5. Ausdruck für Admin (Gast informieren)
    print_job_started_notification(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 (Offline)
**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. Gast-Dashboard aktualisieren
    update_guest_dashboard_status(job.guest_name, "completed")
    
    # 4. Automatischer Ausdruck für Admin
    print_job_completion_notification(
        guest_name=job.guest_name,
        job_name=job.name,
        completion_time=job.actual_end_time,
        pickup_location="TBA Marienfelde, Raum B2.1",
        storage_info="7 Tage Lagerung, dann Entsorgung"
    )
    
    # 5. Admin-Dashboard-Benachrichtigung
    create_pickup_reminder(
        guest_name=job.guest_name,
        job_name=job.name,
        completion_time=job.actual_end_time
    )
```

#### 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.*