Files
awo-hamburg-intranet/module/tasks/docs/cronjobs.md
Moritz Weinmann 743476f64a Module tasks + knowledgecenter_update aus Kundenprojekt übernehmen (bereinigt)
Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt:

Knowledgecenter:
- Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten
- Files-Gallery-Lizenzschlüssel entfernt (config.php)
- Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur,
  nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss),
  Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge
- 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …)

Tasks:
- Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments)
- Task-Definitionen und Verlinkungen geleert
- Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 09:20:02 +02:00

196 lines
6.7 KiB
Markdown

# Cronjobs — Task-Modul
Das Task-Modul benötigt **drei Cronjobs**, die regelmäßig laufen müssen:
1. **Assignments materialisieren** — erstellt neue Aufgaben-Zuweisungen für aktive Zyklen
2. **Assignments synchronisieren** — gleicht Zuweisungen mit aktuellen Zielgruppen-Regeln ab
3. **Eskalationen berechnen** — markiert überfällige Aufgaben und erhöht Eskalationsstufen
Alle CLI-Skripte liegen in `cli/` und nutzen `CronRuntime` mit:
- **Locking** (verhindert parallele Läufe)
- **Strukturiertes Log** (`logs/task_cert_cron.log`, JSON-Lines)
- **Heartbeat** (`logs/heartbeat/{job}.json` für Admin-UI)
- **Exit-Codes** (0 = OK, 1 = Fehler, 2 = ungültige Parameter, 3 = Lock aktiv)
- **CLI-Ausgabe** (`[OK]`/`[SKIP]`/`[ERROR]` auf stdout/stderr)
---
## 1. Assignments materialisieren
Erstellt für alle aktiven Aufgaben die Zuweisungen im aktuellen Zyklus (z.B. neuer Monat = neue Assignments).
```bash
php cli/task_cert_materialize_assignments.php
```
**Optionen:**
- `--no-lock` — Locking deaktivieren (nur Debug)
- `--json` — JSON-Ausgabe zusätzlich auf stdout
- `--help` — Hilfe anzeigen
**Empfohlenes Intervall:** alle 15 Minuten
**Was passiert:**
- Ermittelt den aktuellen Zyklus jeder aktiven Aufgabe (Tag/Woche/Monat/Jahr)
- Erstellt fehlende Assignments für alle Zielkontakte
- Bei completion-based Tasks: erstellt den nächsten Zyklus nach Abschluss
- Operation ist idempotent (kein --apply nötig)
---
## 2. Assignments synchronisieren
Gleicht bestehende Assignments mit den aktuellen Zielgruppen-Regeln ab. Nützlich wenn sich Abteilungszugehörigkeiten oder Rollen ändern.
```bash
# Alle aktiven Aufgaben (Anwenden)
php cli/task_cert_sync_assignments.php --apply
# Dry-Run (nur Vorschau)
php cli/task_cert_sync_assignments.php --dry-run
# Einzelne Aufgabe
php cli/task_cert_sync_assignments.php --apply --task_id=42
```
**Optionen:**
- `--apply` — Mutierender Lauf (Zuweisungen anlegen/entfernen)
- `--dry-run` — Nur Vorschau, keine DB-Änderungen
- `--task_id=<id>` — Optional: nur eine Aufgabe verarbeiten
- `--no-lock` — Locking deaktivieren (nur Debug)
- `--json` — JSON-Ausgabe zusätzlich auf stdout
- `--help` — Hilfe anzeigen
**Empfohlenes Intervall:** täglich nachts (z.B. 02:00)
**Was passiert:**
- Vergleicht Soll-Zielgruppe (Regeln + Overrides) mit Ist-Zuweisungen
- Erstellt fehlende Assignments, entfernt veraltete
- Schützt abgeschlossene Assignments und solche mit Zertifikaten vor Löschung
---
## 3. Eskalationen berechnen
Prüft alle offenen Assignments auf Überfälligkeit und berechnet Eskalationsstufen.
```bash
# Alle Aufgaben (Anwenden)
php cli/task_cert_recalculate_escalations.php --apply
# Dry-Run
php cli/task_cert_recalculate_escalations.php --dry-run
# Einzelne Aufgabe
php cli/task_cert_recalculate_escalations.php --apply --task_id=42
```
**Optionen:**
- `--apply` — Mutierender Lauf (Status/Eskalationslevel schreiben)
- `--dry-run` — Nur Vorschau, keine DB-Änderungen
- `--task_id=<id>` — Optional: nur eine Aufgabe verarbeiten
- `--no-lock` — Locking deaktivieren (nur Debug)
- `--json` — JSON-Ausgabe zusätzlich auf stdout
- `--help` — Hilfe anzeigen
**Empfohlenes Intervall:** alle 30 Minuten
**Was passiert:**
- Prüft `due_at` aller offenen/laufenden Assignments
- Setzt `status = 'overdue'` wenn Deadline überschritten
- Berechnet `escalation_level` anhand der Erinnerungsrichtlinie:
- `first_escalation_days`: Tage nach Fälligkeit bis erste Eskalation
- `step_days`: Tage zwischen Eskalationsstufen
- `max_level`: Maximale Eskalationsstufe
- Protokolliert Eskalations-Events in `task_escalation_event`
- Setzt Eskalation zurück wenn Aufgabe nicht mehr überfällig ist
---
## Crontab-Einrichtung
```crontab
# Assignments materialisieren — alle 15 Minuten
*/15 * * * * cd /var/www/intranet/html/module/tasks && /usr/bin/php cli/task_cert_materialize_assignments.php >> /var/www/intranet/html/module/tasks/logs/task_cert_cron.log 2>&1
# Eskalationen berechnen — alle 30 Minuten
*/30 * * * * cd /var/www/intranet/html/module/tasks && /usr/bin/php cli/task_cert_recalculate_escalations.php --apply >> /var/www/intranet/html/module/tasks/logs/task_cert_cron.log 2>&1
# Assignments synchronisieren — täglich um 02:00
0 2 * * * cd /var/www/intranet/html/module/tasks && /usr/bin/php cli/task_cert_sync_assignments.php --apply >> /var/www/intranet/html/module/tasks/logs/task_cert_cron.log 2>&1
```
> **Hinweis:** Den Pfad `/var/www/intranet/html/module/tasks` ggf. an die tatsächliche Installation anpassen. PHP-Binary-Pfad mit `which php` prüfen.
---
## Reihenfolge
Wenn alle Jobs gleichzeitig laufen sollen, ist die empfohlene Reihenfolge:
1. `task_cert_materialize_assignments.php` — erst Assignments anlegen
2. `task_cert_sync_assignments.php --apply` — dann synchronisieren
3. `task_cert_recalculate_escalations.php --apply` — dann Eskalationen berechnen
Bei getrennten Intervallen (wie oben) ist die Reihenfolge unkritisch.
---
## Exit-Codes
| Code | Bedeutung |
|------|-----------|
| 0 | Erfolg |
| 1 | Fehler (Exception) |
| 2 | Ungültige CLI-Parameter |
| 3 | Lock aktiv, Job übersprungen |
---
## Logging
### CLI-Ausgabe (stdout/stderr)
Jeder Lauf schreibt eine Zeile auf stdout bzw. stderr:
- `[OK] sync_assignments (apply) abgeschlossen in 312ms.`
- `[SKIP] sync_assignments: Lock aktiv, Job wird übersprungen.`
- `[ERROR] sync_assignments (apply): DB-Verbindung fehlgeschlagen`
Bei `--json` wird stattdessen ein JSON-Objekt auf stdout ausgegeben.
### Strukturiertes Log
Alle Läufe (Erfolg, Fehler, Skip) werden in `logs/task_cert_cron.log` als JSON-Lines geschrieben — unabhängig von der Crontab-Umleitung.
### Locking
Lockfiles liegen in `logs/locks/`:
- `task_cert_materialize_assignments.lock`
- `task_cert_sync_assignments.lock`
- `task_cert_recalculate_escalations.lock`
---
## Monitoring (Heartbeat)
Jeder erfolgreiche Apply-Lauf schreibt einen Timestamp nach `logs/heartbeat/{job}.json`.
**Status prüfen:**
```bash
cat logs/heartbeat/materialize_assignments.json
cat logs/heartbeat/recalculate_escalations.json
cat logs/heartbeat/sync_assignments.json
```
**Admin-Ansicht:** Die Admin-Aufgabenliste zeigt automatisch den letzten erfolgreichen Lauf jedes Jobs am unteren Rand an. Wenn ein Job noch nie gelaufen ist, wird dies rot markiert.
**Hinweis:** Heartbeat-Dateien werden nur bei **erfolgreichem** Lauf geschrieben. Fehler sind am Ausbleiben des Timestamps erkennbar.
---
## Legacy-Endpoints
Die alten Endpoint-Skripte (`endpoints/admin/`) bleiben als HTTP-Endpoints für die Admin-UI erhalten, sollten aber **nicht mehr per Cron aufgerufen** werden:
- `endpoints/admin/materialize_assignments.php`
- `endpoints/admin/sync_assignments.php`
- `endpoints/admin/recalculate_escalations.php`
Diese haben kein Locking und keine strukturierte CLI-Ausgabe.