jonaswitt / stripe-datev-exporter

Exports Stripe invoices and payments in DATEV format for bookkeeping
MIT License
15 stars 11 forks source link

stripe.Invoice.list funktioniert nicht mehr richtig #12

Closed enzoberger closed 10 months ago

enzoberger commented 11 months ago

Hallo Jonas, hab mir gerade den ganzen Sonntag um die Ohren gehauen. Das Problem, bei uns kamen nur noch die halben Rechnungen beim Export raus. Ich hab mir daher die Stripe API im Postman angeschaut und festgestellt, dass die stripe.Invoice.list nicht mehr richtig funktioniert. Warum weiß ich nicht. Entweder hat Stripe was umgebaut oder wir haben zu viele Rechnungen für die stripe.Invoice.list. Es gibt aber eine stripe.Invoice.search Abfrage. Da kann man eine Query übergibt in der man das created Datum eingrenzen kann. So funktioniert es wieder perfekt. Würde euch dringend empfehlen das asap umzubauen. Ich musste jetzt bin in Mai zurück die Buchhaltung neu exportieren.

Betroffene Datei: invoices.py Methode: listFinalizedInvoices Code Changes: def listFinalizedInvoices(fromTime, toTime): invoices = stripe.Invoice.search( query= "created>" + str(int(fromTime.timestamp())) + " AND created<" + str(int(toTime.timestamp())) ).auto_paging_iter() for invoice in invoices: .....

Beste Grüße, Enzo

jonaswitt commented 11 months ago

Hast du evtl. noch genauere Angaben dazu, was bei dir nicht richtig funktioniert? Dann kann ich das Problem vielleicht besser nachvollziehen. Wieviele Rechnungen hast du pro Monat erhalten, wieviele hast du erwartet?

Entweder hat Stripe was umgebaut

Die verwendete API-Version ist ja fixiert (2020-08-27), da sollte sich "eigentlich" nichts ändern 🤔

oder wir haben zu viele Rechnungen für die stripe.Invoice.list.

Es wird ja pagination genutzt (.auto_paging_iter()), da dürfte es kein Problem mit der Anzahl der Rechnungen geben

Dein Code-Beispiel ist so auch nicht korrekt, die Eingrenzung allein auf Basis von created ist nicht korrekt. Was wir wollen, sind alle Rechnungen die in einem Monat finalized wurden (=Rechnungsdatum). Danach kann man nicht direkt suchen (auch in search() nicht), daher wurde bisher die Query-Kombination "due_date >= fromTime AND created < toTime" genutzt, und dann client-seitig weiter eingeschränkt. Die Query "created > fromTime" schließt Rechnungen aus, die vor Monatsbeginn erstellt wurden, aber erst nach Monatsbeginn finalisiert wurden. Das geht nicht.

enzoberger commented 11 months ago

Jetzt warst du aber schnell mit der Antwort! Also ich muss zugeben, das ich noch eine recht alte Version deiner Anwendung habe und weil ich diese sehr angepasst habe, bin ich dort stehen geblieben. Ich hab z.B. die ganzen CreditNotes implementiert, da wir am Anfang einige Zahlungsausfälle hatten und daher gebuchte Rechnungen stornieren mussten.

Ich hatte deine aktuelle Version auch erst mal gar nicht zum Laufen gebracht , weil ich keine accountNumber in den MetaDaten vom Customer habe. Daher hatte ich deinen aktuellen Code in meine Version rein kopiert und war jetzt nicht ganz sicher ob das Problem bei dir überhaupt auftritt.

Aber jetzt habe ich das Problem mit den MetaDaten behoben und auch deine aktuelle Version getestet. Leider das selbe Problem. Also wir haben eigentlich nicht so viele Rechnungen ca. 30-40 pro Monat.

Das Problem mit der finalized Rechnung ist mir so ca. 5 Minuten nachdem ich dir geschrieben habe auf die Füße gefallen, da mir eine Rechnung abging die ich am 28.05 erstellt hatte, aber erst am 02.06 finalisiert hatte.

Ich hab jetzt nicht wirklich die Zeit der Sache genau auf den Grund zu gehen. Meine Lösung wird da wohl eher sein, dass ich die Daten vom Vormonat auch lade.

Falls du motiviert bist und dir das genau anschauen willst, sollten uns mal persönlich unterhalten.

BG. Enzo

jonaswitt commented 11 months ago

Wenn du sicher bist, dass zwischen Erstellung und Finalisierung deiner Rechnungen z.B. maximal ein Monat liegt, könntest du folgendes probieren:

  invoices = stripe.Invoice.list(
    created={
      "lt": int(toTime.timestamp()),
      "gte": int((fromTime - datedelta.MONTH).timestamp()),
    },
    expand=["data.customer", "data.customer.tax_ids"],
  ).auto_paging_iter()
enzoberger commented 11 months ago

Sicher bin ich nicht. Aber ich denke, wenn eine Zahlungsmethode nicht funktioniert, dann wird die Rechnung nach 3 Wochen storniert. Aber kann sich in bestimmten Fällen sicher noch etwas länger ziehen. Werde sicherheitshalber 2 Monate nehmen. Und werde es mit den stripe.Invoice.search machen, weil das list ja nicht mehr funktioniert. Sollte so in etwa aussehen: invoices = stripe.Invoice.search( query= "created>" + str(int(fromTime.timestamp())) + " AND created<" + str(int((fromTime - datedelta.datedelta(months=2)).timestamp())) ).auto_paging_iter()

jonaswitt commented 10 months ago

Ich kann das Problem jetzt insoweit nachvollziehen:

Mit dem list()-Call selbst kann ich darüber hinaus keine Problem feststellen, der den Einsatz von search() erfordern würden