--- type: konzept-modul projekt: 3d.lehrstun.de stand: 2026-05-23 tags: [konzept, slots, reservierung] --- # Slot-System (Drucker-Reservierung) > DB-Tabelle: [[datenmodell#slot]]. Routes: [[routen]]. Drucker-Status: [[druckerapi]]. ## Ziel Faire Verteilung der 4 Drucker auf 8-10 SuS, die unterschiedlich lange Drucke fahren. Funktioniert auch bei Drucker-Ausfall ([[druckerapi]] kann brechen). ## Default: Windhund-Prinzip - Wer zuerst kommt, bekommt den Slot. - Jede:r SuS reserviert selbst über das Cockpit. - Konflikt-Check: keine Überlappung mit aktiver/zukünftiger reservierter Reservierung auf demselben Drucker. ## Override: Lehrer-Priorität - Im [[routen#admin|Admin-Dashboard]] kann Herb/Markus pro Slot `prioritaet` setzen (Default 0, höher = wichtiger). - Sortierung im UI: `ORDER BY prioritaet DESC, erstellt_am ASC`. - Bei Konflikt durch Priorisierung: Site zeigt eine Warnung, verschiebt nichts automatisch — Herb entscheidet. ## Slot-Granularität (Entscheidung **offen**) Drei Optionen, siehe [[offene-fragen#slot-granularität]]: | Option | Vorteil | Nachteil | |---|---|---| | **Freie Zeitspannen** (Start + Dauer) | flexibel, passt zu realer Druckzeit (15 Min - 8 h) | Konflikt-Check komplexer | | **Feste Stunden-Slots** | einfach zu buchen, kalenderartig | unflexibel — 4-h-Druck blockiert 4 Slots | | **Tages-Slots** (Vormittag/Nachmittag/Nacht) | passt zu langen Drucken | zu grob für kurze Drucke | Empfehlung aus Recherche: **freie Zeitspannen**, weil Druckzeit stark variiert. ## Drucker-Ausfall-Handling Wenn [[druckerapi]] meldet `status = failed` oder `offline` für > 10 Min: ```mermaid flowchart TB A[Drucker fällt aus] --> B{Aktive Slots betroffen?} B -- ja --> C[Dashboard: rote Markierung] C --> D[Vorschlag: Slot auf anderen Drucker verschieben] D --> E[Admin: 1-Klick-Verschieben] E --> F[Slot.drucker_id ändern] F --> G[Cockpit-Notiz für betroffene SuS] B -- nein --> H[Drucker als 'Wartung nötig' markieren] ``` ## Konflikt-Erkennung ```sql -- Neue Reservierung würde mit bestehender überlappen? SELECT COUNT(*) FROM slot WHERE drucker_id = :drucker_id AND status IN ('reserviert', 'aktiv') AND start_zeit < :neue_ende AND ende_zeit > :neue_start; ``` Falls > 0 Treffer: Reservierung abgelehnt mit Liste der Konflikte. ## UI-Skizze (Cockpit-Slot-Buchung) ``` ┌─ Drucker reservieren ──────────────────────────┐ │ │ │ Drucker: [ ▼ P1S #1 ] │ │ Start: [ Heute, 14:30 ] │ │ Dauer: [ 2 h 30 m ] (Schätzung aus 3MF) │ │ │ │ ┌─ Kalender ────────────────────────────────┐ │ │ │ P1S #1 ▓▓░░░░░░░░░░░░▓▓▓▓▓░░░░░░░░░░░ │ │ │ │ P1S #2 ░░░░░▓▓▓▓░░░░░░░░░░░░░░░▓▓▓░░░ │ │ │ │ X1C ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ │ │ │ │ A1 mini ▓▓▓▓▓▓▓░░░░░░░░░░░▓▓░░░░░░░░░░ │ │ │ │ 09 11 13 15 17 19 21 23 │ │ │ └────────────────────────────────────────────┘ │ │ │ │ [ Reservieren ] │ └─────────────────────────────────────────────────┘ ``` (Genaues Design folgt in [[etappen#etappe-6]].) ## Querverweise - DB-Schema: [[datenmodell#slot]] - Drucker-Live-Status (für Ausfall-Erkennung): [[druckerapi]] - Routes: [[routen#profil]] + [[routen#admin]] - Offene Frage zur Granularität: [[offene-fragen]]