Bring the README up to date with the setup check and settings form

Documents the setup check legend, the explained notification matrix and
the missing-notification notice, that wk-sync:form:create creates a new
form on every call and only the selected form counts, the member group
behaviour on re-import, the birthday format, export file naming, MySQL 8
support and the reusable backend explanation widget.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Jürgen MummertandClaude Fable 5.1 committed 2026-09-26 18:05:21 +02:00
1 parent 36a317d32e
commit a96eed690a
1 file changed
+18 -8
+18 -8
View File
@@ -7,7 +7,7 @@ Verbindet **Contao 5.7** mit der Seminarverwaltung **W&K** (Windows-Software ohn
3. **Posteingang**: Anmeldungen und Kontaktanfragen werden in Ordnern bearbeitet (Neu, Download-Liste, Bereits bearbeitet, Ignoriert/Spam, Exportiert).
4. **Export**: Die Download-Liste wird als CSV für den W&K-Import erzeugt (ISO-8859-1, Semikolon, feste Spalten), die Datensätze werden als exportiert markiert und die freien Plätze der Veranstaltungen reduziert.
- Contao **5.7**, PHP **8.5**, Doctrine DBAL **4**
- Contao **5.7**, PHP **8.5**, Doctrine DBAL **4**, MySQL 8 oder MariaDB
- Keine Abhängigkeiten außer dem Contao-Core und dem Kalender-Bundle
- **Notification Center 2** wird für Benachrichtigungen empfohlen (Typ „W&K-Anmeldung“), ist aber nicht erforderlich
- Newsletter-Anmeldung (Double-Opt-in) mit dem Newsletter-Bundle, optional
@@ -50,17 +50,21 @@ vendor/bin/contao-console contao:migrate
```
Die Feldnamen entsprechen den Spalten von `tl_wk_booking` (`gender`, `firstname`, `lastname`, `street`, `postal`, `city`, `email`, `phone`, `position`, `birthday`, `teacherPosition`, `schoolName`, `schoolCity`, `vegetarian`, `overnightStay`, `addDifferentInvoiceAddress`, `invoice…`, `addNotes`, `notes`, `newsletter`, `privacyAccepted`, `agbAccepted`). Spamschutz über das ALTCHA-Feld des Contao-Kerns. Das Formular braucht **keine** Weiterleitungsseite und **kein** „Daten in Tabelle speichern“ – beides übernimmt das Bundle.
Der Befehl legt bei jedem Aufruf ein neues Formular an (Alias `wk-anmeldung`, bei Bedarf nummeriert); bei der Installation passiert nichts automatisch. Ein von Hand gebautes Formular funktioniert genauso, solange die Feldnamen stimmen – welches Formular gilt, entscheidet allein die Auswahl „Anmeldeformular“ in den Einstellungen.
3. **Einstellungen anlegen** – Backend „W&K-Tools → Einstellungen → Neu“, ein Eintrag je Kalender:
- Kalender, in den importiert wird und dessen Veranstaltungen buchbar sind
- Anmeldeformular, Seite mit dem Anmeldeformular, Bestätigungsseite, Seite mit dem Anfrageformular
- Anmeldeschluss (Tage vor Beginn, Standard 1) und angezeigter Anmeldeschluss (Standard 31)
- Eigene Veranstaltungsorte (Standard „TPI Moritzburg“; Orte, die so beginnen, gelten als „im eigenen Haus“)
- Autor importierter Veranstaltungen, Mitgliedergruppen für Kursleitung und Referenten (leer = keine Mitglieder anlegen)
- Autor importierter Veranstaltungen, Mitgliedergruppen für Kursleitung und Referenten (leer = keine Mitglieder anlegen, die Namen aus W&K bleiben dann unberücksichtigt)
- Newsletter-Verteiler und Aktivierungsseite (optional)
- Benachrichtigungen: Standard sowie je Bedingung 1–12 (siehe unten); die Auswahl zeigt den Titel mit ID
- Benachrichtigungen: Standard sowie je Bedingung 1–12 (siehe unten); die Auswahl zeigt den Titel mit ID. Das Formular erklärt die Bedingungen mit einer Matrix (Art × ein-/mehrtägig); solange keine Benachrichtigung vom Typ „W&K-Anmeldung“ existiert, steht dort ein Hinweis mit Link zum Notification Center.
`wk-sync:form:create --calendar=1` legt den Eintrag bei Bedarf mit an. Am Kalender selbst wird nichts konfiguriert.
Beim Bearbeiten zeigt die Legende **Prüfung der Einrichtung** oben im Formular, ob die Verkettung stimmt: Feldnamen des Anmeldeformulars (fehlen Vorname, Nachname oder E-Mail, ist das ein Fehler), Modul „W&K-Anmeldeformular“ auf der Anmeldeseite, Bestätigungsseite, Anfrageformular mit Zieltabelle `tl_wk_inquiry`, Modul „W&K-Anmeldestatus“ auf der Weiterleitungsseite des Kalenders und mindestens eine zugeordnete Benachrichtigung. Grün, wenn alles passt, rot mit konkreten Hinweisen sonst.
4. **Seiten und Module**
- Seite **Kurs** (`kurs`): Modul *Event-Reader* des Kerns plus Modul **W&K-Anmeldestatus** (freie Plätze, Anmeldeschluss, Link „Jetzt anmelden“, Hinweis bei externer Anmeldung, geschlossenem Teilnehmerkreis usw.)
- Seite **Anmeldung** (`kurs/anmeldung`): Modul **W&K-Anmeldeformular** – wird wie der Event-Reader mit dem Alias der Veranstaltung aufgerufen (`/kurs/anmeldung/<alias>`)
@@ -90,14 +94,14 @@ Regeln beim Import:
| `kbsgebiet` | `wkCategoryText`, `wkCategories`, `wkCategoryPrimary` | Keine Zuordnung möglich → Storno + Hinweis |
| `kbpmemo`, `kbzusatz` | `teaser`, `wkTopics` | Text wird HTML-sicher in Absätze bzw. Listen (`- `) umgewandelt |
| `kbwmemo` | `wkTags` | Kommagetrennt, dedupliziert |
| `kbkln1`, `kbmref` | `wkInstructor`, `wkSpeakers` | Mitglieder nach Nachname; werden nur angelegt, wenn im Kalender Mitgliedergruppen gesetzt sind. „N.N.“ wird ignoriert |
| `kbkln1`, `kbmref` | `wkInstructor`, `wkSpeakers` | Mitglieder nach Nachname; werden nur angelegt, wenn in den Einstellungen Mitgliedergruppen gesetzt sind (die Vorschau kündigt das an). „N.N.“ wird ignoriert |
| `kbanzmax`, `kbanztat` | `wkMaxPlaces`, `wkPlacesLeft` | Freie Plätze = max − belegt |
| `kbkp1`–`kbkp6`, `kbktxp1`–`kbktxp6` | `wkPrice1`–`6`, `wkPriceType1`–`6` | Dezimalzahlen |
| `kbkd*` | `wkOrganizer*` | Straße und Landeskennzahl richtig zugeordnet (war vertauscht) |
| `kbkdemail` | `wkOrganizerEmail` | E-Mail **oder** URL (Veranstaltungsart 3: Anmeldung beim Veranstalter) |
| `kbvort`, `kbgruppe`, `kbvsart`, `kbztermin` | `location`, `wkAudience`, `wkEventType`, `wkAdditionalDates` | „geschlossener Teilnehmerkreis“ verhindert die Online-Anmeldung |
Das Euro-Zeichen, das W&K als „Ç“ exportiert, wird im Umfeld von Zahlen korrigiert. Aliase werden nur beim Anlegen erzeugt und bleiben danach stabil. Jeder Import wird protokolliert (W&K-Tools → Protokoll); die Datei liegt unter `var/wk-sync/imports/`.
Das Euro-Zeichen, das W&K als „Ç“ exportiert, wird im Umfeld von Zahlen korrigiert. Aliase werden nur beim Anlegen erzeugt und bleiben danach stabil. Ein erneuter Import derselben Datei meldet alle Seminare als unverändert. Jeder Import wird protokolliert (W&K-Tools → Protokoll); die Datei liegt unter `var/wk-sync/imports/`.
Auf der Konsole:
@@ -133,8 +137,9 @@ Vorrang: Benachrichtigung an der Veranstaltung (Legende „Anmeldung“) → ers
| 8 / 9 | Tages- / Mehrtagesveranstaltung, Art Evangelische Schulen |
| 10 / 11 | Tages- / Mehrtagesveranstaltung, Art Mentoring |
| 12 | Mehrtägige Ausbildung |
| – | Alles andere (Schule ohne EXTP-Nummer, eintägige Ausbildung, Sonstiges wie AusZEIT) → Standard-Benachrichtigung |
Ohne Notification Center werden Anmeldungen gespeichert, aber keine Mails verschickt (Warnung im Systemprotokoll).
Die Bedingungen sind bewusst fest im Code hinterlegt (`NotificationRouter`), weil sie kundenspezifisch sind; die Einstellungen zeigen sie als Matrix mit Erklärungen an jedem Auswahlfeld. Ohne Notification Center werden Anmeldungen gespeichert, aber keine Mails verschickt (Warnung im Systemprotokoll).
## Folgeformulare (z. B. Workshop-Auswahl)
@@ -142,9 +147,9 @@ Die Bestätigungsseite wird mit `?booking=<Token>` aufgerufen. Formulare des For
## Posteingang und Export
**W&K-Tools → Posteingang.** Neue Anmeldungen und Kontaktanfragen werden gesichtet und einzeln oder gesammelt verschoben. Doppelte Anmeldungen (gleiche E-Mail-Adresse, gleiche Veranstaltung) werden markiert. „Bearbeiten“ öffnet den Datensatz unter W&K-Tools → Anmeldungen bzw. W&K-Tools → Kontaktanfragen; dort lassen sich alle Angaben korrigieren (Liste mit Filter nach Veranstaltung und Ordner, Suche nach Name/E-Mail). Beim Löschen einer Veranstaltung werden ihre Anmeldungen mitgelöscht.
**W&K-Tools → Posteingang.** Neue Anmeldungen und Kontaktanfragen werden gesichtet und einzeln oder gesammelt verschoben. Doppelte Anmeldungen (gleiche E-Mail-Adresse, gleiche Veranstaltung) werden markiert. „Bearbeiten“ öffnet den Datensatz unter W&K-Tools → Anmeldungen bzw. W&K-Tools → Kontaktanfragen; dort lassen sich alle Angaben korrigieren (Liste mit Filter nach Veranstaltung und Ordner, Suche nach Name/E-Mail; der Geburtstag wird wie im Formular als `TT.MM.JJJJ` gespeichert, so wie W&K es erwartet). Beim Löschen einer Veranstaltung werden ihre Anmeldungen mitgelöscht.
**Export**: In der Download-Liste erzeugt „Download-Liste für W&K exportieren“ die Datei `JJJJ-MM-TT_website_kontaktanfragen_wk.csv` mit den Spalten `KBNR;KNKDAN;KNKDTITEL;KNKDN2;KNKDN1;KNKDSTR;KNKDPLZ;KNKDORT;KNGEBDAT;KDEMAIL;KDTEL1;KDFREI01;KDFREI02;KDFREI03;KDFREI04;KNUKAT;KNVEG;schoolName;schoolCity`. Kontaktanfragen stehen ohne Kursnummer in der Datei. Die Datensätze werden als „Exportiert“ markiert, die freien Plätze der Veranstaltungen um die Zahl der Anmeldungen reduziert (bis zum nächsten W&K-Import), und die Datei bleibt unter W&K-Tools → Exporte zum erneuten Download.
**Export**: In der Download-Liste erzeugt „Download-Liste für W&K exportieren“ die Datei `JJJJ-MM-TT_website_kontaktanfragen_wk.csv` mit den Spalten `KBNR;KNKDAN;KNKDTITEL;KNKDN2;KNKDN1;KNKDSTR;KNKDPLZ;KNKDORT;KNGEBDAT;KDEMAIL;KDTEL1;KDFREI01;KDFREI02;KDFREI03;KDFREI04;KNUKAT;KNVEG;schoolName;schoolCity`. Kontaktanfragen stehen ohne Kursnummer in der Datei. Die Datensätze werden als „Exportiert“ markiert, die freien Plätze der Veranstaltungen um die Zahl der Anmeldungen reduziert (bis zum nächsten W&K-Import), und die Datei bleibt unter W&K-Tools → Exporte zum erneuten Download (mehrere Exporte am selben Tag tragen den gleichen Dateinamen, liegen auf dem Server aber mit Zeitstempel getrennt unter `var/wk-sync/exports/`).
## Berechtigungen
@@ -171,3 +176,8 @@ vendor/bin/phpunit
```
Die Tests decken CSV-Parsing, Zeilen-Zuordnung, Kategorie-Auflösung, Formularregeln, Benachrichtigungs-Routing, Textaufbereitung und den W&K-Export ab.
Backend-Bausteine, die sich auch anderswo nutzen lassen:
- Widget `wk_explanation` (`inputType`) für Erklärtexte in DCA-Formularen; Text aus `eval.text` oder der Sprachdatei des Feldes, Box über `eval.boxClass` (`tl_info`, `tl_confirm`, `tl_error`). Contaos eigener Typ `explanation` existiert nur im Frontend-Formulargenerator.
- `BackendMenuListener` hängt das Icon der Navigationsgruppe ein und nimmt die doppelte Escapierung zurück, mit der der Contao-Kern Modulbeschreibungen mit `&` in Tooltips ausgibt.