# 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).

## Manueller Wartelisten-E2E-Test

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

Legt einen ausgebuchten Testkurs / Testtermin an, bucht auf die Warteliste, storniert den
Beleger, vergibt Angebot, Claimt und räumt Testdaten auf (ohne `--keep`).

### 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.
