Zum Hauptinhalt springen
GoCardless API · invalid_state

GoCardless-Fehler mandate_is_inactive beim Anlegen einer Zahlung aus Odoo

mandate_is_inactive stammt nicht von der Bank des Kunden, sondern von der GoCardless-API selbst: Odoo hat versucht, eine Zahlung mit einem Mandat anzulegen, das nicht mehr aktiv ist. Es handelt sich um einen Fehler vom Typ invalid_state, und die GoCardless-Dokumentation ist eindeutig: den Nutzer informieren und nicht erneut versuchen.

FlexigoTech · Verantwortlich: Víctor Gómez · Aktualisiert am 6. November 2026

Das Wichtigste

Versionen
Odoo 17, 18, 19 und 20
Geprüft
im Quellcode des Connectors, Version 17.0, 18.0, 19.0 und 20.0 · in den Quellen am Ende
Lesezeit
4 Min.

Was GoCardless sagt

ReasonTypGoCardless-Text
mandate_is_inactiveinvalid_state«Payment could not be created» und «mandate is cancelled, failed, or expired.»

GoCardless trennt die beiden Teile des Textes durch einen Gedankenstrich. Fehler vom Typ invalid_state bedeuten laut GoCardless, dass die Aktion im aktuellen Zustand der Ressource nicht gültig ist. Hier ist die Ressource das Mandat: Gekündigt, fehlgeschlagen oder abgelaufen, akzeptiert es keine Zahlungen mehr.

GoCardless-Fehlerkarte mandate_is_inactive
Der Reason, sein Typ invalid_state und der Text, mit dem GoCardless ihn dokumentiert.

Wie es zu diesem Fehler kommt

Normalerweise erfährt Odoo über ein GoCardless-Ereignis, dass ein Mandat erloschen ist, bevor es damit abbucht. Dieser Fehler taucht auf, wenn das nicht geschehen ist: Die Meldung ist nicht angekommen oder zu spät, oder das Mandat wurde kurz vor der Abbuchung gekündigt. Die Abbuchung kann von einem Abonnement stammen, das verlängert wird, oder von einer Zahlung, die mit der gespeicherten Zahlungsart des Kunden erfasst wird. Die Benachrichtigungen von GoCardless kommen per Webhook: bei der Verbindung mit zwei Klicks über FlexigoTech Cloud, im erweiterten Modus an den Endpunkt, den Sie im GoCardless-Dashboard angelegt haben. Scheitert dieser Weg, erfährt Odoo nicht rechtzeitig davon.

Was der Konnektor macht

