🛠️ Technische Dokumentation
Turnierplaner der Fasnet Gilde Markgröningen e.V.
v3.106.0 · Version vom 2026-08-20 · Generiert: 20.08.2026 13:43
1 · Überblick
| Eigenschaft | Wert |
|---|---|
| Frontend | Single-Page-App in einer HTML-Datei, Vanilla JavaScript |
| Backend | PHP (api.php als Router, auth.php für Authentifizierung) |
| Datenhaltung | JSON-Dateien im Ordner Data/ (kein DBMS) |
| Authentifizierung | Token-basiert (sessions.json) |
| SMTP | mxe87b.netcup.net:465 |
| Version | v3.106.0 (2026-08-20) |
| Hosting | Synology NAS, nginx, Document-Root = web/turnierplaner |
2 · Architektur
3 · Dateien auf dem Server
| Datei | Größe | Geändert |
|---|---|---|
ANWENDER_RELEASE_NOTES.html | 16.3 KB | 28.06.2026 15:16 |
GUTACHTEN_MARKTWERT.html | 22.4 KB | 28.06.2026 15:16 |
RELEASE_NOTES.html | 44.8 KB | 28.06.2026 15:16 |
TECHNISCHE_RELEASE_NOTES.html | 28.8 KB | 28.06.2026 15:16 |
abmeldung.html | 8.3 KB | 11.08.2026 19:42 |
admin_tools.php | 50 KB | 03.06.2026 23:14 |
anmeldung.html | 16.1 KB | 11.08.2026 19:42 |
api.php | 102.5 KB | 20.08.2026 13:42 |
api_license.php | 3.7 KB | 03.06.2026 23:14 |
api_v1.php | 107.4 KB | 07.08.2026 19:00 |
app.js | 803 KB | 20.08.2026 08:05 |
auth.php | 32.9 KB | 15.08.2026 21:55 |
check_browser.html | 3.6 KB | 28.06.2026 15:16 |
check_permissions.php | 5.9 KB | 03.06.2026 23:14 |
cleanup.php | 37.8 KB | 06.08.2026 00:37 |
db.php | 45.2 KB | 15.08.2026 21:55 |
debug_api.php | 6.3 KB | 22.05.2026 09:39 |
dev_check.php | 10 KB | 22.05.2026 10:13 |
doku.html | 36 KB | 20.08.2026 08:59 |
doku_generator.php | 82.6 KB | 20.08.2026 13:42 |
exceljs.min.js | 925.5 KB | 01.07.2026 14:15 |
export.php | 33.9 KB | 28.06.2026 15:16 |
export_test.php | 10 KB | 03.06.2026 23:14 |
features.html | 30.4 KB | 20.08.2026 08:59 |
handlers_auth.php | 38 KB | 18.08.2026 18:47 |
handlers_contact.php | 23.8 KB | 12.08.2026 11:48 |
handlers_system.php | 29.8 KB | 01.07.2026 14:16 |
handlers_turnier.php | 9.8 KB | 30.07.2026 07:30 |
handlers_users.php | 9.1 KB | 12.08.2026 11:48 |
hilfe.html | 24.7 KB | 20.08.2026 13:43 |
import_vorlage.php | 21.8 KB | 11.08.2026 12:24 |
index.html | 293.8 KB | 20.08.2026 13:42 |
index.php | 1.7 KB | 28.06.2026 15:16 |
maintenance.php | 16.8 KB | 28.06.2026 15:16 |
migrate.php | 11.3 KB | 28.06.2026 15:16 |
notify.php | 13.7 KB | 07.08.2026 19:25 |
phpinfo_test.php | 0.7 KB | 28.06.2026 15:16 |
relnotes_generator.php | 33.6 KB | 14.08.2026 08:26 |
relnotes_lib.php | 28.1 KB | 19.08.2026 11:58 |
reset_admin.php | 4 KB | 28.06.2026 15:16 |
reset_emergency.php | 4.4 KB | 22.05.2026 09:39 |
smtp.php | 12.2 KB | 31.07.2026 12:36 |
test_backup.html | 3.8 KB | 22.05.2026 09:39 |
test_suite.php | 3.5 KB | 28.06.2026 15:16 |
test_suite_real.php | 77.2 KB | 14.08.2026 00:32 |
test_suite_stub.php | 3.5 KB | 14.08.2026 14:17 |
test_version.php | 1 KB | 03.06.2026 23:14 |
test_version_1.php | 1.7 KB | 03.06.2026 23:14 |
tools.php | 7.9 KB | 28.06.2026 15:16 |
tpl_head.php | 1.1 KB | 28.06.2026 15:16 |
tpl_toolnav.php | 3.7 KB | 28.06.2026 15:16 |
turnierplaner.spec.js | 69.2 KB | 03.06.2026 23:14 |
veranstaltungen.html | 5.6 KB | 03.08.2026 16:05 |
xlsx-js-style.js | 415.1 KB | 02.08.2026 18:56 |
xlsx.full.min.js | 861.1 KB | 03.06.2026 23:14 |
Daten-Ordner: /volume1/web/FGM/FGM-Turnierplaner-Dev/Turnierplaner/Data
4 · Datenmodell
Data mit großem D. Alle PHP-Dateien nutzen DATA_DIR = __DIR__ . '/Data'.| Datei | Inhalt |
|---|---|
users.json | Benutzer (users[]) + Rollen (roles[]). Benutzer referenzieren Rollen via roleIds[]. Rollen enthalten visibleAnmeldestatus für Turniersichtbarkeit. |
config.json | SMTP, Absender, Kontakt-Themen/Empfänger (contactTopics, contactTopicConfig), Gast-Sichtbarkeit (guestTurnierStatus). |
Data/turnierplaner.db | SQLite-Datenbank (WAL-Modus): Tabelle termine (Turniere + Veranstaltungen, unterschieden per terminArt), App-Einstellungen (DB::getConfig()), Archiv. Wird beim Laden nach Rollen-/Gast-Filter serverseitig gefiltert. |
sessions.json | Aktive Token mit Ablaufzeit. |
audit.json | Änderungsprotokoll (wer, wann, was). |
doku_backups/ | Backups generierter Dokumentationen. |
system_backups/ | App-Sicherungen (je Backup ein Ordner + _manifest.json mit Versions-Tag). |
5 · API-Endpunkte
Alle Requests an api.php. GET via ?action=…, POST via Header X-Action. Antwort immer JSON {ok:true|false,…}.
} geschlossen sein. Ein offener if-Block ohne } verschluckt alle nachfolgenden Endpunkte (→ nginx 404). Test-Suite prüft diesen Fall.api.php?v=... filtert Turniere anhand von guestTurnierStatus (Gäste) oder visibleAnmeldestatus der Benutzer-Rollen vor dem Zurückgeben.| Methode | Aktion |
|---|---|
| GET | status |
| GET | ping |
| GET | getLegal |
| GET | getLogo |
| GET | updateBackups |
| GET | loadConfig |
| GET | getTurnier |
| GET | appInfo |
| GET | oeffentlicheVeranstaltung |
| GET | oeffentlicheGruppe |
| GET | oeffentlicheVeranstaltungen |
| GET | abmeldungInfo |
| GET | getAnmeldungen |
| GET | getGruppen |
| GET | diagnose |
| GET | users |
| GET | audit |
| GET | getRoles |
| GET | getContactData |
| GET | getFunktionen |
| GET | getMailTemplates |
| GET | getBackupLog |
| GET | abmeldungDurchfuehren |
| GET | anmeldungHinzufuegen |
| GET | anmeldungBearbeiten |
| GET | anmeldungenZusammenfuehren |
| GET | saveGruppe |
| GET | deleteGruppe |
| GET | anmeldungAbmelden |
| GET | anmeldungLinkErneut |
| GET | anmeldungAbsenden |
| GET | gruppenAnmeldungAbsenden |
| GET | update |
| GET | rollback |
| GET | deleteUpdateBackup |
6 · Authentifizierung
au_verifyToken() prüft das Token in dieser Reihenfolge:
- PHP-Session (
$_SESSION['tpl_token']) - Header
X-Token - Header
Authorization: Bearer … - Cookie
tpl_token - POST-Body-Feld
_token
Token werden in sessions.json gespeichert. Frontend legt Token in localStorage + Cookie ab (beide mit try/catch für Safari Private Mode).
Cache-Control: no-cache, no-store, must-revalidate — verhindert Browser-Caching bei status- und Daten-Requests.7 · Berechtigungen
Definiert als PERMISSIONS-Konstante in auth.php. au_hasPermission() prüft alle Rollen des Users; role-admin mit isAdmin=true hat Vollzugriff.
| Schlüssel | Bezeichnung |
|---|---|
turniere.view | Turniere anzeigen (Übersicht) |
turniere.create | Turnier anlegen |
turniere.edit.basis | Basisinformationen bearbeiten |
turniere.edit.ort | Veranstaltungsort bearbeiten |
turniere.edit.kat | Kategorie & Anmeldung bearbeiten |
turniere.edit.fristen | Termine & Fristen bearbeiten |
turniere.edit.garde | Garde & Solisten bearbeiten |
turniere.edit.zusatz | Zusatzinformationen bearbeiten |
turniere.edit.ergebnisse | Ergebnisse & Platzierungen bearbeiten |
turniere.begleitung.view | Begleitung (Trainer/Betreuer/Trainees) ansehen |
turniere.begleitung.edit | Begleitung eintragen & bearbeiten |
turniere.begleitung.delete | Begleitung zurücksetzen / löschen |
turniere.begleitung.auswertung | Kartenbestellung-Auswertung & Export anzeigen |
turniere.status.view | Anmeldestatus ansehen |
turniere.status.edit | Anmeldestatus eintragen & ändern |
turniere.status.delete | Anmeldestatus zurücksetzen / löschen |
turniere.delete | Turnier löschen |
turniere.auswertung | Turnier-Auswertung & Statistiken anzeigen |
ergebnisse.erfassen | Ergebnisse & Platzierungen erfassen |
saison.abschliessen | Saison / Kampagne abschließen |
import | Excel-Import durchführen |
veranstaltungen.create | Veranstaltung anlegen |
veranstaltungen.edit | Veranstaltung bearbeiten |
veranstaltungen.delete | Veranstaltung löschen |
veranstaltungen.anmeldungen.view | Anmeldungen einsehen (Verwalterliste, Export) |
veranstaltungen.anmeldungen.manage | Anmeldungen verwalten (abmelden, Link erneut senden) |
veranstaltungen.hinweistext.edit | Hinweistext für geschlossene Anmeldung pflegen |
einstellungen | Einstellungen verwalten (alle — Rückwärtskompatibilität) |
einstellungen.design | Design & Erscheinungsbild ändern |
einstellungen.gast | Gast-Sichtbarkeit konfigurieren |
einstellungen.turnier | Turnier-Einstellungen (Kategorien, Garde, Typen, Solisten) |
einstellungen.verein.add | Einladende Vereine: hinzufügen |
einstellungen.verein.edit | Einladende Vereine: ändern |
einstellungen.verein.delete | Einladende Vereine: löschen |
einstellungen.anmeldeart.add | Anmeldearten: hinzufügen |
einstellungen.anmeldeart.edit | Anmeldearten: ändern |
einstellungen.anmeldeart.delete | Anmeldearten: löschen |
einstellungen.veranstaltungsart.add | Veranstaltungsarten: hinzufügen |
einstellungen.veranstaltungsart.edit | Veranstaltungsarten: ändern |
einstellungen.veranstaltungsart.delete | Veranstaltungsarten: löschen |
einstellungen.turniertyp.add | Turnier-Typen: hinzufügen |
einstellungen.turniertyp.edit | Turnier-Typen: ändern |
einstellungen.turniertyp.delete | Turnier-Typen: löschen |
einstellungen.garde.add | Garden: hinzufügen |
einstellungen.garde.edit | Garden: ändern |
einstellungen.garde.delete | Garden: löschen |
einstellungen.solist.add | Solisten: hinzufügen |
einstellungen.solist.edit | Solisten: ändern |
einstellungen.solist.delete | Solisten: löschen |
einstellungen.kategorie.add | Kategorien: hinzufügen |
einstellungen.kategorie.edit | Kategorien: ändern |
einstellungen.kategorie.delete | Kategorien: löschen |
kampagne.edit | Kampagne-Name ändern |
verein.name.add | Vereinsname anlegen |
verein.name.change | Vereinsname ändern |
verein.name.delete | Vereinsname löschen / zurücksetzen |
verein.name.edit | Vereinsname ändern (Sammelrecht) |
verein.logo.add | Vereinslogo hochladen |
verein.logo.change | Vereinslogo austauschen |
verein.logo.delete | Vereinslogo löschen / zurücksetzen |
verein.logo.upload | Vereinslogo hochladen / austauschen (Sammelrecht) |
verein.logo.reset | Vereinslogo zurücksetzen auf Standard |
system.logo | Vereinslogo verwalten (Rückwärtskompatibilität) |
system.license | Lizenz verwalten & aktivieren |
users.manage | Benutzer & Rollen verwalten (Sammelrecht) |
users.create | Benutzer anlegen |
users.edit | Benutzer bearbeiten |
users.delete | Benutzer löschen |
users.resetpw | Passwort-Reset-Link an Benutzer senden |
users.forcepassword | Benutzer zum Passwort-Wechsel beim nächsten Login zwingen |
roles.create | Rollen anlegen |
roles.edit | Rollen bearbeiten |
roles.delete | Rollen löschen |
users.report | Benutzer-Auswertung anzeigen & exportieren |
bezeichnung.edit | Bezeichnung (Kampagne/Saison) bearbeiten |
bezeichnung.change | Bezeichnung umbenennen (Label ändern) |
bezeichnung.delete | Bezeichnung zurücksetzen |
users.export | Benutzerdaten exportieren (JSON) |
users.import | Benutzerdaten importieren (JSON) |
passwortrichtlinie | Passwort-Richtlinie verwalten |
funktionen.manage | Funktionen verwalten (Sammelrecht, Fallback) |
einstellungen.funktion.add | Funktionen: hinzufügen |
einstellungen.funktion.edit | Funktionen: umbenennen |
einstellungen.funktion.delete | Funktionen: löschen |
funktionen.approve | Neue Funktionen von Registrierungen genehmigen |
audit.view | Änderungsprotokoll anzeigen |
audit.delete | Änderungsprotokoll löschen |
audit.export | Änderungsprotokoll exportieren |
audit.archive | Änderungsprotokoll archivieren |
backup.create | Sicherung erstellen / herunterladen |
backup.restore | Sicherung einspielen / wiederherstellen |
backup.schedule | Automatisches Backup konfigurieren |
mails.smtp | E-Mail / SMTP-Einstellungen ändern |
mails.edit | E-Mail-Vorlagen bearbeiten |
mails.send | E-Mails manuell versenden (Test & Benachrichtigung) |
kontakt.view | Kontaktformular-Einsendungen einsehen |
kontakt.manage | Kontaktformular Themen & Empfänger verwalten |
themen.add | Kontakt-Themen hinzufügen (Rückwärtskompatibilität) |
themen.edit | Kontakt-Themen bearbeiten (Rückwärtskompatibilität) |
themen.delete | Kontakt-Themen löschen (Rückwärtskompatibilität) |
system.update | System-Update einspielen |
system.diagnose | Diagnose- & Test-Werkzeuge benutzen |
system.wartung | Wartung & Speicher-Bereinigung ausführen |
cleanup.execute | Daten-Aufräum-Tool benutzen (Rückwärtskompatibilität) |
berichte.view | Berichte & Statistiken anzeigen |
berichte.export | Berichte & Statistiken exportieren |
doku.hilfe.view | Anwender-Hilfe anzeigen / öffnen |
doku.hilfe.create | Anwender-Hilfe neu generieren |
doku.hilfe.backup | Anwender-Hilfe Backup erstellen / einspielen |
doku.hilfe.delete | Anwender-Hilfe Backup löschen |
doku.technisch.view | Technische Dokumentation anzeigen / öffnen |
doku.technisch.create | Technische Dokumentation neu generieren |
doku.technisch.backup | Technische Dokumentation Backup erstellen / einspielen |
doku.technisch.delete | Technische Dokumentation Backup löschen |
doku.features.view | Feature-Übersicht anzeigen / öffnen |
doku.features.create | Feature-Übersicht neu generieren |
doku.features.backup | Feature-Übersicht Backup erstellen / einspielen |
doku.features.delete | Feature-Übersicht Backup löschen |
doku.relnotes.anwender.view | Anwender Release Notes anzeigen |
doku.relnotes.anwender.generate | Anwender Release Notes generieren |
doku.relnotes.anwender.backup | Anwender Release Notes Sicherung erstellen |
doku.relnotes.anwender.manage | Anwender Release Notes Sicherungen verwalten/löschen |
doku.relnotes.technisch.view | Technische Release Notes anzeigen |
doku.relnotes.technisch.generate | Technische Release Notes generieren |
doku.relnotes.technisch.backup | Technische Release Notes Sicherung erstellen |
doku.relnotes.technisch.manage | Technische Release Notes Sicherungen verwalten/löschen |
doku.relnotes.gutachten.view | Marktwert-Gutachten anzeigen |
doku.relnotes.gutachten.generate | Marktwert-Gutachten generieren |
doku.relnotes.gutachten.backup | Marktwert-Gutachten Sicherung erstellen |
doku.relnotes.gutachten.manage | Marktwert-Gutachten Sicherungen verwalten/löschen |
8 · Kontaktformular
sendContact liegt vor dem Auth-Gate → öffentlich für Gäste. Einstellungen erfordern einstellungen-Berechtigung.
Themenspezifische Empfänger in config.json unter contactTopicConfig: {"Thema":{"roles":[...],"emails":"a;b"}}. Fallback: globale contactNotifyRoles/contactExtraEmails.
9 · Datensicherung
Manifest (_manifest.json) enthält seit v2.0.0 auch appVersion und appBuild — sichtbar im Backup-Protokoll als blaues Badge.
10 · Deployment
- Server: Synology NAS, nginx, Document-Root =
web/turnierplaner - Dateien direkt per File Station hochladen
- Nach Upload: Strg+Umschalt+R
- Update-ZIP: genau eine Ordnerebene als Prefix (
TurnierplanerZip/datei)