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>
6.7 KiB
Cronjobs — Task-Modul
Das Task-Modul benötigt drei Cronjobs, die regelmäßig laufen müssen:
- Assignments materialisieren — erstellt neue Aufgaben-Zuweisungen für aktive Zyklen
- Assignments synchronisieren — gleicht Zuweisungen mit aktuellen Zielgruppen-Regeln ab
- 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}.jsonfü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).
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.
# 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.
# 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_ataller offenen/laufenden Assignments - Setzt
status = 'overdue'wenn Deadline überschritten - Berechnet
escalation_levelanhand der Erinnerungsrichtlinie:first_escalation_days: Tage nach Fälligkeit bis erste Eskalationstep_days: Tage zwischen Eskalationsstufenmax_level: Maximale Eskalationsstufe
- Protokolliert Eskalations-Events in
task_escalation_event - Setzt Eskalation zurück wenn Aufgabe nicht mehr überfällig ist
Crontab-Einrichtung
# 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/tasksggf. an die tatsächliche Installation anpassen. PHP-Binary-Pfad mitwhich phpprüfen.
Reihenfolge
Wenn alle Jobs gleichzeitig laufen sollen, ist die empfohlene Reihenfolge:
task_cert_materialize_assignments.php— erst Assignments anlegentask_cert_sync_assignments.php --apply— dann synchronisierentask_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.locktask_cert_sync_assignments.locktask_cert_recalculate_escalations.lock
Monitoring (Heartbeat)
Jeder erfolgreiche Apply-Lauf schreibt einen Timestamp nach logs/heartbeat/{job}.json.
Status prüfen:
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.phpendpoints/admin/sync_assignments.phpendpoints/admin/recalculate_escalations.php
Diese haben kein Locking und keine strukturierte CLI-Ausgabe.