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>
35 lines
1.4 KiB
Bash
Executable file
35 lines
1.4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
||
set -euo pipefail
|
||
|
||
# Datenverzeichnisse existieren auch dann, wenn sie per Bind-Mount frisch
|
||
# hereinkommen – und gehören www-data, sonst scheitert das erste Schreiben.
|
||
mkdir -p /var/www/html/data/logs /var/www/html/data/import /var/www/html/data/schluessel
|
||
chown -R www-data:www-data /var/www/html/data
|
||
|
||
# Schlüssel für die verschlüsselten Felder (FinTS-PIN). Steht APP_KEY nicht in
|
||
# der Umgebung, wird einmalig einer erzeugt und unter data/ abgelegt – sonst
|
||
# ließe sich keine Bankverbindung speichern, und ein bei jedem Start neu
|
||
# gewürfelter Schlüssel machte die gespeicherten Zugangsdaten unlesbar.
|
||
#
|
||
# Wer den Schlüssel lieber selbst verwaltet, setzt APP_KEY in der .env; diese
|
||
# Datei wird dann nicht angelegt.
|
||
SCHLUESSELDATEI=/var/www/html/data/schluessel/app_key
|
||
if [ -z "${APP_KEY:-}" ]; then
|
||
if [ ! -s "$SCHLUESSELDATEI" ]; then
|
||
openssl rand -hex 32 > "$SCHLUESSELDATEI"
|
||
echo "APP_KEY erzeugt: data/schluessel/app_key (unbedingt mitsichern – ohne ihn"
|
||
echo "sind gespeicherte Zugangsdaten verloren)."
|
||
fi
|
||
chown www-data:www-data "$SCHLUESSELDATEI"
|
||
chmod 600 "$SCHLUESSELDATEI"
|
||
fi
|
||
|
||
# Migrationen laufen bei jedem Start. Sie sind idempotent, ein zweiter Lauf
|
||
# ändert nichts.
|
||
if [ -f /var/www/html/scripts/migrate.php ]; then
|
||
php /var/www/html/scripts/migrate.php || {
|
||
echo "Migration fehlgeschlagen – Container startet trotzdem, damit man nachsehen kann." >&2
|
||
}
|
||
fi
|
||
|
||
exec "$@"
|