feat(notifications): täglicher Lauf über SMTP und Apprise

- Kanäle SMTP (HTML-Mail mit Logos als CID-Anhang) und Apprise, beide
  blockierenden Bibliotheken laufen in einem Thread
- Vier Anlässe: Fälligkeiten im Vorlauf, Kündigungsfristen in drei Stufen,
  überschrittene Budgets je Monat, Vertragsverlängerungen im Folgemonat
- APScheduler im Anwendungsprozess, täglich 07:00 Europe/Berlin, räumt zugleich
  abgelaufene Sitzungen auf
- Duplikatsschutz über den Zieltag statt den Versandtag; fehlgeschlagener
  Versand wird beim nächsten Lauf erneut versucht
- Endpunkte für Regeln, Protokoll, Testversand und sofortigen Lauf
- Einstellungsseite mit Einrichtungsstand, Regelpflege und Protokoll
- 25 neue Backend-Tests (260 gesamt), 9 neue Frontend-Tests (74 gesamt)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014e7t8UpmoVNMtWivY5LiSH
This commit is contained in:
moneyfy
2026-09-09 17:04:30 +02:00
co-authored by Claude Opus 5
parent 0adf154049
commit 54c59c9f71
17 changed files with 2500 additions and 1 deletions
+15
View File
@@ -96,6 +96,21 @@ die Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/).
Serienpaar aus (bei Deuteranopie nicht unterscheidbar) und bleibt den
Vorzeichen im Text vorbehalten.
- Benachrichtigungen über SMTP (HTML-Mail mit eingebetteten Firmenlogos) und
Apprise, gesteuert über Regeln je Anlass und Kanal.
- Vier Anlässe: bald fällige Posten, Kündigungsfristen (30, 14 und 7 Tage vor
dem Termin), überschrittene Budgets und anstehende Vertragsverlängerungen.
- APScheduler-Job täglich um 07:00 `Europe/Berlin`, der zugleich abgelaufene
Sitzungen aufräumt; verpasste Läufe werden einmal nachgeholt.
- Duplikatsschutz über `(rule_id, ref_type, ref_id, Zieltag)`. Maßgeblich ist der
Zieltag des Ereignisses, nicht der Versandtag ein zweiter Lauf am selben oder
am nächsten Tag erzeugt keine zweite Nachricht. Ein fehlgeschlagener Versand
wird beim nächsten Lauf erneut versucht.
- `POST /api/notifications/test` verschickt eine Testnachricht über beide Kanäle,
`POST /api/notifications/run` führt einen Lauf sofort aus.
- Benachrichtigungen sind in den Einstellungen pflegbar, samt Einrichtungsstand
der Kanäle und Versandprotokoll.
### Geändert
- `SECRET_KEY` muss mindestens 32 Zeichen lang sein (Vorgabe von HS256); in