# Cronjobs

Produktionsbasis: `/var/www/ksbdueren` (bei abweichendem Deployment-Pfad anpassen).
Ausgaben sollten durch die Serverkonfiguration in ein überwachtes Log geschrieben werden.

## Wartelistenangebote (alle 5 Minuten)

### Bewegungszentrum-Kursbuchungen

```bash
php bin/console app:expire-course-waitlist-offers
```

- **Zweck:** Abgelaufene 24-Stunden-Platzangebote freigeben und den Platz im gleichen
  Datums-/Zeitslot-Kontext FIFO an den nächsten passenden Eintrag weitergeben.
- **Option:** `--dry-run` zählt abgelaufene Angebote, ohne Datenbankänderung oder E-Mail-Versand.
- **Exit-Code:** `0` bei erfolgreicher Verarbeitung, `1` bei einem Verarbeitungsfehler.

### Schwimmkurs-Terminbuchungen

```bash
php bin/console app:expire-appointment-waitlist-offers
```

- **Zweck:** Abgelaufene 24-Stunden-Reservierungen freigeben und je Termin FIFO an den nächsten
  Eintrag weitergeben, sofern Kapazität vorhanden ist.
- **Option:** `--dry-run` zählt abgelaufene Angebote, ohne Datenbankänderung oder E-Mail-Versand.
- **Exit-Code:** `0` bei erfolgreicher Verarbeitung, `1` bei einem Verarbeitungsfehler.

Empfohlene Crontab-Einträge:

```cron
*/5 * * * * cd /var/www/ksbdueren && php bin/console app:expire-course-waitlist-offers
*/5 * * * * cd /var/www/ksbdueren && php bin/console app:expire-appointment-waitlist-offers
```

Vor der ersten Aktivierung beide Commands einmal mit `--dry-run` ausführen. Die Migration
`Version20260720160000` muss zuvor regulär im Deployment ausgeführt worden sein.

Weitere historische Cron-Beispiele stehen in `cron-examples.md` im Projektroot; Messenger-Worker
für asynchrone Termin-Mails (`SendAppointmentMailMessage`) bleibt nötig.

## Fit wie ein Fisch (alle 5 Minuten)

Eigene Jobs, weil das Fisch-System bewusst getrennt von BZ/Schwimmen läuft.

```bash
php bin/console app:fisch:waitlist-expire
```

- **Zweck:** Abgelaufene 24-Stunden-Platzangebote der Fisch-Warteliste freigeben und den Platz
  FIFO an den nächsten passenden Eintrag derselben Altersgruppe weitergeben.
- **Option:** `--dry-run` listet die abgelaufenen Angebote, ohne Datenbankänderung oder Mailversand.
- **Exit-Code:** `0` bei erfolgreicher Verarbeitung, `1` bei einem Verarbeitungsfehler.

```bash
php bin/console app:fisch:expire-pending
```

- **Zweck:** Anmeldungen, deren 72-Stunden-Validierungslink nicht bestätigt wurde, auf `cancelled`
  setzen. Der reservierte Platz wird dadurch wieder frei und anschließend der Warteliste angeboten.
- **Option:** `--dry-run` listet die betroffenen Anmeldungen, ohne sie zu stornieren.
- **Exit-Code:** `0` bei erfolgreicher Verarbeitung, `1` bei einem Verarbeitungsfehler.

```cron
*/5 * * * * cd /var/www/ksbdueren && php bin/console app:fisch:waitlist-expire
*/5 * * * * cd /var/www/ksbdueren && php bin/console app:fisch:expire-pending
```

Voraussetzung: Migration `Version20260910150000` (Angebots- und Validierungsfelder).

## Signage: Text-Videos (optional, alle 5 Minuten)

```bash
php bin/console signage:text-video:render
# Optionen: --dry-run  --limit=5
```

- **Zweck:** Offene Render-Aufträge für Text-Videos abarbeiten. Normalerweise rendert die Webseite
  direkt nach der Antwort (`kernel.terminate`); der Cron fängt Aufträge auf, die dabei liegen
  geblieben sind (z. B. abgebrochener PHP-Prozess). Aufträge, die länger als 2 Stunden „läuft“
  zeigen, werden als fehlgeschlagen markiert und können in der Webseite erneut gestartet werden.
- **Option:** `--dry-run` listet offene und hängende Aufträge ohne Änderung; `--limit` begrenzt
  die Anzahl je Lauf.
- **Exit-Code:** immer `0`; ein fehlgeschlagener Auftrag steht mit Meldung in der Ausgabe und
  in der Webseite unter „Text-Videos“.

```cron
*/5 * * * * cd /var/www/ksbdueren && php bin/console signage:text-video:render
```

Voraussetzung: Migration `Version20261026220000`, `ffmpeg` und `fonts-dejavu-core` auf dem Server.

## Lilian Labs: Datenabruf

```bash
php bin/console lilian-labs:fetch-data --days=30
```

- **Zweck:** Holt die Messungen aller Messpunkte des Lilian-Kontos. Die Punktliste kommt bei jedem
  Lauf von Lilian (`GET /points`); neue Punkte werden übernommen, gelöschte fallen aus `point_ids`
  heraus, beides steht in der Ausgabe. Liefert Lilian die Liste nicht, gelten die konfigurierten Punkte.
- **Option:** `--days` Zeitraum rückwirkend (Standard 30). Kein `--dry-run`; Duplikate werden übersprungen.

## Lilian Labs: Messungen den Containern zuordnen (manuell)

```bash
php bin/console lilian-labs:assign-containers --dry-run
php bin/console lilian-labs:assign-containers
```

- **Zweck:** Setzt bei allen vorhandenen Messungen den Container nach der Zuordnung
  „Standort → Container-ID“ in der Lilian-Labs-Konfiguration (`location_containers`).
  Neue Messungen aus `lilian-labs:fetch-data` bekommen den Container schon beim Import.
  Leerzeichen am Ende des Standortnamens werden ignoriert.
- **Option:** `--dry-run` zeigt je Standort Container, Anzahl Messungen und wie viele sich ändern würden.
- **Kein Cron nötig.** Speichern der Konfiguration im Admin ordnet ebenfalls neu zu.

Voraussetzung: Migration `Version20261109150000` (belegt die Zuordnung vor: Blankenheim, Kall und Zülpich → Narwali2,
Köln Mengenicher Strasse, Köln Buchheim und Bonn Medinghoven → Mobi).

## Manueller Wartelisten-E2E-Test

```bash
php bin/console app:waitlist:e2e-test --system=both
# Optionen: --system=bz|swim|both  --email=...  --keep  --skip-mail  --stop-before-claim
```

Legt einen ausgebuchten Testkurs / Testtermin an, bucht auf die Warteliste, storniert den
Beleger, vergibt Angebot, Claimt und räumt Testdaten auf (ohne `--keep`).
`--stop-before-claim` gilt für Swim: gibt die Claim-URL aus und lässt das Angebot stehen
(impliziert `--keep`), damit die Eltern-Seite per HTTP getestet werden kann.

### Fit wie ein Fisch

```bash
MAILER_DSN=null://null php bin/console app:fisch:e2e-test
# Optionen: --email=...  --keep
```

Testet Anmeldung→Validierung, Wartelisten-Angebot nach Storno→Claim und Sammelanmeldung
(Schule→Elternlink). Öffnet die Anmeldephase nur für die Laufzeit und stellt sie danach wieder her.

Messenger-Worker für asynchrone Termin-Mails bleiben separat gemäß `START_MESSENGER_WORKER.md`
zu betreiben.