Ohne besondere Behandlung würden Sie den Fehler unverändert sehen, mit dem Text der API, und das Mandat würde für die nächste Rechnung weiterhin angeboten. Der Konnektor geht anders vor:

  1. Er erkennt den Reason mandate_is_inactive in der Antwort.
  2. Er fragt bei GoCardless den Status dieses Mandats ab.
  3. Ist es gekündigt, fehlgeschlagen, abgelaufen, verbraucht oder gesperrt, archiviert er es in Odoo. Ist es die erste Meldung zu diesem erloschenen Mandat, schreibt er es in die Kundenkarte, mit dem Status des Mandats in Klammern («The GoCardless direct debit mandate of … is no longer usable (cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.»), und legt die Aktivität «GoCardless mandate lost» an.
  4. Er setzt die Transaktion auf «Fehler» mit einer eigenen Meldung statt des Rohfehlers: «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.».

Stellt sich heraus, dass das Mandat aktiv ist, fasst der Konnektor es nicht an, und die Transaktion zeigt den GoCardless-Fehler: «GoCardless rejected the request.», gefolgt von der Meldung der API und ihrer request_id. Dieselbe Behandlung gilt für die Schaltfläche zum erneuten Versuch einer Abbuchung, wenn GoCardless mandate_is_inactive zurückgibt.

Der Konnektor ist nicht ins Deutsche übersetzt: Diese Texte erscheinen immer auf Englisch, auch in einem deutschen Odoo, egal ob ein Benutzer oder eine geplante Aktion sie auslöst, etwa die Verlängerung eines Abonnements: «The GoCardless direct debit mandate of … is no longer usable (cancelled). No further collection can be taken against it. Ask the customer to set up a new mandate.», «GoCardless mandate lost», «The customer's GoCardless mandate is …, so it cannot be charged. Ask the customer for a new mandate.» und «GoCardless rejected the request.».

Warum man nicht erneut versuchen sollte

GoCardless schreibt es in der Beschreibung der invalid_state-Fehler vor: Der Nutzer muss informiert werden und darf nicht erneut versuchen. Ein gekündigtes Mandat wird durch Wiederholen nicht wieder aktiv; es braucht eine neue Unterschrift des Kunden oder, in Einzelfällen und nur mit besonderen Rechten bei GoCardless, eine Reaktivierung.

Schema: was GoCardless bei mandate_is_inactive antwortet und was Odoo mit dem Konnektor tut
Schema auf Grundlage des Konnektor-Codes (17.0, 18.0, 19.0 und 20.0) und der GoCardless-Dokumentation.

Was zu tun ist

  • Lesen Sie die Meldung der Transaktion und die Notiz des Konnektors in der Kundenkarte. Die Transaktion öffnen Sie über die Rechnung, mit der Schaltfläche «Zahlungstransaktion» oben; das Menü der Transaktionen erscheint nur im Entwicklermodus und existiert in Odoo 20 nicht. Beide Texte sagen, in welchem Zustand sich das Mandat befindet.
  • Bitten Sie den Kunden um ein neues Mandat und buchen Sie damit die offene Rechnung ab.
  • Tritt das häufig auf, prüfen Sie, ob die GoCardless-Webhooks Ihr Odoo erreichen: Sie melden die Lage, bevor die Abbuchung kommt. Trotzdem fragt der Konnektor stündlich die Ereignisse ab, die verloren gegangen sein könnten.

Warum fragt der Konnektor das Mandat ab, statt es einfach zu archivieren?

Weil er nur archiviert, was GoCardless als erloschen bestätigt. Sagt die Abfrage, dass das Mandat aktiv ist, würde das Archivieren den Kunden unnötig zu einer neuen Unterschrift zwingen.

Mit unserem Konnektor

In Odoo 17, 18, 19 und 20 verwandelt der Konnektor einen API-Fehler in eine klare Aufgabe: Das erloschene Mandat verschwindet aus der Liste der Zahlungsarten, der Kunde wird in seiner Karte informiert, und die Rechnung bleibt offen, bis es ein funktionierendes Mandat gibt.

Weiterlesen

GoCardless MD01: mandate_cancelled und authorisation_disputed bei einer SEPA-LastschriftMD01 erscheint bei GoCardless als mandate_cancelled oder authorisation_disputed bei fehlgeschlagenen, rückbelasteten oder stornierten SEPA-Zahlungen.GoCardless bank_account_closed: AC04 und MD07, das Konto existiert nicht mehrGoCardless bank_account_closed mit AC04 (Konto geschlossen) oder MD07 (Kontoinhaber verstorben): Das Mandat wird storniert. Was Odoo mit Rechnung und Kunde tut.GoCardless-Fehler retry_failed bei der Wiederholung einer Lastschrift aus OdooGoCardless antwortet mit retry_failed, wenn die Zahlung nicht fehlgeschlagen ist oder keine Wiederholung mehr zulässt. Wann Odoo den Button zeigt.
Geprüft im Quellcode des Connectors (Version 17.0, 18.0, 19.0 und 20.0) und in den verlinkten Quellen

Quellen

  • Quellcode des Moduls: flexigo_payment_gocardless: const.py, Zeile 15 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 247 in 17.0 (d203ee6), Zeile 247 in 18.0 (e2ab18b), Zeile 247 in 19.0 (ce7f5a3) und Zeile 258 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_provider.py, Zeile 71 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: __manifest__.py, Zeile 6 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/mandate
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 278 in 17.0 (d203ee6), Zeile 278 in 18.0 (e2ab18b), Zeile 278 in 19.0 (ce7f5a3) und Zeile 289 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: const.py, Zeile 33 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_token.py, Zeile 131 in 17.0 (d203ee6), Zeile 131 in 18.0 (e2ab18b), Zeile 131 in 19.0 (ce7f5a3) und Zeile 130 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: const.py, Zeile 134 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_provider.py, Zeile 397 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 469 in 17.0 (d203ee6), Zeile 469 in 18.0 (e2ab18b), Zeile 468 in 19.0 (ce7f5a3) und Zeile 487 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: const.py, Zeile 117 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1148 in 17.0 (d203ee6), Zeile 1148 in 18.0 (e2ab18b), Zeile 1148 in 19.0 (ce7f5a3) und Zeile 1155 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 495 in 17.0 (d203ee6), Zeile 495 in 18.0 (e2ab18b), Zeile 495 in 19.0 (ce7f5a3) und Zeile 497 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 521 in 17.0 (d203ee6), Zeile 521 in 18.0 (e2ab18b), Zeile 521 in 19.0 (ce7f5a3) und Zeile 523 in 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/events/mandate
  • Quellcode des Moduls: flexigo_payment_gocardless: __manifest__.py, Zeile 31 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • docs.gocardless.com/docs/api-reference/responses-and-errors
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_transaction.py, Zeile 321 in 17.0 (d203ee6), Zeile 321 in 18.0 (e2ab18b), Zeile 321 in 19.0 (ce7f5a3) und Zeile 332 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: i18n/flexigo_payment_gocardless.pot, Zeile 1233 in 17.0 (d203ee6), Zeile 1233 in 18.0 (e2ab18b), Zeile 1233 in 19.0 (ce7f5a3) und Zeile 1240 in 20.0 (688d86b)
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_token.py, Zeile 83 in 17.0 (d203ee6), Zeile 83 in 18.0 (e2ab18b), Zeile 83 in 19.0 (ce7f5a3) und Zeile 82 in 20.0 (688d86b)
  • github.com/odoo/odoo/blob/20.0/addons/payment/i18n/de.po
  • Quellcode des Moduls: flexigo_payment_gocardless: models/payment_provider.py, Zeile 462 in 17.0 (d203ee6), 18.0 (e2ab18b), 19.0 (ce7f5a3) und 20.0 (688d86b)
  • github.com/odoo/odoo/blob/17.0/odoo/http.py
  • github.com/odoo/odoo/blob/20.0/addons/account_payment/views/account_move_views.xml