feat: agent-11 PR3 – Scheduler + Erinnerungs-Mails + Notification-Prefs
Geplante Erinnerungen (Feature-Parität mit Urlaubsverwaltung): - APScheduler (AsyncIOScheduler) in der FastAPI-Lifespan; tägliche Jobs ab settings.reminder_hour. Redis-Tageslock gegen Doppelversand bei mehreren Prozessen; jeder Job mit eigener Session + RLS-Bypass. - Drei Jobs (auch einzeln aufrufbar): offene Anträge an Genehmiger, Resturlaub-Verfall-Vorwarnung an Mitarbeiter, fehlende AU an HR. - Pro-User notification_prefs (JSONB, opt-out); GET/PATCH /users/me/notification-prefs + ProfilePage-UI; Vertreter-Mail respektiert die Prefs. - Manueller Trigger POST /companies/me/run-reminders (Admin) – gleiche Logik, firmen-scoped (testbar ohne Warten). - Bugfix: GET-/PATCH-Urlaubskonto (update_balance) nutzte nicht existente Felder (base_days/carried_over_days/ip_address) → korrigiert auf entitled_days/carried_over/ip + company_id; available_days ergänzt. Migration 0037 (users.notification_prefs). 188/188 Tests grün. Deployed 137 + 164. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -41,8 +41,17 @@ async def lifespan(app: FastAPI):
|
||||
"In Production sollte ALLOWED_HOSTS in .env konfiguriert sein "
|
||||
"um Host-Header-Injection zu verhindern."
|
||||
)
|
||||
|
||||
# Erinnerungs-Scheduler (agent-11 PR3) – nicht im Test-Kontext starten
|
||||
import sys
|
||||
if settings.scheduler_enabled and "pytest" not in sys.modules:
|
||||
from app.services.scheduler_service import start as start_scheduler
|
||||
start_scheduler()
|
||||
|
||||
yield
|
||||
# Shutdown
|
||||
from app.services.scheduler_service import shutdown as shutdown_scheduler
|
||||
shutdown_scheduler()
|
||||
await engine.dispose()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user