GeoGraSim Lizenzverwaltung (Admin)

🧩 Module 🎮 Level 🎨 Styleguide 👤 Admins 🍽️ Weltküche-Herkunft 📋 ToDo / Review Logout
🛠️ Backend-Werkzeuge (nur Admin)
🗺️ Tourismus-Karten-Editor (Region) 🏠 Tourismustal-Sprite-Editor 🏙️ Stadt-Raumplanung-Editor 📷 Schulbuch-Bildupload 🍽️ Weltküche-Herkunftsübersicht (QA) 📋 ToDo / Review-Liste
Alle nur mit Admin-Login erreichbar. Schulbuch-Upload zusätzlich per PIN (0815). Heli-Audio-Werkzeuge liegen nur lokal (.LocalDeveloperTools) und sind nicht auf dem Server.
Gesamt
Frei
Zugewiesen
Neue Lizenzen generieren
Lizenzen
📐 Datenmodell — Lizenznummern

Eine Lizenz = ein Sitzplatz für eine:n Schüler:in in einem Schuljahr. Der Admin erzeugt einen Vorrat an Codes, eine Lehrperson löst Codes ein (sie werden ihrem Konto zugeordnet) und weist sie dann einzelnen Schüler:innen zu. Alles steht in einer Tabelle licenses — die drei Zustände ergeben sich allein aus zwei Feldern: teacher_id und student_id.

Tabelle „licenses"
SpalteTypBedeutung
idINT · PKInterne ID
codeVARCHAR · UNIQUEDer Lizenzcode, Format XXXX-XXXX-XXXX-JAHR
school_yearVARCHARSchuljahr, z. B. „26/27" — aus dem Jahr abgeleitet
teacher_idFK → teachersEinlösende Lehrperson · NULL = noch im Pool
student_idFK → studentsPlatz-Inhaber:in · NULL = noch frei
redeemed_atTIMESTAMP · NULLZeitpunkt des Einlösens durch die Lehrperson
created_atTIMESTAMPErstellung (Admin-Generierung)
Lebenszyklus & Einlösen
1Generiert
Admin
teacher_id = NULL · student_id = NULL. Frisch erzeugter Code im Pool.
Aktion: generate
2Eingelöst
Lehrperson
teacher_id gesetzt · redeemed_at = jetzt · student_id noch NULL. Code gehört nun der Lehrperson.
Aktion: redeem / redeem_batch
3Zugewiesen
Lehrperson
student_id gesetzt. Der Platz ist von einer konkreten Person belegt.
Aktion: assign / auto_assign
⚠️ In der Statistik oben zählt „Frei" = student_id IS NULL — also auch schon eingelöste, aber noch nicht zugewiesene Codes. „Zugewiesen" = student_id gesetzt. Ob ein freier Code schon einer Lehrperson gehört, sieht man an teacher_id / redeemed_at.
Beziehungen
licenses teacher_id teachers
licenses student_id students class_id classes teacher_id teachers

licenses.teacher_id merkt sich die einlösende Lehrperson, licenses.student_id den Platz-Inhaber. Über students.class_id → classes.teacher_id hängt jede:r Schüler:in ohnehin an einer Klasse einer Lehrperson — der direkte teacher_id-Eintrag macht aber auch eingelöste, noch nicht zugewiesene Codes eindeutig einer Lehrperson zuordenbar.

Jahr → Schuljahr → Code
Eingabe beim Generieren: Jahr = 2026 (Kalenderjahr, in dem das Schuljahr beginnt).
school_year = „letzte 2 Ziffern"  26  /  26+1  = 26/27
Code-Suffix = das volle Jahr: -2026
Zeichen-Alphabet (ohne Verwechsler): A–Z ohne I,O + 2–9 (kein 0, kein 1)
→ 3 Blöcke à 4 Zeichen + Jahr  ⟶  Beispiel: K7QF-3M9P-RT2W-2026  ·  Schuljahr 26/27
Das Jahr steckt fest im Code (Suffix) und bestimmt school_year. Für ein neues Schuljahr wird ein neuer Vorrat generiert; Filter/Export laufen über school_year.