Was GoCardless sagt
| Reason | Typ | GoCardless-Text |
|---|---|---|
mandate_is_inactive | invalid_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.

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:
- Er erkennt den Reason
mandate_is_inactivein der Antwort. - Er fragt bei GoCardless den Status dieses Mandats ab.
- 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.
- 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.

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
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
