Damit ist der geplante Funktionsumfang beisammen. Phase 4 abgeschlossen - Konfigurierbare Cockpit-Kacheln; abgewählte werden nicht berechnet - Einnahmen/Ausgaben je Monat als Balkenpaare mit Saldolinie, aufgesetzt auf den Summenbericht statt auf eine eigene Abfrage - Meine Ausgaben als Ring auf der obersten Kategorieebene - Offene Vorgänge aus allen Modulen Phase 5 – Online-Banking - nemiah/php-fints als Fork auf Codeberg, psr/log direkt eingebaut: die Anwendung hängt an keinem fremden Update-Zyklus - PIN AES-256-GCM-verschlüsselt; Schlüssel aus APP_KEY oder aus data/schluessel/app_key, den der Entrypoint einmalig erzeugt - TAN-Dialog über mehrere Requests (FinTs::persist plus serialisierte Aktion in der Sitzung) – ein wartender Prozess wäre mit php-fpm der falsche Weg - Abgleich statt Direktbuchung: verbinden, übernehmen oder verwerfen - Regeln mit vier Vergleichsarten, Betragsgrenzen und Split-Schema Phase 6 – Wertpapiere - Depotbuchung und Geldbuchung als zwei Seiten eines Geschäfts; betrag ist der Bruttowert, Nebenkosten stehen daneben - Einstand nach gleitendem Durchschnitt, realisierte Gewinne, Erträge - Kursabruf über Leeway oder FMP, täglicher Lauf per Cron - QIF-Import für !Type:Invst Dabei behoben: Der Import buchte den Geldfluss jedes Wertpapiergeschäfts als Abgang – auch bei Verkäufen und Dividenden; und er erkannte das Verrechnungskonto nicht, wenn dem Konto im L-Feld eine Kategorie vorangeht (bei Verkäufen also immer). Phase 7 – Nebenmodule und Zahlungsverkehr - Buchungsvorlagen inklusive QIF-Import, Splits werden mitskaliert - Regelmäßige Buchungen mit Fälligkeitslauf, Finanzkalender, Erinnerungen - Adressen mit IBAN-Prüfung, Verträge mit Kündigungsfrist, Sparziele - Kredite mit gerechnetem Tilgungsplan - Überweisungen über FinTS; die Buchung entsteht erst nach Annahme durch die Bank. Die pain.001-Nachricht erzeugt SepaXml selbst Nebenbei: .dockerignore ergänzt (ohne sie brach der Build an data/mariadb ab), PlatzhalterController entfernt, zwei Inline-Handler beseitigt, die die Content-Security-Policy ohnehin blockierte. 888 PHP-Prüfungen und 45 E2E-Tests grün. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
113 lines
5 KiB
Markdown
113 lines
5 KiB
Markdown
# Finanzmanager
|
||
|
||
Persönliche Finanzverwaltung als Web-Anwendung: Konten, Buchungen mit Kategorien und
|
||
Klassen, Jahresbudget, Monatsabschluss, Auswertungen, Online-Banking über FinTS und
|
||
Wertpapierdepots.
|
||
|
||
Ersetzt den Lexware FinanzManager Deluxe, läuft auf einem Debian-Server statt auf einem
|
||
Windows-Client. Die fachlichen Begriffe bleiben bewusst identisch zum Original – im
|
||
Haushalt wird beides parallel genutzt.
|
||
|
||
## Stand
|
||
|
||
**Alle sieben Phasen aus `PLAN.md` sind umgesetzt.**
|
||
|
||
* **Stammdaten und Buchungen** – Konten, Kontengruppen, Kategorien, Klassen; Kontoblatt,
|
||
Buchungsmaske mit Splitbuchungen und Umbuchungen; QIF-Import mit Stichtag.
|
||
* **Planung** – Budgetplaner mit Monatswerten je Kategorie, Monatsabschluss mit Prüflauf,
|
||
Snapshot und Sperre.
|
||
* **Auswertungen** – Summen-, Buchungs-, Vergleichs-, Kontostands- und Budgetbericht mit
|
||
Zeitraumvorgaben, Spalten-Aufteilung, Drilldown und CSV-Export; gespeicherte Berichte in
|
||
Gruppen.
|
||
* **Cockpit** – konfigurierbare Kacheln: Vermögensentwicklung, Einnahmen/Ausgaben je
|
||
Monat, Ausgaben nach Kategorie, Kontostände, offene Vorgänge.
|
||
* **Online-Banking** – FinTS-Abruf mit TAN-Dialog über mehrere Requests, Abgleich der
|
||
Umsätze gegen vorhandene Buchungen, Regeln für die automatische Kategorisierung.
|
||
* **Wertpapiere** – Depotbestände mit Einstand und Bewertung, Depotbuchungen, Kursabruf,
|
||
Veräußerungsgeschäfte und Erträge.
|
||
* **Nebenmodule** – Buchungsvorlagen, regelmäßige Buchungen mit Fälligkeitslauf und
|
||
Finanzkalender, Erinnerungen, Adressen, Verträge, Sparziele, Kredite mit Tilgungsplan.
|
||
* **Zahlungsverkehr** – Überweisungen und Terminüberweisungen über FinTS.
|
||
|
||
Einzelheiten je Modul in `docs/`, die Entwicklung in `Changes.md`.
|
||
|
||
## Technik
|
||
|
||
| | |
|
||
|---|---|
|
||
| Sprache | PHP 8.3, kein Framework, eigenes MVC |
|
||
| Datenbank | MariaDB 11 |
|
||
| Webserver | nginx + php-fpm |
|
||
| Betrieb | Docker Compose (drei Services) |
|
||
| Frontend | serverseitiges HTML, Vanilla JS, CSS Custom Properties |
|
||
| Fremdbibliotheken | genau eine: `nemiah/php-fints` als eigener Fork auf Codeberg |
|
||
|
||
Diagramme werden als eigenes SVG erzeugt, PDF-Berichte gehen über die Druckfunktion des
|
||
Browsers, die SEPA-Nachricht für Überweisungen entsteht selbst – bewusst keine Chart-,
|
||
PDF- oder SEPA-Bibliothek. Der FinTS-Fork trägt `psr/log` direkt in sich; damit hängt die
|
||
Anwendung an keinem fremden Update-Zyklus.
|
||
|
||
## Start
|
||
|
||
```bash
|
||
cp .env.example .env # Werte anpassen (APP_KEY darf leer bleiben)
|
||
docker compose up -d
|
||
```
|
||
|
||
Ist `APP_KEY` leer, erzeugt der Container beim ersten Start einen Schlüssel unter
|
||
`data/schluessel/app_key`. Er verschlüsselt die Zugangsdaten der Bankverbindungen und
|
||
**gehört ins Backup** – ohne ihn sind sie nicht mehr lesbar.
|
||
|
||
Danach http://localhost:8000 aufrufen. Beim ersten Aufruf führt die Anwendung zur
|
||
Ersteinrichtung und legt den ersten Benutzer an.
|
||
|
||
```bash
|
||
./scripts/run-tests.sh # Tests
|
||
./scripts/backup.sh # Backup mit Rotation
|
||
./scripts/update.sh # Update (auf dem Produktionsserver)
|
||
```
|
||
|
||
## Verzeichnisse
|
||
|
||
```
|
||
src/ Anwendungscode (Controllers, Models, Services, Views)
|
||
public/ Front-Controller und statische Dateien
|
||
migrations/ nummerierte SQL-Migrationen, laufen beim Containerstart
|
||
scripts/ Migration, Update, Backup, Tests, Kursabruf
|
||
tests/ PHP-Testsuite; tests/e2e/ für Playwright
|
||
data/ Nutzdaten: mariadb, logs, import, schluessel (nicht im Repository)
|
||
Altdaten/ Screenshots und QIF-Export der Altanwendung (nicht im Repository)
|
||
```
|
||
|
||
## Migration der Altdaten
|
||
|
||
Datenquelle ist der **QIF-Export** aus dem FinanzManager – die `.QDF`-Datei ist
|
||
verschlüsselt und nicht auswertbar. Der Importer liest Klassen, Kategorien, Konten,
|
||
Buchungen samt Splits sowie Wertpapierbuchungen. Einzelheiten zum Format und den
|
||
Fallstricken stehen in `PLAN.md`, Kapitel 4.
|
||
|
||
Klassen, Kategorien, Konten und Buchungen lassen sich übernehmen – im Dialog unter
|
||
*Verwaltung → QIF-Import* oder auf der Kommandozeile. Buchungen ab dem Stichtag kommen
|
||
einzeln in die Datenbank, alles davor wird je Konto zum Anfangssaldo verrechnet:
|
||
|
||
```bash
|
||
docker compose exec -u www-data php php scripts/qif-import.php data/import/Export.QIF
|
||
docker compose exec -u www-data php php scripts/qif-import.php --uebernehmen data/import/Export.QIF
|
||
```
|
||
|
||
Ohne `--uebernehmen` läuft nur der Trockenlauf.
|
||
|
||
## Dokumentation
|
||
|
||
- `PLAN.md` – Projektplan mit allen Phasen
|
||
- `CLAUDE.md` – Entwicklungsregeln
|
||
- `Changes.md` – Änderungsprotokoll
|
||
- `docs/stammdaten.md` – Konten, Kontengruppen, Kategorien, Klassen
|
||
- `docs/buchungen.md` – Kontoblatt, Umbuchungen, Splitbuchungen, Salden
|
||
- `docs/planung.md` – Budgetplaner und Monatsabschluss
|
||
- `docs/auswertungen.md` – Berichtsmodul, Filterleiste, Drilldown, CSV
|
||
- `docs/cockpit.md` – Startseite und ihre Kacheln
|
||
- `docs/banking.md` – FinTS-Abruf, TAN-Dialog, Abgleich und Regeln
|
||
- `docs/wertpapiere.md` – Depots, Einstand, Kurse und der Invst-Import
|
||
- `docs/nebenmodule.md` – Vorlagen, Termine, Verträge, Sparziele, Kredite, Zahlungsverkehr
|
||
- `docs/qif-import.md` – Aufbau des QIF-Exports und Arbeitsweise des Importeurs
|