feat: Import-Rollback fuer bestaetigte Auszuege (v0.3.0)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 16:40:56 +02:00
parent d71c22adce
commit e7855a7bda
6 changed files with 94 additions and 4 deletions

View File

@@ -150,6 +150,25 @@ def confirm(statement_id: int, session: Session = Depends(get_session)):
return StatementOut.model_validate(stmt)
@router.post("/{statement_id}/rollback")
def rollback(statement_id: int, session: Session = Depends(get_session)):
stmt = session.get(Statement, statement_id)
if stmt is None:
raise HTTPException(404, "Import nicht gefunden")
if stmt.status != "confirmed":
raise HTTPException(409, "Nur bestätigte Importe können zurückgerollt werden")
txs = session.execute(
select(Transaction).where(Transaction.statement_id == statement_id)
).scalars().all()
deleted = len(txs)
for tx in txs:
session.delete(tx)
session.flush()
session.delete(stmt)
session.commit()
return {"deleted_transactions": deleted, "statement_id": statement_id}
@router.delete("/{statement_id}", status_code=204)
def delete_import(statement_id: int, session: Session = Depends(get_session)):
stmt = session.get(Statement, statement_id)

View File

@@ -41,6 +41,11 @@
</form>
{% elif s.status == "confirmed" %}
<span class="muted">Bestätigt — Buchungen übernommen</span>
<form class="inline-form" hx-post="/api/imports/{{ s.id }}/rollback" hx-swap="none"
hx-confirm="Diesen Import und ALLE zugehörigen Buchungen unwiderruflich löschen? Salden und Projektionen ändern sich."
hx-on::after-request="if(event.detail.successful){htmx.trigger(document.getElementById('imports'), 'refresh')}">
<button type="submit">Import zurückrollen</button>
</form>
{% else %}
<form class="inline-form" hx-delete="/api/imports/{{ s.id }}" hx-swap="none"
hx-confirm="Import „{{ s.filename }}“ wirklich verwerfen?"

View File

@@ -21,7 +21,10 @@
<code>~/.local/share/finance_pod/data/inbox/</code> legen und "Inbox
scannen"). Jeder Import wird geprüft (Anfangssaldo + Buchungen = Endsaldo)
und landet als Entwurf: erst nach Kontrolle der Vorschau "Übernehmen"
klicken. Duplikate werden erkannt und nicht doppelt übernommen.
klicken. Duplikate werden erkannt und nicht doppelt übernommen. Bestätigte
Importe lassen sich als Ganzes zurückrollen (Auszug + alle seine
Buchungen), z. B. um einen Auszug mit einem verbesserten Parser neu zu
importieren; einzelne Buchungen bleiben unlöschbar.
</li>
<li>
<strong>Kategorien &amp; Regeln:</strong> Buchungen lassen sich kategorisieren;