feat: Gleich aussehende Buchungen lassen sich behalten, statt loeschen zu muessen

Die Liste sagt ausdruecklich, dass sie nichts entscheidet: Drei
Aufrundungen ueber 1.00 am selben Tag sind echt, drei gleiche Einkaeufe
koennen es auch sein – das weiss nur der Nutzer. Dann darf sie aber auch
nicht zu einer Entscheidung draengen, und genau das tat sie: Der einzige
Knopf war der Papierkorb. Wer die Meldung loswerden wollte, musste eine
richtige Buchung wegwerfen.

Jetzt steht neben jeder Gruppe "Alle behalten". An den Buchungen aendert
sich dabei nichts; es ist ein Haken an der Frage.

Der Haken gilt dem, was man gesehen hat – nicht allem, was noch kommt:
Eine Gruppe faellt erst weg, wenn ALLE ihre Zeilen ihn tragen. Kommt
spaeter eine dritte gleich aussehende Buchung dazu, steht die Frage
wieder da, und zwar fuer alle drei. Ein Test haelt das fest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-15 10:33:44 +02:00
co-authored by Claude Opus 5
parent 6fc2a924d2
commit b867b272ba
8 changed files with 156 additions and 0 deletions
+26
View File
@@ -225,6 +225,12 @@ def duplicates(db: Session = Depends(get_db), user: User = Depends(get_current_u
continue
if rund(schluessel[3]) and len({texte[t.id] for t in zeilen}) > 1:
continue
# Schon entschieden. Nicht die einzelne Zeile ausblenden, sondern die
# Gruppe erst, wenn ALLE ihren Haken tragen: Kommt spaeter eine dritte
# gleich aussehende dazu, ist die Frage wieder offen – und zwar fuer
# alle drei.
if all(t.duplicate_ok for t in zeilen):
continue
verdaechtig[schluessel] = zeilen
if not verdaechtig:
return {"gruppen": []}
@@ -266,6 +272,26 @@ def duplicates(db: Session = Depends(get_db), user: User = Depends(get_current_u
][:100]}
class BehaltenIn(BaseModel):
ids: list[int]
@router.post("/dubletten/behalten", status_code=status.HTTP_204_NO_CONTENT)
def dubletten_behalten(
payload: BehaltenIn, db: Session = Depends(get_db),
user: User = Depends(get_current_user),
) -> None:
"""Beide behalten – die Frage ist beantwortet.
An den Buchungen aendert sich nichts. Ohne diesen Weg blieb nur Loeschen,
um die Meldung loszuwerden: Die Liste draengte zu einer Entscheidung, die
sie selbst ausdruecklich nicht treffen will.
"""
for txn_id in payload.ids:
get_owned(db, Transaction, txn_id, user).duplicate_ok = True
db.commit()
@router.post("", response_model=TransactionOut, status_code=status.HTTP_201_CREATED)
def create_transaction(
payload: TransactionCreate, db: Session = Depends(get_db), user: User = Depends(get_current_user)