fix: Dieselbe Zahlung ueber zwei Bankzugaenge kam doppelt herein
Wer dieselbe Bank zweimal verbindet, bekommt fuer dieselbe Zahlung zwei verschiedene Kennungen – Enable Banking fuehrt eine Bank je Land getrennt. Genau das passiert bei Revolut: Ueber den DE-Eintrag kommen drei Konten, ueber den LT-Eintrag zusaetzlich die Pockets, also verbindet man beide. Zeigen dann zwei Bankkonten auf dasselbe Konto in Certain, holt jeder Zugang dieselben Umsaetze, und der Duplikatschutz kann sie nicht als dieselben erkennen. Drei Aenderungen: - Ein Konto in Certain wird nur noch von EINEM Bankkonto gefuellt. Ordnet man ein zweites zu, wird die alte Zuordnung geloest. Sie ist ohnehin nie richtig, und stillschweigend doppelt zu buchen ist schlimmer als eine geloeste Zuordnung. - Die Ausnahme im Ueberschneidungsschutz gilt nur noch fuer DASSELBE Bankkonto. Dort entscheidet die Kennung der Bank, und die ist exakt – zwei Aufrundungen ueber 1.00 duerfen sich nicht verschlucken. Buchungen aus einem ANDEREN Zugang zaehlen jetzt mit. - Das Aufraeumskript kennt den Fall: Findet es in einer Gruppe (Konto, Art, Tag, Betrag) Buchungen aus zwei Zugaengen, bleibt die Fassung EINES Zugangs stehen. Aufrundungen aus einem einzigen Zugang bleiben unangetastet, auch wenn sie gleich aussehen. An nachgestellten Daten geprueft: Aus -579.50 wird -290.50; die drei gleichen Aufrundungen aus einem Zugang bleiben alle stehen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
"""Bankkonten über PSD2 verbinden und abrufen."""
|
||||
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
@@ -16,6 +18,8 @@ from ..schemas import (
|
||||
from ..services import bank_sync, geheimnis
|
||||
from ..services.bank_api import BankFehler
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
router = APIRouter(prefix="/bank", tags=["bank"])
|
||||
|
||||
|
||||
@@ -222,9 +226,25 @@ def set_link_account(link_id: int, account_id: int, db: Session = Depends(get_db
|
||||
f"{verknuepfung.currency}, das Konto '{konto.name}' führt "
|
||||
f"{konto.currency}."),
|
||||
)
|
||||
# Ein Konto darf nur von EINEM Bankkonto gefuellt werden. Sonst holen zwei
|
||||
# Zugaenge dieselben Umsaetze – mit verschiedenen Kennungen, also ohne dass
|
||||
# der Duplikatschutz greift. Das passiert schnell, wenn dieselbe Bank
|
||||
# zweimal verbunden ist: Enable Banking fuehrt sie je Land getrennt.
|
||||
geloest = (
|
||||
db.query(BankAccountLink)
|
||||
.filter(BankAccountLink.owner_id == user.id,
|
||||
BankAccountLink.account_id == konto.id,
|
||||
BankAccountLink.id != verknuepfung.id)
|
||||
.all()
|
||||
)
|
||||
for andere in geloest:
|
||||
andere.account_id = None
|
||||
verknuepfung.account_id = konto.id
|
||||
db.commit()
|
||||
db.refresh(verknuepfung)
|
||||
if geloest:
|
||||
log.info("Zuordnung von %s auf %s uebernommen, %d andere geloest",
|
||||
verknuepfung.remote_uid, konto.name, len(geloest))
|
||||
return verknuepfung
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user