nemiah / phpFinTS

PHP library to communicate with FinTS/HBCI servers
MIT License
131 stars 40 forks source link

UID Wert #359

Closed timrasche closed 2 years ago

timrasche commented 2 years ago

Moin zusammen!

Gibt es einen speziellen Wert von der Bank der eine Transaktion eindeutig identifiziert? Wir haben festgestellt das unterschiedliche Logins auch unterschiedliche Referenzen produzieren. Da wir diese als Überprüfung nehmen ob die Transaktion bereits importiert wurde, ist das ein Problem.

Danke!

mmnasir commented 2 years ago

Hallo, schaumal hier:

https://github.com/nemiah/phpFinTS/issues/86

ich habe auch genauso gemacht.

timrasche commented 2 years ago

Danke dafür, allerdings hab ich das schon gelesen und es ist ja keine Lösung. Vor allem weil das Buchungsdatum im Format MIT Uhrzeit keine zurück gibt. Und das es mehrere Buchungen mit gleichen Datum gibt ist ja logisch. Da sich der Verwendungszweck Text aber je nach Login verändert, bringt mir auch ein Hash Vergleich nichts...

ampaze commented 2 years ago

Ich hatte bei #86 einiges dazu geschrieben. Entscheidend ist die Reihenfolge am Buchungstag, da ist auch die Uhrzeit egal. Es gibt keine sonstige eindeutige ID, Hash bilden bringt auch nichts weil zwei Buchungen bis auf die Reihenfolge identisch sein können.

Falls es dich beruhigt, das läuft seit Jahren für Zehntausende Buchungen einwandfrei.

timrasche commented 2 years ago

Danke für das Statement. Das habe ich gelesen ja, war für mich als Lösung nur nicht zufriedenstellend. Wir reden hier halt über u.a. geschäftskritische Anwendungen. Die Frage stellte ich auch nur, weil wie bereits geschrieben wir hier eine Komplikation festgestellt haben die sich auf unterschiedliche Logins zurück führen ließ.

Hätte ja sein können ich übersehe etwas im Bezug auf eine ID/UID.

ampaze commented 2 years ago

@timrasche Ich finde es auch nicht zufriedenstellend aber man muss bei (deutschen) Banken immer schon froh sein, dass es überhaupt irgendwie funktioniert. Wenn sich je nach Login auch die Reihenfolge der Buchungen unterscheiden sollte, dann solltet ihr aber eine neue Bank suchen 😉

timrasche commented 2 years ago

@timrasche Ich finde es auch nicht zufriedenstellend aber man muss bei (deutschen) Banken immer schon froh sein, dass es überhaupt irgendwie funktioniert. Wenn sich je nach Login auch die Reihenfolge der Buchungen unterscheiden sollte, dann solltet ihr aber eine neue Bank suchen 😉

haha ja definitiv, ich habe das mal eingebaut nach deinem Prinzip, mal schauen wie es läuft. Zur Reihenfolge, ich hoffe mal stark nicht, hat sich bislang nur auf den SVWZ bezogen.

Masegi commented 4 months ago

Gibt es zum Thema Unique ID inzwischen eine Best Pratise? habe ein paar issues durchgeschaut aber nichts gefunden.

Konkret kommen bei mir gerade Buchungen rein, die erst wohl eine Art vorläufiges Buchungsdatum haben, das dann wohl nochmal aktualisiert wurde. Dadurch erscheinen die Buchungen dann doppelt in unserem crm - ich prüfe quasi so:

foreach ($statement->getTransactions() as $transaction)

Amount (als float) (konkret (float)(($transaction->getCreditDebit() == \Fhp\Model\StatementOfAccount\Transaction::CD_DEBIT ? '-' : '') . $transaction->getAmount()))

Bank (eine interne guid)

Text ($transaction->getBookingText())

Name ($transaction->getName())

Description ($transaction->getMainDescription())

Datum Gebucht ($transaction->getDate()->format('Y-m-d H:i:s');)

