Repository navigation
Concept
Duofy plant, es trackt nicht. Wer nur planen will, bekommt einen fertigen Monat und muss keine einzige Buchung erfassen. Wer nachhalten will, kann es — freiwillig, und zwar an derselben Stelle.
Duofy teilt Geld in drei Budgets und gibt dafür eine Richtlinie vor, statt jeden allein mit der Frage zu lassen, wie er sein Geld ordnen soll:
| Budget | Richtwert | Was hineingehört |
|---|---|---|
| Grundbedarf | 50 % | was sein muss — Wohnen, Strom, Lebensmittel, Versicherung |
| Wünsche | 30 % | was schön ist — Essen gehen, Abos, Urlaub, Hobby |
| Sparen | 20 % | was liegen bleibt oder Schulden abbaut |
Dazu kommen die Einnahmen, aus denen alles bezahlt wird.
Vier Dinge daran sind wichtig:
Die Quoten liegen auf dem Verplanbaren. Verplanbar ist die Summe der Einnahmen im Monat — ohne Abzug. Darauf rechnen die Quoten. Frei ist, was davon noch keinem Posten zugeteilt ist; ist nichts mehr frei (oder mehr verplant, als hereinkommt), weist der Plan darauf hin.
Es ist ein Richtwert, keine Regel. Duofy verbietet nichts, schiebt nichts um und verteilt nichts automatisch. Die Quoten sind die Zielmarke in den Darstellungen, an der der Istwert gemessen wird. Man schaut drauf und entscheidet selbst.
Die drei Quoten ergeben immer 100. 60/30/20 wäre eine Zielmarke, die sich selbst widerspricht; Duofy lehnt so etwas ab. Wer in der Großstadt hohe Miete zahlt, stellt 65/20/15 ein — das geht.
Es gibt einen persönlichen Standard und eine Haushaltsquote.
- Den persönlichen Standard (im Nutzermenü unter „Einstellungen“, mit Reglern für die drei Quoten) bekommt jeder neue Monat als Startwert. Er wird beim Anlegen des Monats kopiert: eine spätere Änderung wirkt nur auf Monate, die danach angelegt werden. Ein Monat behält, womit er geplant wurde. Legt jemand mit Berechtigung den Monat für eine andere Person an, gilt der Standard des Monatseigentümers.
- Die Haushaltsquote (auf der Seite „Haushalt“) gehört niemandem allein: jedes Mitglied darf sie ändern, und sie gilt sofort für jeden Monat des Haushaltsplans, auch für vergangene.
Kategorie und Budget sind zwei getrennte Achsen. Sprit ist sachlich immer „Mobilität“ — ob es Grundbedarf oder Wunsch ist, ist eine Entscheidung und keine Ableitung. In Excel steckte beides in einer Spalte, und genau deshalb liefen zwei Blätter auseinander.
%%{init: {
"theme": "base",
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"themeVariables": {
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"fontSize": "15px",
"textColor": "#334155",
"lineColor": "#94a3b8",
"edgeLabelBackground": "#ffffff",
"clusterBkg": "#f6f8fa",
"clusterBorder": "#e2e8f0"
},
"flowchart": { "curve": "basis", "nodeSpacing": 16, "rankSpacing": 90, "padding": 16 }
}}%%
flowchart LR
subgraph dauerhaft["<b>Verpflichtungen</b> · einmal angelegt, gelten weiter"]
direction TB
vertrag("<b>Vertrag</b><br/><small>Miete · Strom · Handy</small>")
einnahme("<b>Einnahme</b><br/><small>Gehalt · Kindergeld</small>")
sparziel("<b>Sparziel</b><br/><small>Urlaub · Rücklage</small>")
schuld("<b>Schuld</b><br/><small>Ratenzahlung</small>")
end
manuell("<b>Manueller Eintrag</b><br/><small>gilt nur diesen Monat</small>")
subgraph plan["<b>Monatsplan</b> · eine Person, ein Monat"]
direction TB
posten("<b>Posten</b><br/><small>Betrag · Tag · Kategorie · Budget</small>")
end
dauerhaft ==>|"<small>was diesen Monat fällig ist</small>"| plan
manuell ==> plan
classDef v fill:#e8f1fa,stroke:#2b6cb0,stroke-width:1.5px,color:#1e293b
classDef b fill:#fbf1dc,stroke:#c68a0e,stroke-width:1.5px,color:#1e293b
classDef s fill:#f6e9f0,stroke:#8e3b6b,stroke-width:1.5px,color:#1e293b
classDef d fill:#e6f2ea,stroke:#4f9e6a,stroke-width:1.5px,color:#1e293b
classDef m fill:#eef2f6,stroke:#94a3b8,stroke-width:1.5px,color:#1e293b
classDef p fill:#ffffff,stroke:#334155,stroke-width:2px,color:#1e293b
class vertrag v
class einnahme b
class sparziel s
class schuld d
class manuell m
class posten p
Ein Vertrag ist der Kern von Duofy: Geld, das regelmäßig fällig wird oder eingeht. Einmal angelegt, gilt er weiter — aus Abstand und erster Fälligkeit ergibt sich, in welchen Monatsplan er kommt und mit welchem Betrag. Eine Abbuchung ist ein Vertrag.
Es gibt vier Typen:
-
Vertrag
Eine Verpflichtung gegenüber jemand anderem. Es gibt einen Vertragspartner, meist eine Vertragsnummer, und jemand schickt eine Rechnung. Ein Vertrag läuft immer auf genau eine Person: auch der Internetvertrag der WG läuft auf den, der ihn unterschrieben hat.
Miete · Strom · Handy · Versicherung · Rundfunkbeitrag
-
Einnahme
Geld, das eingeht: Gehalt, Kindergeld, Zinsen. Niemand schließt einen Vertrag ab, um den eigenen Lohn zu bekommen, deshalb ist es ein eigener Typ. Einnahmen gehören in das Verplanbare, nicht in eines der drei Budgets.
-
Sparziel
Geld, das man beiseitelegt statt es auszugeben. Zählt immer in das Budget Sparen, unabhängig von der Kategorie. Deshalb kann „Urlaub sparen“ im Sparen liegen und „Urlaub buchen“ in den Wünschen, ohne dass man dafür eine Kunstkategorie erfinden muss.
Ein Sparziel kann einen Zielbetrag (und ein Zieldatum) haben. Ist der Zielbetrag erreicht, plant Duofy im nächsten angelegten Monat keine Rate mehr ein; fehlt weniger als eine Rate, wird nur der Rest eingeplant. Gezählt wird, was per Abhaken gebucht wurde — nimmt man das Häkchen wieder heraus, sinkt der gesparte Betrag, und ein später angelegter Monat plant die Rate wieder ein. Entnahmen sieht dieses Modell noch nicht.
Urlaubskasse · Rücklage für die Autoreparatur
-
Schuld
Eine Ratenzahlung oder ein Darlehen. Zählt ebenfalls in Sparen: Schulden abbauen ist Vermögensaufbau von der anderen Seite.
Ratenzahlung · Privatdarlehen
Unabhängig vom Typ gibt es zwei Arten von Posten im Monat:
- Eine Verpflichtung hat ein Häkchen. Sie ist eine Zahlung, die stattfindet und abgehakt wird: die Miete.
- Ein Limit hat kein Häkchen. Es ist ein Betrag, den man für etwas vorsieht und über den Monat verteilt ausgibt: 500 € für Lebensmittel. Die Höhe steht am Anfang fest, das Geld geht in vielen einzelnen Einkäufen weg, das Ist kommt nur aus Buchungen. Wer trackt, hängt jede Ausgabe an denselben Posten — sie summieren sich: 500 € vorgesehen, 310 € ausgegeben, 190 € noch übrig.
Alle Typen sind dasselbe Muster — Betrag plus Abstand plus Fälligkeit. Deshalb sind sie eine Liste und nicht vier:
| Feld | Bedeutung |
|---|---|
| Betrag | was fällig wird |
| Abstand | alle wie viele Monate der Vertrag fällig ist, 1 bis 120 |
| erste Fälligkeit | Pflicht; ihr Monat ist der erste, ihr Tag ist der Zahltag |
| Laufzeitende | der letzte Monat, in dem der Vertrag fällig ist; leer heißt unbefristet |
| Kategorie | worum es sachlich geht (Wohnen, Mobilität, Gesundheit …) |
| Budget | Grundbedarf, Wünsche oder Sparen — eine Entscheidung, keine Ableitung |
Abstand plus erste Fälligkeit reichen für jeden Fall. Der Rundfunkbeitrag ist alle drei Monate ab Februar, also Februar, Mai, August, November. Die Kfz-Steuer kommt alle zwölf Monate ab September, also nur im September. Ein Vertrag, der endet, bekommt ein Laufzeitende; er wird nicht „ausgeschaltet“.
Ein Vertrag lässt sich nur löschen, solange er in keinem Plan steht. Danach bleibt das Laufzeitende.
Nicht alles wiederholt sich. Das Waffeleisen, die Autoreparatur, das Pfandgeld vom Getränkemarkt. Solche Sachen bekommen keine Verpflichtung, sondern gehen direkt als Posten in den Monat: keinen Abstand, keine Fälligkeit in der Zukunft, nächsten Monat sind sie weg.
Das ist der Unterschied zu einem Vertrag. Ein Vertrag wiederholt sich, ein manueller Eintrag passiert einmal.
Ein Plan gehört einer Person und einem Monat, und zwar genau einmal. Es gibt keinen Plan, der zwei Leuten gehört.
- Der Planungsmonat ist nicht der Kalendermonat. Das Gehalt kommt Ende Juli, gehört aber zum August. Deshalb hat jeder Posten getrennt einen Fälligkeitstag und einen Monat, zu dem er zählt.
- Ein Monat wird angelegt, nicht kopiert. Beim Anlegen entstehen die Posten aus allen Verträgen, die in diesem Monat fällig sind. Sie sind eine Kopie: eine spätere Änderung am Vertrag ändert alte Monate nicht.
- Verplanbar = Einnahmen, darauf die Quoten aus Abschnitt 1.
- Ein Plan gehört immer einer Person. Wie mehrere davon zu einem gemeinsamen Haushaltsplan zusammenkommen, steht im nächsten Abschnitt.
%%{init: {
"theme": "base",
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"themeVariables": {
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"fontSize": "15px",
"textColor": "#334155",
"lineColor": "#94a3b8",
"edgeLabelBackground": "#ffffff",
"clusterBkg": "#f6f8fa",
"clusterBorder": "#e2e8f0"
},
"flowchart": { "curve": "basis", "nodeSpacing": 16, "rankSpacing": 90, "padding": 16 }
}}%%
flowchart LR
subgraph a["<b>Mias Plan</b> · August"]
t1("<b>Miete</b> <small>850,00 €</small><br/><small>gemeinsam</small>")
t2("<b>Handy</b> <small>29,99 €</small><br/><small>privat</small>")
end
subgraph b["<b>Jans Plan</b> · August"]
j1("<b>Lebensmittel</b> <small>500,00 €</small><br/><small>gemeinsam</small>")
j2("<b>Friseur</b> <small>45,00 €</small><br/><small>privat</small>")
end
hh("<b>Haushalt</b> · August<br/><small>alle gemeinsamen Posten, mit Vorname dahinter</small>")
t1 ==> hh
j1 ==> hh
classDef gem fill:#e8f1fa,stroke:#2b6cb0,stroke-width:1.5px,color:#1e293b
classDef priv fill:#eef2f6,stroke:#94a3b8,stroke-width:1.5px,color:#64748b
classDef p fill:#ffffff,stroke:#334155,stroke-width:2px,color:#1e293b
class t1 gem
class j1 gem
class t2 priv
class j2 priv
class hh p
Jeder Posten hat ein Feld: gehört er zu einem Haushalt oder nicht.
- Gesetzt — er erscheint im gemeinsamen Plan, bei allen Mitgliedern.
- Nicht gesetzt — er bleibt im eigenen Plan, niemand sonst sieht ihn.
Der gemeinsame Plan ist deshalb keine eigene Tabelle, sondern die Zusammenstellung aller Posten aller Mitglieder, bei denen ein Haushalt gesetzt ist. Der Posten existiert einmal — nichts wird kopiert, nichts kann auseinanderlaufen. Genau das war der Fehler zweier getrennter Excel-Blätter.
Daraus folgt zweierlei: es gibt im gemeinsamen Plan nichts anzulegen, weil es kein Objekt gibt, das man anlegen könnte. Und geändert wird immer im Plan der Person, zu der der Posten gehört.
Mehrere Haushalte sind normal — WG und Partnerin gleichzeitig, oder nach einem Auszug beides für eine Weile.
In der Seitenleiste unter Haushalt hängen die gemeinsamen Pläne als Untereinträge, dazu die Personen, die Einblick gegeben haben.
Bewusst kein Umschalter: ein Menüpunkt ist ein Ort, den man ansteuert und verlinken kann. Ein Umschalter würde unsichtbar ändern, was alle Seiten zeigen. Die Auswahl steht in der Adresse, ein Link auf den Haushaltsplan bleibt also teilbar.
Jede Person gibt ihre eigenen Daten frei — niemand stellt Rechte für andere ein. Es gibt keine Rolle, die für alle entscheidet, und niemand kann sich selbst Einblick in das Buch eines anderen verschaffen. Die Freigabe gilt pro Bereich, denn den Monat zu teilen ist ein kleiner Schritt, die Verträge dahinter zu übergeben ein viel größerer:
| Bereich | Stufen (jede schließt die davor ein) |
|---|---|
| Planung | Nur gemeinsame Posten (Voreinstellung) · Ganzer Monat sichtbar · Darf ändern und anlegen · Darf auch löschen |
| Verträge | Nichts (Voreinstellung) · Verträge sichtbar · Darf ändern und anlegen · Darf auch löschen |
| Konten | Nichts (Voreinstellung) · Buch und Konten sichtbar · Darf ändern und anlegen · Darf auch löschen |
Die Freigaben stehen auf der Seite Haushalt, eine Zeile pro Mitglied und Bereich. Wo eine Aktion fehlt, weil eine Freigabe fehlt, sagt Duofy, wessen Freigabe es ist, statt die Aktion still auszublenden. Gehört eine Person mehreren gemeinsamen Haushalten an, gilt die höchste Stufe.
Das Paar-Preset. Wer eine Einladung annimmt oder einen Haushalt für sich anlegt, bekommt einmal den Vorschlag „Paar: Die anderen dürfen alles von mir sehen und bearbeiten“. Er setzt nur die eigenen Freigaben dieser Person, in einem Schritt. Ablehnen behält die Voreinstellung; danach lässt sich jeder Bereich einzeln ändern.
Erst ab „Ganzer Monat sichtbar“ erscheint die Person in der Seitenleiste.
Mit der dritten Stufe arbeitet man direkt im Plan der anderen Person: Posten ändern, abhaken, Buchungen anlegen. Eine Buchung gehört dabei immer dem Kontoinhaber, nicht dem, der sie eingetragen hat — sonst stimmten die Kontostände nicht mehr.
Änderungen stehen im Protokoll: wer, wann, welches Feld, von welchem auf welchen Wert. Keine Sperre, sondern Nachvollziehbarkeit. Wer auch löschen darf, löscht endgültig; Löschungen stehen nicht im Protokoll.
%%{init: {
"theme": "base",
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"themeVariables": {
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"fontSize": "15px",
"textColor": "#334155",
"lineColor": "#94a3b8",
"edgeLabelBackground": "#ffffff",
"clusterBkg": "#f6f8fa",
"clusterBorder": "#e2e8f0"
},
"flowchart": { "curve": "basis", "nodeSpacing": 16, "rankSpacing": 90, "padding": 16 }
}}%%
flowchart LR
posten("<b>Posten des Monats</b><br/><small>Fälligkeitstag · Betrag</small>")
tage("<b>Tag 1 bis 31</b><br/><small>Einnahmen +, Ausgaben −</small>")
kurve("<b>Verlauf</b><br/><small>beginnt bei null oder beim Monatsübertrag</small>")
tief("<b>Tiefpunkt</b><br/><small>so viel muss am 1. schon da sein</small>")
posten ==> tage ==> kurve ==> tief
classDef v fill:#e8f1fa,stroke:#2b6cb0,stroke-width:1.5px,color:#1e293b
classDef m fill:#eef2f6,stroke:#94a3b8,stroke-width:1.5px,color:#1e293b
classDef p fill:#ffffff,stroke:#334155,stroke-width:2px,color:#1e293b
classDef warn fill:#fae7e7,stroke:#b3261e,stroke-width:1.5px,color:#1e293b
class posten v
class tage m
class kurve p
class tief warn
Wozu das gut ist: Lücken erkennen. Die Miete ist am 1. fällig, das Gehalt kommt am 28. In der Summe geht der Monat auf. Im Verlauf nicht — dazwischen liegen 27 Tage, in denen das Geld schon weg ist, aber noch nicht wieder da. Genau diese Stelle sieht man sonst erst, wenn die Lastschrift platzt.
Der Verlauf zeigt das Standardkonto. Die Bestandteile:
- Jeder Posten mit seinem Fälligkeitstag. Einnahmen zählen nach oben, Ausgaben nach unten. Posten auf einem anderen Konto fallen heraus, Posten ohne Konto zählen als Standardkonto; eine Umbuchung weg vom Standardkonto senkt die Kurve, eine darauf hebt sie.
- Plan, bis gebucht ist. Wo noch nichts gebucht ist, zeichnet der Plan die Kurve. Ein abgehakter Posten wird durch seine Buchung ersetzt, mit echtem Datum und echtem Betrag — auch wenn das Datum im Abhaken-Dialog frei gesetzt wurde. Über den Monat nähert sich die Kurve dem, was wirklich passiert ist.
- Limits: Plan oder Buchungen. Ein Schalter neben dem Diagramm entscheidet pro Person, ob Limits mit dem vollen Planbetrag am Fälligkeitstag zählen (die Voreinstellung) oder nur mit dem, was gebucht ist. Duofy schätzt nie, wie sich der Rest eines Limits über die Tage verteilt.
- Alle Tage des Monats, 1 bis 31 — auch die ohne Bewegung. Sonst läge die Achse nicht auf dem Kalender und man könnte nicht ablesen, wann es eng wird.
- Die Kurve beginnt bei null, wenn es keinen Monatsübertrag gibt (siehe Abschnitt 5). Dann zeigt sie die Veränderung seit Monatsanfang, keinen Kontostand, und ihr Tiefpunkt ist genau der Betrag, der am 1. schon vorhanden sein muss — ohne dass irgendjemand einen Saldo pflegen muss. Mit Übertrag startet sie bei dessen Betrag.
- Stufen statt weicher Kurve. Geld bewegt sich in Sprüngen; eine geschwungene Linie würde Zwischenwerte behaupten, die es nicht gibt.
- Die Fläche unter null ist als Engpass eingefärbt. Der Engpass kommt als Hinweis (Abschnitt 6) mit Konto, Tag und Betrag.
Der Haushaltsplan hat eine Kurve für alle Haushaltsposten zusammen. Sie beantwortet „geht es bei uns zusammen auf“, nicht „wo fehlt Geld“ — dafür gibt es die eigenen Pläne der Mitglieder, soweit sie freigegeben sind.
Das ersetzt die Excel-Rechnung „einmal mit Kindergeld, einmal ohne“: statt zwei Varianten durchzurechnen sieht man an einer Kurve, wo der Monat kippt.
%%{init: {
"theme": "base",
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"themeVariables": {
"fontFamily": "ui-sans-serif, system-ui, -apple-system, Segoe UI, Helvetica, Arial, sans-serif",
"fontSize": "15px",
"textColor": "#334155",
"lineColor": "#94a3b8",
"edgeLabelBackground": "#ffffff",
"clusterBkg": "#f6f8fa",
"clusterBorder": "#e2e8f0"
},
"flowchart": { "curve": "basis", "nodeSpacing": 16, "rankSpacing": 90, "padding": 16 }
}}%%
flowchart LR
subgraph ist["<b>Buch</b> · das Ist, freiwillig"]
konto("<b>Konto</b><br/><small>Stand · zählt als verfügbar?</small>")
buchung("<b>Buchung</b><br/><small>Datum · Betrag</small>")
ziel("<b>anderes Konto</b><br/><small>Umbuchung</small>")
konto ==>|"<small>liegt auf</small>"| buchung
buchung -.->|"<small>Zielkonto gesetzt</small>"| ziel
end
posten("<b>Posten im Plan</b><br/><small>das Soll: Betrag · Tag</small>")
buchung -.->|"<small>Posten gesetzt · füllt das Ist</small>"| posten
classDef b fill:#fbf1dc,stroke:#c68a0e,stroke-width:1.5px,color:#1e293b
classDef d fill:#e6f2ea,stroke:#4f9e6a,stroke-width:1.5px,color:#1e293b
classDef p fill:#ffffff,stroke:#334155,stroke-width:2px,color:#1e293b
class posten p
class konto d
class ziel d
class buchung b
Das Buch ist optional. Das Konzept ist Planen und Budgetieren — wer nur plant, benutzt Duofy vollständig. Man kann aber auch tracken, und dann fällt die Auswertung als Nebenprodukt an: die Kategorie hängt schon am geplanten Posten, es muss nichts im Nachhinein einsortiert werden.
Jedes Konto gehört einer Person, nie dem Haushalt. Es hat einen Anfangsbestand mit Stichtag; alles danach ergibt sich aus den Buchungen.
Dazu ein Häkchen: zählt als verfügbar. Ein Depot oder eine Rücklage soll nicht mitzählen, wenn Duofy sagt, wie viel man noch ausgeben kann. Ohne dieses Häkchen wäre „verfügbar" die Summe aller Konten und damit unbrauchbar.
Daraus ergeben sich zwei verschiedene Zahlen:
| Zahl | Was sie beantwortet |
|---|---|
| Verfügbar | was auf den Konten liegt, die als verfügbar zählen |
| Frei nach Abzug | dasselbe, minus die Posten, die diesen Monat noch offen sind |
Datum und Betrag, dazu zwei optionale Felder — zwei unabhängige Fragen:
- Posten gesetzt? Dann füllt die Buchung das Ist dieses Posten. Das ist die einzige Stelle, an der Plan und Buch sich berühren. Ohne Posten ist die Buchung trotzdem gültig: der Kiosk, den niemand geplant hat, steht im Buch.
- Zielkonto gesetzt? Dann ist es eine Umbuchung — Geld wandert zwischen eigenen Konten und ist nicht ausgegeben. Es verlässt ein Konto und landet auf einem anderen.
Beide Felder sind unabhängig, und das ist wichtig: Geld aufs Sparkonto legen erfüllt die Sparquote (Posten gesetzt) und verschiebt nur zwischen den eigenen Konten (Zielkonto gesetzt). Ein Bezahldienst aufladen ist ebenfalls eine Umbuchung, erfüllt aber nichts.
Eine Regel, kein „beides":
- Mit Posten zählt der Monat des Plans, in dem der Posten steht. Eine im Juli abgebuchte Augustmiete gehört zum August.
- Ohne Posten zählt das Datum der Buchung.
Manches Geld gehört nicht dem, auf dessen Konto es eingeht. Pflegegeld, Kindergeld, Kinderzuschlag — das kommt bei einer Person an und wird weitergereicht.
Ein Posten kann deshalb als durchlaufend markiert werden. Er bleibt sichtbar und buchbar, wird aber aus Budget und Quoten herausgerechnet. Sonst würde weitergereichtes Geld erst als Einnahme das Budget aufblähen und dann als Ausgabe eine Quote füllen — die Zahlen sähen gut aus, ohne dass jemand etwas davon gehabt hätte.
Ein Monatsübertrag hält fest, mit welchem Stand ein Konto in den Monat geht. Er ist eine besondere Buchungsart, optional, und wird im Verlauf-Tab gesetzt, geändert oder entfernt. Gibt es einen, startet der Verlauf dort statt bei null. Er kann negativ sein — ein überzogenes Konto geht im Minus in den Monat.
Er bewegt keinen Kontostand: der Stand ergibt sich weiter aus Anfangsbestand plus Buchungen, der Übertrag stellt einen Stand fest, er fügt keinen hinzu. Er zählt in keiner Quote, keiner Einnahme, keiner Ausgabe und nicht in „Anstehend“; im Buch steht er markiert, aber außerhalb aller Summen. Es gibt höchstens einen pro Konto und Monat, und er liegt immer auf dem ersten Tag des Monats.
Duofy schlägt beim Setzen den Buchstand zum Ende des Vormonats vor. Wer nicht trackt, sieht dann einen Vorschlag, der von der Bank abweicht, und trägt den Stand vom Kontoauszug ein. Automatisch setzt Duofy nie einen Übertrag.
Das Abhaken eines Postens erzeugt die Buchung, die die Zahlung belegt — auf das Konto des Postens, sonst auf das Standardkonto des Planeigentümers. Duofy lehnt das Abhaken ab, statt still nichts zu buchen, wenn kein Konto da ist oder Quelle und Ziel dasselbe Konto wären, und sagt im Dialog, was zu tun ist. Hat ein Posten schon Buchungen (ein Limit, auf das eingekauft wurde), bucht der Haken nichts mehr: er heißt dann „Monat erledigt“, und Datum und Betrag im Dialog sind gesperrt.
Manche Dinge sollte der Plan von selbst sagen. Duofy zeigt sie als Hinweise an dem Posten, den sie betreffen, im eigenen Plan wie im Haushaltsplan. Die Regel dahinter: Das Backend entscheidet, die Oberfläche zeigt nur an. Jeder Hinweis wird beim Lesen des Plans berechnet und nie gespeichert; er verschwindet, sobald der Grund weg ist.
Heute gibt es zwei:
- Überfällig. Eine Verpflichtung ist ab dem Tag nach ihrer Fälligkeit überfällig, wenn sie nicht abgehakt ist. Ohne Karenzfrist, und nie für Limits — sie haben kein Häkchen. Ein Posten zum 31. wird in einem 30-Tage-Monat gegen den 30. verglichen. Künftige Monate erzeugen keinen Hinweis, vergangene schon.
- Engpass im Verlauf. „Du brauchst am 1. mindestens X“, mit Konto, Tag des Tiefpunkts und Betrag.
Hinweise lassen sich nicht wegklicken. Was man wegklicken kann, übersieht man irgendwann.
Kleines löscht Duofy sofort und bietet zehn Sekunden lang Rückgängig an, in einer Meldung am unteren Rand — immer nur eine gleichzeitig. Das ist besser als „Bist du sicher?“, weil man Rückfragen wegklickt. Folgenreiches fragt einmal.
Listen haben kein Menü ⋯: ein Klick auf den Namen öffnet den Dialog, und dort
steht „Löschen“. Ein Vertrag ist nur löschbar, solange er in keinem Plan steht,
ein Konto bis zur ersten Buchung; danach gibt es das Laufzeitende beziehungsweise
„Aktiv“ aus. Die Regeln für die Oberfläche stehen im UI-Leitfaden im Repository
(docs/ui/README.md).