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>
58 lines
1.8 KiB
YAML
58 lines
1.8 KiB
YAML
services:
|
||
nginx:
|
||
image: nginx:1.27-alpine
|
||
ports:
|
||
# Lokal erreichbar unter http://localhost:8000
|
||
- "8000:80"
|
||
volumes:
|
||
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
|
||
- ./public:/var/www/html/public:ro
|
||
depends_on:
|
||
- php
|
||
restart: unless-stopped
|
||
|
||
php:
|
||
build: .
|
||
volumes:
|
||
- ./public:/var/www/html/public
|
||
- ./src:/var/www/html/src
|
||
- ./migrations:/var/www/html/migrations
|
||
- ./scripts:/var/www/html/scripts
|
||
- ./tests:/var/www/html/tests
|
||
# Persistente Nutzdaten außerhalb des Web-Roots. data/mariadb wird hier
|
||
# bewusst NICHT gemountet – das gehört allein dem db-Container.
|
||
- ./data/logs:/var/www/html/data/logs
|
||
- ./data/import:/var/www/html/data/import
|
||
# Der Schlüssel für die verschlüsselten Felder (FinTS-PIN). Eigenes
|
||
# Verzeichnis, damit er einen Neubau des Images überlebt: Ohne ihn sind
|
||
# gespeicherte Zugangsdaten nicht mehr lesbar.
|
||
- ./data/schluessel:/var/www/html/data/schluessel
|
||
environment:
|
||
TZ: Europe/Berlin
|
||
DB_HOST: db
|
||
DB_NAME: finanzmanager
|
||
DB_USER: finanzmanager
|
||
DB_PASS: ${DB_PASS:-finanzmanager}
|
||
APP_KEY: ${APP_KEY:-}
|
||
DEBUG_LOG: ${DEBUG_LOG:-0}
|
||
depends_on:
|
||
db:
|
||
condition: service_healthy
|
||
restart: unless-stopped
|
||
|
||
db:
|
||
image: mariadb:11
|
||
environment:
|
||
TZ: Europe/Berlin
|
||
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASS:-rootpass}
|
||
MARIADB_DATABASE: finanzmanager
|
||
MARIADB_USER: finanzmanager
|
||
MARIADB_PASSWORD: ${DB_PASS:-finanzmanager}
|
||
volumes:
|
||
- ./data/mariadb:/var/lib/mysql
|
||
healthcheck:
|
||
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||
interval: 5s
|
||
timeout: 5s
|
||
retries: 10
|
||
restart: unless-stopped
|