158 lines
10 KiB
Markdown
158 lines
10 KiB
Markdown
# FixFin
|
||
|
||
Kleine responsive Webapp für **monatliche Fixplanung ohne Buchungsverlauf und ohne Kontostände**.
|
||
|
||
## Datenmodell
|
||
|
||
- Konten: nur Name / Zuordnung
|
||
- fixe Eingänge: Bezeichnung, Betrag pro Monat, Konto
|
||
- fixe Ausgänge: Bezeichnung, Betrag pro Monat, Konto
|
||
- fixe Transfers: Bezeichnung, Betrag pro Monat, Quellkonto, Zielkonto
|
||
- kein Datum
|
||
- keine einmaligen Buchungen
|
||
- keine Datenbank
|
||
- Speicherung ausschließlich in `finance.json`
|
||
|
||
### Berechnung
|
||
|
||
Je Konto:
|
||
|
||
`Eingänge - Ausgänge + Transfers rein - Transfers raus = monatlicher Kontosaldo`
|
||
|
||
Gesamt:
|
||
|
||
`alle Eingänge - alle Ausgänge = monatlicher Gesamtsaldo`
|
||
|
||
Interne Transfers verändern den Gesamtsaldo nicht.
|
||
|
||
## Lokal starten
|
||
|
||
```bash
|
||
chmod +x start-local.sh
|
||
./start-local.sh
|
||
```
|
||
|
||
Die App läuft standardmäßig auf `http://127.0.0.1:3000` und speichert lokal in `.local-data/finance.json`.
|
||
|
||
## Docker-Server
|
||
|
||
Persistente Daten:
|
||
|
||
`/srv/docker/fixfin/data/finance.json`
|
||
|
||
Compose / Anwendung:
|
||
|
||
`/opt/docker-infra/fixfin`
|
||
|
||
Installation:
|
||
|
||
```bash
|
||
sudo chmod +x install.sh
|
||
sudo ./install.sh
|
||
```
|
||
|
||
Danach: `http://DOCKER-SERVER-IP:3080`
|
||
|
||
## Build + Push in Gitea Container Registry
|
||
|
||
Vor dem ersten Push:
|
||
|
||
```bash
|
||
docker login git.example.de
|
||
```
|
||
|
||
Dann:
|
||
|
||
```bash
|
||
./build-and-push-gitea.sh git.example.de owner/fixfin latest
|
||
```
|
||
|
||
Das Image wird als `git.example.de/owner/fixfin:latest` gepusht.
|
||
|
||
Standardplattform ist `linux/amd64`. Abweichend z. B.:
|
||
|
||
```bash
|
||
PLATFORM=linux/arm64 ./build-and-push-gitea.sh git.example.de owner/fixfin latest
|
||
```
|
||
|
||
## Registry-Image deployen
|
||
|
||
```bash
|
||
cd /opt/docker-infra/fixfin
|
||
sudo FIXFIN_IMAGE=git.example.de/owner/fixfin:latest docker compose -f docker-compose.registry.yml up -d
|
||
```
|
||
|
||
## JSON-Migration
|
||
|
||
Alte FixFin-v1-Dateien mit `balance` in Konten werden automatisch auf v2 migriert. Die alten Kontostände werden entfernt; Eingänge, Ausgänge und Transfers bleiben erhalten. Vor dem Umschreiben wird `finance.json.bak` angelegt.
|
||
|
||
## Periodische Fixkosten und Jahresprognose (v1.2)
|
||
|
||
Eingänge, Ausgänge und Transfers unterstützen `monthly`, `quarterly`, `semiannual` und `yearly`.
|
||
Der eingegebene Betrag ist immer der Betrag pro Intervall. Für Salden kann FixFin periodische Werte automatisch auf einen Monatsdurchschnitt umrechnen. Diese Berücksichtigung lässt sich global in der Übersicht ein-/ausschalten.
|
||
|
||
Für nicht-monatliche Positionen kann optional ein Fälligkeitsmonat angegeben werden. Bei vierteljährlichen und halbjährlichen Positionen ist dies der erste Fälligkeitsmonat. Die Jahresansicht verteilt die Position anschließend auf die tatsächlichen Fälligkeitsmonate. Positionen ohne Monat bleiben für die Monatsdurchschnittsrechnung nutzbar, werden in der Jahresprognose aber separat als nicht zugeordnet angezeigt.
|
||
|
||
|
||
## Jahresansicht auf Mobilgeräten
|
||
|
||
Die Jahresprognose verwendet kompakte Monats-Akkordeons. Monat, Eingänge, Ausgänge und Saldo sind immer sichtbar. Fällige Einzelpositionen werden erst beim Aufklappen angezeigt. Die mobile Bottom-Navigation bleibt auf allen Ansichten identisch.
|
||
|
||
## Finanzcockpit und Planung (v3.9)
|
||
|
||
- Navigation: Eingänge, Ausgänge und Transfers sind unter **Bewegungen** zusammengefasst.
|
||
- Übersicht: Kennzahlen, benötigte Zuführung je Konto und Rücklagenübersicht.
|
||
- Statistik: Kategorie-Drilldown bis auf einzelne Fixpositionen. Bei einem gewählten Einzelkonto werden Transfers je nach Richtung den Eingängen oder Ausgängen zugerechnet.
|
||
- Jahr: Belastungsprofil für die zwölf Monate zusätzlich zu den Monats-Akkordeons.
|
||
- Szenarien: Was-wäre-wenn-Anpassungen für zusätzliche Eingänge, Ausgänge und Transfers, ohne den Basisplan zu verändern.
|
||
- Bewegungen können dupliziert und anschließend angepasst werden.
|
||
|
||
Das JSON-Datenmodell verwendet aktuell `version: 11`. Neben Konten und Kategorien gibt es eine zentrale Personenliste (`persons`). Eingänge, Ausgänge, Transfers und Szenario-Anpassungen können über `personIds` einer oder mehreren Personen zugeordnet werden. In personenbezogenen Auswertungen wird der Betrag einer gemeinsam zugeordneten Bewegung gleichmäßig auf die ausgewählten Personen verteilt; in Gesamtansichten wird die Bewegung nur einmal mit ihrem vollen Betrag gerechnet. Bestehende `personId`-Zuordnungen aus Version 9 werden automatisch in ein ein-elementiges `personIds`-Array migriert. Ältere Daten ohne Zuordnung bleiben als „Ohne Person“ erhalten. Vor einer Migration bzw. jedem Speichern wird weiterhin eine `.bak`-Datei angelegt.
|
||
|
||
|
||
### Gemeinsame Kosten relativ zum persönlichen Einkommen (v3.25)
|
||
|
||
In der Statistik gibt es zusätzlich eine einkommensbasierte Vergleichssicht für Gemeinschaftsbereiche. Gemeinsame Einnahmen auf Gemeinschaftskonten werden zuerst zur Deckung gemeinsamer Kosten verwendet und niemals als persönliches Einkommen eines Eigentümers gezählt. Der verbleibende Finanzierungsbedarf wird für diese Vergleichsstatistik proportional zu den echten Einnahmen auf persönlich zugeordneten Konten der Gemeinschaftseigentümer verteilt. Angezeigt werden persönliches Einkommen, Einkommensanteil, Soll-Finanzierung nach Einkommen, Belastungsquote, tatsächliche Gemeinschaftsfinanzierung und deren Abweichung. Diese Vergleichssicht verändert keine Bewegungen, Kosten-Personenzuordnungen oder Kontosalden.
|
||
|
||
### Beitragsanteile zu gemeinsamen Ausgaben (v3.26)
|
||
|
||
Die Gemeinschaftsfinanzierung zeigt je Person zusätzlich Prozentwerte. **Kostenanteil** ist der Anteil der Person an den zugeordneten gemeinsamen Kosten. **Soll-Finanzierung %** zeigt den daraus resultierenden Anteil am verbleibenden Finanzierungsbedarf nach Abzug gemeinsamer Einnahmen. **Ist-Beitrag %** zeigt den Anteil der Person an allen tatsächlichen persönlichen Einzahlungen in diesen Gemeinschaftsbereich. **Anteil am Bedarf** zeigt, wie viel des verbleibenden Finanzierungsbedarfs durch die tatsächliche Einzahlung dieser Person gedeckt wird. In der einkommensbasierten Vergleichssicht werden Soll-% (Einkommensanteil) und Ist-% direkt gegenübergestellt; die Abweichung wird zusätzlich in Prozentpunkten angezeigt.
|
||
|
||
|
||
|
||
### v3.27 – gerichtete Personentransfers und verfügbare Liquidität
|
||
|
||
Transfers zwischen persönlichen Konten unterschiedlicher Eigentümer werden in personenbezogenen Auswertungen aus den Kontoeigentümern als Sender → Empfänger abgeleitet. Der globale Schalter blendet Transferdetails nur noch ein oder aus; Kontoliquidität und verfügbare Beträge bleiben immer inklusive Transfers. In der persönlichen Statistik werden wirtschaftlich verfügbar und liquid verfügbar getrennt ausgewiesen.
|
||
|
||
### v3.28 – kompakte Akkordeons in Planung und Bewegungen
|
||
|
||
**Benötigt pro Konto** zeigt geschlossen nur Konto, Eigentum/Funktion und den resultierenden Fehlbetrag bzw. Überschuss. Die Zusammensetzung aus echten Ein-/Ausgängen und Transfers wird erst beim Aufklappen sichtbar. **Bewegungen** werden ebenfalls als einzelne Akkordeons dargestellt: Bezeichnung, Betrag sowie kompakte Badges bleiben sichtbar; Personen, Fälligkeit, Monatswert, Klassifikation, geplante Betragsänderungen und Bearbeitungsaktionen liegen im Detailbereich.
|
||
|
||
### v3.29 – gebündelte Navigation und Stammdaten
|
||
|
||
Die Hauptnavigation bleibt bei fünf Punkten, die fachlichen Unterseiten sind aber neu gruppiert:
|
||
|
||
- **Planung**: Kontenbedarf, Jahresplanung und Szenarien.
|
||
- **Auswertung**: Statistik und Auszüge.
|
||
- **Mehr → Stammdaten**: Konten, Personen und Kategorien auf einer gemeinsamen Verwaltungsseite mit Tabs.
|
||
- **Mehr → Einstellungen & Daten**: Benachrichtigungen sowie Backup/Import und Datenstand auf getrennten Tabs.
|
||
|
||
Die Kategorienverwaltung wurde vollständig aus der Statistik entfernt. Kategorieauswertungen bleiben dort erhalten. Der bisherige reine Kategorie-Zähler in der Statistik wurde durch einen zur aktuellen Konto-/Personenauswahl passenden Saldo- bzw. Nettoflusswert ersetzt. Die Änderung betrifft nur Navigation und UI-Struktur; das JSON-Datenmodell bleibt bei `version: 11`.
|
||
|
||
### v3.30 – einmalige geplante Positionen
|
||
|
||
Eingänge, Ausgänge und Transfers unterstützen zusätzlich den Intervalltyp **Einmalig**. Dafür wird ein konkretes Datum (`oneTimeDate`) hinterlegt. Die Position wird nur im betreffenden Monat der Jahresplanung, Statistiken und Kontoauszüge berücksichtigt und nicht auf einen Monatsdurchschnitt verteilt. Einmalige Ausgaben können wie andere Ausgaben per Pushover im Zielmonat erinnert werden.
|
||
|
||
### v3.31 – Transferanalyse
|
||
|
||
Unter **Auswertung → Transferanalyse** können ein oder mehrere Quellkonten und ein oder mehrere Zielkonten gleichzeitig ausgewählt werden. Die Analyse zeigt das geplante Transfervolumen des gewählten Jahres je Quellkonto, die prozentuale und absolute Verteilung auf die Zielkonten, die einzelnen zugrunde liegenden Transfers sowie eine Quelle-Ziel-Matrix. Einmalige Transfers werden nur in ihrem Zieljahr berücksichtigt; periodische Transfers ohne konkreten Fälligkeitsmonat werden für den Jahreswert über ihren Monatsdurchschnitt normalisiert.
|
||
|
||
|
||
### v3.32 – nachvollziehbare und geprüfte Statistik
|
||
|
||
Die Statistik ist jetzt jahresbezogen und erklärt ihre Rechenwege direkt in der Oberfläche. **Ø / Monat** bedeutet durchgehend: der im gewählten Kalenderjahr eingeplante Betrag geteilt durch 12. Dadurch werden monatliche, periodische und einmalige Positionen auf einer konsistenten Basis verglichen. Die Statistik ist damit unabhängig vom Dashboard-Schalter, der periodische Kosten nur für den aktuellen Monats-Saldo ein- oder ausblendet.
|
||
|
||
Gesamtkennzahlen und Kennzahlen der aktuellen Konto-/Personenauswahl sind visuell getrennt. Jede zentrale Kennzahl besitzt einen aufklappbaren Rechenweg bzw. eine Zusammensetzung aus Einzelpositionen; zusätzliche Info-Buttons öffnen ausführliche Erläuterungen zu Aussage und Formel. Kategorieauswertungen zeigen neben dem Monatsdurchschnitt auch den Jahresbetrag und lassen sich bis zu den einzelnen Positionen aufklappen. Gemeinschaftsfinanzierung, einkommensbasierte Vergleichssicht und Transferarten besitzen ebenfalls Rechenweg-/Detailakkordeons.
|
||
|
||
Bei der Rechenprüfung wurden zwei semantische Inkonsistenzen korrigiert: Die Gesamtkennzahlen verwenden nun immer alle für das gewählte Jahr geplanten periodischen und einmaligen Positionen, unabhängig von der Dashboard-Einstellung. Außerdem verwendet ein ausgewähltes Einzelkonto bei Personenfiltern für echte Eingänge die Bewegungs-Personenzuordnung, während die Gesamt-Personensicht persönliches Einkommen weiterhin korrekt aus dem Kontoeigentum ableitet. Der Zähler **Ohne Kategorie** zählt nur echte Ein- und Ausgänge und ändert sich nicht mehr durch das Ein-/Ausblenden von Transferdetails. Das JSON-Datenmodell bleibt bei `version: 11`.
|