Files
moneyfy/CHANGELOG.md
T
moneyfyandClaude Opus 5 8edb69fe6a feat(logos): Provider-Kette, lokaler Cache und Markenfarben
- simple-icons als kompakter Index im Repository (3.459 Marken, 2 MB gzip),
  erzeugt von scripts/vendor_simple_icons.py bzw. `make vendor-icons`
- logo.dev und Brandfetch als optionale Adapter, ohne Schlüssel übersprungen
- Favicon-Fallback und generierter Buchstaben-Avatar als Garantie
- Bei eindeutigem Offline-Treffer unterbleiben Anfragen nach außen komplett
- Cache im Dateisystem nach SHA-256, Auslieferung nur über /api/logos/{id}
  mit immutable-Header und ETag
- Markenfarbe aus SVG-Fills bzw. per k-Means (k=4) über 64x64 Pixel, dazu eine
  aufgehellte Variante mit mindestens 4,5:1 Kontrast auf dunklem Grund
- Kandidatensuche mit Vorauswahl, Auswahl, Upload und Zurücksetzen
- Bildtyp wird nur noch am Inhalt bestimmt, nicht an der gemeldeten Kopfzeile
- 60 neue Tests, insgesamt 208 grün

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014e7t8UpmoVNMtWivY5LiSH
2026-09-09 13:54:21 +02:00

75 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
Alle nennenswerten Änderungen an diesem Projekt werden hier dokumentiert.
Das Format orientiert sich an [Keep a Changelog](https://keepachangelog.com/de/1.1.0/),
die Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/).
## [Unreleased]
### Hinzugefügt
- Projektgerüst mit getrennten Bereichen für Backend, Frontend, Dokumentation und CI.
- FastAPI-Backend mit Konfiguration über `pydantic-settings` und einheitlichem
Fehlerformat (`{"detail": ..., "code": ...}`).
- Vollständiges Datenmodell als SQLAlchemy-2.0-Modelle: Konten, Kategorien, Firmen,
Logo-Assets, Recurrences, Preishistorie, Occurrences, Buchungen, Budgets samt
Vorlagen, Sparziele, Rücklagen, Benachrichtigungsregeln und -protokoll, Benutzer.
- Alembic-Setup gegen die Async-Engine samt Erstmigration des kompletten Schemas;
der Downgrade entfernt auch die nativen Enum-Typen, sodass Auf- und Abwärtsmigration
beliebig oft wiederholbar sind.
- Idempotenter Seed für den deutschen Standard-Kategoriebaum (35 Kategorien) und
die Standard-Benachrichtigungsregeln.
- Endpunkte `GET /api/health` und `GET /api/version`.
- Testinfrastruktur mit pytest, httpx und transaktionsisolierten Fixtures.
- `.env.example`, `docker-compose.override.yml.example` und Makefile für die
lokale Entwicklung.
- Recurrence-Engine (`app/services/recurrence.py`) mit vollständiger
RFC-5545-Expansion: `expand` liefert nominale und tatsächliche Zahltage,
`expand_by_due_date` filtert nach dem Zahltag für Kalender und Monatsberichte.
- Wochenend- und Feiertagsverschiebung über den NRW-Kalender; das nominale Datum
bleibt stabiler Schlüssel zur Zuordnung materialisierter Fälligkeiten.
- Auflösung der Preishistorie je Fälligkeitsdatum, Overlays aus `occurrence`,
Kappung der Serie durch `until`, Kündigung und Ratenzahl.
- `installments_remaining` (Restraten und Restschuld), `contract_term` und
`notice_deadline` (Mindestlaufzeit, automatische Verlängerung, Kündigungsfrist)
sowie `annual_burden` und `monthly_reserve` für die Rücklagenbildung.
- `validate_rrule` und `next_dates` als Grundlage für Eingabeprüfung und Vorschau.
- Authentifizierung mit Argon2id, JWT in httpOnly-Cookies (Access 30 min, Refresh
14 Tage) und echter Token-Rotation über die Tabelle `refresh_token`; ein erneut
eingelöstes Refresh-Token beendet alle Sitzungen.
- `AuthProvider`-Protokoll mit lokalem Provider als Vorbereitung für OIDC.
- Anlage des Administrators beim Erststart mit erzwungenem Passwortwechsel; bis
dahin sind alle Fachrouten gesperrt.
- CRUD für Konten, Kategorien, Firmen, wiederkehrende Posten, Preisversionen,
Buchungen, Budgets, Budgetvorlagen und Sparziele.
- Fälligkeiten-API mit Overlay-Logik: abrufen, bestätigen (auch mit abweichendem
Betrag oder Datum), auslassen und zurücksetzen.
- Kontosalden zum Stichtag aus Eröffnungssaldo, Buchungen und bestätigten
Fälligkeiten, inklusive abweichender Konten je Fälligkeit.
- Monatsübersicht mit Plan-Ist-Vergleich, Aufteilung in fixe und variable Kosten,
Rücklagen und Vergleich zum Vormonat.
- Vollständig annotiertes OpenAPI-Dokument unter `/api/docs`.
- Logo-Service mit fünfstufiger Provider-Kette: lokal gevendorte simple-icons
(3.459 Marken, rund 2 MB), logo.dev und Brandfetch bei gesetztem Schlüssel,
Favicon-Fallback und generierter Buchstaben-Avatar als Garantie.
- Logo-Cache im Dateisystem, benannt nach dem SHA-256 des Inhalts; Auslieferung
ausschließlich über `GET /api/logos/{id}` mit `immutable`-Cache-Header und
ETag-Unterstützung.
- Ermittlung der Markenfarbe: bei SVG aus den `fill`-Attributen, bei
Rastergrafiken per k-Means über 64×64 Pixel; dazu eine im HSL-Raum aufgehellte
Variante, die gegen den dunklen Hintergrund mindestens 4,5:1 Kontrast erreicht.
- Auswahldialog-Endpunkte: Kandidatensuche mit Vorauswahl, Übernahme eines
Kandidaten, Upload (SVG/PNG/JPEG bis 1 MB) und Zurücksetzen.
- Die Logosuche läuft nach dem Anlegen einer Firma im Hintergrund; der Aufruf
antwortet sofort.
- `make vendor-icons` erzeugt den simple-icons-Index neu.
### Geändert
- `SECRET_KEY` muss mindestens 32 Zeichen lang sein (Vorgabe von HS256); in
Produktion wird der Platzhalterwert beim Start abgelehnt.
- Der Bildtyp eines Uploads wird ausschließlich am Inhalt bestimmt; die vom
Aufrufer gemeldete Kopfzeile wird nicht mehr als Nachweis akzeptiert.