wobei nichts davon alleine einzigartig ist (dooferweiße kann die Beschreibung sowas wie "Überweisungsgutschr." sein.

P.s. falls das klappt inzw? Wie komme ich an diese fortlaufende Nummer und bleibt die dann bei solchen nachträglichen Datumsänderungen unberührt? Gibt es da inzwischen Erfahrungswerte?

Beides war übrigens "Sparkasse Krefeld" ... (immer diese Sparkassen ...)

Außerdem etwas merkwürdig, beide Stichproben wurden am 09.05 um 23 Uhr das erste mal eingelesen und dann um 1 Uhr am 10.05, also im übernächsten Durchlauf wieder eingelesen, also beide genau um Mitternacht rum.

ampaze commented 4 months ago

Das klingt als wären das dann vorgemerkte Buchungen? Du könntest schauen ob es sich lohnt (und die Sparkasse es unterstützt), die Buchungen als XML abzufragen, ggf. ist dann dort vermerkt ob es sich um vorgemerkte Buchungen oder nicht handelt. War das erste Buchungsdatum zufällig ein Feiertag?

Masegi commented 4 months ago

Komischerweiße sind beide Buchungen als Gebucht eingegangen, allerdings aktualisiere ich das nachträglich, wenn alles "normal läuft".

Ja der 09.05 war wohl christi himmelfahrt.

ampaze commented 4 months ago

Okay, der 9.5 ist tatsächlich einer dieser Bankfeiertage. Imho sollte ein Umsatz nie dieses Buchungsdatum haben, darum hat die Sparkasse wohl korrigiert...

Masegi commented 4 months ago

kann man da was machen außer an feiertagen den abruf zu pausieren? und betrifft das auch wochenenden dann?

bzw mir fällt gerade ein, manchmal kommen am wochenende buchungen rein, mit buchungsdatum der montag drauf :D

Und betrifft das nur diese nationalen Bankfeiertage oder auch regionale Feiertage am Standort der Bank?

Masegi commented 4 months ago

Noch eine Idee dazu, ist das Anmerkungen Eingabefeld dass mir z.B. meine Bank zu jeder Transaktion anzeigt ein Standard? Sodass man das per fints füllen und wieder auslesen könnte? Dann wäre das noch eine Option bereits eingelesene Transaktionen zu kennzeichnen.

timrasche commented 4 months ago

Tacho!

https://github.com/nemiah/phpFinTS/issues/86

das wurde bereits weiter oben gepostet und so habe ich es im Endeffekt auch gelöst, funktioniert tadellos.

ampaze commented 4 months ago

kann man da was machen außer an feiertagen den abruf zu pausieren? und betrifft das auch wochenenden dann?

Wie man damit 100% sicher umgeht, weiß ich auch nicht. Wir rufen an Feiertagen oder am Wochenende nicht ab und haben womöglich Glück mit den Banken.

Eigentlich müsste man immer auch die Umsätze, die ein paar Tage in die Vergangenheit liegen mit abrufen und stetig mit den bereits Verbuchten abgleichen.

bzw mir fällt gerade ein, manchmal kommen am wochenende buchungen rein, mit buchungsdatum der montag drauf :D

Genau. Die Bank sollte eigentlich auch vorher wissen, wann Bankfeiertag ist und das Buchungsdatum gleich initial richtig setzen...

Und betrifft das nur diese nationalen Bankfeiertage oder auch regionale Feiertage am Standort der Bank?

Das sollte nur die SEPA/EU Bankfeiertage betreffen.


Ob man die Umsätze per FinTS auch um Metadaten erweitern kann ist eine Interessante Frage, hab ich aber noch nie recherchiert.

Masegi commented 4 months ago

Tacho!

86

das wurde bereits weiter oben gepostet und so habe ich es im Endeffekt auch gelöst, funktioniert tadellos.

Ich finde nur den Ansatz alle Einträge an einem Tag durchzuzählen, aber der Korrektureintrag in meinem Beispiel hatte doch "auf einmal" ein anderes Datum. Das führt dann nicht zu einem Treffer, ergo wird der Eintrag zweimal eingetragen oder übersehe ich da was?

timrasche commented 4 months ago

Tacho!

86

das wurde bereits weiter oben gepostet und so habe ich es im Endeffekt auch gelöst, funktioniert tadellos.

Ich finde nur den Ansatz alle Einträge an einem Tag durchzuzählen, aber der Korrektureintrag in meinem Beispiel hatte doch "auf einmal" ein anderes Datum. Das führt dann nicht zu einem Treffer, ergo wird der Eintrag zweimal eingetragen oder übersehe ich da was?

Also meines wissens nach (und das kann ich bis dato auch so bestätigen - auch mit Sparkassen) verändert die Bank keine Buchungen. Allerdings würde nach dem beschriebenen Prinzip in Kombination mit einer Auto-Update funktion (falls es den Eintrag mit dem Counter und dem Datum (ACHTUNG! Valuta-Datum (ValutaDate) ist nicht das Emfpangsdatum (BookingDate)) bereits gibt = update, ansonsten = insert) die daten ja eh aktuell bleiben, selbst wenn die bank etwas ändert.

Masegi commented 4 months ago

Ok dann nehme ich jetzt mal getValutaDate(), denn getDate() hat sich definitiv geändert.

timrasche commented 4 months ago

getBookingDate ist meine Basis. Das ValutaDate ist das Datum der Wertstellung.

Masegi commented 4 months ago

Also wenn ich das richtig sehe, nutzt getDate einfach nur das getBookingDate:

https://github.com/nemiah/phpFinTS/blob/182f8c0d741eceda1b32263b982fa74cb699b027/lib/Fhp/Model/StatementOfAccount/Transaction.php#L106

 public function getDate(): ?\DateTime
    {
        return $this->getBookingDate();
    }

    /**
     * Get booking date
     */
    public function getBookingDate(): ?\DateTime
    {
        return $this->bookingDate;
    }

und das getDate kam ja einmal so und dann auf einmal mit einem anderen Datum zurück.

timrasche commented 4 months ago

Dazu müsste man sich dann mal den Log-Auszug aus diesen Transaktionen anschauen. Normalerweise sollte so etwas nicht möglich sein.

Masegi commented 4 months ago

Hier mal so ein doppelter Datensatz auf das wesentliche reduziert: image

wobei Name, etc auch doppelt ist und nur wegen dsgvo und so hier ausgeblendet.

Ein "richtiges" Protokoll liegt mir nicht vor. Man sieht hier aber wohl, dass das DatumBooked (also getDate, also getBookingDate), einmal um 23 uhr und dann um 1 uhr am Folgetag war, der Rest der Transaktion ist exakt gleich geblieben weswegen die halt dann doppelt eingelesen wurde.

P.s. Falls automatisch ein Log erzeugt wird (nicht, dass ich wüsste), wäre das wohl inzw weg da fints php im kubernetes in den pods liegt.

timrasche commented 4 months ago

Weird. Gibt es diese 2 Buchungen denn auch im Online-Banking oder nur eine?

Masegi commented 4 months ago

Ne im Onlinebanking nur die neuste. Bei allen Beispielen - sonst wäre es ja nicht wirklich "mein Problem" ;)

