Rechnungsstatus nach Abgleich mit Bankingdaten ändern
Hallo zusammen,
wahrscheinlich stehe ich einfach nur sehr stark auf dem Schlauch, aber ich hoffe, dass ihr mir helfen könnt: Wir laden in unsere Datenbank in eine Tabelle "Bankingdaten" regelmäßig alle Überweisungen hoch, die passiert sind. Das machen wir über einen CSV Bankauszug. Eigentlich war das nur für Eingangsrechnungen wichtig, jetzt wollen wir aber gern auch die bezahlten Ausgangsrechnungen dort abbilden.
Da kam mir der Gedanke, dass es möglich sein muss (entweder als Trigger nach neuem Datensatz/Änderung beim Hochladen oder über einen Button irgendwo), dass die Rechnungen in den Verwendungszwecken nach ihrer Rechnungsnummer suchen und sich dann selbst auf "bezahlt" setzen, wenn die Rechnungsnummer irgendwo im Verwendungszweck auftaucht. Leider hat man ja auch ständig Kunden, die alles mögliche Andere auch noch da rein schreiben, weshalb ich nicht exakt nach der Nummer suchen kann (oder doch?).
Nochmal kurz zur Struktur: In der Tabelle "Bankingdaten" ist die Spalte "Verwendungszweck", diese wird regelmäßig mit neuen Daten gefüttert. In "Rechnungen" gibt es "Rechnungsnr.", die soll gesucht werden und dann der "Status" auf 2/bezahlt gesetzt werden. Von mir aus auch über eine Untertabelle, hauptsache, es klappt irgendwie.
Ich hoffe, ihr könnt mir helfen - das Forum hat mir in der Vergangenheit schon viele nützliche Hinweise geliefert!
13 Antworten
-
Hallo Linda, es gibt verschiedene Ansätze dazu. Eine Möglichkeit wäre, die offenen Rechnungen in ein Array zu lesen und die Buchungstexte dann mit contains() nach den Rechnungsnummern zu durchsuchen. Ein ganz einfaches Beispiel für einen einzelnen Datensatz der importierten CSV-Liste:
let myOP := select Rechnungen where Status = "Offen"; for i in myOP do if contains(Verwendungszweck, i.RechnungsNr) then i.Status := "Bezahlt" end end
Die genaue Umsetzung hinge natürlich davon ab, was genau bei einem Treffer passieren soll (im Beispiel: Status auf „Bezahlt“ setzen).
Wenn eure Rechnungsnummern einen festen Präfix und ein bestimmtes Schema haben, dann könnte man auch den umgekehrten Weg gehen und versuchen, mit extractx() per Regex die Rechnungsnummer und/oder die Kundennummer aus dem Verwendungszweck zu extrahieren und mit „first(select ... where ...“ in den offenen Rechnungen danach zu suchen. Ein weiteres, evtl. ergänzendes Suchkriterium könnte der Betrag sein.
Eine 100-prozentige Zuordnung wird man wohl nie hinbekommen, aber wenn die Rechnungsnummer im Verwendungszweck enthalten ist, dann sollte es zumindest bei einem Teil der Einträge funktionieren. Wobei gilt: Je individueller die Rechnungsnummer, desto größer die Wahrscheinlichkeit, dass die Buchung sicher zugeordnet werden kann.
Übrigens gibt es inzwischen auch eine Integration, mit der sich automatisiert Kontoauszüge holen und auch Transaktionen ausführen lassen. Ist noch im Betastadium, sieht aber schon sehr vielversprechend aus: https://kontoflux.io/
Das könnte man täglich ausführen lassen und würde sich den ständigen manuellen CSV-Import sparen.
-
Vielleicht fehlt nur ein "i" vor Verwendungszweck, was man auch ausklammern könnte vor contains?
let myOP := select Rechnungen where Status = "Offen"; for i in myOP do if contains(i.Verwendungszweck, i.RechnungsNr) then i.Status := "Bezahlt" end end
-
said:
Hast du eine Ahnung, wieso contains nicht tut was es soll?Leider nicht. Wenn der String (RechnungsNr) exakt so in dem zu durchsuchenden Textfeld (Verwendungszweck) irgendwo vorkommt, dann wird er mit contains() auch gefunden.
Falls die RechnungsNr Buchstaben enthält, sollte man natürlich beide Felder mit upper() oder lower() angleichen:
contains(upper(Verwendungszweck), i.upper(RechnungsNr)
Zusätzlich kann man mit replace() auch noch Leer- und Sonderzeichen entfernen für den Fall, dass der Kunde welche weglässt oder hinzufügt. Dann müsste man eigentlich eine recht hohe Trefferquote bekommen.
Ansonsten fällt mir spontan nichts weiter ein. Bei mir funktioniert es so wie beschrieben.
-
said:
Wenn ich den Betrag in das if mit einbaue, gibt es natürlich Probleme, wenn jemand den falschen Betrag überweist (brutto statt netto, Centbeträge, usw).Oder Skonto ... ;)
Ja, als eindeutiges Suchkriterium taugt der Zahlbetrag natürlich nicht. Auswerten muss man ihn aber eigentlich immer, denn es sollen ja keine Rechnungen als "Bezahlt" markiert werden, wenn erst 50 % beglichen wurden. Als weitere Besonderheit kann es jau auch sein, dass mehrere Rechnungen mit einer Überweisung bezahlt wurden. Aber das sind dann die individuellen Feinheiten.
-
said:
Ich wollte das im Dashboard ausführen,Ah, okay. Und das Dashboard ist 1:N mit den Bankingdaten verknüpft?
Egal, es geht natürlich auch vom Dashboard aus, um gleich alle Rechnungen durchzugehen. Man braucht dann halt zwei Schleifen. Hier ein Beispiel (wiederum ohne Berücksichtigung irgendwelcher Verknüpfungen):
let myOP := (select Rechnungen where Status != 2); for x in myOP do let myRE := x.'Rechnungsnr.'; for y in select Bankingdaten do if contains(y.Verwendungszweck, myRE) then x.(Status := 2) end end end
Letztlich hängt wie gesagt natürlich noch mehr dran. Aber als Basis müsste der Code eigentlich funktionieren.
Edit: Sehe gerade, dass du die DB angehängt hast. Habe jetzt aber noch nicht reingeschaut. Probiere doch erst mal den Code oben.
Content aside
- Status Answered
- vor 10 MonatenZuletzt aktiv
- 13Antworten
- 60Ansichten
-
3
Folge bereits