Lizenz-Gate: Schueler ohne Lizenz gesperrt + Lehrer-Cockpit-Warnung

Teil 1 — Schueler-Lizenz-Gate (gilt fuer alle Klassen-Schueler ohne gueltige
Lizenz = zugewiesen, nicht storniert, nicht abgelaufen):
- Server-Gate zentral im Front-Controller (index.php + php/lib/license_gate.php):
  eingeloggte Klassen-Schueler ohne Lizenz sehen bei JEDER Sim-Route statt der
  Simulation eine Hinweis-Seite "Deine Lehrperson muss dir noch eine gueltige
  Lizenz zuweisen". Schnell-Ausstieg fuer Nicht-Schueler/Nicht-Sim (kein Cookie
  -> keine DB-Abfrage). Autodidakt ohne Klasse: nicht lizenzpflichtig.
- modules.php?student=1 liefert 'licensed'; Schueler-Cockpit (schueler.html)
  zeigt oben die Meldung und sperrt die Start-Buttons.

Teil 2 — Lehrer-Cockpit:
- Rote Warnleiste ganz oben, wenn Schueler:innen ohne gueltige Lizenz in der
  Klasse sind (+ Link "Jetzt zuweisen"). licenses?class_id=X liefert dazu die
  Liste 'unlicensed'.
- Lizenzen-Lasche: neue Sektion "Ohne gueltige Lizenz" mit Einzel- und
  Sammel-Zuweisung (auto_assign) — sonst fuehrt die Warnung ins Leere.

Kunden-Vereinfachung (Feedback): keine Auto-Erkennung/Dedup mehr (Ansprech-
partner koennen wechseln). Kunde = Freitext "Name/Verlag/Schule" + Mailadresse,
je Bestellung gespeichert. Editierbares Kundennummer-Feld + Autocomplete entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 16:15:16 +02:00
parent eea5688c76
commit ff889865e1
7 changed files with 197 additions and 29 deletions
+12 -2
View File
@@ -230,6 +230,9 @@ async function renderModules() {
if (modList.error) modList = [];
} catch(e) {}
// Lizenz-Gate: ohne gültige Lizenz sind die Sims nicht startbar (Hinweis oben).
var licensed = !modList.length || modList[0].licensed !== false;
// Lehrer-gesteuerte Auftraege zuerst — erledigte Auftraege fallen automatisch
// in die regulaere Modul-Liste, damit der Auftrag aus dem Cockpit verschwindet,
// das Modul aber spielbar bleibt.
@@ -257,7 +260,7 @@ async function renderModules() {
s += '<h3 style="color:#c25e1e">'+(m.icon||'📚')+' '+m.name+(m.forcedLevel ? ' <span style="font-weight:600;color:#9a9a9a;font-size:.82rem">· Stufe '+m.forcedLevel+'</span>' : '')+'</h3>';
s += '<p>Auftrag von deiner Lehrperson'+(meta.length ? '<br><span style="color:#8a8a8a">'+meta.join(' · ')+'</span>' : '')+'</p>';
s += '<div class="mod-actions">';
s += '<a href="'+url+'" class="mod-btn primary" style="background:#e8833a;border-color:#e8833a">▶ Jetzt starten</a>';
s += licensed ? '<a href="'+url+'" class="mod-btn primary" style="background:#e8833a;border-color:#e8833a">▶ Jetzt starten</a>' : '<span class="mod-btn primary" style="background:#c9a99a;border-color:#c9a99a;opacity:.7;pointer-events:none">🔑 Lizenz nötig</span>';
s += '</div></div></div>';
return s;
}
@@ -293,7 +296,7 @@ async function renderModules() {
s += '<h3>'+(m.icon||'📚')+' '+m.name+'</h3>';
s += '<p>'+(m.desc||'')+'</p>';
s += '<div class="mod-actions">';
if (isSpielbar) s += '<a href="'+url+'" class="mod-btn primary">▶ Starten</a>';
if (isSpielbar) s += licensed ? '<a href="'+url+'" class="mod-btn primary">▶ Starten</a>' : '<span class="mod-btn primary" style="opacity:.5;pointer-events:none" title="Deine Lehrperson muss dir eine Lizenz zuweisen">🔑 Lizenz nötig</span>';
s += '<a href="'+infoHref+'" class="mod-btn" title="Mehr Infos">📖 Infos</a>';
if (!isComing) s += '<a href="'+glossarHref+'" class="mod-btn" title="Glossar zu diesem Modul">📚 Glossar</a>';
if (buchHref) s += '<a href="'+buchHref+'" class="mod-btn" title="Schulbuch-Kapitel zu diesem Modul">📘 Schulbuch</a>';
@@ -323,6 +326,13 @@ async function renderModules() {
html += '</div>';
}
if (!licensed) {
html = '<div style="background:#fdece9;border:1px solid #f3c9c1;border-left:5px solid #c0392b;border-radius:12px;padding:1rem 1.1rem;margin-bottom:1.2rem;color:#7a2318">'
+ '<div style="font-size:1.4rem;margin-bottom:.15rem">🔑</div>'
+ '<div style="font-weight:800;font-size:.98rem;margin-bottom:.25rem">Noch keine Lizenz</div>'
+ '<div style="font-size:.84rem;line-height:1.55">Deine Lehrperson muss dir noch eine gültige Lizenz zuweisen. Sobald das erledigt ist, kannst du die Simulationen starten.</div>'
+ '</div>' + html;
}
document.getElementById('tab-modules').innerHTML = html;
}