timrasche commented 4 months ago

Und evtl. mal überprüfen ob die Zeitzonen richtig gesetzt werden und nicht UTC etc. vermischt wird. Aufällig dabei ist das es genau 2 Stunden sind was oft bei deutschen Zeitzonen dann zu fehlerhaften Counter werten führt.

Masegi commented 4 months ago

Die Zeitzone ist europe/berlin, aber auf allen pods, immer und dauerhaft, das ist auch passiert als keine patches stattgefunden haben o.ä.

hier ein anderes beispiel, ebenfalls um die Mitternacht an dem Tag rum image

timrasche commented 4 months ago

PHP-Zeitzone oder "nur" die auf dem Server allgemein? Ersteres ist nämlich wichtig.

Masegi commented 4 months ago

alle, php, server + mysql instanzen

das läuft auch schon ein Jahr stabil eigentlich. und in meiner alten App seit 2017 oder so. Aber in dem crm sind mehr Buchungen pro Tag. Und alle problematischen Buchungen waren an Christi Himmelfahrt diesen Jahres.

timrasche commented 4 months ago

alle, php, server + mysql instanzen

Komisch. Evtl. mal bei der Bank nachfragen ob die was verkakkt haben, ebenfalls schon erlebt.

peukerjonathan commented 4 months ago

Kommentar aus dem "off" dazu: Ich habe das beschriebene Szenario - dass sich das BookingDate derselben Überweisung im Nachhinein ändert - tatsächlich auch schon ein paar mal beobachtet. Und zwar immer nur bei Sparkassen. Ich arbeite auch mit einer Art Hashing Taktik um Dopplungen in meiner Datenbank bei mehrfach Abruf des Kontos zu vermeiden - und habe das Problem aufgrund der Änderung des BookingDates dann genau so gehabt.

Da ich aber nicht nur mit php-fints arbeite, sondern zB auch mit HBCI4PHP und das Problem dort ebenfalls aufgetreten ist, würde ich sagen dass kann auf Seiten des PHP Codes gar nicht "gefixt" werden. Das Problem liegt hier imho bei den Banken, die in sehr seltenen Fällen die Datensätze verändern.

Masegi commented 4 months ago

Ja das war bisher auch auch meine Warnehmung und den Sparkassen traue ich sowas zu :D

wenn man ein Kommentar zur Transaktion speichern könnte wäre eine gute Lösung, also grad ein json mit der id in das Kommentarfeld der Transaktion und das dann beim Abruf gegenprüfen.

Aber das steht und fällt mit der Theorie dass das ein Standard Feld ist und ggf per fints ansteuerbar!?

image