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>
30 lines
534 B
Plaintext
30 lines
534 B
Plaintext
fastapi>=0.110.0
|
|
uvicorn[standard]>=0.27.0
|
|
sqlalchemy[asyncio]>=2.0.0
|
|
asyncpg>=0.29.0
|
|
alembic>=1.13.0
|
|
pydantic[email]>=2.6.0
|
|
pydantic-settings>=2.2.0
|
|
python-jose[cryptography]>=3.3.0
|
|
bcrypt>=4.0.0
|
|
openpyxl>=3.1.0
|
|
ldap3>=2.9.0
|
|
cryptography>=42.0.0
|
|
python-multipart>=0.0.9
|
|
slowapi>=0.1.9
|
|
limits>=3.6.0
|
|
redis>=5.0.0
|
|
resend>=0.7.0
|
|
python-dateutil>=2.9.0
|
|
pyotp>=2.9.0
|
|
httpx>=0.27.0
|
|
icalendar>=5.0.0
|
|
pytest>=8.0.0
|
|
pytest-asyncio>=0.23.0
|
|
pytest-httpx>=0.30.0
|
|
aiosqlite>=0.20.0
|
|
weasyprint>=61.0
|
|
typer>=0.12.0
|
|
rich>=13.7.0
|
|
apscheduler>=3.10.0
|